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/ICJZRVMiIDogIk5PIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HSSgiICBERVFVRVVFRDogaGFuZGxlOiAlcCwgbWVkaWEgdGltZTogJWxsZHVzLCBpbmRleDogJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgaXQtPm1HcmFwaGljQnVmZmVyLT5oYW5kbGUsIChsb25nIGxvbmcpaXQtPm1NZWRpYVRpbWVVcywgaXQtPm1JbmRleCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKaW5kZXggMGMyZmYxNS4uMDY4YTc3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcApAQCAtMzQsMTAgKzM0LDEwIEBACiAgICAgOiBtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zKDApLAogICAgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMoMCksCiAgICAgICBtVG90YWxUcmFuc2ZlckJ5dGVzKDApLAorICAgICAgbU1heEJhbmR3aWR0aEhpc3RvcnlJdGVtcygxMDApLAogICAgICAgbVByZXZCYW5kd2lkdGhNZWFzdXJlVGltZVVzKDApLAogICAgICAgbVByZXZFc3RpbWF0ZWRCYW5kV2lkdGhLYnBzKDApLAotICAgICAgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXMoNTAwMCksCi0gICAgICBtTWF4QmFuZHdpZHRoSGlzdG9yeUl0ZW1zKDEwMCkgeworICAgICAgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXMoNTAwMCkgewogfQogCiB2b2lkIEhUVFBCYXNlOjphZGRCYW5kd2lkdGhNZWFzdXJlbWVudCgKQEAgLTc1LDcgKzc1LDExIEBACiBib29sIEhUVFBCYXNlOjplc3RpbWF0ZUJhbmR3aWR0aChpbnQzMl90ICpiYW5kd2lkdGhfYnBzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIGlmIChtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zIDwgMikgeworICAgIC8vIERvIG5vdCBkbyBiYW5kd2lkdGggZXN0aW1hdGlvbiBpZiB3ZSBkb24ndCBoYXZlIGVub3VnaCBzYW1wbGVzLCBvcgorICAgIC8vIHRvdGFsIGJ5dGVzIGRvd25sb2FkIGFyZSB0b28gc21hbGwgKDw2NEspLgorICAgIC8vIEJhbmR3aWR0aCBlc3RpbWF0aW9uIGZyb20gdGhlc2Ugc2FtcGxlcyBjYW4gb2Z0ZW4gc2hvb3QgdXAgYW5kIGNhdXNlCisgICAgLy8gdW53YW50ZWQgYncgYWRhcHRpb24gYmVoYXZpb3JzLgorICAgIGlmIChtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zIDwgMiB8fCBtVG90YWxUcmFuc2ZlckJ5dGVzIDwgNjU1MzYpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAKaW5kZXggNGE2MzE1Mi4uMmU1NGU4YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUDNFeHRyYWN0b3IuY3BwCkBAIC04Miw3ICs4Miw3IEBACiAgICAgICAgICAgICAqaW5vdXRfcG9zICs9IGxlbjsKIAogICAgICAgICAgICAgQUxPR1YoInNraXBwZWQgSUQzIHRhZywgbmV3IHN0YXJ0aW5nIG9mZnNldCBpcyAlbGxkICgweCUwMTZsbHgpIiwKLSAgICAgICAgICAgICAgICAgKmlub3V0X3BvcywgKmlub3V0X3Bvcyk7CisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKmlub3V0X3BvcywgKGxvbmcgbG9uZykqaW5vdXRfcG9zKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChwb3N0X2lkM19wb3MgIT0gTlVMTCkgewpAQCAtMTAzLDkgKzEwMyw5IEBACiAgICAgdWludDhfdCAqdG1wID0gYnVmOwogCiAgICAgZG8gewotICAgICAgICBpZiAocG9zID49ICppbm91dF9wb3MgKyBrTWF4Qnl0ZXNDaGVja2VkKSB7CisgICAgICAgIGlmIChwb3MgPj0gKG9mZjY0X3QpKCppbm91dF9wb3MgKyBrTWF4Qnl0ZXNDaGVja2VkKSkgewogICAgICAgICAgICAgLy8gRG9uJ3Qgc2NhbiBmb3JldmVyLgotICAgICAgICAgICAgQUxPR1YoImdpdmluZyB1cCBhdCBvZmZzZXQgJWxsZCIsIHBvcyk7CisgICAgICAgICAgICBBTE9HVigiZ2l2aW5nIHVwIGF0IG9mZnNldCAlbGxkIiwgKGxvbmcgbG9uZylwb3MpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTU1LDcgKzE1NSw3IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIEFMT0dWKCJmb3VuZCBwb3NzaWJsZSAxc3QgZnJhbWUgYXQgJWxsZCAoaGVhZGVyID0gMHglMDh4KSIsIHBvcywgaGVhZGVyKTsKKyAgICAgICAgQUxPR1YoImZvdW5kIHBvc3NpYmxlIDFzdCBmcmFtZSBhdCAlbGxkIChoZWFkZXIgPSAweCUwOHgpIiwgKGxvbmcgbG9uZylwb3MsIGhlYWRlcik7CiAKICAgICAgICAgLy8gV2UgZm91bmQgd2hhdCBsb29rcyBsaWtlIGEgdmFsaWQgZnJhbWUsCiAgICAgICAgIC8vIG5vdyBmaW5kIGl0cyBzdWNjZXNzb3JzLgpAQCAtMTg2LDcgKzE4Niw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEFMT0dWKCJmb3VuZCBzdWJzZXF1ZW50IGZyYW1lICMlZCBhdCAlbGxkIiwgaiArIDIsIHRlc3RfcG9zKTsKKyAgICAgICAgICAgIEFMT0dWKCJmb3VuZCBzdWJzZXF1ZW50IGZyYW1lICMlZCBhdCAlbGxkIiwgaiArIDIsIChsb25nIGxvbmcpdGVzdF9wb3MpOwogCiAgICAgICAgICAgICB0ZXN0X3BvcyArPSB0ZXN0X2ZyYW1lX3NpemU7CiAgICAgICAgIH0KQEAgLTI4Miw2ICsyODIsNDEgQEAKIAogICAgIG1GaXJzdEZyYW1lUG9zID0gcG9zOwogICAgIG1GaXhlZEhlYWRlciA9IGhlYWRlcjsKKyAgICBtTWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBzcDxYSU5HU2Vla2VyPiBzZWVrZXIgPSBYSU5HU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKG1EYXRhU291cmNlLCBtRmlyc3RGcmFtZVBvcyk7CisKKyAgICBpZiAoc2Vla2VyID09IE5VTEwpIHsKKyAgICAgICAgbVNlZWtlciA9IFZCUklTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UobURhdGFTb3VyY2UsIHBvc3RfaWQzX3Bvcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlZWtlciA9IHNlZWtlcjsKKyAgICAgICAgaW50IGVuY2QgPSBzZWVrZXItPmdldEVuY29kZXJEZWxheSgpOworICAgICAgICBpbnQgZW5jcCA9IHNlZWtlci0+Z2V0RW5jb2RlclBhZGRpbmcoKTsKKyAgICAgICAgaWYgKGVuY2QgIT0gMCB8fCBlbmNwICE9IDApIHsKKyAgICAgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBlbmNkKTsKKyAgICAgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIGVuY3ApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1TZWVrZXIgIT0gTlVMTCkgeworICAgICAgICAvLyBXaGlsZSBpdCBpcyBzYWZlIHRvIHNlbmQgdGhlIFhJTkcvVkJSSSBmcmFtZSB0byB0aGUgZGVjb2RlciwgdGhpcyB3aWxsCisgICAgICAgIC8vIHJlc3VsdCBpbiBhbiBleHRyYSAxMTUyIHNhbXBsZXMgYmVpbmcgb3V0cHV0LiBJbiBhZGRpdGlvbiwgdGhlIGJpdHJhdGUKKyAgICAgICAgLy8gb2YgdGhlIFhpbmcgaGVhZGVyIG1pZ2h0IG5vdCBtYXRjaCB0aGUgcmVzdCBvZiB0aGUgZmlsZSwgd2hpY2ggY291bGQKKyAgICAgICAgLy8gbGVhZCB0byBwcm9ibGVtcyB3aGVuIHNlZWtpbmcuIFRoZSByZWFsIGZpcnN0IGZyYW1lIHRvIGRlY29kZSBpcyBhZnRlcgorICAgICAgICAvLyB0aGUgWElORy9WQlJJIGZyYW1lLCBzbyBza2lwIHRoZXJlLgorICAgICAgICBzaXplX3QgZnJhbWVfc2l6ZTsKKyAgICAgICAgaW50IHNhbXBsZV9yYXRlOworICAgICAgICBpbnQgbnVtX2NoYW5uZWxzOworICAgICAgICBpbnQgYml0cmF0ZTsKKyAgICAgICAgR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAorICAgICAgICAgICAgICAgIGhlYWRlciwgJmZyYW1lX3NpemUsICZzYW1wbGVfcmF0ZSwgJm51bV9jaGFubmVscywgJmJpdHJhdGUpOworICAgICAgICBwb3MgKz0gZnJhbWVfc2l6ZTsKKyAgICAgICAgaWYgKCFSZXN5bmMobURhdGFTb3VyY2UsIDAsICZwb3MsICZwb3N0X2lkM19wb3MsICZoZWFkZXIpKSB7CisgICAgICAgICAgICAvLyBtSW5pdENoZWNrIHdpbGwgcmVtYWluIE5PX0lOSVQKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtRmlyc3RGcmFtZVBvcyA9IHBvczsKKyAgICAgICAgbUZpeGVkSGVhZGVyID0gaGVhZGVyOworICAgIH0KIAogICAgIHNpemVfdCBmcmFtZV9zaXplOwogICAgIGludCBzYW1wbGVfcmF0ZTsKQEAgLTI5Miw4ICszMjcsNiBAQAogCiAgICAgdW5zaWduZWQgbGF5ZXIgPSA0IC0gKChoZWFkZXIgPj4gMTcpICYgMyk7CiAKLSAgICBtTWV0YSA9IG5ldyBNZXRhRGF0YTsKLQogICAgIHN3aXRjaCAobGF5ZXIpIHsKICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgbU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpOwpAQCAtMzEyLDI3ICszNDUsNiBAQAogICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgYml0cmF0ZSAqIDEwMDApOwogICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOwogCi0gICAgc3A8WElOR1NlZWtlcj4gc2Vla2VyID0gWElOR1NlZWtlcjo6Q3JlYXRlRnJvbVNvdXJjZShtRGF0YVNvdXJjZSwgbUZpcnN0RnJhbWVQb3MpOwotCi0gICAgaWYgKHNlZWtlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1TZWVrZXIgPSBWQlJJU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKG1EYXRhU291cmNlLCBwb3N0X2lkM19wb3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TZWVrZXIgPSBzZWVrZXI7Ci0gICAgICAgIGludCBlbmNkID0gc2Vla2VyLT5nZXRFbmNvZGVyRGVsYXkoKTsKLSAgICAgICAgaW50IGVuY3AgPSBzZWVrZXItPmdldEVuY29kZXJQYWRkaW5nKCk7Ci0gICAgICAgIGlmIChlbmNkICE9IDAgfHwgZW5jcCAhPSAwKSB7Ci0gICAgICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZW5jZCk7Ci0gICAgICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBlbmNwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtU2Vla2VyICE9IE5VTEwpIHsKLSAgICAgICAgLy8gV2hpbGUgaXQgaXMgc2FmZSB0byBzZW5kIHRoZSBYSU5HL1ZCUkkgZnJhbWUgdG8gdGhlIGRlY29kZXIsIHRoaXMgd2lsbAotICAgICAgICAvLyByZXN1bHQgaW4gYW4gZXh0cmEgMTE1MiBzYW1wbGVzIGJlaW5nIG91dHB1dC4gVGhlIHJlYWwgZmlyc3QgZnJhbWUgdG8KLSAgICAgICAgLy8gZGVjb2RlIGlzIGFmdGVyIHRoZSBYSU5HL1ZCUkkgZnJhbWUsIHNvIHNraXAgdGhlcmUuCi0gICAgICAgIG1GaXJzdEZyYW1lUG9zICs9IGZyYW1lX3NpemU7Ci0gICAgfQotCiAgICAgaW50NjRfdCBkdXJhdGlvblVzOwogCiAgICAgaWYgKG1TZWVrZXIgPT0gTlVMTCB8fCAhbVNlZWtlci0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuY3BwCmluZGV4IDk4NTZmOTIuLmVmMDdhYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuY3BwCkBAIC0xMzUsNyArMTM1LDcgQEAKIAogICAgIG1Ob3RpZnkgPSBub3RpZnk7CiAKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTVBFRzJUU1dyaXRlcjo6U291cmNlSW5mbzo6c3RvcCgpIHsKQEAgLTM2MSw3ICszNjEsNyBAQAogfQogCiB2b2lkIE1QRUcyVFNXcml0ZXI6OlNvdXJjZUluZm86OnJlYWRNb3JlKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVhZCwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTVBFRzJUU1dyaXRlcjo6U291cmNlSW5mbzo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKQEAgLTQ4MCwxOSArNDgwLDYgQEAKICAgICBpbml0KCk7CiB9CiAKLU1QRUcyVFNXcml0ZXI6Ok1QRUcyVFNXcml0ZXIoY29uc3QgY2hhciAqZmlsZW5hbWUpCi0gICAgOiBtRmlsZShmb3BlbihmaWxlbmFtZSwgIndiIikpLAotICAgICAgbVdyaXRlQ29va2llKE5VTEwpLAotICAgICAgbVdyaXRlRnVuYyhOVUxMKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1OdW1Tb3VyY2VzRG9uZSgwKSwKLSAgICAgIG1OdW1UU1BhY2tldHNXcml0dGVuKDApLAotICAgICAgbU51bVRTUGFja2V0c0JlZm9yZU1ldGEoMCksCi0gICAgICBtUEFUQ29udGludWl0eUNvdW50ZXIoMCksCi0gICAgICBtUE1UQ29udGludWl0eUNvdW50ZXIoMCkgewotICAgIGluaXQoKTsKLX0KLQogTVBFRzJUU1dyaXRlcjo6TVBFRzJUU1dyaXRlcigKICAgICAgICAgdm9pZCAqY29va2llLAogICAgICAgICBzc2l6ZV90ICgqd3JpdGUpKHZvaWQgKmNvb2tpZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpKQpAQCAtNTY1LDcgKzU1Miw3IEBACiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPQotICAgICAgICAgICAgbmV3IEFNZXNzYWdlKGtXaGF0U291cmNlTm90aWZ5LCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICAgICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgbVJlZmxlY3Rvcik7CiAKICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic291cmNlLWluZGV4IiwgaSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDI2MmNmZDAuLmYxNTg3ODAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcApAQCAtMzU4LDYgKzM1OCw4IEBACiAKIE1QRUc0RXh0cmFjdG9yOjpNUEVHNEV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQogICAgIDogbU1vb2ZPZmZzZXQoMCksCisgICAgICBtTW9vZkZvdW5kKGZhbHNlKSwKKyAgICAgIG1NZGF0Rm91bmQoZmFsc2UpLAogICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtSGFzVmlkZW8oZmFsc2UpLApAQCAtNDk0LDcgKzQ5Niw5IEBACiAKICAgICBvZmY2NF90IG9mZnNldCA9IDA7CiAgICAgc3RhdHVzX3QgZXJyOwotICAgIHdoaWxlICh0cnVlKSB7CisgICAgYm9vbCBzYXdNb292T3JTaWR4ID0gZmFsc2U7CisKKyAgICB3aGlsZSAoIShzYXdNb292T3JTaWR4ICYmIChtTWRhdEZvdW5kIHx8IG1Nb29mRm91bmQpKSkgewogICAgICAgICBvZmY2NF90IG9yaWdfb2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgICBlcnIgPSBwYXJzZUNodW5rKCZvZmZzZXQsIDApOwogCkBAIC01MDMsMjYgKzUwNywxMiBAQAogICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCA8PSBvcmlnX29mZnNldCkgewogICAgICAgICAgICAgLy8gb25seSBjb250aW51ZSBwYXJzaW5nIGlmIHRoZSBvZmZzZXQgd2FzIGFkdmFuY2VkLAogICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIG1pZ2h0IGVuZCB1cCBpbiBhbiBpbmZpbml0ZSBsb29wCi0gICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCBhZHZhbmNlOiAweCVsbGQtPjB4JWxsZCIsIG9yaWdfb2Zmc2V0LCBvZmZzZXQpOworICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgYWR2YW5jZTogJWxsZC0+JWxsZCIsIChsb25nIGxvbmcpb3JpZ19vZmZzZXQsIChsb25nIGxvbmcpb2Zmc2V0KTsKICAgICAgICAgICAgIGVyciA9IEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IFVOS05PV05fRVJST1IpIHsKKyAgICAgICAgICAgIHNhd01vb3ZPclNpZHggPSB0cnVlOwogICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3QgaGRyWzJdOwotICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGhkciwgOCkgPCA4KSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB1aW50MzJfdCBjaHVua190eXBlID0gbnRvaGwoaGRyWzFdKTsKLSAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJykpIHsKLSAgICAgICAgICAgIC8vIHN0b3JlIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IHNlZ21lbnQKLSAgICAgICAgICAgIG1Nb29mT2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICB9IGVsc2UgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCdtJywgJ2QnLCAnYScsICd0JykpIHsKLSAgICAgICAgICAgIC8vIGtlZXAgcGFyc2luZyB1bnRpbCB3ZSBnZXQgdG8gdGhlIGRhdGEKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CkBAIC01MzksMTEgKzUyOSwxMSBAQAogICAgIENIRUNLX05FKGVyciwgKHN0YXR1c190KU5PX0lOSVQpOwogCiAgICAgLy8gY29weSBwc3NoIGRhdGEgaW50byBmaWxlIG1ldGFkYXRhCi0gICAgaW50IHBzc2hzaXplID0gMDsKKyAgICB1aW50NjRfdCBwc3Noc2l6ZSA9IDA7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUHNzaC5zaXplKCk7IGkrKykgewogICAgICAgICBwc3Noc2l6ZSArPSAyMCArIG1Qc3NoW2ldLmRhdGFsZW47CiAgICAgfQotICAgIGlmIChwc3Noc2l6ZSkgeworICAgIGlmIChwc3Noc2l6ZSA+IDAgJiYgcHNzaHNpemUgPD0gVUlOVDMyX01BWCkgewogICAgICAgICBjaGFyICpidWYgPSAoY2hhciopbWFsbG9jKHBzc2hzaXplKTsKICAgICAgICAgaWYgKCFidWYpIHsKICAgICAgICAgICAgIEFMT0dFKCJiLzI4NDcxMjA2Iik7CkBAIC03NTcsNiArNzQ3LDE3IEBACiAgICAgICAgICYmIHBhdGhbM10gPT0gRk9VUkNDKCdpJywgJ2wnLCAncycsICd0Jyk7CiB9CiAKK3N0YXRpYyBib29sIHVuZGVyUVRNZXRhUGF0aChjb25zdCBWZWN0b3I8dWludDMyX3Q+ICZwYXRoLCBpbnQzMl90IGRlcHRoKSB7CisgICAgcmV0dXJuIHBhdGguc2l6ZSgpID49IDIKKyAgICAgICAgICAgICYmIHBhdGhbMF0gPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykKKyAgICAgICAgICAgICYmIHBhdGhbMV0gPT0gRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJykKKyAgICAgICAgICAgICYmIChkZXB0aCA9PSAyCisgICAgICAgICAgICB8fCAoZGVwdGggPT0gMworICAgICAgICAgICAgICAgICAgICAmJiAocGF0aFsyXSA9PSBGT1VSQ0MoJ2gnLCAnZCcsICdsJywgJ3InKQorICAgICAgICAgICAgICAgICAgICB8fCAgcGF0aFsyXSA9PSBGT1VSQ0MoJ2knLCAnbCcsICdzJywgJ3QnKQorICAgICAgICAgICAgICAgICAgICB8fCAgcGF0aFsyXSA9PSBGT1VSQ0MoJ2snLCAnZScsICd5JywgJ3MnKSkpKTsKK30KKwogLy8gR2l2ZW4gYSB0aW1lIGluIHNlY29uZHMgc2luY2UgSmFuIDEgMTkwNCwgcHJvZHVjZSBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZy4KIHN0YXRpYyB2b2lkIGNvbnZlcnRUaW1lVG9EYXRlKGludDY0X3QgdGltZV8xOTA0LCBTdHJpbmc4ICpzKSB7CiAgICAgdGltZV90IHRpbWVfMTk3MCA9IHRpbWVfMTkwNCAtICgoKDY2ICogMzY1ICsgMTcpICogMjQpICogMzYwMCk7CkBAIC03NjgsNyArNzY5LDcgQEAKIH0KIAogc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0LCBpbnQgZGVwdGgpIHsKLSAgICBBTE9HVigiZW50ZXJpbmcgcGFyc2VDaHVuayAlbGxkLyVkIiwgKm9mZnNldCwgZGVwdGgpOworICAgIEFMT0dWKCJlbnRlcmluZyBwYXJzZUNodW5rICVsbGQvJWQiLCAobG9uZyBsb25nKSpvZmZzZXQsIGRlcHRoKTsKICAgICB1aW50MzJfdCBoZHJbMl07CiAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgaGRyLCA4KSA8IDgpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwpAQCAtODEyLDcgKzgxMyw3IEBACiAKICAgICBjaGFyIGNodW5rWzVdOwogICAgIE1ha2VGb3VyQ0NTdHJpbmcoY2h1bmtfdHlwZSwgY2h1bmspOwotICAgIEFMT0dWKCJjaHVuazogJXMgQCAlbGxkLCAlZCIsIGNodW5rLCAqb2Zmc2V0LCBkZXB0aCk7CisgICAgQUxPR1YoImNodW5rOiAlcyBAICVsbGQsICVkIiwgY2h1bmssIChsb25nIGxvbmcpKm9mZnNldCwgZGVwdGgpOwogCiAgICAgaWYgKGtVc2VIZXhEdW1wKSB7CiAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGtXaGl0ZXNwYWNlW10gPSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7CkBAIC04NzIsNiArODczLDEyIEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2MnLCAnaCcsICdpJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdlJywgJ2QnLCAndCcsICdzJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpICYmICFtTW9vZkZvdW5kKSB7CisgICAgICAgICAgICAgICAgLy8gc3RvcmUgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3Qgc2VnbWVudAorICAgICAgICAgICAgICAgIG1Nb29mRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1Nb29mT2Zmc2V0ID0gKm9mZnNldDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJykpIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2FtcGxlVGFibGUgY2h1bmsgaXMgJSIgUFJJdTY0ICIgYnl0ZXMgbG9uZy4iLCBjaHVua19zaXplKTsKIApAQCAtODg2LDYgKzg5Myw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPSBuZXcgU2FtcGxlVGFibGUobURhdGFTb3VyY2UpOwogICAgICAgICAgICAgfQogCkBAIC0xMDQ1LDYgKzEwNTUsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9yaWdpbmFsX2ZvdXJjYyA9IG50b2hsKG9yaWdpbmFsX2ZvdXJjYyk7CiAgICAgICAgICAgICBBTE9HVigicmVhZCBvcmlnaW5hbCBmb3JtYXQ6ICVkIiwgb3JpZ2luYWxfZm91cmNjKTsKKworICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUob3JpZ2luYWxfZm91cmNjKSk7CiAgICAgICAgICAgICB1aW50MzJfdCBudW1fY2hhbm5lbHMgPSAwOwogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlX3JhdGUgPSAwOwpAQCAtMTEwMCw2ICsxMTE0LDkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUNyeXB0b01vZGUsIGRlZmF1bHRBbGdvcml0aG1JZCk7CiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgZGVmYXVsdElWU2l6ZSk7CiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKGtLZXlDcnlwdG9LZXksICd0ZW5jJywgZGVmYXVsdEtleUlkLCAxNik7CkBAIC0xMTM0LDcgKzExNTEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHNzaC5kYXRhbGVuID0gbnRvaGwocHNzaGRhdGFsZW4pOwogICAgICAgICAgICAgQUxPR1YoInBzc2ggZGF0YSBzaXplOiAlZCIsIHBzc2guZGF0YWxlbik7Ci0gICAgICAgICAgICBpZiAocHNzaC5kYXRhbGVuICsgMjAgPiBjaHVua19zaXplKSB7CisgICAgICAgICAgICBpZiAoY2h1bmtfc2l6ZSA8IDIwIHx8IHBzc2guZGF0YWxlbiA+IGNodW5rX3NpemUgLSAyMCkgewogICAgICAgICAgICAgICAgIC8vIHBzc2ggZGF0YSBsZW5ndGggZXhjZWVkcyBzaXplIG9mIGNvbnRhaW5pbmcgYm94CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KQEAgLTEyMTUsNyArMTIzMiw3IEBACiAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gbnRvaGwoZHVyYXRpb24zMik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDApIHsKKyAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwICYmIG1MYXN0VHJhY2stPnRpbWVzY2FsZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50NjQoCiAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKICAgICAgICAgICAgIH0KQEAgLTEyNzksNiArMTI5NiwxMCBAQAogICAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgdGhlIHRpbWVkIHRleHQuCiAgICAgICAgICAgICAgICAgLy8gRm9yIGVuY3J5cHRlZCBmaWxlcywgdGhlcmUgbWF5IGFsc28gYmUgbW9yZSB0aGFuIG9uZSBlbnRyeS4KICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworCisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKICAgICAgICAgICAgICAgICBpZiAoc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjYXNlY21wKG1pbWUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKSkgewpAQCAtMTMyNSw2ICsxMzQ2LDkgQEAKICAgICAgICAgICAgIHVpbnQxNl90IHNhbXBsZV9zaXplID0gVTE2X0FUKCZidWZmZXJbMThdKTsKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV9yYXRlID0gVTMyX0FUKCZidWZmZXJbMjRdKSA+PiAxNjsKIAorICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSAhPSBGT1VSQ0MoJ2UnLCAnbicsICdjJywgJ2EnKSkgewogICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjaHVuayB0eXBlIGlzIGVuY2EsIHdlJ2xsIGdldCB0aGUgdHlwZSBmcm9tIHRoZSBzaW5mL2ZybWEgYm94IGxhdGVyCiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIEZvdXJDQzJNSU1FKGNodW5rX3R5cGUpKTsKQEAgLTEzODYsNiArMTQxMCw5IEBACiAgICAgICAgICAgICAvLyBwcmludGYoIioqKiBjb2Rpbmc9JyVzJyB3aWR0aD0lZCBoZWlnaHQ9JWRcbiIsCiAgICAgICAgICAgICAvLyAgICAgICAgY2h1bmssIHdpZHRoLCBoZWlnaHQpOwogCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnZScsICduJywgJ2MnLCAndicpKSB7CiAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNodW5rIHR5cGUgaXMgZW5jdiwgd2UnbGwgZ2V0IHRoZSB0eXBlIGZyb20gdGhlIHNpbmYvZnJtYSBib3ggbGF0ZXIKICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOwpAQCAtMTQxMSw2ICsxNDM4LDkgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdjJywgJ28nKToKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnbycsICc2JywgJzQnKToKICAgICAgICAgeworICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRDaHVua09mZnNldFBhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwpAQCAtMTQyNiw2ICsxNDU2LDkgQEAKIAogICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAnYycpOgogICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFNhbXBsZVRvQ2h1bmtQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKQEAgLTE0NDIsNiArMTQ3NSw5IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncycsICd6Jyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAneicsICcyJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0U2FtcGxlU2l6ZVBhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwpAQCAtMTUyMyw2ICsxNTU5LDkgQEAKIAogICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3QnLCAncycpOgogICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KQEAgLTE1MzgsNiArMTU3Nyw5IEBACiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAndCcsICd0JywgJ3MnKToKICAgICAgICAgeworICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CkBAIC0xNTUzLDYgKzE1OTUsOSBAQAogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncycsICdzJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQpAQCAtMTU2NiwxMyArMTYxMSwxMyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICAvLyCpeHl6CisgICAgICAgIC8vIFx4QTl4eXoKICAgICAgICAgY2FzZSBGT1VSQ0MoMHhBOSwgJ3gnLCAneScsICd6Jyk6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIAotICAgICAgICAgICAgLy8gQmVzdCBjYXNlIHRoZSB0b3RhbCBkYXRhIGxlbmd0aCBpbnNpZGUgIql4eXoiIGJveAotICAgICAgICAgICAgLy8gd291bGQgYmUgOCwgZm9yIGluc3RhbmNlICKpeHl6IiArICJceDAwXHgwNFx4MTVceGM3IiArICIwKzAvIiwKKyAgICAgICAgICAgIC8vIEJlc3QgY2FzZSB0aGUgdG90YWwgZGF0YSBsZW5ndGggaW5zaWRlICJceEE5eHl6IiBib3gKKyAgICAgICAgICAgIC8vIHdvdWxkIGJlIDgsIGZvciBpbnN0YW5jZSAiXHhBOXh5eiIgKyAiXHgwMFx4MDRceDE1XHhjNyIgKyAiMCswLyIsCiAgICAgICAgICAgICAvLyB3aGVyZSAiXHgwMFx4MDQiIGlzIHRoZSB0ZXh0IHN0cmluZyBsZW5ndGggd2l0aCB2YWx1ZSA9IDQsCiAgICAgICAgICAgICAvLyAiXDB4MTVceGM3IiBpcyB0aGUgbGFuZ3VhZ2UgY29kZSA9IGVuLCBhbmQgIjArMCIgaXMgYQogICAgICAgICAgICAgLy8gbG9jYXRpb24gKHN0cmluZykgdmFsdWUgd2l0aCBsb25naXR1ZGUgPSAwIGFuZCBsYXRpdHVkZSA9IDAuCkBAIC0xNjI1LDYgKzE2NzAsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0RGF0YSgKICAgICAgICAgICAgICAgICAgICAga0tleUVTRFMsIGtUeXBlRVNEUywgJmJ1ZmZlcls0XSwgY2h1bmtfZGF0YV9zaXplIC0gNCk7CiAKQEAgLTE2NDIsNyArMTY5MCwxOCBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUGF0aC5zaXplKCkgPj0gMgorICAgICAgICAgICAgICAgICAgICAmJiBtUGF0aFttUGF0aC5zaXplKCkgLSAyXSA9PSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ3YnKSkgeworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB2aWRlbyBpcyBNUEVHMgorICAgICAgICAgICAgICAgIEVTRFMgZXNkcygmYnVmZmVyWzRdLCBjaHVua19kYXRhX3NpemUgLSA0KTsKIAorICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb2JqZWN0VHlwZUluZGljYXRpb247CisgICAgICAgICAgICAgICAgaWYgKGVzZHMuZ2V0T2JqZWN0VHlwZUluZGljYXRpb24oJm9iamVjdFR5cGVJbmRpY2F0aW9uKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0VHlwZUluZGljYXRpb24gPj0gMHg2MCAmJiBvYmplY3RUeXBlSW5kaWNhdGlvbiA8PSAweDY1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTY2Miw2ICsxNzIxLDkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0RGF0YSgKICAgICAgICAgICAgICAgICAgICAga0tleUFWQ0MsIGtUeXBlQVZDQywgYnVmZmVyLT5kYXRhKCksIGNodW5rX2RhdGFfc2l6ZSk7CiAKQEAgLTE2ODEsNiArMTc0Myw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgIGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGJ1ZmZlci0+ZGF0YSgpLCBjaHVua19kYXRhX3NpemUpOwogCkBAIC0xNzA1LDcgKzE3NzAsNyBAQAogICAgICAgICAgICAgY2hhciBidWZmZXJbMjNdOwogICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSAhPSA3ICYmCiAgICAgICAgICAgICAgICAgY2h1bmtfZGF0YV9zaXplICE9IDIzKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkluY29ycmVjdCBEMjYzIGJveCBzaXplICVsbGQiLCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgICAgIEFMT0dFKCJJbmNvcnJlY3QgRDI2MyBib3ggc2l6ZSAlbGxkIiwgKGxvbmcgbG9uZyljaHVua19kYXRhX3NpemUpOwogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKQEAgLTE3MTQsNiArMTc3OSw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoa0tleUQyNjMsIGtUeXBlRDI2MywgYnVmZmVyLCBjaHVua19kYXRhX3NpemUpOwogCiAgICAgICAgICAgICBicmVhazsKQEAgLTE3MjEsMzEgKzE3ODksMzUgQEAKIAogICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpOgogICAgICAgICB7Ci0gICAgICAgICAgICB1aW50OF90IGJ1ZmZlcls0XTsKLSAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAob2ZmNjRfdClzaXplb2YoYnVmZmVyKSkgewotICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIDQpIDwgNCkgewotICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChVMzJfQVQoYnVmZmVyKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2hvdWxkIGJlIHZlcnNpb24gMCwgZmxhZ3MgMC4KLQotICAgICAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90LCBsZXQncyBhc3N1bWUgdGhpcyBpcyBvbmUgb2YgdGhvc2UKLSAgICAgICAgICAgICAgICAvLyBhcHBhcmVudGx5IG1hbGZvcm1lZCBjaHVua3MgdGhhdCBkb24ndCBoYXZlIGZsYWdzCi0gICAgICAgICAgICAgICAgLy8gYW5kIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljcyB0aGFuIHdoYXQncwotICAgICAgICAgICAgICAgIC8vIGluIHRoZSBNUEVHNCBzcGVjcyBhbmQgc2tpcCBpdC4KLSAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7Ci0gICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQgKyBzaXplb2YoYnVmZmVyKTsKKyAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldDsKKyAgICAgICAgICAgIGJvb2wgaXNQYXJzaW5nTWV0YUtleXMgPSB1bmRlclFUTWV0YVBhdGgobVBhdGgsIDIpOworICAgICAgICAgICAgaWYgKCFpc1BhcnNpbmdNZXRhS2V5cykgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzRdOworICAgICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAob2ZmNjRfdClzaXplb2YoYnVmZmVyKSkgeworICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlciwgNCkgPCA0KSB7CisgICAgICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChVMzJfQVQoYnVmZmVyKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBiZSB2ZXJzaW9uIDAsIGZsYWdzIDAuCisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncyBub3QsIGxldCdzIGFzc3VtZSB0aGlzIGlzIG9uZSBvZiB0aG9zZQorICAgICAgICAgICAgICAgICAgICAvLyBhcHBhcmVudGx5IG1hbGZvcm1lZCBjaHVua3MgdGhhdCBkb24ndCBoYXZlIGZsYWdzCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpY3MgdGhhbiB3aGF0J3MKKyAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIE1QRUc0IHNwZWNzIGFuZCBza2lwIGl0LgorICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKm9mZnNldCArPSAgc2l6ZW9mKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHdoaWxlICgqb2Zmc2V0IDwgc3RvcF9vZmZzZXQpIHsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKG9mZnNldCwgZGVwdGggKyAxKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0xODExLDcgKzE4ODMsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGQzMjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwKSB7CisgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDApIHsKICAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOwogICAgICAgICAgICAgfQogCkBAIC0xODYwLDcgKzE5MzIsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwKSB7CisgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDApIHsKICAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOwogICAgICAgICAgICAgfQogCkBAIC0xODcwLDYgKzE5NDIsOSBAQAogICAgICAgICBjYXNlIEZPVVJDQygnbScsICdkJywgJ2EnLCAndCcpOgogICAgICAgICB7CiAgICAgICAgICAgICBBTE9HVigibWRhdCBjaHVuaywgZHJtOiAlZCIsIG1Jc0RybSk7CisKKyAgICAgICAgICAgIG1NZGF0Rm91bmQgPSB0cnVlOworCiAgICAgICAgICAgICBpZiAoIW1Jc0RybSkgewogICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE4ODYsNiArMTk2MSwxMCBAQAogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKKyAgICAgICAgICAgIGlmICh1bmRlclFUTWV0YVBhdGgobVBhdGgsIDMpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcjsKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKyA4LCAmYnVmZmVyLCA0KSA8IDQpIHsKQEAgLTE5MDUsNiArMTk4NCwxNiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEZPVVJDQygnaycsICdlJywgJ3knLCAncycpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGlmICh1bmRlclFUTWV0YVBhdGgobVBhdGgsIDMpKSB7CisgICAgICAgICAgICAgICAgcGFyc2VRVE1ldGFLZXkoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3InLCAnZScsICd4Jyk6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKQEAgLTE5MjYsNiArMjAxNSw5IEBACiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAneCcsICczJywgJ2cnKToKICAgICAgICAgeworICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICB1aW50MzJfdCB0eXBlOwogICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKICAgICAgICAgICAgIHNpemVfdCBzaXplID0gMDsKQEAgLTE5NzEsOCArMjA2Myw4IEBACiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKICAgICAgICAgICAgIGlmIChtRmlsZU1ldGFEYXRhICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiY2h1bmtfZGF0YV9zaXplID0gJWxsZCBhbmQgZGF0YV9vZmZzZXQgPSAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX2RhdGFfc2l6ZSwgZGF0YV9vZmZzZXQpOworICAgICAgICAgICAgICAgIEFMT0dWKCJjaHVua19kYXRhX3NpemUgPSAlIiBQUklkNjQgIiBhbmQgZGF0YV9vZmZzZXQgPSAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfZGF0YV9zaXplLCBkYXRhX29mZnNldCk7CiAKICAgICAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMCB8fCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oY2h1bmtfZGF0YV9zaXplKSA+PSBTSVpFX01BWCAtIDEpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKQEAgLTIwNDgsNiArMjE0MCwxMiBAQAogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlJ3JlIHBhcnNpbmcgJ2lsc3QnIGZvciBtZXRhIGtleXMKKyAgICAgICAgICAgIC8vIGlmIHNvLCB0cmVhdCB0eXBlIGFzIGEgbnVtYmVyIChrZXktaWQpLgorICAgICAgICAgICAgaWYgKHVuZGVyUVRNZXRhUGF0aChtUGF0aCwgMykpIHsKKyAgICAgICAgICAgICAgICBwYXJzZVFUTWV0YVZhbChjaHVua190eXBlLCBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIwODMsNiArMjE4MSw4IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogICAgIEFMT0dWKCJzaWR4IHJlZmlkL3RpbWVzY2FsZTogJWQvJWQiLCByZWZlcmVuY2VJZCwgdGltZVNjYWxlKTsKKyAgICBpZiAodGltZVNjYWxlID09IDApCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKICAgICB1aW50NjRfdCBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWU7CiAgICAgdWludDY0X3QgZmlyc3RPZmZzZXQ7CkBAIC0yMTY2LDYgKzIyNjYsOSBAQAogCiAgICAgdWludDY0X3Qgc2lkeER1cmF0aW9uID0gdG90YWxfZHVyYXRpb24gKiAxMDAwMDAwIC8gdGltZVNjYWxlOwogCisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgIGludDY0X3QgbWV0YUR1cmF0aW9uOwogICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJm1ldGFEdXJhdGlvbikgfHwgbWV0YUR1cmF0aW9uID09IDApIHsKICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBzaWR4RHVyYXRpb24pOwpAQCAtMjE3Myw3ICsyMjc2LDEwOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlUVRNZXRhS2V5KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgOCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KIAorICAgIHVpbnQzMl90IGNvdW50OworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmY291bnQpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKG1NZXRhS2V5TWFwLnNpemUoKSA+IDApIHsKKyAgICAgICAgQUxPR1coIidrZXlzJyBhdG9tIHNlZW4gYWdhaW4sIGRpc2NhcmRpbmcgZXhpc3RpbmcgZW50cmllcyIpOworICAgICAgICBtTWV0YUtleU1hcC5jbGVhcigpOworICAgIH0KKworICAgIG9mZjY0X3Qga2V5T2Zmc2V0ID0gb2Zmc2V0ICsgODsKKyAgICBvZmY2NF90IHN0b3BPZmZzZXQgPSBvZmZzZXQgKyBzaXplOworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDw9IGNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKGtleU9mZnNldCArIDggPiBzdG9wT2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3Qga2V5U2l6ZTsKKyAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGtleU9mZnNldCwgJmtleVNpemUpCisgICAgICAgICAgICAgICAgfHwga2V5U2l6ZSA8IDgKKyAgICAgICAgICAgICAgICB8fCBrZXlPZmZzZXQgKyBrZXlTaXplID4gc3RvcE9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihrZXlPZmZzZXQgKyA0LCAmdHlwZSkKKyAgICAgICAgICAgICAgICB8fCB0eXBlICE9IEZPVVJDQygnbScsICdkJywgJ3QnLCAnYScpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAga2V5U2l6ZSAtPSA4OworICAgICAgICBrZXlPZmZzZXQgKz0gODsKKworICAgICAgICBzcDxBQnVmZmVyPiBrZXlEYXRhID0gbmV3IEFCdWZmZXIoa2V5U2l6ZSk7CisgICAgICAgIGlmIChrZXlEYXRhLT5kYXRhKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBrZXlPZmZzZXQsIGtleURhdGEtPmRhdGEoKSwga2V5U2l6ZSkgPCAoc3NpemVfdCkga2V5U2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIEFTdHJpbmcga2V5KChjb25zdCBjaGFyICopa2V5RGF0YS0+ZGF0YSgpLCBrZXlTaXplKTsKKyAgICAgICAgbU1ldGFLZXlNYXAuYWRkKGksIGtleSk7CisKKyAgICAgICAga2V5T2Zmc2V0ICs9IGtleVNpemU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlUVRNZXRhVmFsKAorICAgICAgICBpbnQzMl90IGtleUlkLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU1ldGFLZXlNYXAuaW5kZXhPZktleShrZXlJZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAvLyBjb3JyZXNwb25kaW5nIGtleSBpcyBub3QgcHJlc2VudCwgaWdub3JlCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKHNpemUgPD0gMTYpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdWludDMyX3QgZGF0YVNpemU7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJmRhdGFTaXplKQorICAgICAgICAgICAgfHwgZGF0YVNpemUgPiBzaXplIHx8IGRhdGFTaXplIDw9IDE2KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVpbnQzMl90IGF0b21Gb3VyQ0M7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDQsICZhdG9tRm91ckNDKQorICAgICAgICAgICAgfHwgYXRvbUZvdXJDQyAhPSBGT1VSQ0MoJ2QnLCAnYScsICd0JywgJ2EnKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1aW50MzJfdCBkYXRhVHlwZTsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0ICsgOCwgJmRhdGFUeXBlKQorICAgICAgICAgICAgfHwgKChkYXRhVHlwZSAmIDB4ZmYwMDAwMDApICE9IDApKSB7CisgICAgICAgIC8vIG5vdCB3ZWxsLWtub3duIHR5cGUKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBkYXRhU2l6ZSAtPSAxNjsKKyAgICBvZmZzZXQgKz0gMTY7CisKKyAgICBpZiAoZGF0YVR5cGUgPT0gMjMgJiYgZGF0YVNpemUgPj0gNCkgeworICAgICAgICAvLyBCRSBGbG9hdDMyCisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnZhbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1NZXRhS2V5TWFwW2luZGV4XS5jX3N0cigpLCAiY29tLmFuZHJvaWQuY2FwdHVyZS5mcHMiKSkgeworICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0RmxvYXQoa0tleUNhcHR1cmVGcmFtZXJhdGUsICooZmxvYXQgKikmdmFsKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGFkZCBtb3JlIGtleXMgaWYgbmVlZGVkCisgICAgICAgIEFMT0dWKCJpZ25vcmluZyBrZXk6IHR5cGUgJWQsIHNpemUgJWQiLCBkYXRhVHlwZSwgZGF0YVNpemUpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KIAogc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlVHJhY2tIZWFkZXIoCiAgICAgICAgIG9mZjY0X3QgZGF0YV9vZmZzZXQsIG9mZjY0X3QgZGF0YV9zaXplKSB7CkBAIC0yMjE2LDYgKzI0MjAsOSBAQAogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlUcmFja0lELCBpZCk7CiAKICAgICBzaXplX3QgbWF0cml4T2Zmc2V0ID0gZHluU2l6ZSArIDE2OwpAQCAtMjI4Nyw3ICsyNDk0LDcgQEAKICAgICB1aW50MzJfdCBtZXRhZGF0YUtleSA9IDA7CiAgICAgY2hhciBjaHVua1s1XTsKICAgICBNYWtlRm91ckNDU3RyaW5nKG1QYXRoWzRdLCBjaHVuayk7Ci0gICAgQUxPR1YoIm1ldGE6ICVzIEAgJWxsZCIsIGNodW5rLCBvZmZzZXQpOworICAgIEFMT0dWKCJtZXRhOiAlcyBAICVsbGQiLCBjaHVuaywgKGxvbmcgbG9uZylvZmZzZXQpOwogICAgIHN3aXRjaCAoKGludDMyX3QpbVBhdGhbNF0pIHsKICAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ2EnLCAnbCcsICdiJyk6CiAgICAgICAgIHsKQEAgLTI0MDQsNiArMjYxMSw5IEBACiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGVsYXksIHBhZGRpbmc7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzc2NhbmYobUxhc3RDb21tZW50RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICUqeCAleCAleCAlKngiLCAmZGVsYXksICZwYWRkaW5nKSA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGRlbGF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZyk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTI2OTUsNiArMjkwNSw3IEBACiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkKKyAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewogICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKICAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlRVNEUykgewpAQCAtMjc3OSw2ICsyOTkwLDkgQEAKIAogICAgIGlmIChvYmplY3RUeXBlSW5kaWNhdGlvbiA9PSAweGUxKSB7CiAgICAgICAgIC8vIFRoaXMgaXNuJ3QgTVBFRzQgYXVkaW8gYXQgYWxsLCBpdCdzIFFDRUxQIDE0ay4uLgorICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFApOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQpAQCAtMjc5OSw3ICszMDEzLDcgQEAKICAgICB9CiAKICAgICBpZiAoa1VzZUhleER1bXApIHsKLSAgICAgICAgcHJpbnRmKCJFU0Qgb2Ygc2l6ZSAlZFxuIiwgY3NkX3NpemUpOworICAgICAgICBwcmludGYoIkVTRCBvZiBzaXplICV6dVxuIiwgY3NkX3NpemUpOwogICAgICAgICBoZXhkdW1wKGNzZCwgY3NkX3NpemUpOwogICAgIH0KIApAQCAtMjgyNyw2ICszMDQxLDkgQEAKICAgICAgICAgb2JqZWN0VHlwZSA9IDMyICsgYnIuZ2V0Qml0cyg2KTsKICAgICB9CiAKKyAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgLy9rZWVwIEFPVCB0eXBlCiAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUFBQ0FPVCwgb2JqZWN0VHlwZSk7CiAKQEAgLTI4MzUsMTIgKzMwNTIsMTEgQEAKICAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAwOwogICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAwOwogICAgIGlmIChmcmVxSW5kZXggPT0gMTUpIHsKLSAgICAgICAgaWYgKGNzZF9zaXplIDwgNSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQorICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDI4KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICBzYW1wbGVSYXRlID0gYnIuZ2V0Qml0cygyNCk7CiAgICAgICAgIG51bUNoYW5uZWxzID0gYnIuZ2V0Qml0cyg0KTsKICAgICB9IGVsc2UgeworICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIG51bUNoYW5uZWxzID0gYnIuZ2V0Qml0cyg0KTsKIAogICAgICAgICBpZiAoZnJlcUluZGV4ID09IDEzIHx8IGZyZXFJbmRleCA9PSAxNCkgewpAQCAtMjg1MSwxMiArMzA2NywxNCBAQAogICAgIH0KIAogICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsvL1NCUiBzcGVjaWZpYyBjb25maWcgcGVyIDE0NDk2LTMgdGFibGUgMS4xMworICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIHVpbnQzMl90IGV4dEZyZXFJbmRleCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgIGludDMyX3QgZXh0U2FtcGxlUmF0ZSBfX3VudXNlZDsKICAgICAgICAgaWYgKGV4dEZyZXFJbmRleCA9PSAxNSkgewogICAgICAgICAgICAgaWYgKGNzZF9zaXplIDwgOCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDI0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgZXh0U2FtcGxlUmF0ZSA9IGJyLmdldEJpdHMoMjQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGV4dEZyZXFJbmRleCA9PSAxMyB8fCBleHRGcmVxSW5kZXggPT0gMTQpIHsKQEAgLTI4OTMsMjAgKzMxMTEsMjQgQEAKIAogICAgIHsKICAgICAgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX1NCUiB8fCBvYmplY3RUeXBlID09IEFPVF9QUykgeworICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA1KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgb2JqZWN0VHlwZSA9IGJyLmdldEJpdHMoNSk7CiAKICAgICAgICAgICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9FU0NBUEUpIHsKKyAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDYpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSA9IDMyICsgYnIuZ2V0Qml0cyg2KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfQUFDX0xDIHx8IG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MQyB8fAogICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MRCB8fCBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfU0NBTCB8fAogICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0JTQUMpIHsKKyAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMikgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVMZW5ndGhGbGFnIF9fdW51c2VkID0gYnIuZ2V0Qml0cygxKTsKIAogICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkZXBlbmRzT25Db3JlQ29kZXIgPSBici5nZXRCaXRzKDEpOwogCiAgICAgICAgICAgICBpZiAoZGVwZW5kc09uQ29yZUNvZGVyICkgeworICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMTQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBjb3JlQ29kZXJEZWxheSBfX3VudXNlZCA9IGJyLmdldEJpdHMoMTQpOwogICAgICAgICAgICAgfQogCkBAIC0yOTI2LDcgKzMxNDgsNyBAQAogICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25GbGFnID0gMTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dXKCJjc2QgbWlzc2luZyBleHRlbnNpb24gZmxhZzsgYXNzdW1pbmcgJWQgZm9yIG9iamVjdCB0eXBlICV1LiIsCkBAIC0yOTM2LDYgKzMxNTgsOSBAQAogICAgICAgICAgICAgaWYgKG51bUNoYW5uZWxzID09IDApIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gMDsKICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxzTnVtID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDMyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRWxlbWVudEluc3RhbmNlVGFnIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFByb2ZpbGUgX191bnVzZWQgPSBici5nZXRCaXRzKDIpOwogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU2FtcGxpbmdGcmVxdWVuY3lJbmRleCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CkBAIC0yOTQ3LDM1ICszMTcyLDQ0IEBACiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1WYWxpZENjRWxlbWVudHMgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwogCiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNb25vTWl4ZG93blByZXNlbnQgPSBici5nZXRCaXRzKDEpOworCiAgICAgICAgICAgICAgICAgaWYgKE1vbm9NaXhkb3duUHJlc2VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNb25vTWl4ZG93bkVsZW1lbnROdW1iZXIgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFN0ZXJlb01peGRvd25QcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICBpZiAoU3RlcmVvTWl4ZG93blByZXNlbnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU3RlcmVvTWl4ZG93bkVsZW1lbnROdW1iZXIgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1hdHJpeE1peGRvd25JbmRleFByZXNlbnQgPSBici5nZXRCaXRzKDEpOwogICAgICAgICAgICAgICAgIGlmIChNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAzKSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1hdHJpeE1peGRvd25JbmRleCBfX3VudXNlZCA9IGJyLmdldEJpdHMoMik7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgUHNldWRvU3Vycm91bmRFbmFibGUgX191bnVzZWQgPSBici5nZXRCaXRzKDEpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGludCBpOwogICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDUpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRnJvbnRFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEZyb250RWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IEZyb250RWxlbWVudElzQ3BlID8gMiA6IDE7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA1KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNpZGVFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNpZGVFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gU2lkZUVsZW1lbnRJc0NwZSA/IDIgOiAxOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtQmFja0NoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBCYWNrRWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBCYWNrRWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IEJhY2tFbGVtZW50SXNDcGUgPyAyIDogMTsKQEAgLTI5ODMsNiArMzIxNyw3IEBACiAgICAgICAgICAgICAgICAgY2hhbm5lbHNFZmZlY3RpdmVOdW0gPSBjaGFubmVsc051bTsKIAogICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtTGZlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IExmZUVsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwogICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSAxOwogICAgICAgICAgICAgICAgIH0KQEAgLTI5OTcsNiArMzIzMiw5IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKKyAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgaW50MzJfdCBwcmV2U2FtcGxlUmF0ZTsKICAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZwcmV2U2FtcGxlUmF0ZSkpOwogCkBAIC0zMjA4LDcgKzM0NDYsNyBAQAogCiAgICAgY2hhciBjaHVua1s1XTsKICAgICBNYWtlRm91ckNDU3RyaW5nKGNodW5rX3R5cGUsIGNodW5rKTsKLSAgICBBTE9HVigiTVBFRzRTb3VyY2UgY2h1bmsgJXMgQCAlbGx4IiwgY2h1bmssICpvZmZzZXQpOworICAgIEFMT0dWKCJNUEVHNFNvdXJjZSBjaHVuayAlcyBAICUjbGx4IiwgY2h1bmssIChsb25nIGxvbmcpKm9mZnNldCk7CiAKICAgICBvZmY2NF90IGNodW5rX2RhdGFfc2l6ZSA9ICpvZmZzZXQgKyBjaHVua19zaXplIC0gZGF0YV9vZmZzZXQ7CiAKQEAgLTM2ODgsNyArMzkyNiw3IEBACiAgICAgICAgIHNhbXBsZUN0c09mZnNldCA9IDA7CiAgICAgfQogCi0gICAgaWYgKHNpemUgPCAob2ZmNjRfdClzYW1wbGVDb3VudCAqIGJ5dGVzUGVyU2FtcGxlKSB7CisgICAgaWYgKHNpemUgPCAob2ZmNjRfdCkoc2FtcGxlQ291bnQgKiBieXRlc1BlclNhbXBsZSkpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCkBAIC00NTAzLDcgKzQ3NDEsNyBAQAogCiAgICAgICAgIGNoYXIgY2h1bmtzdHJpbmdbNV07CiAgICAgICAgIE1ha2VGb3VyQ0NTdHJpbmcoY2h1bmtUeXBlLCBjaHVua3N0cmluZyk7Ci0gICAgICAgIEFMT0dWKCJzYXcgY2h1bmsgdHlwZSAlcywgc2l6ZSAlIiBQUkl1NjQgIiBAICVsbGQiLCBjaHVua3N0cmluZywgY2h1bmtTaXplLCBvZmZzZXQpOworICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJSIgUFJJdTY0ICIgQCAlbGxkIiwgY2h1bmtzdHJpbmcsIGNodW5rU2l6ZSwgKGxvbmcgbG9uZylvZmZzZXQpOwogICAgICAgICBzd2l0Y2ggKGNodW5rVHlwZSkgewogICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ2YnLCAndCcsICd5JywgJ3AnKToKICAgICAgICAgICAgIHsKQEAgLTQ1NjYsNyArNDgwNCw3IEBACiAgICAgICAgICptZXRhID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAoKm1ldGEpLT5zZXRJbnQ2NCgibWV0YS1kYXRhLXNpemUiLCBtb292QXRvbUVuZE9mZnNldCk7CiAKLSAgICAgICAgQUxPR1YoImZvdW5kIG1ldGFkYXRhIHNpemU6ICVsbGQiLCBtb292QXRvbUVuZE9mZnNldCk7CisgICAgICAgIEFMT0dWKCJmb3VuZCBtZXRhZGF0YSBzaXplOiAlbGxkIiwgKGxvbmcgbG9uZyltb292QXRvbUVuZE9mZnNldCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggODQ0YTAxOS4uNDdmMTE0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CkBAIC02Miw2ICs2MywxNiBAQAogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05hbFVuaXRUeXBlUGljUGFyYW1TZXQgPSAweDA4Owogc3RhdGljIGNvbnN0IGludDY0X3Qga0luaXRpYWxEZWxheVRpbWVVcyAgICAgPSA3MDAwMDBMTDsKIAorc3RhdGljIGNvbnN0IGNoYXIga01ldGFLZXlfVmVyc2lvbltdICAgID0gImNvbS5hbmRyb2lkLnZlcnNpb24iOworI2lmZGVmIFNIT1dfTU9ERUxfQlVJTEQKK3N0YXRpYyBjb25zdCBjaGFyIGtNZXRhS2V5X01vZGVsW10gICAgICA9ICJjb20uYW5kcm9pZC5tb2RlbCI7CitzdGF0aWMgY29uc3QgY2hhciBrTWV0YUtleV9CdWlsZFtdICAgICAgPSAiY29tLmFuZHJvaWQuYnVpbGQiOworI2VuZGlmCitzdGF0aWMgY29uc3QgY2hhciBrTWV0YUtleV9DYXB0dXJlRnBzW10gPSAiY29tLmFuZHJvaWQuY2FwdHVyZS5mcHMiOworCisvKiB1bmNvbW1lbnQgdG8gaW5jbHVkZSBtb2RlbCBhbmQgYnVpbGQgaW4gbWV0YSAqLworLy8jZGVmaW5lIFNIT1dfTU9ERUxfQlVJTEQgMQorCiBjbGFzcyBNUEVHNFdyaXRlcjo6VHJhY2sgewogcHVibGljOgogICAgIFRyYWNrKE1QRUc0V3JpdGVyICpvd25lciwgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsIHNpemVfdCB0cmFja0lkKTsKQEAgLTgzLDYgKzk0LDcgQEAKICAgICB2b2lkIGFkZENodW5rT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKICAgICBpbnQzMl90IGdldFRyYWNrSWQoKSBjb25zdCB7IHJldHVybiBtVHJhY2tJZDsgfQogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0Rm91ckNDRm9yTWltZShjb25zdCBjaGFyICptaW1lKTsKIAogcHJpdmF0ZToKICAgICBlbnVtIHsKQEAgLTEwMSw2ICsxMTMsOCBAQAogICAgICAgICAgICAgbUN1cnJUYWJsZUVudHJpZXNFbGVtZW50KE5VTEwpIHsKICAgICAgICAgICAgIENIRUNLX0dUKG1FbGVtZW50Q2FwYWNpdHksIDApOwogICAgICAgICAgICAgQ0hFQ0tfR1QobUVudHJ5Q2FwYWNpdHksIDApOworICAgICAgICAgICAgLy8gRW5zdXJlIG5vIGludGVnZXIgb3ZlcmZsb3cgb24gYWxsb2NhdGlvbiBpbiBhZGQoKS4KKyAgICAgICAgICAgIENIRUNLX0xUKG1FbnRyeUNhcGFjaXR5LCBVSU5UMzJfTUFYIC8gbUVsZW1lbnRDYXBhY2l0eSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBGcmVlIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LgpAQCAtMzQ1LDMxICszNTksNiBAQAogICAgIFRyYWNrICZvcGVyYXRvcj0oY29uc3QgVHJhY2sgJik7CiB9OwogCi1NUEVHNFdyaXRlcjo6TVBFRzRXcml0ZXIoY29uc3QgY2hhciAqZmlsZW5hbWUpCi0gICAgOiBtRmQoLTEpLAotICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKLSAgICAgIG1Jc1JlYWxUaW1lUmVjb3JkaW5nKHRydWUpLAotICAgICAgbVVzZTRCeXRlTmFsTGVuZ3RoKHRydWUpLAotICAgICAgbVVzZTMyQml0T2Zmc2V0KHRydWUpLAotICAgICAgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQoZmFsc2UpLAotICAgICAgbVBhdXNlZChmYWxzZSksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtV3JpdGVyVGhyZWFkU3RhcnRlZChmYWxzZSksCi0gICAgICBtT2Zmc2V0KDApLAotICAgICAgbU1kYXRPZmZzZXQoMCksCi0gICAgICBtRXN0aW1hdGVkTW9vdkJveFNpemUoMCksCi0gICAgICBtSW50ZXJsZWF2ZUR1cmF0aW9uVXMoMTAwMDAwMCksCi0gICAgICBtTGF0aXR1ZGV4MTAwMDAoMCksCi0gICAgICBtTG9uZ2l0dWRleDEwMDAwKDApLAotICAgICAgbUFyZUdlb1RhZ3NBdmFpbGFibGUoZmFsc2UpLAotICAgICAgbVN0YXJ0VGltZU9mZnNldE1zKC0xKSB7Ci0KLSAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7Ci0gICAgaWYgKG1GZCA+PSAwKSB7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKLSAgICB9Ci19Ci0KIE1QRUc0V3JpdGVyOjpNUEVHNFdyaXRlcihpbnQgZmQpCiAgICAgOiBtRmQoZHVwKGZkKSksCiAgICAgICBtSW5pdENoZWNrKG1GZCA8IDA/IE5PX0lOSVQ6IE9LKSwKQEAgLTM4MiwxMiArMzcxLDI5IEBACiAgICAgICBtV3JpdGVyVGhyZWFkU3RhcnRlZChmYWxzZSksCiAgICAgICBtT2Zmc2V0KDApLAogICAgICAgbU1kYXRPZmZzZXQoMCksCisgICAgICBtTW9vdkJveEJ1ZmZlcihOVUxMKSwKKyAgICAgIG1Nb292Qm94QnVmZmVyT2Zmc2V0KDApLAorICAgICAgbVdyaXRlTW9vdkJveFRvTWVtb3J5KGZhbHNlKSwKKyAgICAgIG1GcmVlQm94T2Zmc2V0KDApLAorICAgICAgbVN0cmVhbWFibGVGaWxlKGZhbHNlKSwKICAgICAgIG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSgwKSwKKyAgICAgIG1Nb292RXh0cmFTaXplKDApLAogICAgICAgbUludGVybGVhdmVEdXJhdGlvblVzKDEwMDAwMDApLAorICAgICAgbVRpbWVTY2FsZSgtMSksCisgICAgICBtU3RhcnRUaW1lc3RhbXBVcygtMWxsKSwKICAgICAgIG1MYXRpdHVkZXgxMDAwMCgwKSwKICAgICAgIG1Mb25naXR1ZGV4MTAwMDAoMCksCiAgICAgICBtQXJlR2VvVGFnc0F2YWlsYWJsZShmYWxzZSksCi0gICAgICBtU3RhcnRUaW1lT2Zmc2V0TXMoLTEpIHsKKyAgICAgIG1TdGFydFRpbWVPZmZzZXRNcygtMSksCisgICAgICBtTWV0YUtleXMobmV3IEFNZXNzYWdlKCkpIHsKKyAgICBhZGREZXZpY2VNZXRhKCk7CisKKyAgICAvLyBWZXJpZnkgbUZkIGlzIHNlZWthYmxlCisgICAgb2ZmNjRfdCBvZmYgPSBsc2VlazY0KG1GZCwgMCwgU0VFS19TRVQpOworICAgIGlmIChvZmYgPCAwKSB7CisgICAgICAgIEFMT0dFKCJjYW5ub3Qgc2VlayBtRmQ6ICVzICglZCkiLCBzdHJlcnJvcihlcnJubyksIGVycm5vKTsKKyAgICAgICAgcmVsZWFzZSgpOworICAgIH0KIH0KIAogTVBFRzRXcml0ZXI6On5NUEVHNFdyaXRlcigpIHsKQEAgLTQzNyw2ICs0NDMsMzMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKKy8vIHN0YXRpYworY29uc3QgY2hhciAqTVBFRzRXcml0ZXI6OlRyYWNrOjpnZXRGb3VyQ0NGb3JNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKKyAgICBpZiAobWltZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgeworICAgICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCBtaW1lKSkgeworICAgICAgICAgICAgcmV0dXJuICJzYW1yIjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsIG1pbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gInNhd2IiOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgbWltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAibXA0YSI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCBtaW1lKSkgeworICAgICAgICAgICAgcmV0dXJuICJtcDR2IjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCBtaW1lKSkgeworICAgICAgICAgICAgcmV0dXJuICJzMjYzIjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1pbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gImF2YzEiOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIlRyYWNrICglcykgb3RoZXIgdGhhbiB2aWRlbyBvciBhdWRpbyBpcyBub3Qgc3VwcG9ydGVkIiwgbWltZSk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCiBzdGF0dXNfdCBNUEVHNFdyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIGlmIChtU3RhcnRlZCkgewpAQCAtNDUyLDE0ICs0ODUsMTEgQEAKIAogICAgIENIRUNLKHNvdXJjZS5nZXQoKSAhPSBOVUxMKTsKIAotICAgIC8vIEEgdHJhY2sgb2YgdHlwZSBvdGhlciB0aGFuIHZpZGVvIG9yIGF1ZGlvIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKICAgICBib29sIGlzQXVkaW8gPSAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpOwotICAgIGJvb2wgaXNWaWRlbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNik7Ci0gICAgaWYgKCFpc0F1ZGlvICYmICFpc1ZpZGVvKSB7Ci0gICAgICAgIEFMT0dFKCJUcmFjayAoJXMpIG90aGVyIHRoYW4gdmlkZW8gb3IgYXVkaW8gaXMgbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICBtaW1lKTsKKyAgICBpZiAoVHJhY2s6OmdldEZvdXJDQ0Zvck1pbWUobWltZSkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbWltZSAnJXMnIiwgbWltZSk7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKQEAgLTUwNyw2ICs1MzcsMzQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgTVBFRzRXcml0ZXI6OmFkZERldmljZU1ldGEoKSB7CisgICAgLy8gYWRkIGRldmljZSBpbmZvIGFuZCBlc3RpbWF0ZSBzcGFjZSBpbiAnbW9vdicKKyAgICBjaGFyIHZhbFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHNpemVfdCBuOworICAgIC8vIG1ldGEgc2l6ZSBpcyBlc3RpbWF0ZWQgYnkgYWRkaW5nIHVwIHRoZSBmb2xsb3dpbmc6CisgICAgLy8gLSBtZXRhIGhlYWRlciBzdHJ1Y3R1cmVzLCB3aGljaCBvY2N1ciBvbmx5IG9uY2UgKHRvdGFsIDY2IGJ5dGVzKQorICAgIC8vIC0gc2l6ZSBmb3IgZWFjaCBrZXksIHdoaWNoIGNvbnNpc3RzIG9mIGEgZml4ZWQgaGVhZGVyICgzMiBieXRlcyksCisgICAgLy8gICBwbHVzIGtleSBsZW5ndGggYW5kIGRhdGEgbGVuZ3RoLgorICAgIG1Nb292RXh0cmFTaXplICs9IDY2OworICAgIGlmIChwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZSIsIHZhbCwgTlVMTCkKKyAgICAgICAgICAgICYmIChuID0gc3RybGVuKHZhbCkpID4gMCkgeworICAgICAgICBtTWV0YUtleXMtPnNldFN0cmluZyhrTWV0YUtleV9WZXJzaW9uLCB2YWwsIG4gKyAxKTsKKyAgICAgICAgbU1vb3ZFeHRyYVNpemUgKz0gc2l6ZW9mKGtNZXRhS2V5X1ZlcnNpb24pICsgbiArIDMyOworICAgIH0KKyNpZmRlZiBTSE9XX01PREVMX0JVSUxECisgICAgaWYgKHByb3BlcnR5X2dldCgicm8ucHJvZHVjdC5tb2RlbCIsIHZhbCwgTlVMTCkKKyAgICAgICAgICAgICYmIChuID0gc3RybGVuKHZhbCkpID4gMCkgeworICAgICAgICBtTWV0YUtleXMtPnNldFN0cmluZyhrTWV0YUtleV9Nb2RlbCwgdmFsLCBuICsgMSk7CisgICAgICAgIG1Nb292RXh0cmFTaXplICs9IHNpemVvZihrTWV0YUtleV9Nb2RlbCkgKyBuICsgMzI7CisgICAgfQorICAgIGlmIChwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLmRpc3BsYXkuaWQiLCB2YWwsIE5VTEwpCisgICAgICAgICAgICAmJiAobiA9IHN0cmxlbih2YWwpKSA+IDApIHsKKyAgICAgICAgbU1ldGFLZXlzLT5zZXRTdHJpbmcoa01ldGFLZXlfQnVpbGQsIHZhbCwgbiArIDEpOworICAgICAgICBtTW9vdkV4dHJhU2l6ZSArPSBzaXplb2Yoa01ldGFLZXlfQnVpbGQpICsgbiArIDMyOworICAgIH0KKyNlbmRpZgorfQorCiBpbnQ2NF90IE1QRUc0V3JpdGVyOjplc3RpbWF0ZU1vb3ZCb3hTaXplKGludDMyX3QgYml0UmF0ZSkgewogICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgaGlnaGx5IGV4cGVyaW1lbnRhbC9oZXVyaXNpdGljLgogICAgIC8vCkBAIC01NjAsNiArNjE4LDkgQEAKICAgICAgICAgc2l6ZSA9IE1BWF9NT09WX0JPWF9TSVpFOwogICAgIH0KIAorICAgIC8vIEFjY291bnQgZm9yIHRoZSBleHRyYSBzdHVmZiAoR2VvLCBtZXRhIGtleXMsIGV0Yy4pCisgICAgc2l6ZSArPSBtTW9vdkV4dHJhU2l6ZTsKKwogICAgIEFMT0dJKCJsaW1pdHM6ICUiIFBSSWQ2NCAiLyUiIFBSSWQ2NCAiIGJ5dGVzL3VzLCBiaXQgcmF0ZTogJWQgYnBzIGFuZCB0aGUiCiAgICAgICAgICAiIGVzdGltYXRlZCBtb292IHNpemUgJSIgUFJJZDY0ICIgYnl0ZXMiLAogICAgICAgICAgbU1heEZpbGVTaXplTGltaXRCeXRlcywgbU1heEZpbGVEdXJhdGlvbkxpbWl0VXMsIGJpdFJhdGUsIHNpemUpOwpAQCAtOTczLDYgKzEwMzQsNyBAQAogICAgIGlmIChtQXJlR2VvVGFnc0F2YWlsYWJsZSkgewogICAgICAgICB3cml0ZVVkdGFCb3goKTsKICAgICB9CisgICAgd3JpdGVNZXRhQm94KCk7CiAgICAgaW50MzJfdCBpZCA9IDE7CiAgICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCwgKytpZCkgewpAQCAtMTE0Miw2ICsxMjA0LDE0IEBACiAgICAgcmV0dXJuIGJ5dGVzOwogfQogCit2b2lkIE1QRUc0V3JpdGVyOjpiZWdpbkJveCh1aW50MzJfdCBpZCkgeworICAgIG1Cb3hlcy5wdXNoX2JhY2sobVdyaXRlTW9vdkJveFRvTWVtb3J5PworICAgICAgICAgICAgbU1vb3ZCb3hCdWZmZXJPZmZzZXQ6IG1PZmZzZXQpOworCisgICAgd3JpdGVJbnQzMigwKTsKKyAgICB3cml0ZUludDMyKGlkKTsKK30KKwogdm9pZCBNUEVHNFdyaXRlcjo6YmVnaW5Cb3goY29uc3QgY2hhciAqZm91cmNjKSB7CiAgICAgQ0hFQ0tfRVEoc3RybGVuKGZvdXJjYyksIDQpOwogCkBAIC0xMjY2LDYgKzEzMzYsMTggQEAKICAgICBtTGF0aXR1ZGV4MTAwMDAgPSBsYXRpdHVkZXgxMDAwMDsKICAgICBtTG9uZ2l0dWRleDEwMDAwID0gbG9uZ2l0dWRleDEwMDAwOwogICAgIG1BcmVHZW9UYWdzQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICBtTW9vdkV4dHJhU2l6ZSArPSAzMDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0V3JpdGVyOjpzZXRDYXB0dXJlUmF0ZShmbG9hdCBjYXB0dXJlRnBzKSB7CisgICAgaWYgKGNhcHR1cmVGcHMgPD0gMC4wZikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1NZXRhS2V5cy0+c2V0RmxvYXQoa01ldGFLZXlfQ2FwdHVyZUZwcywgY2FwdHVyZUZwcyk7CisgICAgbU1vb3ZFeHRyYVNpemUgKz0gc2l6ZW9mKGtNZXRhS2V5X0NhcHR1cmVGcHMpICsgNCArIDMyOworCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yNjg5LDE3ICsyNzcxLDEzIEBACiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBib29sIHN1Y2Nlc3MgPSBtTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CiAgICAgQ0hFQ0soc3VjY2Vzcyk7Ci0gICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCBtaW1lKSkgewotICAgICAgICBtT3duZXItPmJlZ2luQm94KCJtcDR2Iik7Ci0gICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCBtaW1lKSkgewotICAgICAgICBtT3duZXItPmJlZ2luQm94KCJzMjYzIik7Ci0gICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1pbWUpKSB7Ci0gICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImF2YzEiKTsKLSAgICB9IGVsc2UgeworICAgIGNvbnN0IGNoYXIgKmZvdXJjYyA9IGdldEZvdXJDQ0Zvck1pbWUobWltZSk7CisgICAgaWYgKGZvdXJjYyA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJVbmtub3duIG1pbWUgdHlwZSAnJXMnLiIsIG1pbWUpOwogICAgICAgICBDSEVDSyghInNob3VsZCBub3QgYmUgaGVyZSwgdW5rbm93biBtaW1lIHR5cGUuIik7CiAgICAgfQogCisgICAgbU93bmVyLT5iZWdpbkJveChmb3VyY2MpOyAgICAgICAgLy8gdmlkZW8gZm9ybWF0CiAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gcmVzZXJ2ZWQKICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAogICAgIG1Pd25lci0+d3JpdGVJbnQxNigxKTsgICAgICAgICAgIC8vIGRhdGEgcmVmIGluZGV4CkBAIC0yNzQzLDE0ICsyODIxLDggQEAKICAgICBjb25zdCBjaGFyICptaW1lOwogICAgIGJvb2wgc3VjY2VzcyA9IG1NZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKICAgICBDSEVDSyhzdWNjZXNzKTsKLSAgICBjb25zdCBjaGFyICpmb3VyY2MgPSBOVUxMOwotICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsIG1pbWUpKSB7Ci0gICAgICAgIGZvdXJjYyA9ICJzYW1yIjsKLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgbWltZSkpIHsKLSAgICAgICAgZm91cmNjID0gInNhd2IiOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCBtaW1lKSkgewotICAgICAgICBmb3VyY2MgPSAibXA0YSI7Ci0gICAgfSBlbHNlIHsKKyAgICBjb25zdCBjaGFyICpmb3VyY2MgPSBnZXRGb3VyQ0NGb3JNaW1lKG1pbWUpOworICAgIGlmIChmb3VyY2MgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiVW5rbm93biBtaW1lIHR5cGUgJyVzJy4iLCBtaW1lKTsKICAgICAgICAgQ0hFQ0soISJzaG91bGQgbm90IGJlIGhlcmUsIHVua25vd24gbWltZSB0eXBlLiIpOwogICAgIH0KQEAgLTMwOTksNiArMzE3MSwxMDMgQEAKICAgICBlbmRCb3goKTsKIH0KIAordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVIZGxyKCkgeworICAgIGJlZ2luQm94KCJoZGxyIik7CisgICAgd3JpdGVJbnQzMigwKTsgLy8gVmVyc2lvbiwgRmxhZ3MKKyAgICB3cml0ZUludDMyKDApOyAvLyBQcmVkZWZpbmVkCisgICAgd3JpdGVGb3VyY2MoIm1kdGEiKTsKKyAgICB3cml0ZUludDMyKDApOyAvLyBSZXNlcnZlZFswXQorICAgIHdyaXRlSW50MzIoMCk7IC8vIFJlc2VydmVkWzFdCisgICAgd3JpdGVJbnQzMigwKTsgLy8gUmVzZXJ2ZWRbMl0KKyAgICB3cml0ZUludDgoMCk7ICAvLyBOYW1lIChlbXB0eSkKKyAgICBlbmRCb3goKTsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVLZXlzKCkgeworICAgIHNpemVfdCBjb3VudCA9IG1NZXRhS2V5cy0+Y291bnRFbnRyaWVzKCk7CisKKyAgICBiZWdpbkJveCgia2V5cyIpOworICAgIHdyaXRlSW50MzIoMCk7ICAgICAvLyBWZXJzaW9uLCBGbGFncworICAgIHdyaXRlSW50MzIoY291bnQpOyAvLyBFbnRyeV9jb3VudAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBBTWVzc2FnZTo6VHlwZSB0eXBlOworICAgICAgICBjb25zdCBjaGFyICprZXkgPSBtTWV0YUtleXMtPmdldEVudHJ5TmFtZUF0KGksICZ0eXBlKTsKKyAgICAgICAgc2l6ZV90IG4gPSBzdHJsZW4oa2V5KTsKKyAgICAgICAgd3JpdGVJbnQzMihuICsgOCk7CisgICAgICAgIHdyaXRlRm91cmNjKCJtZHRhIik7CisgICAgICAgIHdyaXRlKGtleSwgbik7IC8vIHdyaXRlIHdpdGhvdXQgdGhlIFwwCisgICAgfQorICAgIGVuZEJveCgpOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZUlsc3QoKSB7CisgICAgc2l6ZV90IGNvdW50ID0gbU1ldGFLZXlzLT5jb3VudEVudHJpZXMoKTsKKworICAgIGJlZ2luQm94KCJpbHN0Iik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGJlZ2luQm94KGkgKyAxKTsgLy8ga2V5IGlkICgxLWJhc2VkKQorICAgICAgICBiZWdpbkJveCgiZGF0YSIpOworICAgICAgICBBTWVzc2FnZTo6VHlwZSB0eXBlOworICAgICAgICBjb25zdCBjaGFyICprZXkgPSBtTWV0YUtleXMtPmdldEVudHJ5TmFtZUF0KGksICZ0eXBlKTsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZVN0cmluZzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHZhbDsKKyAgICAgICAgICAgICAgICBDSEVDSyhtTWV0YUtleXMtPmZpbmRTdHJpbmcoa2V5LCAmdmFsKSk7CisgICAgICAgICAgICAgICAgd3JpdGVJbnQzMigxKTsgLy8gdHlwZSA9IFVURjgKKyAgICAgICAgICAgICAgICB3cml0ZUludDMyKDApOyAvLyBkZWZhdWx0IGNvdW50cnkvbGFuZ3VhZ2UKKyAgICAgICAgICAgICAgICB3cml0ZSh2YWwuY19zdHIoKSwgc3RybGVuKHZhbC5jX3N0cigpKSk7IC8vIHdyaXRlIHdpdGhvdXQgXDAKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVGbG9hdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB2YWw7CisgICAgICAgICAgICAgICAgQ0hFQ0sobU1ldGFLZXlzLT5maW5kRmxvYXQoa2V5LCAmdmFsKSk7CisgICAgICAgICAgICAgICAgd3JpdGVJbnQzMigyMyk7IC8vIHR5cGUgPSBmbG9hdDMyCisgICAgICAgICAgICAgICAgd3JpdGVJbnQzMigwKTsgIC8vIGRlZmF1bHQgY291bnRyeS9sYW5ndWFnZQorICAgICAgICAgICAgICAgIHdyaXRlSW50MzIoKnJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCAqPigmdmFsKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50MzI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB2YWw7CisgICAgICAgICAgICAgICAgQ0hFQ0sobU1ldGFLZXlzLT5maW5kSW50MzIoa2V5LCAmdmFsKSk7CisgICAgICAgICAgICAgICAgd3JpdGVJbnQzMig2Nyk7IC8vIHR5cGUgPSBzaWduZWQgaW50MzIKKyAgICAgICAgICAgICAgICB3cml0ZUludDMyKDApOyAgLy8gZGVmYXVsdCBjb3VudHJ5L2xhbmd1YWdlCisgICAgICAgICAgICAgICAgd3JpdGVJbnQzMih2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFMT0dXKCJVbnN1cHBvcnRlZCBrZXkgdHlwZSwgd3JpdGluZyAwIGluc3RlYWQiKTsKKyAgICAgICAgICAgICAgICB3cml0ZUludDMyKDc3KTsgLy8gdHlwZSA9IHVuc2lnbmVkIGludDMyCisgICAgICAgICAgICAgICAgd3JpdGVJbnQzMigwKTsgIC8vIGRlZmF1bHQgY291bnRyeS9sYW5ndWFnZQorICAgICAgICAgICAgICAgIHdyaXRlSW50MzIoMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZW5kQm94KCk7IC8vIGRhdGEKKyAgICAgICAgZW5kQm94KCk7IC8vIGtleSBpZAorICAgIH0KKyAgICBlbmRCb3goKTsgLy8gaWxzdAorfQorCit2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZU1ldGFCb3goKSB7CisgICAgc2l6ZV90IGNvdW50ID0gbU1ldGFLZXlzLT5jb3VudEVudHJpZXMoKTsKKyAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYmVnaW5Cb3goIm1ldGEiKTsKKyAgICB3cml0ZUhkbHIoKTsKKyAgICB3cml0ZUtleXMoKTsKKyAgICB3cml0ZUlsc3QoKTsKKyAgICBlbmRCb3goKTsKK30KKwogLyoKICAqIEdlb2RhdGEgaXMgc3RvcmVkIGFjY29yZGluZyB0byBJU08tNjcwOSBzdGFuZGFyZC4KICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNsb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjQxZTRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5jcHAKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhQ2xvY2siCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK01lZGlhQ2xvY2s6Ok1lZGlhQ2xvY2soKQorICAgIDogbUFuY2hvclRpbWVNZWRpYVVzKC0xKSwKKyAgICAgIG1BbmNob3JUaW1lUmVhbFVzKC0xKSwKKyAgICAgIG1NYXhUaW1lTWVkaWFVcyhJTlQ2NF9NQVgpLAorICAgICAgbVN0YXJ0aW5nVGltZU1lZGlhVXMoLTEpLAorICAgICAgbVBsYXliYWNrUmF0ZSgxLjApIHsKK30KKworTWVkaWFDbG9jazo6fk1lZGlhQ2xvY2soKSB7Cit9CisKK3ZvaWQgTWVkaWFDbG9jazo6c2V0U3RhcnRpbmdUaW1lTWVkaWEoaW50NjRfdCBzdGFydGluZ1RpbWVNZWRpYVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtU3RhcnRpbmdUaW1lTWVkaWFVcyA9IHN0YXJ0aW5nVGltZU1lZGlhVXM7Cit9CisKK3ZvaWQgTWVkaWFDbG9jazo6Y2xlYXJBbmNob3IoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSAtMTsKKyAgICBtQW5jaG9yVGltZVJlYWxVcyA9IC0xOworfQorCit2b2lkIE1lZGlhQ2xvY2s6OnVwZGF0ZUFuY2hvcigKKyAgICAgICAgaW50NjRfdCBhbmNob3JUaW1lTWVkaWFVcywKKyAgICAgICAgaW50NjRfdCBhbmNob3JUaW1lUmVhbFVzLAorICAgICAgICBpbnQ2NF90IG1heFRpbWVNZWRpYVVzKSB7CisgICAgaWYgKGFuY2hvclRpbWVNZWRpYVVzIDwgMCB8fCBhbmNob3JUaW1lUmVhbFVzIDwgMCkgeworICAgICAgICBBTE9HVygicmVqZWN0IGFuY2hvciB0aW1lIHNpbmNlIGl0IGlzIG5lZ2F0aXZlLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpbnQ2NF90IG5vd01lZGlhVXMgPQorICAgICAgICBhbmNob3JUaW1lTWVkaWFVcyArIChub3dVcyAtIGFuY2hvclRpbWVSZWFsVXMpICogKGRvdWJsZSltUGxheWJhY2tSYXRlOworICAgIGlmIChub3dNZWRpYVVzIDwgMCkgeworICAgICAgICBBTE9HVygicmVqZWN0IGFuY2hvciB0aW1lIHNpbmNlIGl0IGxlYWRzIHRvIG5lZ2F0aXZlIG1lZGlhIHRpbWUuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUFuY2hvclRpbWVSZWFsVXMgPSBub3dVczsKKyAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSBub3dNZWRpYVVzOworICAgIG1NYXhUaW1lTWVkaWFVcyA9IG1heFRpbWVNZWRpYVVzOworfQorCit2b2lkIE1lZGlhQ2xvY2s6OnVwZGF0ZU1heFRpbWVNZWRpYShpbnQ2NF90IG1heFRpbWVNZWRpYVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtTWF4VGltZU1lZGlhVXMgPSBtYXhUaW1lTWVkaWFVczsKK30KKwordm9pZCBNZWRpYUNsb2NrOjpzZXRQbGF5YmFja1JhdGUoZmxvYXQgcmF0ZSkgeworICAgIENIRUNLX0dFKHJhdGUsIDAuMCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUFuY2hvclRpbWVSZWFsVXMgPT0gLTEpIHsKKyAgICAgICAgbVBsYXliYWNrUmF0ZSA9IHJhdGU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBtQW5jaG9yVGltZU1lZGlhVXMgKz0gKG5vd1VzIC0gbUFuY2hvclRpbWVSZWFsVXMpICogKGRvdWJsZSltUGxheWJhY2tSYXRlOworICAgIGlmIChtQW5jaG9yVGltZU1lZGlhVXMgPCAwKSB7CisgICAgICAgIEFMT0dXKCJzZXRSYXRlOiBhbmNob3IgdGltZSBzaG91bGQgbm90IGJlIG5lZ2F0aXZlLCBzZXQgdG8gMC4iKTsKKyAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzID0gMDsKKyAgICB9CisgICAgbUFuY2hvclRpbWVSZWFsVXMgPSBub3dVczsKKyAgICBtUGxheWJhY2tSYXRlID0gcmF0ZTsKK30KKworZmxvYXQgTWVkaWFDbG9jazo6Z2V0UGxheWJhY2tSYXRlKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1QbGF5YmFja1JhdGU7Cit9CisKK3N0YXR1c190IE1lZGlhQ2xvY2s6OmdldE1lZGlhVGltZSgKKyAgICAgICAgaW50NjRfdCByZWFsVXMsIGludDY0X3QgKm91dE1lZGlhVXMsIGJvb2wgYWxsb3dQYXN0TWF4VGltZSkgY29uc3QgeworICAgIGlmIChvdXRNZWRpYVVzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBnZXRNZWRpYVRpbWVfbChyZWFsVXMsIG91dE1lZGlhVXMsIGFsbG93UGFzdE1heFRpbWUpOworfQorCitzdGF0dXNfdCBNZWRpYUNsb2NrOjpnZXRNZWRpYVRpbWVfbCgKKyAgICAgICAgaW50NjRfdCByZWFsVXMsIGludDY0X3QgKm91dE1lZGlhVXMsIGJvb2wgYWxsb3dQYXN0TWF4VGltZSkgY29uc3QgeworICAgIGlmIChtQW5jaG9yVGltZVJlYWxVcyA9PSAtMSkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpbnQ2NF90IG1lZGlhVXMgPSBtQW5jaG9yVGltZU1lZGlhVXMKKyAgICAgICAgICAgICsgKHJlYWxVcyAtIG1BbmNob3JUaW1lUmVhbFVzKSAqIChkb3VibGUpbVBsYXliYWNrUmF0ZTsKKyAgICBpZiAobWVkaWFVcyA+IG1NYXhUaW1lTWVkaWFVcyAmJiAhYWxsb3dQYXN0TWF4VGltZSkgeworICAgICAgICBtZWRpYVVzID0gbU1heFRpbWVNZWRpYVVzOworICAgIH0KKyAgICBpZiAobWVkaWFVcyA8IG1TdGFydGluZ1RpbWVNZWRpYVVzKSB7CisgICAgICAgIG1lZGlhVXMgPSBtU3RhcnRpbmdUaW1lTWVkaWFVczsKKyAgICB9CisgICAgaWYgKG1lZGlhVXMgPCAwKSB7CisgICAgICAgIG1lZGlhVXMgPSAwOworICAgIH0KKyAgICAqb3V0TWVkaWFVcyA9IG1lZGlhVXM7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYUNsb2NrOjpnZXRSZWFsVGltZUZvcigKKyAgICAgICAgaW50NjRfdCB0YXJnZXRNZWRpYVVzLCBpbnQ2NF90ICpvdXRSZWFsVXMpIGNvbnN0IHsKKyAgICBpZiAob3V0UmVhbFVzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtUGxheWJhY2tSYXRlID09IDAuMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpbnQ2NF90IG5vd01lZGlhVXM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIGdldE1lZGlhVGltZV9sKG5vd1VzLCAmbm93TWVkaWFVcywgdHJ1ZSAvKiBhbGxvd1Bhc3RNYXhUaW1lICovKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgICpvdXRSZWFsVXMgPSAodGFyZ2V0TWVkaWFVcyAtIG5vd01lZGlhVXMpIC8gKGRvdWJsZSltUGxheWJhY2tSYXRlICsgbm93VXM7CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAppbmRleCA2Y2ExMjNhLi5jZDU5NzA5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcApAQCAtMjEsMTAgKzIxLDE1IEBACiAjaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKICNpbmNsdWRlICJpbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCIKIAotI2luY2x1ZGUgPGJpbmRlci9JQmF0dGVyeVN0YXRzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMzYsODUgKzQxLDEzMSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUZpbHRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTmF0aXZlV2luZG93V3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUGVyc2lzdGVudFN1cmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBNZWRpYUNvZGVjOjpCYXR0ZXJ5Tm90aWZpZXIgOiBwdWJsaWMgU2luZ2xldG9uPEJhdHRlcnlOb3RpZmllcj4gewotICAgIEJhdHRlcnlOb3RpZmllcigpOworc3RhdGljIGludDY0X3QgZ2V0SWQoc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50KSB7CisgICAgcmV0dXJuIChpbnQ2NF90KSBjbGllbnQuZ2V0KCk7Cit9CiAKLSAgICB2b2lkIG5vdGVTdGFydFZpZGVvKCk7Ci0gICAgdm9pZCBub3RlU3RvcFZpZGVvKCk7Ci0gICAgdm9pZCBub3RlU3RhcnRBdWRpbygpOwotICAgIHZvaWQgbm90ZVN0b3BBdWRpbygpOworc3RhdGljIGJvb2wgaXNSZXNvdXJjZUVycm9yKHN0YXR1c190IGVycikgeworICAgIHJldHVybiAoZXJyID09IE5PX01FTU9SWSk7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQga01heFJldHJ5ID0gMjsKKworc3RydWN0IFJlc291cmNlTWFuYWdlckNsaWVudCA6IHB1YmxpYyBCblJlc291cmNlTWFuYWdlckNsaWVudCB7CisgICAgUmVzb3VyY2VNYW5hZ2VyQ2xpZW50KE1lZGlhQ29kZWMqIGNvZGVjKSA6IG1NZWRpYUNvZGVjKGNvZGVjKSB7fQorCisgICAgdmlydHVhbCBib29sIHJlY2xhaW1SZXNvdXJjZSgpIHsKKyAgICAgICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBtTWVkaWFDb2RlYy5wcm9tb3RlKCk7CisgICAgICAgIGlmIChjb2RlYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyBjb2RlYyBpcyBhbHJlYWR5IGdvbmUuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb2RlYy0+cmVjbGFpbSgpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IGZhaWxlZCB0byByZWxlYXNlIGNvZGVjIHdpdGggZXJyICVkIiwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGVyciA9PSBPSyk7CisgICAgfQorCisgICAgdmlydHVhbCBTdHJpbmc4IGdldE5hbWUoKSB7CisgICAgICAgIFN0cmluZzggcmV0OworICAgICAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYyA9IG1NZWRpYUNvZGVjLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIGNvZGVjIGlzIGFscmVhZHkgZ29uZS4KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBBU3RyaW5nIG5hbWU7CisgICAgICAgIGlmIChjb2RlYy0+Z2V0TmFtZSgmbmFtZSkgPT0gT0spIHsKKyAgICAgICAgICAgIHJldC5zZXRUbyhuYW1lLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+UmVzb3VyY2VNYW5hZ2VyQ2xpZW50KCkge30KIAogcHJpdmF0ZToKLSAgICBpbnQzMl90IG1WaWRlb1JlZkNvdW50OwotICAgIGludDMyX3QgbUF1ZGlvUmVmQ291bnQ7Ci0gICAgc3A8SUJhdHRlcnlTdGF0cz4gbUJhdHRlcnlTdGF0U2VydmljZTsKKyAgICB3cDxNZWRpYUNvZGVjPiBtTWVkaWFDb2RlYzsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlc291cmNlTWFuYWdlckNsaWVudCk7CiB9OwogCi1BTkRST0lEX1NJTkdMRVRPTl9TVEFUSUNfSU5TVEFOQ0UoTWVkaWFDb2RlYzo6QmF0dGVyeU5vdGlmaWVyKQotCi1NZWRpYUNvZGVjOjpCYXR0ZXJ5Tm90aWZpZXI6OkJhdHRlcnlOb3RpZmllcigpIDoKLSAgICBtVmlkZW9SZWZDb3VudCgwKSwKLSAgICBtQXVkaW9SZWZDb3VudCgwKSB7Ci0gICAgLy8gZ2V0IGJhdHRlcnkgc2VydmljZQotICAgIGNvbnN0IHNwPElTZXJ2aWNlTWFuYWdlcj4gc20oZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCkpOwotICAgIGlmIChzbSAhPSBOVUxMKSB7Ci0gICAgICAgIGNvbnN0IFN0cmluZzE2IG5hbWUoImJhdHRlcnlzdGF0cyIpOwotICAgICAgICBtQmF0dGVyeVN0YXRTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUJhdHRlcnlTdGF0cz4oc20tPmdldFNlcnZpY2UobmFtZSkpOwotICAgICAgICBpZiAobUJhdHRlcnlTdGF0U2VydmljZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYmF0dGVyeXN0YXRzIHNlcnZpY2UgdW5hdmFpbGFibGUhIik7Ci0gICAgICAgIH0KK01lZGlhQ29kZWM6OlJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eTo6UmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5KHBpZF90IHBpZCkKKyAgICAgICAgOiBtUGlkKHBpZCkgeworICAgIGlmIChtUGlkID09IE1lZGlhQ29kZWM6OmtOb1BpZCkgeworICAgICAgICBtUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIH0KIH0KIAotdm9pZCBNZWRpYUNvZGVjOjpCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdGFydFZpZGVvKCkgewotICAgIGlmIChtVmlkZW9SZWZDb3VudCA9PSAwICYmIG1CYXR0ZXJ5U3RhdFNlcnZpY2UgIT0gTlVMTCkgewotICAgICAgICBtQmF0dGVyeVN0YXRTZXJ2aWNlLT5ub3RlU3RhcnRWaWRlbyhBSURfTUVESUEpOworTWVkaWFDb2RlYzo6UmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5Ojp+UmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5KCkgeworICAgIGlmIChtU2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1TZXJ2aWNlKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKICAgICB9Ci0gICAgbVZpZGVvUmVmQ291bnQrKzsKIH0KIAotdm9pZCBNZWRpYUNvZGVjOjpCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdG9wVmlkZW8oKSB7Ci0gICAgaWYgKG1WaWRlb1JlZkNvdW50ID09IDApIHsKLSAgICAgICAgQUxPR1coIkJhdHRlcnlOb3RpZmllcjo6bm90ZVN0b3AoKTogdmlkZW8gcmVmY291bnQgaXMgYnJva2VuISIpOwordm9pZCBNZWRpYUNvZGVjOjpSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHk6OmluaXQoKSB7CisgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5yZXNvdXJjZV9tYW5hZ2VyIikpOworICAgIG1TZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SVJlc291cmNlTWFuYWdlclNlcnZpY2U+KGJpbmRlcik7CisgICAgaWYgKG1TZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZSIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotCi0gICAgbVZpZGVvUmVmQ291bnQtLTsKLSAgICBpZiAobVZpZGVvUmVmQ291bnQgPT0gMCAmJiBtQmF0dGVyeVN0YXRTZXJ2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgbUJhdHRlcnlTdGF0U2VydmljZS0+bm90ZVN0b3BWaWRlbyhBSURfTUVESUEpOwotICAgIH0KKyAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtU2VydmljZSktPmxpbmtUb0RlYXRoKHRoaXMpOwogfQogCi12b2lkIE1lZGlhQ29kZWM6OkJhdHRlcnlOb3RpZmllcjo6bm90ZVN0YXJ0QXVkaW8oKSB7Ci0gICAgaWYgKG1BdWRpb1JlZkNvdW50ID09IDAgJiYgbUJhdHRlcnlTdGF0U2VydmljZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1CYXR0ZXJ5U3RhdFNlcnZpY2UtPm5vdGVTdGFydEF1ZGlvKEFJRF9NRURJQSk7Ci0gICAgfQotICAgIG1BdWRpb1JlZkNvdW50Kys7Cit2b2lkIE1lZGlhQ29kZWM6OlJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgLyp3aG8qLykgeworICAgIEFMT0dXKCJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIGRpZWQuIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtU2VydmljZS5jbGVhcigpOwogfQogCi12b2lkIE1lZGlhQ29kZWM6OkJhdHRlcnlOb3RpZmllcjo6bm90ZVN0b3BBdWRpbygpIHsKLSAgICBpZiAobUF1ZGlvUmVmQ291bnQgPT0gMCkgewotICAgICAgICBBTE9HVygiQmF0dGVyeU5vdGlmaWVyOjpub3RlU3RvcCgpOiBhdWRpbyByZWZjb3VudCBpcyBicm9rZW4hIik7Cit2b2lkIE1lZGlhQ29kZWM6OlJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eTo6YWRkUmVzb3VyY2UoCisgICAgICAgIGludDY0X3QgY2xpZW50SWQsCisgICAgICAgIGNvbnN0IHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudCwKKyAgICAgICAgY29uc3QgVmVjdG9yPE1lZGlhUmVzb3VyY2U+ICZyZXNvdXJjZXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtU2VydmljZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0KLSAgICBtQXVkaW9SZWZDb3VudC0tOwotICAgIGlmIChtQXVkaW9SZWZDb3VudCA9PSAwICYmIG1CYXR0ZXJ5U3RhdFNlcnZpY2UgIT0gTlVMTCkgewotICAgICAgICBtQmF0dGVyeVN0YXRTZXJ2aWNlLT5ub3RlU3RvcEF1ZGlvKEFJRF9NRURJQSk7Ci0gICAgfQorICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShtUGlkLCBjbGllbnRJZCwgY2xpZW50LCByZXNvdXJjZXMpOwogfQorCit2b2lkIE1lZGlhQ29kZWM6OlJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eTo6cmVtb3ZlUmVzb3VyY2UoaW50NjRfdCBjbGllbnRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1TZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtU2VydmljZS0+cmVtb3ZlUmVzb3VyY2UobVBpZCwgY2xpZW50SWQpOworfQorCitib29sIE1lZGlhQ29kZWM6OlJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eTo6cmVjbGFpbVJlc291cmNlKAorICAgICAgICBjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gJnJlc291cmNlcykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1TZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShtUGlkLCByZXNvdXJjZXMpOworfQorCiAvLyBzdGF0aWMKIHNwPE1lZGlhQ29kZWM+IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZSgKLSAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgY29uc3QgY2hhciAqbWltZSwgYm9vbCBlbmNvZGVyLCBzdGF0dXNfdCAqZXJyKSB7Ci0gICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBuZXcgTWVkaWFDb2RlYyhsb29wZXIpOworICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBjaGFyICptaW1lLCBib29sIGVuY29kZXIsIHN0YXR1c190ICplcnIsIHBpZF90IHBpZCkgeworICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gbmV3IE1lZGlhQ29kZWMobG9vcGVyLCBwaWQpOwogCiAgICAgY29uc3Qgc3RhdHVzX3QgcmV0ID0gY29kZWMtPmluaXQobWltZSwgdHJ1ZSAvKiBuYW1lSXNUeXBlICovLCBlbmNvZGVyKTsKICAgICBpZiAoZXJyICE9IE5VTEwpIHsKQEAgLTEyNSw4ICsxNzYsOCBAQAogCiAvLyBzdGF0aWMKIHNwPE1lZGlhQ29kZWM+IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZSgKLSAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgY29uc3QgY2hhciAqbmFtZSwgc3RhdHVzX3QgKmVycikgewotICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gbmV3IE1lZGlhQ29kZWMobG9vcGVyKTsKKyAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgY29uc3QgY2hhciAqbmFtZSwgc3RhdHVzX3QgKmVyciwgcGlkX3QgcGlkKSB7CisgICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBuZXcgTWVkaWFDb2RlYyhsb29wZXIsIHBpZCk7CiAKICAgICBjb25zdCBzdGF0dXNfdCByZXQgPSBjb2RlYy0+aW5pdChuYW1lLCBmYWxzZSAvKiBuYW1lSXNUeXBlICovLCBmYWxzZSAvKiBlbmNvZGVyICovKTsKICAgICBpZiAoZXJyICE9IE5VTEwpIHsKQEAgLTEzNSwyNSArMTg2LDgyIEBACiAgICAgcmV0dXJuIHJldCA9PSBPSyA/IGNvZGVjIDogTlVMTDsgLy8gTlVMTCBkZWFsbG9jYXRlcyBjb2RlYy4KIH0KIAotTWVkaWFDb2RlYzo6TWVkaWFDb2RlYyhjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyKQorLy8gc3RhdGljCitzcDxQZXJzaXN0ZW50U3VyZmFjZT4gTWVkaWFDb2RlYzo6Q3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgpIHsKKyAgICBPTVhDbGllbnQgY2xpZW50OworICAgIENIRUNLX0VRKGNsaWVudC5jb25uZWN0KCksIChzdGF0dXNfdClPSyk7CisgICAgc3A8SU9NWD4gb214ID0gY2xpZW50LmludGVyZmFjZSgpOworCisgICAgY29uc3Qgc3A8SU1lZGlhQ29kZWNMaXN0PiBtZWRpYUNvZGVjTGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOworICAgIGlmIChtZWRpYUNvZGVjTGlzdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIE1lZGlhQ29kZWNMaXN0ISIpOworICAgICAgICByZXR1cm4gTlVMTDsgLy8gaWYgY2FsbGVkIGZyb20gSmF2YSBzaG91bGQgcmFpc2UgSU9FeGNlcHRpb24KKyAgICB9CisKKyAgICBBU3RyaW5nIHRtcDsKKyAgICBzcDxBTWVzc2FnZT4gZ2xvYmFsU2V0dGluZ3MgPSBtZWRpYUNvZGVjTGlzdC0+Z2V0R2xvYmFsU2V0dGluZ3MoKTsKKyAgICBpZiAoZ2xvYmFsU2V0dGluZ3MgPT0gTlVMTCB8fCAhZ2xvYmFsU2V0dGluZ3MtPmZpbmRTdHJpbmcoCisgICAgICAgICAgICBrTWF4RW5jb2RlcklucHV0QnVmZmVycywgJnRtcCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgZW5jb2RlciBpbnB1dCBidWZmZXIgY291bnQhIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGludDMyX3QgYnVmZmVyQ291bnQgPSBzdHJ0b2wodG1wLmNfc3RyKCksIE5VTEwsIDEwKTsKKyAgICBpZiAoYnVmZmVyQ291bnQgPD0gMAorICAgICAgICAgICAgfHwgYnVmZmVyQ291bnQgPiBCdWZmZXJRdWV1ZTo6TUFYX01BWF9BQ1FVSVJFRF9CVUZGRVJTKSB7CisgICAgICAgIEFMT0dFKCJFbmNvZGVyIGlucHV0IGJ1ZmZlciBjb3VudCBpcyBpbnZhbGlkISIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBidWZmZXJDb25zdW1lcjsKKworICAgIHN0YXR1c190IGVyciA9IG9teC0+Y3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgICZidWZmZXJQcm9kdWNlciwgJmJ1ZmZlckNvbnN1bWVyKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgcGVyc2lzdGVudCBpbnB1dCBzdXJmYWNlLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBlcnIgPSBidWZmZXJDb25zdW1lci0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChidWZmZXJDb3VudCk7CisKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IEJRIG1heCBhY3F1aXJlZCBidWZmZXIgY291bnQgdG8gJXU6ICVkIiwKKyAgICAgICAgICAgICAgICBidWZmZXJDb3VudCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBQZXJzaXN0ZW50U3VyZmFjZShidWZmZXJQcm9kdWNlciwgYnVmZmVyQ29uc3VtZXIpOworfQorCitNZWRpYUNvZGVjOjpNZWRpYUNvZGVjKGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIHBpZF90IHBpZCkKICAgICA6IG1TdGF0ZShVTklOSVRJQUxJWkVEKSwKKyAgICAgIG1SZWxlYXNlZEJ5UmVzb3VyY2VNYW5hZ2VyKGZhbHNlKSwKICAgICAgIG1Mb29wZXIobG9vcGVyKSwKICAgICAgIG1Db2RlYyhOVUxMKSwKICAgICAgIG1SZXBseUlEKDApLAogICAgICAgbUZsYWdzKDApLAogICAgICAgbVN0aWNreUVycm9yKE9LKSwKICAgICAgIG1Tb2Z0UmVuZGVyZXIoTlVMTCksCisgICAgICBtUmVzb3VyY2VNYW5hZ2VyQ2xpZW50KG5ldyBSZXNvdXJjZU1hbmFnZXJDbGllbnQodGhpcykpLAorICAgICAgbVJlc291cmNlTWFuYWdlclNlcnZpY2UobmV3IFJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eShwaWQpKSwKICAgICAgIG1CYXR0ZXJ5U3RhdE5vdGlmaWVkKGZhbHNlKSwKICAgICAgIG1Jc1ZpZGVvKGZhbHNlKSwKKyAgICAgIG1WaWRlb1dpZHRoKDApLAorICAgICAgbVZpZGVvSGVpZ2h0KDApLAorICAgICAgbVJvdGF0aW9uRGVncmVlcygwKSwKICAgICAgIG1EZXF1ZXVlSW5wdXRUaW1lb3V0R2VuZXJhdGlvbigwKSwKICAgICAgIG1EZXF1ZXVlSW5wdXRSZXBseUlEKDApLAogICAgICAgbURlcXVldWVPdXRwdXRUaW1lb3V0R2VuZXJhdGlvbigwKSwKICAgICAgIG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCgwKSwKLSAgICAgIG1IYXZlSW5wdXRTdXJmYWNlKGZhbHNlKSB7CisgICAgICBtSGF2ZUlucHV0U3VyZmFjZShmYWxzZSksCisgICAgICBtSGF2ZVBlbmRpbmdJbnB1dEJ1ZmZlcnMoZmFsc2UpIHsKIH0KIAogTWVkaWFDb2RlYzo6fk1lZGlhQ29kZWMoKSB7CiAgICAgQ0hFQ0tfRVEobVN0YXRlLCBVTklOSVRJQUxJWkVEKTsKKyAgICBtUmVzb3VyY2VNYW5hZ2VyU2VydmljZS0+cmVtb3ZlUmVzb3VyY2UoZ2V0SWQobVJlc291cmNlTWFuYWdlckNsaWVudCkpOwogfQogCiAvLyBzdGF0aWMKQEAgLTE3MiwxNCArMjgwLDIxIEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAotLy8gc3RhdGljCi12b2lkIE1lZGlhQ29kZWM6OlBvc3RSZXBseVdpdGhFcnJvcihpbnQzMl90IHJlcGx5SUQsIGludDMyX3QgZXJyKSB7Cit2b2lkIE1lZGlhQ29kZWM6OlBvc3RSZXBseVdpdGhFcnJvcihjb25zdCBzcDxBUmVwbHlUb2tlbj4gJnJlcGx5SUQsIGludDMyX3QgZXJyKSB7CisgICAgaW50MzJfdCBmaW5hbEVyciA9IGVycjsKKyAgICBpZiAobVJlbGVhc2VkQnlSZXNvdXJjZU1hbmFnZXIpIHsKKyAgICAgICAgLy8gb3ZlcnJpZGUgdGhlIGVyciBjb2RlIGlmIE1lZGlhQ29kZWMgaGFzIGJlZW4gcmVsZWFzZWQgYnkgUmVzb3VyY2VNYW5hZ2VyLgorICAgICAgICBmaW5hbEVyciA9IERFQURfT0JKRUNUOworICAgIH0KKwogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBmaW5hbEVycik7CiAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlYzo6aW5pdChjb25zdCBBU3RyaW5nICZuYW1lLCBib29sIG5hbWVJc1R5cGUsIGJvb2wgZW5jb2RlcikgeworICAgIG1SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLT5pbml0KCk7CisKICAgICAvLyBzYXZlIGluaXQgcGFyYW1ldGVycyBmb3IgcmVzZXQKICAgICBtSW5pdE5hbWUgPSBuYW1lOwogICAgIG1Jbml0TmFtZUlzVHlwZSA9IG5hbWVJc1R5cGU7CkBAIC0xODksMTYgKzMwNCwzMCBAQAogICAgIC8vIHF1aWNrbHksIHZpb2xhdGluZyB0aGUgT3Blbk1BWCBzcGVjcywgdW50aWwgdGhhdCBpcyByZW1lZGllZAogICAgIC8vIHdlIG5lZWQgdG8gaW52ZXN0IGluIGFuIGV4dHJhIGxvb3BlciB0byBmcmVlIHRoZSBtYWluIGV2ZW50CiAgICAgLy8gcXVldWUuCi0gICAgbUNvZGVjID0gbmV3IEFDb2RlYzsKLSAgICBib29sIG5lZWREZWRpY2F0ZWRMb29wZXIgPSBmYWxzZTsKKworICAgIGlmIChuYW1lSXNUeXBlIHx8ICFzdHJuY2FzZWNtcChuYW1lLmNfc3RyKCksICJvbXguIiwgNCkpIHsKKyAgICAgICAgbUNvZGVjID0gbmV3IEFDb2RlYzsKKyAgICB9IGVsc2UgaWYgKCFuYW1lSXNUeXBlCisgICAgICAgICAgICAmJiAhc3RybmNhc2VjbXAobmFtZS5jX3N0cigpLCAiYW5kcm9pZC5maWx0ZXIuIiwgMTUpKSB7CisgICAgICAgIG1Db2RlYyA9IG5ldyBNZWRpYUZpbHRlcjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgYm9vbCBzZWN1cmVDb2RlYyA9IGZhbHNlOwogICAgIGlmIChuYW1lSXNUeXBlICYmICFzdHJuY2FzZWNtcChuYW1lLmNfc3RyKCksICJ2aWRlby8iLCA2KSkgewotICAgICAgICBuZWVkRGVkaWNhdGVkTG9vcGVyID0gdHJ1ZTsKKyAgICAgICAgbUlzVmlkZW8gPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFTdHJpbmcgdG1wID0gbmFtZTsKICAgICAgICAgaWYgKHRtcC5lbmRzV2l0aCgiLnNlY3VyZSIpKSB7CisgICAgICAgICAgICBzZWN1cmVDb2RlYyA9IHRydWU7CiAgICAgICAgICAgICB0bXAuZXJhc2UodG1wLnNpemUoKSAtIDcsIDcpOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IHNwPElNZWRpYUNvZGVjTGlzdD4gbWNsID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CisgICAgICAgIGlmIChtY2wgPT0gTlVMTCkgeworICAgICAgICAgICAgbUNvZGVjID0gTlVMTDsgIC8vIHJlbW92ZSB0aGUgY29kZWMuCisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsgLy8gaWYgY2FsbGVkIGZyb20gSmF2YSBzaG91bGQgcmFpc2UgSU9FeGNlcHRpb24KKyAgICAgICAgfQogICAgICAgICBzc2l6ZV90IGNvZGVjSWR4ID0gbWNsLT5maW5kQ29kZWNCeU5hbWUodG1wLmNfc3RyKCkpOwogICAgICAgICBpZiAoY29kZWNJZHggPj0gMCkgewogICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBtY2wtPmdldENvZGVjSW5mbyhjb2RlY0lkeCk7CkBAIC0yMDYsMTQgKzMzNSwxNSBAQAogICAgICAgICAgICAgaW5mby0+Z2V0U3VwcG9ydGVkTWltZXMoJm1pbWVzKTsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWltZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAobWltZXNbaV0uc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKLSAgICAgICAgICAgICAgICAgICAgbmVlZERlZGljYXRlZExvb3BlciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG5lZWREZWRpY2F0ZWRMb29wZXIpIHsKKyAgICBpZiAobUlzVmlkZW8pIHsKKyAgICAgICAgLy8gdmlkZW8gY29kZWMgbmVlZHMgZGVkaWNhdGVkIGxvb3BlcgogICAgICAgICBpZiAobUNvZGVjTG9vcGVyID09IE5VTEwpIHsKICAgICAgICAgICAgIG1Db2RlY0xvb3BlciA9IG5ldyBBTG9vcGVyOwogICAgICAgICAgICAgbUNvZGVjTG9vcGVyLT5zZXROYW1lKCJDb2RlY0xvb3BlciIpOwpAQCAtMjI3LDkgKzM1Nyw5IEBACiAKICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CiAKLSAgICBtQ29kZWMtPnNldE5vdGlmaWNhdGlvbk1lc3NhZ2UobmV3IEFNZXNzYWdlKGtXaGF0Q29kZWNOb3RpZnksIGlkKCkpKTsKKyAgICBtQ29kZWMtPnNldE5vdGlmaWNhdGlvbk1lc3NhZ2UobmV3IEFNZXNzYWdlKGtXaGF0Q29kZWNOb3RpZnksIHRoaXMpKTsKIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRJbml0LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0SW5pdCwgdGhpcyk7CiAgICAgbXNnLT5zZXRTdHJpbmcoIm5hbWUiLCBuYW1lKTsKICAgICBtc2ctPnNldEludDMyKCJuYW1lSXNUeXBlIiwgbmFtZUlzVHlwZSk7CiAKQEAgLTIzNyw1OCArMzY3LDEyNCBAQAogICAgICAgICBtc2ctPnNldEludDMyKCJlbmNvZGVyIiwgZW5jb2Rlcik7CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CisgICAgc3RhdHVzX3QgZXJyOworICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXM7CisgICAgY29uc3QgY2hhciAqdHlwZSA9IHNlY3VyZUNvZGVjID8ga1Jlc291cmNlU2VjdXJlQ29kZWMgOiBrUmVzb3VyY2VOb25TZWN1cmVDb2RlYzsKKyAgICBjb25zdCBjaGFyICpzdWJ0eXBlID0gbUlzVmlkZW8gPyBrUmVzb3VyY2VWaWRlb0NvZGVjIDoga1Jlc291cmNlQXVkaW9Db2RlYzsKKyAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoU3RyaW5nOCh0eXBlKSwgU3RyaW5nOChzdWJ0eXBlKSwgMSkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IGtNYXhSZXRyeTsgKytpKSB7CisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIHJlY2xhaW0gcmVzb3VyY2UgZm9yIHRoZSBmaXJzdCB0aW1lLgorICAgICAgICAgICAgaWYgKCFtUmVzb3VyY2VNYW5hZ2VyU2VydmljZS0+cmVjbGFpbVJlc291cmNlKHJlc291cmNlcykpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICAgICAgZXJyID0gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOworICAgICAgICBpZiAoIWlzUmVzb3VyY2VFcnJvcihlcnIpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpzZXRDYWxsYmFjayhjb25zdCBzcDxBTWVzc2FnZT4gJmNhbGxiYWNrKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldENhbGxiYWNrLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0Q2FsbGJhY2ssIHRoaXMpOwogICAgIG1zZy0+c2V0TWVzc2FnZSgiY2FsbGJhY2siLCBjYWxsYmFjayk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFDb2RlYzo6c2V0T25GcmFtZVJlbmRlcmVkTm90aWZpY2F0aW9uKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldE5vdGlmaWNhdGlvbiwgdGhpcyk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJvbi1mcmFtZS1yZW5kZXJlZCIsIG5vdGlmeSk7CisgICAgcmV0dXJuIG1zZy0+cG9zdCgpOworfQorCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpjb25maWd1cmUoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAotICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmbmF0aXZlV2luZG93LAorICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKICAgICAgICAgY29uc3Qgc3A8SUNyeXB0bz4gJmNyeXB0bywKICAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlndXJlLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlndXJlLCB0aGlzKTsKKworICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmbVZpZGVvV2lkdGgpOworICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJm1WaWRlb0hlaWdodCk7CisgICAgICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmbVJvdGF0aW9uRGVncmVlcykpIHsKKyAgICAgICAgICAgIG1Sb3RhdGlvbkRlZ3JlZXMgPSAwOworICAgICAgICB9CisgICAgfQogCiAgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOwogICAgIG1zZy0+c2V0SW50MzIoImZsYWdzIiwgZmxhZ3MpOwotCi0gICAgaWYgKG5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7Ci0gICAgICAgIG1zZy0+c2V0T2JqZWN0KAotICAgICAgICAgICAgICAgICJuYXRpdmUtd2luZG93IiwKLSAgICAgICAgICAgICAgICBuZXcgTmF0aXZlV2luZG93V3JhcHBlcihuYXRpdmVXaW5kb3cpKTsKLSAgICB9CisgICAgbXNnLT5zZXRPYmplY3QoInN1cmZhY2UiLCBzdXJmYWNlKTsKIAogICAgIGlmIChjcnlwdG8gIT0gTlVMTCkgewogICAgICAgICBtc2ctPnNldFBvaW50ZXIoImNyeXB0byIsIGNyeXB0by5nZXQoKSk7CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IGVyciA9IFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKKyAgICAvLyBzYXZlIG1zZyBmb3IgcmVzZXQKKyAgICBtQ29uZmlndXJlTXNnID0gbXNnOwogCi0gICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKLSAgICAgICAgLy8gTWVkaWFDb2RlYyBub3cgc2V0IHN0YXRlIHRvIFVOSU5JVElBTElaRUQgdXBvbiBhbnkgZmF0YWwgZXJyb3IuCi0gICAgICAgIC8vIFRvIG1haW50YWluIGJhY2t3YXJkLWNvbXBhdGliaWxpdHksIGRvIGEgcmVzZXQoKSB0byBwdXQgY29kZWMKLSAgICAgICAgLy8gYmFjayBpbnRvIElOSVRJQUxJWkVEIHN0YXRlLgotICAgICAgICAvLyBCdXQgZG9uJ3QgcmVzZXQgaWYgdGhlIGVyciBpcyBJTlZBTElEX09QRVJBVElPTiwgd2hpY2ggbWVhbnMKLSAgICAgICAgLy8gdGhlIGNvbmZpZ3VyZSBmYWlsdXJlIGlzIGR1ZSB0byB3cm9uZyBzdGF0ZS4KKyAgICBzdGF0dXNfdCBlcnI7CisgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlczsKKyAgICBjb25zdCBjaGFyICp0eXBlID0gKG1GbGFncyAmIGtGbGFnSXNTZWN1cmUpID8KKyAgICAgICAgICAgIGtSZXNvdXJjZVNlY3VyZUNvZGVjIDoga1Jlc291cmNlTm9uU2VjdXJlQ29kZWM7CisgICAgY29uc3QgY2hhciAqc3VidHlwZSA9IG1Jc1ZpZGVvID8ga1Jlc291cmNlVmlkZW9Db2RlYyA6IGtSZXNvdXJjZUF1ZGlvQ29kZWM7CisgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKFN0cmluZzgodHlwZSksIFN0cmluZzgoc3VidHlwZSksIDEpKTsKKyAgICAvLyBEb24ndCBrbm93IHRoZSBidWZmZXIgc2l6ZSBhdCB0aGlzIHBvaW50LCBidXQgaXQncyBmaW5lIHRvIHVzZSAxIGJlY2F1c2UKKyAgICAvLyB0aGUgcmVjbGFpbVJlc291cmNlIGNhbGwgZG9lc24ndCBjb25zaWRlciB0aGUgcmVxdWVzdGVyJ3MgYnVmZmVyIHNpemUgZm9yIG5vdy4KKyAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoU3RyaW5nOChrUmVzb3VyY2VHcmFwaGljTWVtb3J5KSwgMSkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IGtNYXhSZXRyeTsgKytpKSB7CisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIHJlY2xhaW0gcmVzb3VyY2UgZm9yIHRoZSBmaXJzdCB0aW1lLgorICAgICAgICAgICAgaWYgKCFtUmVzb3VyY2VNYW5hZ2VyU2VydmljZS0+cmVjbGFpbVJlc291cmNlKHJlc291cmNlcykpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgICAgIEFMT0dFKCJjb25maWd1cmUgZmFpbGVkIHdpdGggZXJyIDB4JTA4eCwgcmVzZXR0aW5nLi4uIiwgZXJyKTsKLSAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgICAgICBlcnIgPSBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CisgICAgICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgICAgICAvLyBNZWRpYUNvZGVjIG5vdyBzZXQgc3RhdGUgdG8gVU5JTklUSUFMSVpFRCB1cG9uIGFueSBmYXRhbCBlcnJvci4KKyAgICAgICAgICAgIC8vIFRvIG1haW50YWluIGJhY2t3YXJkLWNvbXBhdGliaWxpdHksIGRvIGEgcmVzZXQoKSB0byBwdXQgY29kZWMKKyAgICAgICAgICAgIC8vIGJhY2sgaW50byBJTklUSUFMSVpFRCBzdGF0ZS4KKyAgICAgICAgICAgIC8vIEJ1dCBkb24ndCByZXNldCBpZiB0aGUgZXJyIGlzIElOVkFMSURfT1BFUkFUSU9OLCB3aGljaCBtZWFucworICAgICAgICAgICAgLy8gdGhlIGNvbmZpZ3VyZSBmYWlsdXJlIGlzIGR1ZSB0byB3cm9uZyBzdGF0ZS4KKworICAgICAgICAgICAgQUxPR0UoImNvbmZpZ3VyZSBmYWlsZWQgd2l0aCBlcnIgMHglMDh4LCByZXNldHRpbmcuLi4iLCBlcnIpOworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzUmVzb3VyY2VFcnJvcihlcnIpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IE1lZGlhQ29kZWM6OnNldElucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldElucHV0U3VyZmFjZSwgdGhpcyk7CisgICAgbXNnLT5zZXRPYmplY3QoImlucHV0LXN1cmZhY2UiLCBzdXJmYWNlLmdldCgpKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFN1cmZhY2UsIHRoaXMpOworICAgIG1zZy0+c2V0T2JqZWN0KCJzdXJmYWNlIiwgc3VyZmFjZSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKK30KKwogc3RhdHVzX3QgTWVkaWFDb2RlYzo6Y3JlYXRlSW5wdXRTdXJmYWNlKAogICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiogYnVmZmVyUHJvZHVjZXIpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlLCB0aGlzKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICBzdGF0dXNfdCBlcnIgPSBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CkBAIC0zMDYsMjIgKzUwMiw4NSBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3VpbnQ2NF90IE1lZGlhQ29kZWM6OmdldEdyYXBoaWNCdWZmZXJTaXplKCkgeworICAgIGlmICghbUlzVmlkZW8pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdWludDY0X3Qgc2l6ZSA9IDA7CisgICAgc2l6ZV90IHBvcnROdW0gPSBzaXplb2YobVBvcnRCdWZmZXJzKSAvIHNpemVvZigobVBvcnRCdWZmZXJzKVswXSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwb3J0TnVtOyArK2kpIHsKKyAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBqdXN0IGFuIGVzdGltYXRpb24sIHdlIHNob3VsZCBnZXQgdGhlIHJlYWwgYnVmZmVyIHNpemUgZnJvbSBBQ29kZWMuCisgICAgICAgIHNpemUgKz0gbVBvcnRCdWZmZXJzW2ldLnNpemUoKSAqIG1WaWRlb1dpZHRoICogbVZpZGVvSGVpZ2h0ICogMyAvIDI7CisgICAgfQorICAgIHJldHVybiBzaXplOworfQorCit2b2lkIE1lZGlhQ29kZWM6OmFkZFJlc291cmNlKGNvbnN0IFN0cmluZzggJnR5cGUsIGNvbnN0IFN0cmluZzggJnN1YnR5cGUsIHVpbnQ2NF90IHZhbHVlKSB7CisgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlczsKKyAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UodHlwZSwgc3VidHlwZSwgdmFsdWUpKTsKKyAgICBtUmVzb3VyY2VNYW5hZ2VyU2VydmljZS0+YWRkUmVzb3VyY2UoCisgICAgICAgICAgICBnZXRJZChtUmVzb3VyY2VNYW5hZ2VyQ2xpZW50KSwgbVJlc291cmNlTWFuYWdlckNsaWVudCwgcmVzb3VyY2VzKTsKK30KKwogc3RhdHVzX3QgTWVkaWFDb2RlYzo6c3RhcnQoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIHRoaXMpOworCisgICAgc3RhdHVzX3QgZXJyOworICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXM7CisgICAgY29uc3QgY2hhciAqdHlwZSA9IChtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlKSA/CisgICAgICAgICAgICBrUmVzb3VyY2VTZWN1cmVDb2RlYyA6IGtSZXNvdXJjZU5vblNlY3VyZUNvZGVjOworICAgIGNvbnN0IGNoYXIgKnN1YnR5cGUgPSBtSXNWaWRlbyA/IGtSZXNvdXJjZVZpZGVvQ29kZWMgOiBrUmVzb3VyY2VBdWRpb0NvZGVjOworICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShTdHJpbmc4KHR5cGUpLCBTdHJpbmc4KHN1YnR5cGUpLCAxKSk7CisgICAgLy8gRG9uJ3Qga25vdyB0aGUgYnVmZmVyIHNpemUgYXQgdGhpcyBwb2ludCwgYnV0IGl0J3MgZmluZSB0byB1c2UgMSBiZWNhdXNlCisgICAgLy8gdGhlIHJlY2xhaW1SZXNvdXJjZSBjYWxsIGRvZXNuJ3QgY29uc2lkZXIgdGhlIHJlcXVlc3RlcidzIGJ1ZmZlciBzaXplIGZvciBub3cuCisgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKFN0cmluZzgoa1Jlc291cmNlR3JhcGhpY01lbW9yeSksIDEpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8PSBrTWF4UmV0cnk7ICsraSkgeworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIC8vIERvbid0IHRyeSB0byByZWNsYWltIHJlc291cmNlIGZvciB0aGUgZmlyc3QgdGltZS4KKyAgICAgICAgICAgIGlmICghbVJlc291cmNlTWFuYWdlclNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShyZXNvdXJjZXMpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBSZWNvdmVyIGNvZGVjIGZyb20gcHJldmlvdXMgZXJyb3IgYmVmb3JlIHJldHJ5IHN0YXJ0LgorICAgICAgICAgICAgZXJyID0gcmVzZXQoKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgicmV0cnlpbmcgc3RhcnQ6IGZhaWxlZCB0byByZXNldCBjb2RlYyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgICAgICAgICAgZXJyID0gUG9zdEFuZEF3YWl0UmVzcG9uc2UobUNvbmZpZ3VyZU1zZywgJnJlc3BvbnNlKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgicmV0cnlpbmcgc3RhcnQ6IGZhaWxlZCB0byBjb25maWd1cmUgY29kZWMiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICAgICAgZXJyID0gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOworICAgICAgICBpZiAoIWlzUmVzb3VyY2VFcnJvcihlcnIpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpzdG9wKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCB0aGlzKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOwogfQogCi1zdGF0dXNfdCBNZWRpYUNvZGVjOjpzdG9wKCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKTsKK3N0YXR1c190IE1lZGlhQ29kZWM6OnJlY2xhaW0oKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2UsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoInJlY2xhaW1lZCIsIDEpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWM6OnJlbGVhc2UoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2UsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlLCB0aGlzKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOwpAQCAtMzczLDcgKzYzMiw3IEBACiAgICAgICAgIGVycm9yRGV0YWlsTXNnLT5jbGVhcigpOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRRdWV1ZUlucHV0QnVmZmVyLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UXVldWVJbnB1dEJ1ZmZlciwgdGhpcyk7CiAgICAgbXNnLT5zZXRTaXplKCJpbmRleCIsIGluZGV4KTsKICAgICBtc2ctPnNldFNpemUoIm9mZnNldCIsIG9mZnNldCk7CiAgICAgbXNnLT5zZXRTaXplKCJzaXplIiwgc2l6ZSk7CkBAIC00MDAsNyArNjU5LDcgQEAKICAgICAgICAgZXJyb3JEZXRhaWxNc2ctPmNsZWFyKCk7CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFF1ZXVlSW5wdXRCdWZmZXIsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRRdWV1ZUlucHV0QnVmZmVyLCB0aGlzKTsKICAgICBtc2ctPnNldFNpemUoImluZGV4IiwgaW5kZXgpOwogICAgIG1zZy0+c2V0U2l6ZSgib2Zmc2V0Iiwgb2Zmc2V0KTsKICAgICBtc2ctPnNldFBvaW50ZXIoInN1YlNhbXBsZXMiLCAodm9pZCAqKXN1YlNhbXBsZXMpOwpAQCAtNDE5LDcgKzY3OCw3IEBACiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWM6OmRlcXVldWVJbnB1dEJ1ZmZlcihzaXplX3QgKmluZGV4LCBpbnQ2NF90IHRpbWVvdXRVcykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREZXF1ZXVlSW5wdXRCdWZmZXIsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREZXF1ZXVlSW5wdXRCdWZmZXIsIHRoaXMpOwogICAgIG1zZy0+c2V0SW50NjQoInRpbWVvdXRVcyIsIHRpbWVvdXRVcyk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC00NDAsNyArNjk5LDcgQEAKICAgICAgICAgaW50NjRfdCAqcHJlc2VudGF0aW9uVGltZVVzLAogICAgICAgICB1aW50MzJfdCAqZmxhZ3MsCiAgICAgICAgIGludDY0X3QgdGltZW91dFVzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERlcXVldWVPdXRwdXRCdWZmZXIsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREZXF1ZXVlT3V0cHV0QnVmZmVyLCB0aGlzKTsKICAgICBtc2ctPnNldEludDY0KCJ0aW1lb3V0VXMiLCB0aW1lb3V0VXMpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwpAQCAtNDU5LDcgKzcxOCw3IEBACiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWM6OnJlbmRlck91dHB1dEJ1ZmZlckFuZFJlbGVhc2Uoc2l6ZV90IGluZGV4KSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VPdXRwdXRCdWZmZXIsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlT3V0cHV0QnVmZmVyLCB0aGlzKTsKICAgICBtc2ctPnNldFNpemUoImluZGV4IiwgaW5kZXgpOwogICAgIG1zZy0+c2V0SW50MzIoInJlbmRlciIsIHRydWUpOwogCkBAIC00NjgsNyArNzI3LDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlYzo6cmVuZGVyT3V0cHV0QnVmZmVyQW5kUmVsZWFzZShzaXplX3QgaW5kZXgsIGludDY0X3QgdGltZXN0YW1wTnMpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVsZWFzZU91dHB1dEJ1ZmZlciwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VPdXRwdXRCdWZmZXIsIHRoaXMpOwogICAgIG1zZy0+c2V0U2l6ZSgiaW5kZXgiLCBpbmRleCk7CiAgICAgbXNnLT5zZXRJbnQzMigicmVuZGVyIiwgdHJ1ZSk7CiAgICAgbXNnLT5zZXRJbnQ2NCgidGltZXN0YW1wTnMiLCB0aW1lc3RhbXBOcyk7CkBAIC00NzgsNyArNzM3LDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlYzo6cmVsZWFzZU91dHB1dEJ1ZmZlcihzaXplX3QgaW5kZXgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVsZWFzZU91dHB1dEJ1ZmZlciwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VPdXRwdXRCdWZmZXIsIHRoaXMpOwogICAgIG1zZy0+c2V0U2l6ZSgiaW5kZXgiLCBpbmRleCk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC00ODYsMTQgKzc0NSwxNCBAQAogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTaWduYWxFbmRPZklucHV0U3RyZWFtLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSwgdGhpcyk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlYzo6Z2V0T3V0cHV0Rm9ybWF0KHNwPEFNZXNzYWdlPiAqZm9ybWF0KSBjb25zdCB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldE91dHB1dEZvcm1hdCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldE91dHB1dEZvcm1hdCwgdGhpcyk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgc3RhdHVzX3QgZXJyOwpAQCAtNTA3LDcgKzc2Niw3IEBACiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWM6OmdldElucHV0Rm9ybWF0KHNwPEFNZXNzYWdlPiAqZm9ybWF0KSBjb25zdCB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldElucHV0Rm9ybWF0LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0SW5wdXRGb3JtYXQsIHRoaXMpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHN0YXR1c190IGVycjsKQEAgLTUyMSw3ICs3ODAsNyBAQAogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXROYW1lKEFTdHJpbmcgKm5hbWUpIGNvbnN0IHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0TmFtZSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldE5hbWUsIHRoaXMpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHN0YXR1c190IGVycjsKQEAgLTUzNCw4ICs3OTMsMTggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE1lZGlhQ29kZWM6OmdldFdpZGV2aW5lTGVnYWN5QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqYnVmZmVycykgY29uc3QgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRCdWZmZXJzLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJwb3J0SW5kZXgiLCBrUG9ydEluZGV4SW5wdXQpOworICAgIG1zZy0+c2V0UG9pbnRlcigiYnVmZmVycyIsIGJ1ZmZlcnMpOworICAgIG1zZy0+c2V0SW50MzIoIndpZGV2aW5lIiwgdHJ1ZSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKK30KKwogc3RhdHVzX3QgTWVkaWFDb2RlYzo6Z2V0SW5wdXRCdWZmZXJzKFZlY3RvcjxzcDxBQnVmZmVyPiA+ICpidWZmZXJzKSBjb25zdCB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldEJ1ZmZlcnMsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRCdWZmZXJzLCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJwb3J0SW5kZXgiLCBrUG9ydEluZGV4SW5wdXQpOwogICAgIG1zZy0+c2V0UG9pbnRlcigiYnVmZmVycyIsIGJ1ZmZlcnMpOwogCkBAIC01NDQsNyArODEzLDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlYzo6Z2V0T3V0cHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqYnVmZmVycykgY29uc3QgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRCdWZmZXJzLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0QnVmZmVycywgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigicG9ydEluZGV4Iiwga1BvcnRJbmRleE91dHB1dCk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJidWZmZXJzIiwgYnVmZmVycyk7CiAKQEAgLTU3Niw2ICs4NDUsMTAgQEAKICAgICAgICAgc3A8QUJ1ZmZlcj4gKmJ1ZmZlciwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIHsKICAgICAvLyB1c2UgbXV0ZXggaW5zdGVhZCBvZiBhIGNvbnRleHQgc3dpdGNoCiAKKyAgICBpZiAobVJlbGVhc2VkQnlSZXNvdXJjZU1hbmFnZXIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKwogICAgIGJ1ZmZlci0+Y2xlYXIoKTsKICAgICBmb3JtYXQtPmNsZWFyKCk7CiAgICAgaWYgKCFpc0V4ZWN1dGluZygpKSB7CkBAIC02MDIsMjAgKzg3NSwyMCBAQAogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpmbHVzaCgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgdGhpcyk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlYzo6cmVxdWVzdElEUkZyYW1lKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXF1ZXN0SURSRnJhbWUsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXF1ZXN0SURSRnJhbWUsIHRoaXMpKS0+cG9zdCgpOwogCiAgICAgcmV0dXJuIE9LOwogfQogCiB2b2lkIE1lZGlhQ29kZWM6OnJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24sIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24sIHRoaXMpOwogICAgIG1zZy0+c2V0TWVzc2FnZSgibm90aWZ5Iiwgbm90aWZ5KTsKICAgICBtc2ctPnBvc3QoKTsKIH0KQEAgLTY0MCw3ICs5MTMsNyBAQAogICAgIH0KIH0KIAotYm9vbCBNZWRpYUNvZGVjOjpoYW5kbGVEZXF1ZXVlSW5wdXRCdWZmZXIodWludDMyX3QgcmVwbHlJRCwgYm9vbCBuZXdSZXF1ZXN0KSB7Citib29sIE1lZGlhQ29kZWM6OmhhbmRsZURlcXVldWVJbnB1dEJ1ZmZlcihjb25zdCBzcDxBUmVwbHlUb2tlbj4gJnJlcGx5SUQsIGJvb2wgbmV3UmVxdWVzdCkgewogICAgIGlmICghaXNFeGVjdXRpbmcoKSB8fCAobUZsYWdzICYga0ZsYWdJc0FzeW5jKQogICAgICAgICAgICAgfHwgKG5ld1JlcXVlc3QgJiYgKG1GbGFncyAmIGtGbGFnRGVxdWV1ZUlucHV0UGVuZGluZykpKSB7CiAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CkBAIC02NjQsMjEgKzkzNywyMCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIE1lZGlhQ29kZWM6OmhhbmRsZURlcXVldWVPdXRwdXRCdWZmZXIodWludDMyX3QgcmVwbHlJRCwgYm9vbCBuZXdSZXF1ZXN0KSB7Ci0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotCitib29sIE1lZGlhQ29kZWM6OmhhbmRsZURlcXVldWVPdXRwdXRCdWZmZXIoY29uc3Qgc3A8QVJlcGx5VG9rZW4+ICZyZXBseUlELCBib29sIG5ld1JlcXVlc3QpIHsKICAgICBpZiAoIWlzRXhlY3V0aW5nKCkgfHwgKG1GbGFncyAmIGtGbGFnSXNBc3luYykKICAgICAgICAgICAgIHx8IChuZXdSZXF1ZXN0ICYmIChtRmxhZ3MgJiBrRmxhZ0RlcXVldWVPdXRwdXRQZW5kaW5nKSkpIHsKLSAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CiAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7Ci0gICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZ2V0U3RpY2t5RXJyb3IoKSk7CisgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnT3V0cHV0QnVmZmVyc0NoYW5nZWQpIHsKLSAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQpOworICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEKTsKICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ091dHB1dEJ1ZmZlcnNDaGFuZ2VkOwogICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdPdXRwdXRGb3JtYXRDaGFuZ2VkKSB7Ci0gICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5GT19GT1JNQVRfQ0hBTkdFRCk7CisgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTkZPX0ZPUk1BVF9DSEFOR0VEKTsKICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ091dHB1dEZvcm1hdENoYW5nZWQ7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICBzc2l6ZV90IGluZGV4ID0gZGVxdWV1ZVBvcnRCdWZmZXIoa1BvcnRJbmRleE91dHB1dCk7CiAKICAgICAgICAgaWYgKGluZGV4IDwgMCkgewpAQCAtNzEzLDEwICs5ODUsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJmbGFncyIsIGZsYWdzKTsKKyAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKICAgICB9CiAKLSAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTg3NCwxOCArMTE0NSwzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ1VzZXNTb2Z0d2FyZVJlbmRlcmVyOwogICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCByZXNvdXJjZVR5cGU7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29tcG9uZW50TmFtZS5lbmRzV2l0aCgiLnNlY3VyZSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdJc1NlY3VyZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlVHlwZSA9IFN0cmluZzgoa1Jlc291cmNlU2VjdXJlQ29kZWMpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0lzU2VjdXJlOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VUeXBlID0gU3RyaW5nOChrUmVzb3VyY2VOb25TZWN1cmVDb2RlYyk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdWJ0eXBlID0gbUlzVmlkZW8gPyBrUmVzb3VyY2VWaWRlb0NvZGVjIDoga1Jlc291cmNlQXVkaW9Db2RlYzsKKyAgICAgICAgICAgICAgICAgICAgYWRkUmVzb3VyY2UocmVzb3VyY2VUeXBlLCBTdHJpbmc4KHN1YnR5cGUpLCAxKTsKKwogICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0Q29tcG9uZW50Q29uZmlndXJlZDoKICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCB8fCBtU3RhdGUgPT0gSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgYSBrV2hhdEVycm9yIG1lc3NhZ2UgY2FtZSBpbiBhbmQgcmVwbGllZCB3aXRoIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbG9nIGEgd2FybmluZyBhbmQgaWdub3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNvbmZpZ3VyZSBpbnRlcnJ1cHRlZCBieSBlcnJvciwgY3VycmVudCBzdGF0ZSAlZCIsIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIENPTkZJR1VSSU5HKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBpbnB1dCBzdXJmYWNlIGZsYWcKQEAgLTkwOCw3ICsxMTkxLDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHRvIGluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlKCkKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gTk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CiAgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPmZpbmRPYmplY3QoImlucHV0LXN1cmZhY2UiLCAmb2JqKTsKQEAgLTkyMiwxMCArMTIwNSwyNCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRJbnB1dFN1cmZhY2VBY2NlcHRlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHRvIGluaXRpYXRlU2V0SW5wdXRTdXJmYWNlKCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gTk9fRVJST1I7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUhhdmVJbnB1dFN1cmZhY2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkobVJlcGx5SUQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRTaWduYWxlZElucHV0RU9TOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgdG8gc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpCi0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVycjsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwpAQCAtOTU5LDYgKzEyNTYsMTcgQEAKIAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtQnVmZmVycyA9IHBvcnREZXNjLT5jb3VudEJ1ZmZlcnMoKTsKIAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG90YWxTaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1CdWZmZXJzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0ICYmIG1DcnlwdG8gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSArPSBwb3J0RGVzYy0+YnVmZmVyQXQoaSktPmNhcGFjaXR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcih0b3RhbFNpemUsICJNZWRpYUNvZGVjIik7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUJ1ZmZlcnM7ICsraSkgewogICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySW5mbyBpbmZvOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tQnVmZmVySUQgPSBwb3J0RGVzYy0+YnVmZmVySURBdChpKTsKQEAgLTk2Niw4ICsxMjc0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm1EYXRhID0gcG9ydERlc2MtPmJ1ZmZlckF0KGkpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCAmJiBtQ3J5cHRvICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiBtZW0gPSBtRGVhbGVyLT5hbGxvY2F0ZShpbmZvLm1EYXRhLT5jYXBhY2l0eSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm1FbmNyeXB0ZWREYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFCdWZmZXIoaW5mby5tRGF0YS0+Y2FwYWNpdHkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQnVmZmVyKG1lbS0+cG9pbnRlcigpLCBpbmZvLm1EYXRhLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm1TaGFyZWRFbmNyeXB0ZWRCdWZmZXIgPSBtZW07CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnB1c2hfYmFjayhpbmZvKTsKQEAgLTk3OCw2ICsxMjg4LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgYWx3YXlzIGFsbG9jYXRpbmcgb3V0cHV0IGJ1ZmZlcnMgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0aW5nIGlucHV0IGJ1ZmZlcnMsIHNvIHRoaXMgaXMgYSBnb29kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGlvbiB0aGF0IG5vdyBhbGwgYnVmZmVycyBhcmUgYWxsb2NhdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IHN1YnR5cGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc291cmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoa1Jlc291cmNlR3JhcGhpY01lbW9yeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRHcmFwaGljQnVmZmVyU2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoU1RBUlRFRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtOTkzLDEzICsxMzEwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjb2RlYyBvdXRwdXQgZm9ybWF0IGNoYW5nZWQiKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobVNvZnRSZW5kZXJlciA9PSBOVUxMICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2UgIT0gTlVMTCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ1VzZXNTb2Z0d2FyZVJlbmRlcmVyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBtaW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aElnbm9yZUNhc2UoInZpZGVvLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvZnRSZW5kZXJlciA9IG5ldyBTb2Z0d2FyZVJlbmRlcmVyKG1OYXRpdmVXaW5kb3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXIgPSBuZXcgU29mdHdhcmVSZW5kZXJlcihtU3VyZmFjZSwgbVJvdGF0aW9uRGVncmVlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMTAzMSw2ICsxMzQ4LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdE91dHB1dEZyYW1lc1JlbmRlcmVkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZXNlIGluIGFsbCBzdGF0ZXMgZXhjZXB0IHJ1bm5pbmcsIGFuZCBjaGVjayB0aGF0IHdlIGhhdmUgYQorICAgICAgICAgICAgICAgICAgICAvLyBub3RpZmljYXRpb24gc2V0CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBUlRFRCAmJiBtT25GcmFtZVJlbmRlcmVkTm90aWZpY2F0aW9uICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtT25GcmFtZVJlbmRlcmVkTm90aWZpY2F0aW9uLT5kdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZGF0YSIsIG1zZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRGaWxsVGhpc0J1ZmZlcjoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8qIHNpemVfdCBpbmRleCA9ICovdXBkYXRlQnVmZmVycyhrUG9ydEluZGV4SW5wdXQsIG1zZyk7CkBAIC0xMDY4LDcgKzEzOTcsMTEgQEAKIAogICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1IYXZlSW5wdXRTdXJmYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25JbnB1dEJ1ZmZlckF2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gRkxVU0hFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGF2ZVBlbmRpbmdJbnB1dEJ1ZmZlcnMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW5wdXRCdWZmZXJBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlSW5wdXRQZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhoYW5kbGVEZXF1ZXVlSW5wdXRCdWZmZXIobURlcXVldWVJbnB1dFJlcGx5SUQpKTsKQEAgLTExNTcsNiArMTQ5MCw4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0lzQ29tcG9uZW50QWxsb2NhdGVkOwogCisgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShnZXRJZChtUmVzb3VyY2VNYW5hZ2VyQ2xpZW50KSk7CisKICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTExODgsNyArMTUyMyw3IEBACiAKICAgICAgICAgY2FzZSBrV2hhdEluaXQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBVTklOSVRJQUxJWkVEKSB7CkBAIC0xMjIyLDkgKzE1NTcsMTggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdFNldE5vdGlmaWNhdGlvbjoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeTsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRNZXNzYWdlKCJvbi1mcmFtZS1yZW5kZXJlZCIsICZub3RpZnkpKSB7CisgICAgICAgICAgICAgICAgbU9uRnJhbWVSZW5kZXJlZE5vdGlmaWNhdGlvbiA9IG5vdGlmeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdFNldENhbGxiYWNrOgogICAgICAgICB7Ci0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRApAQCAtMTI1Niw3ICsxNjAwLDcgQEAKIAogICAgICAgICBjYXNlIGtXaGF0Q29uZmlndXJlOgogICAgICAgICB7Ci0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gSU5JVElBTElaRUQpIHsKQEAgLTEyNjUsMjYgKzE2MDksMjUgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwotICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRPYmplY3QoIm5hdGl2ZS13aW5kb3ciLCAmb2JqKSkgewotICAgICAgICAgICAgICAgIG9iai5jbGVhcigpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzdXJmYWNlIiwgJm9iaikpOwogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOwogCisgICAgICAgICAgICBpbnQzMl90IHB1c2g7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInB1c2gtYmxhbmstYnVmZmVycy1vbi1zaHV0ZG93biIsICZwdXNoKSAmJiBwdXNoICE9IDApIHsKKyAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdQdXNoQmxhbmtCdWZmZXJzT25TaHV0ZG93bjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgZm9ybWF0LT5zZXRPYmplY3QoIm5hdGl2ZS13aW5kb3ciLCBvYmopOwotCi0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0TmF0aXZlV2luZG93KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxOYXRpdmVXaW5kb3dXcmFwcGVyICo+KG9iai5nZXQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0U3VyZmFjZVRleHR1cmVDbGllbnQoKSk7Ci0KKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBoYW5kbGVTZXRTdXJmYWNlKHN0YXRpY19jYXN0PFN1cmZhY2UgKj4ob2JqLmdldCgpKSk7CiAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXROYXRpdmVXaW5kb3coTlVMTCk7CisgICAgICAgICAgICAgICAgaGFuZGxlU2V0U3VyZmFjZShOVUxMKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbVJlcGx5SUQgPSByZXBseUlEOwpAQCAtMTMxMSw5ICsxNjU0LDY5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2Uga1doYXRDcmVhdGVJbnB1dFN1cmZhY2U6CisgICAgICAgIGNhc2Uga1doYXRTZXRTdXJmYWNlOgogICAgICAgICB7Ci0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKworICAgICAgICAgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBTVEFSVEVEOgorICAgICAgICAgICAgICAgIGNhc2UgRkxVU0hFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpbXNnLT5maW5kT2JqZWN0KCJzdXJmYWNlIiwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBzdGF0aWNfY2FzdDxTdXJmYWNlICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3VyZmFjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3Qgc3VwcG9ydCBzZXR0aW5nIHN1cmZhY2UgaWYgaXQgd2FzIG5vdCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iaiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3Qgc3VwcG9ydCB1bnNldHRpbmcgc3VyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gY29ubmVjdFRvU3VyZmFjZShzdXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQkFEX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1pbmcgcmVjb25uZWN0aW5nIHRvIHNhbWUgc3VyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGlmIGl0IGlzIHRoZSBzYW1lIHN1cmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdVc2VzU29mdHdhcmVSZW5kZXJlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Tb2Z0UmVuZGVyZXIgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobUZsYWdzICYga0ZsYWdQdXNoQmxhbmtCdWZmZXJzT25TaHV0ZG93bikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3cobVN1cmZhY2UuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvZnRSZW5kZXJlciA9IG5ldyBTb2Z0d2FyZVJlbmRlcmVyKHN1cmZhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgaWYgdGhpcyB3YXMgc3VjY2Vzc2Z1bAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbUNvZGVjLT5zZXRTdXJmYWNlKHN1cmZhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpZGlzY29ubmVjdEZyb21TdXJmYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlID0gc3VyZmFjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZXJyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdENyZWF0ZUlucHV0U3VyZmFjZToKKyAgICAgICAgY2FzZSBrV2hhdFNldElucHV0U3VyZmFjZToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgICAgIC8vIE11c3QgYmUgY29uZmlndXJlZCwgYnV0IGNhbid0IGhhdmUgYmVlbiBzdGFydGVkIHlldC4KQEAgLTEzMjMsMTcgKzE3MjYsMjggQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbVJlcGx5SUQgPSByZXBseUlEOwotICAgICAgICAgICAgbUNvZGVjLT5pbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgICAgICAgICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5pbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJpbnB1dC1zdXJmYWNlIiwgJm9iaikpOworCisgICAgICAgICAgICAgICAgbUNvZGVjLT5pbml0aWF0ZVNldElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFBlcnNpc3RlbnRTdXJmYWNlICo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLQogICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBGTFVTSEVEKSB7CiAgICAgICAgICAgICAgICAgc2V0U3RhdGUoU1RBUlRFRCk7CisgICAgICAgICAgICAgICAgaWYgKG1IYXZlUGVuZGluZ0lucHV0QnVmZmVycykgeworICAgICAgICAgICAgICAgICAgICBvbklucHV0QnVmZmVyQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgIG1IYXZlUGVuZGluZ0lucHV0QnVmZmVycyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbFJlc3VtZSgpOwogICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBPSyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMzU1LDkgKzE3NjksMjMgQEAKICAgICAgICAgICAgIFN0YXRlIHRhcmdldFN0YXRlID0KICAgICAgICAgICAgICAgICAobXNnLT53aGF0KCkgPT0ga1doYXRTdG9wKSA/IElOSVRJQUxJWkVEIDogVU5JTklUSUFMSVpFRDsKIAotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCisgICAgICAgICAgICAvLyBhbHJlYWR5IHN0b3BwZWQvcmVsZWFzZWQKKyAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCAmJiBtUmVsZWFzZWRCeVJlc291cmNlTWFuYWdlcikgeworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIE9LKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQzMl90IHJlY2xhaW1lZCA9IDA7CisgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigicmVjbGFpbWVkIiwgJnJlY2xhaW1lZCk7CisgICAgICAgICAgICBpZiAocmVjbGFpbWVkKSB7CisgICAgICAgICAgICAgICAgbVJlbGVhc2VkQnlSZXNvdXJjZU1hbmFnZXIgPSB0cnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoISgobUZsYWdzICYga0ZsYWdJc0NvbXBvbmVudEFsbG9jYXRlZCkgJiYgdGFyZ2V0U3RhdGUgPT0gVU5JTklUSUFMSVpFRCkgLy8gU2VlIDEKICAgICAgICAgICAgICAgICAgICAgJiYgbVN0YXRlICE9IElOSVRJQUxJWkVECiAgICAgICAgICAgICAgICAgICAgICYmIG1TdGF0ZSAhPSBDT05GSUdVUkVEICYmICFpc0V4ZWN1dGluZygpKSB7CkBAIC0xMzcxLDYgKzE3OTksOCBAQAogICAgICAgICAgICAgICAgIC8vIGFuZCBpdCBzaG91bGQgYmUgaW4gdGhpcyBjYXNlLCBubyBoYXJtIHRvIGFsbG93IGEgcmVsZWFzZSgpCiAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgYWxyZWFkeSB1bmluaXRpYWxpemVkLgogICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB3ZSBzaG91bGRuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciBzdG9wL3JlbGVhc2UuIENoYW5nZSB0aGlzIHRvIHdhaXQgdW50aWwKKyAgICAgICAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgc3RvcC9yZWxlYXNlIGNvbXBsZXRlcyBhbmQgdGhlbiByZXBseSB3aXRoIE9LLgogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1TdGF0ZSA9PSB0YXJnZXRTdGF0ZSA/IE9LIDogSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgdGFyZ2V0U3RhdGUgPT0gVU5JTklUSUFMSVpFRCkgewpAQCAtMTM5OCwxMiArMTgyOCwxNiBAQAogICAgICAgICAgICAgICAgICAgICBtc2ctPndoYXQoKSA9PSBrV2hhdFN0b3AgLyoga2VlcENvbXBvbmVudEFsbG9jYXRlZCAqLyk7CiAKICAgICAgICAgICAgIHJldHVybkJ1ZmZlcnNUb0NvZGVjKCk7CisKKyAgICAgICAgICAgIGlmIChtU29mdFJlbmRlcmVyICE9IE5VTEwgJiYgKG1GbGFncyAmIGtGbGFnUHVzaEJsYW5rQnVmZmVyc09uU2h1dGRvd24pKSB7CisgICAgICAgICAgICAgICAgcHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93KG1TdXJmYWNlLmdldCgpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBrV2hhdERlcXVldWVJbnB1dEJ1ZmZlcjoKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CkBAIC0xNDM1LDcgKzE4NjksNyBAQAogCiAgICAgICAgICAgICBpZiAodGltZW91dFVzID4gMGxsKSB7CiAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHRpbWVvdXRNc2cgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXREZXF1ZXVlSW5wdXRUaW1lZE91dCwgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdERlcXVldWVJbnB1dFRpbWVkT3V0LCB0aGlzKTsKICAgICAgICAgICAgICAgICB0aW1lb3V0TXNnLT5zZXRJbnQzMigKICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5lcmF0aW9uIiwgKyttRGVxdWV1ZUlucHV0VGltZW91dEdlbmVyYXRpb24pOwogICAgICAgICAgICAgICAgIHRpbWVvdXRNc2ctPnBvc3QodGltZW91dFVzKTsKQEAgLTE0NjQsNyArMTg5OCw3IEBACiAKICAgICAgICAgY2FzZSBrV2hhdFF1ZXVlSW5wdXRCdWZmZXI6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKCFpc0V4ZWN1dGluZygpKSB7CkBAIC0xNDgzLDcgKzE5MTcsNyBAQAogCiAgICAgICAgIGNhc2Uga1doYXREZXF1ZXVlT3V0cHV0QnVmZmVyOgogICAgICAgICB7Ci0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKQEAgLTE1MDksNyArMTk0Myw3IEBACiAKICAgICAgICAgICAgIGlmICh0aW1lb3V0VXMgPiAwbGwpIHsKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdGltZW91dE1zZyA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdERlcXVldWVPdXRwdXRUaW1lZE91dCwgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdERlcXVldWVPdXRwdXRUaW1lZE91dCwgdGhpcyk7CiAgICAgICAgICAgICAgICAgdGltZW91dE1zZy0+c2V0SW50MzIoCiAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGlvbiIsICsrbURlcXVldWVPdXRwdXRUaW1lb3V0R2VuZXJhdGlvbik7CiAgICAgICAgICAgICAgICAgdGltZW91dE1zZy0+cG9zdCh0aW1lb3V0VXMpOwpAQCAtMTUzOCw3ICsxOTcyLDcgQEAKIAogICAgICAgICBjYXNlIGtXaGF0UmVsZWFzZU91dHB1dEJ1ZmZlcjoKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBpZiAoIWlzRXhlY3V0aW5nKCkpIHsKQEAgLTE1NTcsNyArMTk5MSw3IEBACiAKICAgICAgICAgY2FzZSBrV2hhdFNpZ25hbEVuZE9mSW5wdXRTdHJlYW06CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKCFpc0V4ZWN1dGluZygpKSB7CkBAIC0xNTc1LDEwICsyMDA5LDE0IEBACiAKICAgICAgICAgY2FzZSBrV2hhdEdldEJ1ZmZlcnM6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHkgd2lkZXZpbmUgbGVnYWN5IHNvdXJjZSByZXF1aXJlcyBrbm93aW5nIGFsbCBvZiB0aGUKKyAgICAgICAgICAgIC8vIGNvZGVjIGlucHV0IGJ1ZmZlcnMsIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSB0aGVtIGV2ZW4gaW4gYXN5bmMgbW9kZS4KKyAgICAgICAgICAgIGludDMyX3Qgd2lkZXZpbmUgPSAwOworICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoIndpZGV2aW5lIiwgJndpZGV2aW5lKTsKIAotICAgICAgICAgICAgaWYgKCFpc0V4ZWN1dGluZygpIHx8IChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpKSB7CisgICAgICAgICAgICBpZiAoIWlzRXhlY3V0aW5nKCkgfHwgKChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpICYmICF3aWRldmluZSkpIHsKICAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7CkBAIC0xNjA5LDcgKzIwNDcsNyBAQAogCiAgICAgICAgIGNhc2Uga1doYXRGbHVzaDoKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBpZiAoIWlzRXhlY3V0aW5nKCkpIHsKQEAgLTE2MzUsNyArMjA3Myw3IEBACiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0KICAgICAgICAgICAgICAgICAobXNnLT53aGF0KCkgPT0ga1doYXRHZXRPdXRwdXRGb3JtYXQgPyBtT3V0cHV0Rm9ybWF0IDogbUlucHV0Rm9ybWF0KTsKIAotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBpZiAoKG1TdGF0ZSAhPSBDT05GSUdVUkVEICYmIG1TdGF0ZSAhPSBTVEFSVElORyAmJgpAQCAtMTY3Miw3ICsyMTEwLDcgQEAKIAogICAgICAgICBjYXNlIGtXaGF0R2V0TmFtZToKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBpZiAobUNvbXBvbmVudE5hbWUuZW1wdHkoKSkgewpAQCAtMTY4OCw3ICsyMTI2LDcgQEAKIAogICAgICAgICBjYXNlIGtXaGF0U2V0UGFyYW1ldGVyczoKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zOwpAQCAtMTc0Miw3ICsyMTgwLDcgQEAKIAogICAgIEFTdHJpbmcgZXJyb3JEZXRhaWxNc2c7CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UXVldWVJbnB1dEJ1ZmZlciwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFF1ZXVlSW5wdXRCdWZmZXIsIHRoaXMpOwogICAgIG1zZy0+c2V0U2l6ZSgiaW5kZXgiLCBidWZmZXJJbmRleCk7CiAgICAgbXNnLT5zZXRTaXplKCJvZmZzZXQiLCAwKTsKICAgICBtc2ctPnNldFNpemUoInNpemUiLCBjc2QtPnNpemUoKSk7CkBAIC0xNzU5LDcgKzIxOTcsNyBAQAogICAgICAgICBtU29mdFJlbmRlcmVyID0gTlVMTDsKIAogICAgICAgICBtQ3J5cHRvLmNsZWFyKCk7Ci0gICAgICAgIHNldE5hdGl2ZVdpbmRvdyhOVUxMKTsKKyAgICAgICAgaGFuZGxlU2V0U3VyZmFjZShOVUxMKTsKIAogICAgICAgICBtSW5wdXRGb3JtYXQuY2xlYXIoKTsKICAgICAgICAgbU91dHB1dEZvcm1hdC5jbGVhcigpOwpAQCAtMTk0Myw3ICsyMzgxLDggQEAKICAgICAgICAgICAgICAgICBrZXksCiAgICAgICAgICAgICAgICAgaXYsCiAgICAgICAgICAgICAgICAgbW9kZSwKLSAgICAgICAgICAgICAgICBpbmZvLT5tRW5jcnlwdGVkRGF0YS0+YmFzZSgpICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgIGluZm8tPm1TaGFyZWRFbmNyeXB0ZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsCiAgICAgICAgICAgICAgICAgbnVtU3ViU2FtcGxlcywKICAgICAgICAgICAgICAgICBpbmZvLT5tRGF0YS0+YmFzZSgpLApAQCAtMTk2OSw2ICsyNDA4LDIzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCisvL3N0YXRpYworc2l6ZV90IE1lZGlhQ29kZWM6OkNyZWF0ZUZyYW1lc1JlbmRlcmVkTWVzc2FnZSgKKyAgICAgICAgc3RkOjpsaXN0PEZyYW1lUmVuZGVyVHJhY2tlcjo6SW5mbz4gZG9uZSwgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzaXplX3QgaW5kZXggPSAwOworCisgICAgZm9yIChzdGQ6Omxpc3Q8RnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBkb25lLmNiZWdpbigpOworICAgICAgICAgICAgaXQgIT0gZG9uZS5jZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGl0LT5nZXRSZW5kZXJUaW1lTnMoKSA8IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBkcm9wcGVkIGZyYW1lIGZyb20gdHJhY2tpbmcKKyAgICAgICAgfQorICAgICAgICBtc2ctPnNldEludDY0KEFTdHJpbmdQcmludGYoIiV6dS1tZWRpYS10aW1lLXVzIiwgaW5kZXgpLmNfc3RyKCksIGl0LT5nZXRNZWRpYVRpbWVVcygpKTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NChBU3RyaW5nUHJpbnRmKCIlenUtc3lzdGVtLW5hbm8iLCBpbmRleCkuY19zdHIoKSwgaXQtPmdldFJlbmRlclRpbWVOcygpKTsKKyAgICAgICAgKytpbmRleDsKKyAgICB9CisgICAgcmV0dXJuIGluZGV4OworfQorCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpvblJlbGVhc2VPdXRwdXRCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzaXplX3QgaW5kZXg7CiAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgiaW5kZXgiLCAmaW5kZXgpKTsKQEAgLTIwMDEsMjYgKzI0NTcsMzEgQEAKICAgICBpZiAocmVuZGVyICYmIGluZm8tPm1EYXRhICE9IE5VTEwgJiYgaW5mby0+bURhdGEtPnNpemUoKSAhPSAwKSB7CiAgICAgICAgIGluZm8tPm1Ob3RpZnktPnNldEludDMyKCJyZW5kZXIiLCB0cnVlKTsKIAotICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcE5zID0gMDsKLSAgICAgICAgaWYgKG1zZy0+ZmluZEludDY0KCJ0aW1lc3RhbXBOcyIsICZ0aW1lc3RhbXBOcykpIHsKLSAgICAgICAgICAgIGluZm8tPm1Ob3RpZnktPnNldEludDY0KCJ0aW1lc3RhbXBOcyIsIHRpbWVzdGFtcE5zKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE86IGl0IHNlZW1zIGxpa2Ugd2Ugc2hvdWxkIHVzZSB0aGUgdGltZXN0YW1wCi0gICAgICAgICAgICAvLyBpbiB0aGUgKG1lZGlhKWJ1ZmZlciBhcyBpdCBwb3RlbnRpYWxseSBjYW1lIGZyb20KLSAgICAgICAgICAgIC8vIGFuIGlucHV0IHN1cmZhY2UsIGJ1dCB3ZSBkaWQgbm90IHByb3BhZ2F0ZSBpdCBwcmlvciB0bwotICAgICAgICAgICAgLy8gQVBJIDIwLiAgUGVyaGFwcyBjaGVjayBmb3IgdGFyZ2V0IFNESyB2ZXJzaW9uLgotI2lmIDAKLSAgICAgICAgICAgIGlmIChpbmZvLT5tRGF0YS0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lc3RhbXBOcykpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigidXNpbmcgYnVmZmVyIFBUUyBvZiAlIiBQUklkNjQsIHRpbWVzdGFtcE5zKTsKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXBOcyAqPSAxMDAwOwotICAgICAgICAgICAgfQotI2VuZGlmCisgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXMgPSAtMTsKKyAgICAgICAgaW5mby0+bURhdGEtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpOworCisgICAgICAgIGludDY0X3QgcmVuZGVyVGltZU5zID0gMDsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQ2NCgidGltZXN0YW1wTnMiLCAmcmVuZGVyVGltZU5zKSkgeworICAgICAgICAgICAgLy8gdXNlIG1lZGlhIHRpbWVzdGFtcCBpZiBjbGllbnQgZGlkIG5vdCByZXF1ZXN0IGEgc3BlY2lmaWMgcmVuZGVyIHRpbWVzdGFtcAorICAgICAgICAgICAgQUxPR1YoInVzaW5nIGJ1ZmZlciBQVFMgb2YgJWxsZCIsIChsb25nIGxvbmcpbWVkaWFUaW1lVXMpOworICAgICAgICAgICAgcmVuZGVyVGltZU5zID0gbWVkaWFUaW1lVXMgKiAxMDAwOwogICAgICAgICB9CisgICAgICAgIGluZm8tPm1Ob3RpZnktPnNldEludDY0KCJ0aW1lc3RhbXBOcyIsIHJlbmRlclRpbWVOcyk7CiAKICAgICAgICAgaWYgKG1Tb2Z0UmVuZGVyZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbVNvZnRSZW5kZXJlci0+cmVuZGVyKAorICAgICAgICAgICAgc3RkOjpsaXN0PEZyYW1lUmVuZGVyVHJhY2tlcjo6SW5mbz4gZG9uZUZyYW1lcyA9IG1Tb2Z0UmVuZGVyZXItPnJlbmRlcigKICAgICAgICAgICAgICAgICAgICAgaW5mby0+bURhdGEtPmRhdGEoKSwgaW5mby0+bURhdGEtPnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wTnMsIE5VTEwsIGluZm8tPm1Gb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVVcywgcmVuZGVyVGltZU5zLCBOVUxMLCBpbmZvLT5tRm9ybWF0KTsKKworICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHJ1bm5pbmcsIG5vdGlmeSByZW5kZXJlZCBmcmFtZXMKKyAgICAgICAgICAgIGlmICghZG9uZUZyYW1lcy5lbXB0eSgpICYmIG1TdGF0ZSA9PSBTVEFSVEVEICYmIG1PbkZyYW1lUmVuZGVyZWROb3RpZmljYXRpb24gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtT25GcmFtZVJlbmRlcmVkTm90aWZpY2F0aW9uLT5kdXAoKTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZGF0YSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgICAgICBpZiAoQ3JlYXRlRnJhbWVzUmVuZGVyZWRNZXNzYWdlKGRvbmVGcmFtZXMsIGRhdGEpKSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZGF0YSIsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIwNjQsMzcgKzI1MjUsNjUgQEAKICAgICByZXR1cm4gaW5kZXg7CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWM6OnNldE5hdGl2ZVdpbmRvdygKLSAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2VUZXh0dXJlQ2xpZW50KSB7Ci0gICAgc3RhdHVzX3QgZXJyOwotCi0gICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgewotICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KAotICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HVygibmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCByZXR1cm5lZCBhbiBlcnJvcjogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbU5hdGl2ZVdpbmRvdy5jbGVhcigpOwotICAgIH0KLQotICAgIGlmIChzdXJmYWNlVGV4dHVyZUNsaWVudCAhPSBOVUxMKSB7Ci0gICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QoCi0gICAgICAgICAgICAgICAgc3VyZmFjZVRleHR1cmVDbGllbnQuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgibmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdCByZXR1cm5lZCBhbiBlcnJvcjogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCBlcnIpOwotCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpjb25uZWN0VG9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgaWYgKHN1cmZhY2UgIT0gTlVMTCkgeworICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KHN1cmZhY2UuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKyAgICAgICAgaWYgKGVyciA9PSBCQURfVkFMVUUpIHsKKyAgICAgICAgICAgIEFMT0dJKCJuYXRpdmUgd2luZG93IGFscmVhZHkgY29ubmVjdGVkLiBBc3N1bWluZyBubyBjaGFuZ2Ugb2Ygc3VyZmFjZSIpOwogICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIC8vIFJlcXVpcmUgYSBmcmVzaCBzZXQgb2YgYnVmZmVycyBhZnRlciBlYWNoIGNvbm5lY3QgYnkgdXNpbmcgYSB1bmlxdWUgZ2VuZXJhdGlvbgorICAgICAgICAgICAgLy8gbnVtYmVyLiBSZWx5IG9uIHRoZSBmYWN0IHRoYXQgbWF4IHN1cHBvcnRlZCBwcm9jZXNzIGlkIGJ5IExpbnV4IGlzIDJeMjIuCisgICAgICAgICAgICAvLyBQSUQgaXMgbmV2ZXIgMCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IHRoYXQgd2UgdXNlIHRoZSBkZWZhdWx0IGdlbmVyYXRpb24gb2YgMC4KKyAgICAgICAgICAgIC8vIFRPRE86IGNvbWUgdXAgd2l0aCBhIHVuaXF1ZSBzY2hlbWUgaWYgb3RoZXIgcHJvZHVjZXJzIGFsc28gc2V0IHRoZSBnZW5lcmF0aW9uIG51bWJlci4KKyAgICAgICAgICAgIHN0YXRpYyB1aW50MzJfdCBtU3VyZmFjZUdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IChnZXRwaWQoKSA8PCAxMCkgfCAoKyttU3VyZmFjZUdlbmVyYXRpb24gJiAoKDEgPDwgMTApIC0gMSkpOworICAgICAgICAgICAgc3VyZmFjZS0+c2V0R2VuZXJhdGlvbk51bWJlcihnZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIHNldHRpbmcgc3VyZmFjZSBnZW5lcmF0aW9uIHRvICV1IiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZ2VuZXJhdGlvbik7CisKKyAgICAgICAgICAgIC8vIEhBQ0s6IGNsZWFyIGFueSBmcmVlIGJ1ZmZlcnMuIFJlbW92ZSB3aGVuIGNvbm5lY3Qgd2lsbCBhdXRvbWF0aWNhbGx5IGRvIHRoaXMuCisgICAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBhcyB0aGUgY29uc3VtZXIgbWF5IGJlIGhvbGRpbmcgb250byBzdGFsZSBmcmFtZXMgdGhhdCBpdCBjYW4gcmVhdHRhY2gKKyAgICAgICAgICAgIC8vIHRvIHRoaXMgc3VyZmFjZSBhZnRlciBkaXNjb25uZWN0L2Nvbm5lY3QsIGFuZCB0aG9zZSBmcmVlIGZyYW1lcyB3b3VsZCBpbmhlcml0IHRoZSBuZXcKKyAgICAgICAgICAgIC8vIGdlbmVyYXRpb24gbnVtYmVyLiBEaXNjb25uZWN0aW5nIGFmdGVyIHNldHRpbmcgYSB1bmlxdWUgZ2VuZXJhdGlvbiBwcmV2ZW50cyB0aGlzLgorICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChzdXJmYWNlLmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KHN1cmZhY2UuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKICAgICAgICAgfQogCi0gICAgICAgIG1OYXRpdmVXaW5kb3cgPSBzdXJmYWNlVGV4dHVyZUNsaWVudDsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIm5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QgcmV0dXJuZWQgYW4gZXJyb3I6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gZXJyOworfQogCi0gICAgcmV0dXJuIE9LOworc3RhdHVzX3QgTWVkaWFDb2RlYzo6ZGlzY29ubmVjdEZyb21TdXJmYWNlKCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIFJlc2V0dGluZyBnZW5lcmF0aW9uIGlzIG5vdCB0ZWNobmljYWxseSBuZWVkZWQsIGJ1dCB0aGVyZSBpcyBubyBuZWVkIHRvIGtlZXAgaXQgZWl0aGVyCisgICAgICAgIG1TdXJmYWNlLT5zZXRHZW5lcmF0aW9uTnVtYmVyKDApOworICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG1TdXJmYWNlLmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0IHJldHVybmVkIGFuIGVycm9yOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIH0KKyAgICAgICAgLy8gYXNzdW1lIGRpc2Nvbm5lY3RlZCBldmVuIG9uIGVycm9yCisgICAgICAgIG1TdXJmYWNlLmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWM6OmhhbmRsZVNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBpZiAobVN1cmZhY2UgIT0gTlVMTCkgeworICAgICAgICAodm9pZClkaXNjb25uZWN0RnJvbVN1cmZhY2UoKTsKKyAgICB9CisgICAgaWYgKHN1cmZhY2UgIT0gTlVMTCkgeworICAgICAgICBlcnIgPSBjb25uZWN0VG9TdXJmYWNlKHN1cmZhY2UpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBtU3VyZmFjZSA9IHN1cmZhY2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKIH0KIAogdm9pZCBNZWRpYUNvZGVjOjpvbklucHV0QnVmZmVyQXZhaWxhYmxlKCkgewpAQCAtMjE5Nyw3ICsyNjg2LDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlYzo6c2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRQYXJhbWV0ZXJzLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0UGFyYW1ldGVycywgdGhpcyk7CiAgICAgbXNnLT5zZXRNZXNzYWdlKCJwYXJhbXMiLCBwYXJhbXMpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwpAQCAtMjI1MywxMiArMjc0Miw2IEBACiAKIHZvaWQgTWVkaWFDb2RlYzo6dXBkYXRlQmF0dGVyeVN0YXQoKSB7CiAgICAgaWYgKG1TdGF0ZSA9PSBDT05GSUdVUkVEICYmICFtQmF0dGVyeVN0YXROb3RpZmllZCkgewotICAgICAgICBBU3RyaW5nIG1pbWU7Ci0gICAgICAgIENIRUNLKG1PdXRwdXRGb3JtYXQgIT0gTlVMTCAmJgotICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwotCi0gICAgICAgIG1Jc1ZpZGVvID0gbWltZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgidmlkZW8vIik7Ci0KICAgICAgICAgQmF0dGVyeU5vdGlmaWVyJiBub3RpZmllcihCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkpOwogCiAgICAgICAgIGlmIChtSXNWaWRlbykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCmluZGV4IGNmNmU5MzcuLjVlZGMwNGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKQEAgLTE4LDExICsxOCwxNSBAQAogI2RlZmluZSBMT0dfVEFHICJNZWRpYUNvZGVjTGlzdCIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgIk1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmgiCisKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUmVzb3VyY2VQb2xpY3kuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMzEsMjcgKzM1LDEwMCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+CiAKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bGliZXhwYXQvZXhwYXQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjb25zdCBjaGFyICprTWF4RW5jb2RlcklucHV0QnVmZmVycyA9ICJtYXgtdmlkZW8tZW5jb2Rlci1pbnB1dC1idWZmZXJzIjsKKwogc3RhdGljIE11dGV4IHNJbml0TXV0ZXg7CiAKLXN0YXRpYyBNZWRpYUNvZGVjTGlzdCAqZ0NvZGVjTGlzdCA9IE5VTEw7CitzdGF0aWMgYm9vbCBwYXJzZUJvb2xlYW4oY29uc3QgY2hhciAqcykgeworICAgIGlmICghc3RyY2FzZWNtcChzLCAidHJ1ZSIpIHx8ICFzdHJjYXNlY21wKHMsICJ5ZXMiKSB8fCAhc3RyY2FzZWNtcChzLCAieSIpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjaGFyICplbmQ7CisgICAgdW5zaWduZWQgbG9uZyByZXMgPSBzdHJ0b3VsKHMsICZlbmQsIDEwKTsKKyAgICByZXR1cm4gKnMgIT0gJ1wwJyAmJiAqZW5kID09ICdcMCcgJiYgcmVzID4gMDsKK30KKworc3RhdGljIGJvb2wgaXNQcm9maWxpbmdOZWVkZWQoKSB7CisgICAgaW50OF90IHZhbHVlID0gcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LnByb2ZpbGVjb2RlYyIsIDApOworICAgIGlmICh2YWx1ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIHByb2ZpbGluZ05lZWRlZCA9IHRydWU7CisgICAgRklMRSAqcmVzdWx0c0ZpbGUgPSBmb3BlbihrUHJvZmlsaW5nUmVzdWx0cywgInIiKTsKKyAgICBpZiAocmVzdWx0c0ZpbGUpIHsKKyAgICAgICAgQVN0cmluZyBjdXJyZW50VmVyc2lvbiA9IGdldFByb2ZpbGluZ1ZlcnNpb25TdHJpbmcoKTsKKyAgICAgICAgc2l6ZV90IGN1cnJlbnRWZXJzaW9uU2l6ZSA9IGN1cnJlbnRWZXJzaW9uLnNpemUoKTsKKyAgICAgICAgY2hhciAqdmVyc2lvblN0cmluZyA9IG5ldyBjaGFyW2N1cnJlbnRWZXJzaW9uU2l6ZSArIDFdOworICAgICAgICBmZ2V0cyh2ZXJzaW9uU3RyaW5nLCBjdXJyZW50VmVyc2lvblNpemUgKyAxLCByZXN1bHRzRmlsZSk7CisgICAgICAgIGlmIChzdHJjbXAodmVyc2lvblN0cmluZywgY3VycmVudFZlcnNpb24uY19zdHIoKSkgPT0gMCkgeworICAgICAgICAgICAgLy8gcHJvZmlsaW5nIHJlc3VsdCB1cCB0byBkYXRlCisgICAgICAgICAgICBwcm9maWxpbmdOZWVkZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmY2xvc2UocmVzdWx0c0ZpbGUpOworICAgICAgICBkZWxldGVbXSB2ZXJzaW9uU3RyaW5nOworICAgIH0KKyAgICByZXR1cm4gcHJvZmlsaW5nTmVlZGVkOworfQogCiAvLyBzdGF0aWMKIHNwPElNZWRpYUNvZGVjTGlzdD4gTWVkaWFDb2RlY0xpc3Q6OnNDb2RlY0xpc3Q7CiAKIC8vIHN0YXRpYwordm9pZCAqTWVkaWFDb2RlY0xpc3Q6OnByb2ZpbGVyVGhyZWFkV3JhcHBlcih2b2lkICogLyphcmcqLykgeworICAgIEFMT0dWKCJFbnRlciBwcm9maWxlclRocmVhZFdyYXBwZXIuIik7CisgICAgcmVtb3ZlKGtQcm9maWxpbmdSZXN1bHRzKTsgIC8vIHJlbW92ZSBwcmV2aW91cyByZXN1bHQgc28gdGhhdCBpdCB3b24ndCBiZSBsb2FkZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5ldyBNZWRpYUNvZGVjTGlzdAorICAgIE1lZGlhQ29kZWNMaXN0ICpjb2RlY0xpc3QgPSBuZXcgTWVkaWFDb2RlY0xpc3QoKTsKKyAgICBpZiAoY29kZWNMaXN0LT5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGNyZWF0ZSBhIG5ldyBNZWRpYUNvZGVjTGlzdCwgc2tpcHBpbmcgY29kZWMgcHJvZmlsaW5nLiIpOworICAgICAgICBkZWxldGUgY29kZWNMaXN0OworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiBpbmZvczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvZGVjTGlzdC0+Y291bnRDb2RlY3MoKTsgKytpKSB7CisgICAgICAgIGluZm9zLnB1c2hfYmFjayhjb2RlY0xpc3QtPmdldENvZGVjSW5mbyhpKSk7CisgICAgfQorICAgIEFMT0dWKCJDb2RlYyBwcm9maWxpbmcgc3RhcnRlZC4iKTsKKyAgICBwcm9maWxlQ29kZWNzKGluZm9zKTsKKyAgICBBTE9HVigiQ29kZWMgcHJvZmlsaW5nIGNvbXBsZXRlZC4iKTsKKyAgICBjb2RlY0xpc3QtPnBhcnNlVG9wTGV2ZWxYTUxGaWxlKGtQcm9maWxpbmdSZXN1bHRzLCB0cnVlIC8qIGlnbm9yZV9lcnJvcnMgKi8pOworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soc0luaXRNdXRleCk7CisgICAgICAgIHNDb2RlY0xpc3QgPSBjb2RlY0xpc3Q7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvLyBzdGF0aWMKIHNwPElNZWRpYUNvZGVjTGlzdD4gTWVkaWFDb2RlY0xpc3Q6OmdldExvY2FsSW5zdGFuY2UoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKHNJbml0TXV0ZXgpOwogCi0gICAgaWYgKGdDb2RlY0xpc3QgPT0gTlVMTCkgewotICAgICAgICBnQ29kZWNMaXN0ID0gbmV3IE1lZGlhQ29kZWNMaXN0OwotICAgICAgICBpZiAoZ0NvZGVjTGlzdC0+aW5pdENoZWNrKCkgPT0gT0spIHsKLSAgICAgICAgICAgIHNDb2RlY0xpc3QgPSBnQ29kZWNMaXN0OworICAgIGlmIChzQ29kZWNMaXN0ID09IE5VTEwpIHsKKyAgICAgICAgTWVkaWFDb2RlY0xpc3QgKmNvZGVjTGlzdCA9IG5ldyBNZWRpYUNvZGVjTGlzdDsKKyAgICAgICAgaWYgKGNvZGVjTGlzdC0+aW5pdENoZWNrKCkgPT0gT0spIHsKKyAgICAgICAgICAgIHNDb2RlY0xpc3QgPSBjb2RlY0xpc3Q7CisKKyAgICAgICAgICAgIGlmIChpc1Byb2ZpbGluZ05lZWRlZCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIkNvZGVjIHByb2ZpbGluZyBuZWVkZWQsIHdpbGwgYmUgcnVuIGluIHNlcGFyYXRlZCB0aHJlYWQuIik7CisgICAgICAgICAgICAgICAgcHRocmVhZF90IHByb2ZpbGVyOworICAgICAgICAgICAgICAgIGlmIChwdGhyZWFkX2NyZWF0ZSgmcHJvZmlsZXIsIE5VTEwsIHByb2ZpbGVyVGhyZWFkV3JhcHBlciwgTlVMTCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGNyZWF0ZSB0aHJlYWQgZm9yIGNvZGVjIHByb2ZpbGluZy4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBmYWlsdXJlIHRvIGluaXRpYWxpemUgbWF5IGJlIHRlbXBvcmFyeS4gcmV0cnkgb24gbmV4dCBjYWxsLgorICAgICAgICAgICAgZGVsZXRlIGNvZGVjTGlzdDsKICAgICAgICAgfQogICAgIH0KIApAQCAtOTQsMTEgKzE3MSwxNSBAQAogfQogCiBNZWRpYUNvZGVjTGlzdDo6TWVkaWFDb2RlY0xpc3QoKQotICAgIDogbUluaXRDaGVjayhOT19JTklUKSB7CisgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAorICAgICAgbVVwZGF0ZShmYWxzZSksCisgICAgICBtR2xvYmFsU2V0dGluZ3MobmV3IEFNZXNzYWdlKCkpIHsKICAgICBwYXJzZVRvcExldmVsWE1MRmlsZSgiL2V0Yy9tZWRpYV9jb2RlY3MueG1sIik7CisgICAgcGFyc2VUb3BMZXZlbFhNTEZpbGUoIi9ldGMvbWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlLnhtbCIsIHRydWUvKiBpZ25vcmVfZXJyb3JzICovKTsKKyAgICBwYXJzZVRvcExldmVsWE1MRmlsZShrUHJvZmlsaW5nUmVzdWx0cywgdHJ1ZS8qIGlnbm9yZV9lcnJvcnMgKi8pOwogfQogCi12b2lkIE1lZGlhQ29kZWNMaXN0OjpwYXJzZVRvcExldmVsWE1MRmlsZShjb25zdCBjaGFyICpjb2RlY3NfeG1sKSB7Cit2b2lkIE1lZGlhQ29kZWNMaXN0OjpwYXJzZVRvcExldmVsWE1MRmlsZShjb25zdCBjaGFyICpjb2RlY3NfeG1sLCBib29sIGlnbm9yZV9lcnJvcnMpIHsKICAgICAvLyBnZXQgaHJlZl9iYXNlCiAgICAgY2hhciAqaHJlZl9iYXNlX2VuZCA9IHN0cnJjaHIoY29kZWNzX3htbCwgJy8nKTsKICAgICBpZiAoaHJlZl9iYXNlX2VuZCAhPSBOVUxMKSB7CkBAIC0xMTIsMjAgKzE5Myw0OSBAQAogICAgIE9NWENsaWVudCBjbGllbnQ7CiAgICAgbUluaXRDaGVjayA9IGNsaWVudC5jb25uZWN0KCk7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm47ICAvLyB0aGlzIG1heSBmYWlsIGlmIElNZWRpYVBsYXllclNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZS4KICAgICB9CiAgICAgbU9NWCA9IGNsaWVudC5pbnRlcmZhY2UoKTsKICAgICBwYXJzZVhNTEZpbGUoY29kZWNzX3htbCk7CiAgICAgbU9NWC5jbGVhcigpOwogCiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgaWYgKGlnbm9yZV9lcnJvcnMpIHsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBtQ29kZWNJbmZvcy5jbGVhcigpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgZm9yIChzaXplX3QgaSA9IG1Db2RlY0luZm9zLnNpemUoKTsgaS0tID4gMDspIHsKLSAgICAgICAgY29uc3QgTWVkaWFDb2RlY0luZm8gJmluZm8gPSAqbUNvZGVjSW5mb3MuaXRlbUF0KGkpLmdldCgpOworICAgIFZlY3RvcjxNZWRpYVJlc291cmNlUG9saWN5PiBwb2xpY2llczsKKyAgICBBU3RyaW5nIHZhbHVlOworICAgIGlmIChtR2xvYmFsU2V0dGluZ3MtPmZpbmRTdHJpbmcoa1BvbGljeVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MsICZ2YWx1ZSkpIHsKKyAgICAgICAgcG9saWNpZXMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2VQb2xpY3koCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGtQb2xpY3lTdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgodmFsdWUuY19zdHIoKSkpKTsKKyAgICB9CisgICAgaWYgKG1HbG9iYWxTZXR0aW5ncy0+ZmluZFN0cmluZyhrUG9saWN5U3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMsICZ2YWx1ZSkpIHsKKyAgICAgICAgcG9saWNpZXMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2VQb2xpY3koCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGtQb2xpY3lTdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHZhbHVlLmNfc3RyKCkpKSk7CisgICAgfQorICAgIGlmIChwb2xpY2llcy5zaXplKCkgPiAwKSB7CisgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLnJlc291cmNlX21hbmFnZXIiKSk7CisgICAgICAgIHNwPElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiBzZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SVJlc291cmNlTWFuYWdlclNlcnZpY2U+KGJpbmRlcik7CisgICAgICAgIGlmIChzZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZWRpYUNvZGVjTGlzdDogZmFpbGVkIHRvIGdldCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXJ2aWNlLT5jb25maWcocG9saWNpZXMpOworICAgICAgICB9CisgICAgfQogCisgICAgZm9yIChzaXplX3QgaSA9IG1Db2RlY0luZm9zLnNpemUoKTsgaSA+IDA7KSB7CisgICAgICAgIGktLTsKKyAgICAgICAgY29uc3QgTWVkaWFDb2RlY0luZm8gJmluZm8gPSAqbUNvZGVjSW5mb3MuaXRlbUF0KGkpLmdldCgpOwogICAgICAgICBpZiAoaW5mby5tQ2Fwcy5zaXplKCkgPT0gMCkgewogICAgICAgICAgICAgLy8gTm8gdHlwZXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29tcG9uZW50Pz8/CiAgICAgICAgICAgICBBTE9HVygiQ29tcG9uZW50ICVzIGRvZXMgbm90IHN1cHBvcnQgYW55IHR5cGUgb2YgbWVkaWE/IiwKQEAgLTE2OSw2ICsyNzksMTYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBBTE9HVigiICAgIGxldmVscz1bJXNdIiwgbmljZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHF1aXJrczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGluZm8ubVF1aXJrcy5zaXplKCk7IGl4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpeCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWlya3MuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcXVpcmtzLmFwcGVuZChpbmZvLm1RdWlya3NbaXhdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBTE9HVigiICAgIHF1aXJrcz1bJXNdIiwgcXVpcmtzLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICNlbmRpZgogICAgICAgICB9CkBAIC0zMjgsNiArNDQ4LDE2IEBACiAgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9ERUNPREVSUzsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiRW5jb2RlcnMiKSkgewogICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUlM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlNldHRpbmdzIikpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1NFVFRJTkdTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFQ1RJT05fU0VUVElOR1M6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJTZXR0aW5nIikpIHsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzKGF0dHJzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zOTcsNiArNTI3LDE0IEBACiAgICAgfQogCiAgICAgc3dpdGNoIChtQ3VycmVudFNlY3Rpb24pIHsKKyAgICAgICAgY2FzZSBTRUNUSU9OX1NFVFRJTkdTOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiU2V0dGluZ3MiKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSUzoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlY29kZXJzIikpIHsKQEAgLTQ2MiwxMCArNjAwLDgxIEBACiAgICAgLS1tRGVwdGg7CiB9CiAKK3N0YXR1c190IE1lZGlhQ29kZWNMaXN0OjphZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqdmFsdWUgPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IE5VTEw7CisKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2kgKyAxXTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidmFsdWUiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZSA9IGF0dHJzW2kgKyAxXTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidXBkYXRlIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaSArIDFdOworICAgICAgICAgICAgKytpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICArK2k7CisgICAgfQorCisgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCB2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIG1VcGRhdGUgPSAodXBkYXRlICE9IE5VTEwpICYmIHBhcnNlQm9vbGVhbih1cGRhdGUpOworICAgIGlmIChtVXBkYXRlICE9IG1HbG9iYWxTZXR0aW5ncy0+Y29udGFpbnMobmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgbUdsb2JhbFNldHRpbmdzLT5zZXRTdHJpbmcobmFtZSwgdmFsdWUpOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBNZWRpYUNvZGVjTGlzdDo6c2V0Q3VycmVudENvZGVjSW5mbyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlY0luZm9zLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChBU3RyaW5nKG5hbWUpID09IG1Db2RlY0luZm9zW2ldLT5nZXRDb2RlY05hbWUoKSkgeworICAgICAgICAgICAgaWYgKG1Db2RlY0luZm9zW2ldLT5nZXRDYXBhYmlsaXRpZXNGb3IodHlwZSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJPdmVycmlkZXMgd2l0aCBhbiB1bmV4cGVjdGVkIG1pbWUgJXMiLCB0eXBlKTsKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTWVkaWFDb2RlY0luZm8gKGJ1dCBkb24ndCBhZGQgaXQgdG8gbUNvZGVjSW5mb3MpIHRvIGhvbGQgdGhlCisgICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGVzIHdlIGRvbid0IHdhbnQuCisgICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvKG5hbWUsIGVuY29kZXIsIHR5cGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudEluZm8gPSBtQ29kZWNJbmZvcy5lZGl0SXRlbUF0KGkpOworICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mby0+dXBkYXRlTWltZSh0eXBlKTsgIC8vIHRvIHNldCB0aGUgY3VycmVudCBjYXAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQ3VycmVudEluZm8gPSBuZXcgTWVkaWFDb2RlY0luZm8obmFtZSwgZW5jb2RlciwgdHlwZSk7CisgICAgLy8gVGhlIG5leHQgc3RlcCBpbnZvbHZlcyB0cnlpbmcgdG8gbG9hZCB0aGUgY29kZWMsIHdoaWNoIG1heQorICAgIC8vIGZhaWwuICBPbmx5IGxpc3QgdGhlIGNvZGVjIGlmIHRoaXMgc3VjY2VlZHMuCisgICAgLy8gSG93ZXZlciwga2VlcCBtQ3VycmVudEluZm8gb2JqZWN0IGFyb3VuZCB1bnRpbCBwYXJzaW5nCisgICAgLy8gb2YgZnVsbCBjb2RlYyBpbmZvIGlzIGNvbXBsZXRlZC4KKyAgICBpZiAoaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyh0eXBlKSA9PSBPSykgeworICAgICAgICBtQ29kZWNJbmZvcy5wdXNoX2JhY2sobUN1cnJlbnRJbmZvKTsKKyAgICB9Cit9CisKIHN0YXR1c190IE1lZGlhQ29kZWNMaXN0OjphZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXMoCiAgICAgICAgIGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqKmF0dHJzKSB7CiAgICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqdHlwZSA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqdXBkYXRlID0gTlVMTDsKIAogICAgIHNpemVfdCBpID0gMDsKICAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgewpAQCAtNDgxLDYgKzY5MCwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgdHlwZSA9IGF0dHJzW2kgKyAxXTsKICAgICAgICAgICAgICsraTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidXBkYXRlIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaSArIDFdOworICAgICAgICAgICAgKytpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KQEAgLTQ5MiwxNCArNzA3LDM5IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIG1DdXJyZW50SW5mbyA9IG5ldyBNZWRpYUNvZGVjSW5mbyhuYW1lLCBlbmNvZGVyLCB0eXBlKTsKLSAgICAvLyBUaGUgbmV4dCBzdGVwIGludm9sdmVzIHRyeWluZyB0byBsb2FkIHRoZSBjb2RlYywgd2hpY2ggbWF5Ci0gICAgLy8gZmFpbC4gIE9ubHkgbGlzdCB0aGUgY29kZWMgaWYgdGhpcyBzdWNjZWVkcy4KLSAgICAvLyBIb3dldmVyLCBrZWVwIG1DdXJyZW50SW5mbyBvYmplY3QgYXJvdW5kIHVudGlsIHBhcnNpbmcKLSAgICAvLyBvZiBmdWxsIGNvZGVjIGluZm8gaXMgY29tcGxldGVkLgotICAgIGlmIChpbml0aWFsaXplQ2FwYWJpbGl0aWVzKHR5cGUpID09IE9LKSB7Ci0gICAgICAgIG1Db2RlY0luZm9zLnB1c2hfYmFjayhtQ3VycmVudEluZm8pOworICAgIG1VcGRhdGUgPSAodXBkYXRlICE9IE5VTEwpICYmIHBhcnNlQm9vbGVhbih1cGRhdGUpOworICAgIHNzaXplX3QgaW5kZXggPSAtMTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlY0luZm9zLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChBU3RyaW5nKG5hbWUpID09IG1Db2RlY0luZm9zW2ldLT5nZXRDb2RlY05hbWUoKSkgeworICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICB9CiAgICAgfQorICAgIGlmIChtVXBkYXRlICE9IChpbmRleCA+PSAwKSkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAvLyBleGlzdGluZyBjb2RlYworICAgICAgICBtQ3VycmVudEluZm8gPSBtQ29kZWNJbmZvcy5lZGl0SXRlbUF0KGluZGV4KTsKKyAgICAgICAgaWYgKHR5cGUgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gZXhpc3RpbmcgdHlwZQorICAgICAgICAgICAgaWYgKG1Db2RlY0luZm9zW2luZGV4XS0+Z2V0Q2FwYWJpbGl0aWVzRm9yKHR5cGUpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50SW5mby0+dXBkYXRlTWltZSh0eXBlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG5ldyBjb2RlYworICAgICAgICBtQ3VycmVudEluZm8gPSBuZXcgTWVkaWFDb2RlY0luZm8obmFtZSwgZW5jb2RlciwgdHlwZSk7CisgICAgICAgIC8vIFRoZSBuZXh0IHN0ZXAgaW52b2x2ZXMgdHJ5aW5nIHRvIGxvYWQgdGhlIGNvZGVjLCB3aGljaCBtYXkKKyAgICAgICAgLy8gZmFpbC4gIE9ubHkgbGlzdCB0aGUgY29kZWMgaWYgdGhpcyBzdWNjZWVkcy4KKyAgICAgICAgLy8gSG93ZXZlciwga2VlcCBtQ3VycmVudEluZm8gb2JqZWN0IGFyb3VuZCB1bnRpbCBwYXJzaW5nCisgICAgICAgIC8vIG9mIGZ1bGwgY29kZWMgaW5mbyBpcyBjb21wbGV0ZWQuCisgICAgICAgIGlmIChpbml0aWFsaXplQ2FwYWJpbGl0aWVzKHR5cGUpID09IE9LKSB7CisgICAgICAgICAgICBtQ29kZWNJbmZvcy5wdXNoX2JhY2sobUN1cnJlbnRJbmZvKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNTUzLDYgKzc5Myw3IEBACiAKIHN0YXR1c190IE1lZGlhQ29kZWNMaXN0OjphZGRUeXBlRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzKSB7CiAgICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqdXBkYXRlID0gTlVMTDsKIAogICAgIHNpemVfdCBpID0gMDsKICAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgewpAQCAtNTYyLDYgKzgwMywxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2kgKyAxXTsKICAgICAgICAgICAgICsraTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidXBkYXRlIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaSArIDFdOworICAgICAgICAgICAgKytpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KQEAgLTU3MywxNCArODIwLDI1IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIHN0YXR1c190IHJldCA9IG1DdXJyZW50SW5mby0+YWRkTWltZShuYW1lKTsKKyAgICBib29sIGlzRXhpc3RpbmdUeXBlID0gKG1DdXJyZW50SW5mby0+Z2V0Q2FwYWJpbGl0aWVzRm9yKG5hbWUpICE9IE5VTEwpOworICAgIGlmIChtVXBkYXRlICE9IGlzRXhpc3RpbmdUeXBlKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHN0YXR1c190IHJldDsKKyAgICBpZiAobVVwZGF0ZSkgeworICAgICAgICByZXQgPSBtQ3VycmVudEluZm8tPnVwZGF0ZU1pbWUobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gbUN1cnJlbnRJbmZvLT5hZGRNaW1lKG5hbWUpOworICAgIH0KKwogICAgIGlmIChyZXQgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKICAgICAvLyBUaGUgbmV4dCBzdGVwIGludm9sdmVzIHRyeWluZyB0byBsb2FkIHRoZSBjb2RlYywgd2hpY2ggbWF5CiAgICAgLy8gZmFpbC4gIEhhbmRsZSB0aGlzIGdyYWNlZnVsbHkgKGJ5IG5vdCByZXBvcnRpbmcgc3VjaCBtaW1lKS4KLSAgICBpZiAoaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhuYW1lKSAhPSBPSykgeworICAgIGlmICghbVVwZGF0ZSAmJiBpbml0aWFsaXplQ2FwYWJpbGl0aWVzKG5hbWUpICE9IE9LKSB7CiAgICAgICAgIG1DdXJyZW50SW5mby0+cmVtb3ZlTWltZShuYW1lKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwpAQCAtNjc1LDE0ICs5MzMsMTYgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgLy8gc2l6ZSwgYmxvY2tzLCBiaXRyYXRlLCBmcmFtZS1yYXRlLCBibG9ja3MtcGVyLXNlY29uZCwgYXNwZWN0LXJhdGlvOiByYW5nZQorICAgIC8vIHNpemUsIGJsb2NrcywgYml0cmF0ZSwgZnJhbWUtcmF0ZSwgYmxvY2tzLXBlci1zZWNvbmQsIGFzcGVjdC1yYXRpbywKKyAgICAvLyBtZWFzdXJlZC1mcmFtZS1yYXRlLCBtZWFzdXJlZC1ibG9ja3MtcGVyLXNlY29uZDogcmFuZ2UKICAgICAvLyBxdWFsaXR5OiByYW5nZSArIGRlZmF1bHQgKyBbc2NhbGVdCiAgICAgLy8gY29tcGxleGl0eTogcmFuZ2UgKyBkZWZhdWx0CiAgICAgYm9vbCBmb3VuZDsKIAogICAgIGlmIChuYW1lID09ICJhc3BlY3QtcmF0aW8iIHx8IG5hbWUgPT0gImJpdHJhdGUiIHx8IG5hbWUgPT0gImJsb2NrLWNvdW50IgogICAgICAgICAgICAgfHwgbmFtZSA9PSAiYmxvY2tzLXBlci1zZWNvbmQiIHx8IG5hbWUgPT0gImNvbXBsZXhpdHkiCi0gICAgICAgICAgICB8fCBuYW1lID09ICJmcmFtZS1yYXRlIiB8fCBuYW1lID09ICJxdWFsaXR5IiB8fCBuYW1lID09ICJzaXplIikgeworICAgICAgICAgICAgfHwgbmFtZSA9PSAiZnJhbWUtcmF0ZSIgfHwgbmFtZSA9PSAicXVhbGl0eSIgfHwgbmFtZSA9PSAic2l6ZSIKKyAgICAgICAgICAgIHx8IG5hbWUgPT0gIm1lYXN1cmVkLWJsb2Nrcy1wZXItc2Vjb25kIiB8fCBuYW1lLnN0YXJ0c1dpdGgoIm1lYXN1cmVkLWZyYW1lLXJhdGUtIikpIHsKICAgICAgICAgQVN0cmluZyBtaW4sIG1heDsKICAgICAgICAgaWYgKG1zZy0+ZmluZFN0cmluZygibWluIiwgJm1pbikgJiYgbXNnLT5maW5kU3RyaW5nKCJtYXgiLCAmbWF4KSkgewogICAgICAgICAgICAgbWluLmFwcGVuZCgiLSIpOwpAQCAtNzQ2LDcgKzEwMDYsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAiZGVmYXVsdCIpOwogICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoImluIikpIHsKICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgImluIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoKG5hbWUgPT0gImNoYW5uZWwtY291bnQiKSBeCisgICAgICAgIH0gZWxzZSBpZiAoKG5hbWUgPT0gImNoYW5uZWwtY291bnQiIHx8IG5hbWUgPT0gImNvbmN1cnJlbnQtaW5zdGFuY2VzIikgXgogICAgICAgICAgICAgICAgIChmb3VuZCA9IG1zZy0+ZmluZFN0cmluZygibWF4IiwgJm1heCkpKSB7CiAgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJtYXgiLCBmb3VuZCk7CiAgICAgICAgIH0gZWxzZSBpZiAobXNnLT5jb250YWlucygibWluIikpIHsKQEAgLTc4MCwxNSArMTA0MCw2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0aWMgYm9vbCBwYXJzZUJvb2xlYW4oY29uc3QgY2hhciAqcykgewotICAgIGlmICghc3RyY2FzZWNtcChzLCAidHJ1ZSIpIHx8ICFzdHJjYXNlY21wKHMsICJ5ZXMiKSB8fCAhc3RyY2FzZWNtcChzLCAieSIpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjaGFyICplbmQ7Ci0gICAgdW5zaWduZWQgbG9uZyByZXMgPSBzdHJ0b3VsKHMsICZlbmQsIDEwKTsKLSAgICByZXR1cm4gKnMgIT0gJ1wwJyAmJiAqZW5kID09ICdcMCcgJiYgcmVzID4gMDsKLX0KLQogc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmFkZEZlYXR1cmUoY29uc3QgY2hhciAqKmF0dHJzKSB7CiAgICAgc2l6ZV90IGkgPSAwOwogICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwpAQCAtODYwLDQgKzExMTEsOCBAQAogICAgIHJldHVybiBtQ29kZWNJbmZvcy5zaXplKCk7CiB9CiAKK2NvbnN0IHNwPEFNZXNzYWdlPiBNZWRpYUNvZGVjTGlzdDo6Z2V0R2xvYmFsU2V0dGluZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1HbG9iYWxTZXR0aW5nczsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWMzNmI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwCkBAIC0wLDAgKzEsNDIxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuaCIKKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVJlc291cmNlUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSVZDb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3QgY2hhciAqa1Byb2ZpbGluZ1Jlc3VsdHMgPSAiL2RhdGEvbWlzYy9tZWRpYS9tZWRpYV9jb2RlY3NfcHJvZmlsaW5nX3Jlc3VsdHMueG1sIjsKKworQVN0cmluZyBnZXRQcm9maWxpbmdWZXJzaW9uU3RyaW5nKCkgeworICAgIGNoYXIgdmFsW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldCgicm8uYnVpbGQuZGlzcGxheS5pZCIsIHZhbCwgTlVMTCkgJiYgKHN0cmxlbih2YWwpID4gMCkpIHsKKyAgICAgICAgcmV0dXJuIEFTdHJpbmdQcmludGYoIjwhLS0gUHJvZmlsZWQtd2l0aDogJXMgLS0+IiwgdmFsKTsKKyAgICB9CisKKyAgICByZXR1cm4gIjwhLS0gUHJvZmlsZWQtd2l0aDogVU5LTk9XTl9CVUlMRF9JRCAtLT4iOworfQorCisvLyBhIGxpbWl0IHRvIGF2b2lkIGFsbG9jYXRpbmcgdW5yZWFzb25hYmxlIG51bWJlciBvZiBjb2RlYyBpbnN0YW5jZXMgaW4gdGhlIG1lYXN1cmVtZW50LgorLy8gdGhpcyBzaG91bGQgYmUgaW4gc3luYyB3aXRoIHRoZSBNQVhfU1VQUE9SVEVEX0lOU1RBTkNFUyBkZWZpbmVkIGluIE1lZGlhQ29kZWNJbmZvLmphdmEuCitzdGF0aWMgY29uc3QgaW50IGtNYXhJbnN0YW5jZXMgPSAzMjsKKworLy8gVE9ETzogbW92ZSBNZWRpYUNvZGVjSW5mbyB0byBDKysuIFVudGlsIHRoZW4sIHNvbWUgdGVtcCBtZXRob2RzIHRvIHBhcnNlIG91dCBpbmZvLgorc3RhdGljIGJvb2wgZ2V0TWVhc3VyZVNpemUoc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcywgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgeworICAgIEFTdHJpbmcgc2l6ZVJhbmdlOworICAgIGlmICghY2Fwcy0+Z2V0RGV0YWlscygpLT5maW5kU3RyaW5nKCJzaXplLXJhbmdlIiwgJnNpemVSYW5nZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBU3RyaW5nIG1pblNpemU7CisgICAgQVN0cmluZyBtYXhTaXplOworICAgIGlmICghc3BsaXRTdHJpbmcoc2l6ZVJhbmdlLCAiLSIsICZtaW5TaXplLCAmbWF4U2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBU3RyaW5nIHNXaWR0aDsKKyAgICBBU3RyaW5nIHNIZWlnaHQ7CisgICAgaWYgKCFzcGxpdFN0cmluZyhtaW5TaXplLCAieCIsICZzV2lkdGgsICZzSGVpZ2h0KSkgeworICAgICAgICBpZiAoIXNwbGl0U3RyaW5nKG1pblNpemUsICIqIiwgJnNXaWR0aCwgJnNIZWlnaHQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqd2lkdGggPSBzdHJ0b2woc1dpZHRoLmNfc3RyKCksIE5VTEwsIDEwKTsKKyAgICAqaGVpZ2h0ID0gc3RydG9sKHNIZWlnaHQuY19zdHIoKSwgTlVMTCwgMTApOworICAgIHJldHVybiAoKndpZHRoID4gMCkgJiYgKCpoZWlnaHQgPiAwKTsKK30KKworc3RhdGljIHZvaWQgZ2V0TWVhc3VyZUJpdHJhdGUoc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcywgaW50MzJfdCAqYml0cmF0ZSkgeworICAgIC8vIFVudGlsIGhhdmUgbmF0aXZlIE1lZGlhQ29kZWNJbmZvLCB3ZSBjYW5ub3QgZ2V0IGJpdHJhdGVzIGJhc2VkIG9uIHByb2ZpbGUvbGV2ZWxzLgorICAgIC8vIFdlIHVzZSAyMDAwMDAgYXMgZGVmYXVsdCB2YWx1ZSBmb3Igb3VyIG1lYXN1cmVtZW50LgorICAgICpiaXRyYXRlID0gMjAwMDAwOworICAgIEFTdHJpbmcgYml0cmF0ZVJhbmdlOworICAgIGlmICghY2Fwcy0+Z2V0RGV0YWlscygpLT5maW5kU3RyaW5nKCJiaXRyYXRlLXJhbmdlIiwgJmJpdHJhdGVSYW5nZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU3RyaW5nIG1pbkJpdHJhdGU7CisgICAgQVN0cmluZyBtYXhCaXRyYXRlOworICAgIGlmICghc3BsaXRTdHJpbmcoYml0cmF0ZVJhbmdlLCAiLSIsICZtaW5CaXRyYXRlLCAmbWF4Qml0cmF0ZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICpiaXRyYXRlID0gc3RydG9sKG1pbkJpdHJhdGUuY19zdHIoKSwgTlVMTCwgMTApOworfQorCitzdGF0aWMgc3A8QU1lc3NhZ2U+IGdldE1lYXN1cmVGb3JtYXQoCisgICAgICAgIGJvb2wgaXNFbmNvZGVyLCBBU3RyaW5nIG1pbWUsIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHMpIHsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lKTsKKworICAgIGlmIChpc0VuY29kZXIpIHsKKyAgICAgICAgaW50MzJfdCBiaXRyYXRlID0gMDsKKyAgICAgICAgZ2V0TWVhc3VyZUJpdHJhdGUoY2FwcywgJmJpdHJhdGUpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJiaXRyYXRlIiwgYml0cmF0ZSk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImVuY29kZXIiLCAxKTsKKyAgICB9CisKKyAgICBpZiAobWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICBpbnQzMl90IHdpZHRoID0gMDsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQgPSAwOworICAgICAgICBpZiAoIWdldE1lYXN1cmVTaXplKGNhcHMsICZ3aWR0aCwgJmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgd2lkdGgpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJoZWlnaHQiLCBoZWlnaHQpOworCisgICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gY29sb3JGb3JtYXRzOworICAgICAgICBjYXBzLT5nZXRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoJmNvbG9yRm9ybWF0cyk7CisgICAgICAgIGlmIChjb2xvckZvcm1hdHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIGNvbG9yRm9ybWF0c1swXSk7CisKKyAgICAgICAgZm9ybWF0LT5zZXRGbG9hdCgiZnJhbWUtcmF0ZSIsIDEwLjApOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJpLWZyYW1lLWludGVydmFsIiwgMTApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRPRE86IHByb2ZpbGUgaHcgYXVkaW8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGZvcm1hdDsKK30KKworc3RhdGljIHNpemVfdCBkb1Byb2ZpbGVFbmNvZGVySW5wdXRCdWZmZXJzKAorICAgICAgICBBU3RyaW5nIG5hbWUsIEFTdHJpbmcgbWltZSwgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcykgeworICAgIEFMT0dWKCJkb1Byb2ZpbGVFbmNvZGVySW5wdXRCdWZmZXJzOiBuYW1lICVzLCBtaW1lICVzIiwgbmFtZS5jX3N0cigpLCBtaW1lLmNfc3RyKCkpOworCisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IGdldE1lYXN1cmVGb3JtYXQodHJ1ZSAvKiBpc0VuY29kZXIgKi8sIG1pbWUsIGNhcHMpOworICAgIGlmIChmb3JtYXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZSk7CisgICAgQUxPR1YoImRvUHJvZmlsZUVuY29kZXJJbnB1dEJ1ZmZlcnM6IGZvcm1hdCAlcyIsIGZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIGxvb3Blci0+c2V0TmFtZSgiTWVkaWFDb2RlY19sb29wZXIiKTsKKyAgICBsb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgZmFsc2UgLyogcnVuT25DYWxsaW5nVGhyZWFkICovLCBmYWxzZSAvKiBjYW5DYWxsSmF2YSAqLywgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisKKyAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShsb29wZXIsIG5hbWUuY19zdHIoKSwgJmVycik7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBjb2RlYzogJXMiLCBuYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBlcnIgPSBjb2RlYy0+Y29uZmlndXJlKGZvcm1hdCwgTlVMTCwgTlVMTCwgTWVkaWFDb2RlYzo6Q09ORklHVVJFX0ZMQUdfRU5DT0RFKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlIGNvZGVjOiAlcyB3aXRoIG1pbWU6ICVzIiwgbmFtZS5jX3N0cigpLCBtaW1lLmNfc3RyKCkpOworICAgICAgICBjb2RlYy0+cmVsZWFzZSgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKKyAgICBlcnIgPSBjb2RlYy0+Y3JlYXRlSW5wdXRTdXJmYWNlKCZidWZmZXJQcm9kdWNlcik7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBzdXJmYWNlOiAlcyB3aXRoIG1pbWU6ICVzIiwgbmFtZS5jX3N0cigpLCBtaW1lLmNfc3RyKCkpOworICAgICAgICBjb2RlYy0+cmVsZWFzZSgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpbnQgbWluVW5kZXF1ZXVlZCA9IDA7CisgICAgZXJyID0gYnVmZmVyUHJvZHVjZXItPnF1ZXJ5KAorICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLCAmbWluVW5kZXF1ZXVlZCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHF1ZXJ5IE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUyIpOworICAgICAgICBtaW5VbmRlcXVldWVkID0gMDsKKyAgICB9CisKKyAgICBlcnIgPSBjb2RlYy0+cmVsZWFzZSgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGNvZGVjOiAlcyB3aXRoIG1pbWU6ICVzIiwgbmFtZS5jX3N0cigpLCBtaW1lLmNfc3RyKCkpOworICAgIH0KKworICAgIHJldHVybiBtaW5VbmRlcXVldWVkOworfQorCitzdGF0aWMgc2l6ZV90IGRvUHJvZmlsZUNvZGVjcygKKyAgICAgICAgYm9vbCBpc0VuY29kZXIsIEFTdHJpbmcgbmFtZSwgQVN0cmluZyBtaW1lLCBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBzKSB7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IGdldE1lYXN1cmVGb3JtYXQoaXNFbmNvZGVyLCBtaW1lLCBjYXBzKTsKKyAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEFMT0dWKCJkb1Byb2ZpbGVDb2RlY3MgJXMgJXMgJXMgJXMiLAorICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBtaW1lLmNfc3RyKCksIGlzRW5jb2RlciA/ICJlbmNvZGVyIiA6ICJkZWNvZGVyIiwKKyAgICAgICAgICAgIGZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIFZlY3RvcjxzcDxNZWRpYUNvZGVjPj4gY29kZWNzOworICAgIHdoaWxlIChlcnIgPT0gT0sgJiYgY29kZWNzLnNpemUoKSA8IGtNYXhJbnN0YW5jZXMpIHsKKyAgICAgICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgICAgIGxvb3Blci0+c2V0TmFtZSgiTWVkaWFDb2RlY19sb29wZXIiKTsKKyAgICAgICAgQUxPR1YoImRvUHJvZmlsZUNvZGVjcyBmb3IgY29kZWMgIyV6dSIsIGNvZGVjcy5zaXplKCkpOworICAgICAgICBBTE9HVigiZG9Qcm9maWxlQ29kZWNzIHN0YXJ0IGxvb3BlciIpOworICAgICAgICBsb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgICAgIGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLywgZmFsc2UgLyogY2FuQ2FsbEphdmEgKi8sIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgICAgICBBTE9HVigiZG9Qcm9maWxlQ29kZWNzIENyZWF0ZUJ5Q29tcG9uZW50TmFtZSIpOworICAgICAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShsb29wZXIsIG5hbWUuY19zdHIoKSwgJmVycik7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJGYWlsZWQgdG8gY3JlYXRlIGNvZGVjOiAlcyIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiBuYXRpdmVXaW5kb3c7CisgICAgICAgIGNvbnN0IHNwPElDcnlwdG8+IGNyeXB0bzsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSBpc0VuY29kZXIgPyBNZWRpYUNvZGVjOjpDT05GSUdVUkVfRkxBR19FTkNPREUgOiAwOworICAgICAgICBBTE9HVigiZG9Qcm9maWxlQ29kZWNzIGNvbmZpZ3VyZSIpOworICAgICAgICBlcnIgPSBjb2RlYy0+Y29uZmlndXJlKGZvcm1hdCwgbmF0aXZlV2luZG93LCBjcnlwdG8sIGZsYWdzKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1YoIkZhaWxlZCB0byBjb25maWd1cmUgY29kZWM6ICVzIHdpdGggbWltZTogJXMiLCBuYW1lLmNfc3RyKCksIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICBjb2RlYy0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImRvUHJvZmlsZUNvZGVjcyBzdGFydCIpOworICAgICAgICBlcnIgPSBjb2RlYy0+c3RhcnQoKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1YoIkZhaWxlZCB0byBzdGFydCBjb2RlYzogJXMgd2l0aCBtaW1lOiAlcyIsIG5hbWUuY19zdHIoKSwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb2RlY3MucHVzaF9iYWNrKGNvZGVjKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvZGVjcy5zaXplKCk7ICsraSkgeworICAgICAgICBBTE9HVigiZG9Qcm9maWxlQ29kZWNzIHJlbGVhc2UgJXMiLCBuYW1lLmNfc3RyKCkpOworICAgICAgICBlcnIgPSBjb2RlY3NbaV0tPnJlbGVhc2UoKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWxlYXNlIGNvZGVjOiAlcyB3aXRoIG1pbWU6ICVzIiwgbmFtZS5jX3N0cigpLCBtaW1lLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvZGVjcy5zaXplKCk7Cit9CisKK2Jvb2wgc3BsaXRTdHJpbmcoY29uc3QgQVN0cmluZyAmcywgY29uc3QgQVN0cmluZyAmZGVsaW1pdGVyLCBBU3RyaW5nICpzMSwgQVN0cmluZyAqczIpIHsKKyAgICBzc2l6ZV90IHBvcyA9IHMuZmluZChkZWxpbWl0ZXIuY19zdHIoKSk7CisgICAgaWYgKHBvcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAqczEgPSBBU3RyaW5nKHMsIDAsIHBvcyk7CisgICAgKnMyID0gQVN0cmluZyhzLCBwb3MgKyAxLCBzLnNpemUoKSAtIHBvcyAtIDEpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIHNwbGl0U3RyaW5nKAorICAgICAgICBjb25zdCBBU3RyaW5nICZzLCBjb25zdCBBU3RyaW5nICZkZWxpbWl0ZXIsIEFTdHJpbmcgKnMxLCBBU3RyaW5nICpzMiwgQVN0cmluZyAqczMpIHsKKyAgICBBU3RyaW5nIHRlbXA7CisgICAgaWYgKCFzcGxpdFN0cmluZyhzLCBkZWxpbWl0ZXIsIHMxLCAmdGVtcCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIXNwbGl0U3RyaW5nKHRlbXAsIGRlbGltaXRlciwgczIsIHMzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIHByb2ZpbGVDb2RlY3MoY29uc3QgVmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gJmluZm9zKSB7CisgICAgQ29kZWNTZXR0aW5ncyBnbG9iYWxfcmVzdWx0czsKKyAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiBlbmNvZGVyX3Jlc3VsdHM7CisgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4gZGVjb2Rlcl9yZXN1bHRzOworICAgIHByb2ZpbGVDb2RlY3MoaW5mb3MsICZnbG9iYWxfcmVzdWx0cywgJmVuY29kZXJfcmVzdWx0cywgJmRlY29kZXJfcmVzdWx0cyk7CisgICAgZXhwb3J0UmVzdWx0c1RvWE1MKGtQcm9maWxpbmdSZXN1bHRzLCBnbG9iYWxfcmVzdWx0cywgZW5jb2Rlcl9yZXN1bHRzLCBkZWNvZGVyX3Jlc3VsdHMpOworfQorCit2b2lkIHByb2ZpbGVDb2RlY3MoCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+ICZpbmZvcywKKyAgICAgICAgQ29kZWNTZXR0aW5ncyAqZ2xvYmFsX3Jlc3VsdHMsCisgICAgICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+ICplbmNvZGVyX3Jlc3VsdHMsCisgICAgICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+ICpkZWNvZGVyX3Jlc3VsdHMsCisgICAgICAgIGJvb2wgZm9yY2VUb01lYXN1cmUpIHsKKyAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPj4gY29kZWNzTmVlZE1lYXN1cmU7CisgICAgQVN0cmluZyBzdXBwb3J0TXVsdGlwbGVTZWN1cmVDb2RlY3MgPSAidHJ1ZSI7CisgICAgc2l6ZV90IG1heEVuY29kZXJJbnB1dEJ1ZmZlcnMgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5mb3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBpbmZvc1tpXTsKKyAgICAgICAgQVN0cmluZyBuYW1lID0gaW5mby0+Z2V0Q29kZWNOYW1lKCk7CisgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIk9NWC5nb29nbGUuIikgfHwKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiByZWVuYWJsZSBiZWxvdyBjb2RlY3Mgb25jZSBmaXhlZAorICAgICAgICAgICAgICAgIG5hbWUgPT0gIk9NWC5JbnRlbC5WaWRlb0RlY29kZXIuVlA5Lmh5YnJpZCIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgVmVjdG9yPEFTdHJpbmc+IG1pbWVzOworICAgICAgICBpbmZvLT5nZXRTdXBwb3J0ZWRNaW1lcygmbWltZXMpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1pbWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiAmY2FwcyA9CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmdldENhcGFiaWxpdGllc0ZvcihtaW1lc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgIGlmICghZm9yY2VUb01lYXN1cmUgJiYKKyAgICAgICAgICAgICAgICAoY2Fwcy0+Z2V0RGV0YWlscygpLT5jb250YWlucygibWF4LXN1cHBvcnRlZC1pbnN0YW5jZXMiKSB8fAorICAgICAgICAgICAgICAgICBjYXBzLT5nZXREZXRhaWxzKCktPmNvbnRhaW5zKCJtYXgtY29uY3VycmVudC1pbnN0YW5jZXMiKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IG1heCA9IGRvUHJvZmlsZUNvZGVjcyhpbmZvLT5pc0VuY29kZXIoKSwgbmFtZSwgbWltZXNbaV0sIGNhcHMpOworICAgICAgICAgICAgaWYgKG1heCA+IDApIHsKKyAgICAgICAgICAgICAgICBDb2RlY1NldHRpbmdzIHNldHRpbmdzOworICAgICAgICAgICAgICAgIGNoYXIgbWF4U3RyWzMyXTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKG1heFN0ciwgIiV6dSIsIG1heCk7CisgICAgICAgICAgICAgICAgc2V0dGluZ3MuYWRkKCJtYXgtc3VwcG9ydGVkLWluc3RhbmNlcyIsIG1heFN0cik7CisKKyAgICAgICAgICAgICAgICBBU3RyaW5nIGtleSA9IG5hbWU7CisgICAgICAgICAgICAgICAga2V5LmFwcGVuZCgiICIpOworICAgICAgICAgICAgICAgIGtleS5hcHBlbmQobWltZXNbaV0pOworCisgICAgICAgICAgICAgICAgaWYgKGluZm8tPmlzRW5jb2RlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZXJfcmVzdWx0cy0+YWRkKGtleSwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZXJfcmVzdWx0cy0+YWRkKGtleSwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCIuc2VjdXJlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1heCA8PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0TXVsdGlwbGVTZWN1cmVDb2RlY3MgPSAiZmFsc2UiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbmZvLT5pc0VuY29kZXIoKSAmJiBtaW1lc1tpXS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgICAgICBzaXplX3QgZW5jb2RlcklucHV0QnVmZmVycyA9CisgICAgICAgICAgICAgICAgICAgICAgICBkb1Byb2ZpbGVFbmNvZGVySW5wdXRCdWZmZXJzKG5hbWUsIG1pbWVzW2ldLCBjYXBzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kZXJJbnB1dEJ1ZmZlcnMgPiBtYXhFbmNvZGVySW5wdXRCdWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhFbmNvZGVySW5wdXRCdWZmZXJzID0gZW5jb2RlcklucHV0QnVmZmVyczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobWF4RW5jb2RlcklucHV0QnVmZmVycyA+IDApIHsKKyAgICAgICAgY2hhciB0bXBbMzJdOworICAgICAgICBzcHJpbnRmKHRtcCwgIiV6dSIsIG1heEVuY29kZXJJbnB1dEJ1ZmZlcnMpOworICAgICAgICBnbG9iYWxfcmVzdWx0cy0+YWRkKGtNYXhFbmNvZGVySW5wdXRCdWZmZXJzLCB0bXApOworICAgIH0KKyAgICBnbG9iYWxfcmVzdWx0cy0+YWRkKGtQb2xpY3lTdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzLCBzdXBwb3J0TXVsdGlwbGVTZWN1cmVDb2RlY3MpOworfQorCitzdGF0aWMgQVN0cmluZyBnbG9iYWxSZXN1bHRzVG9YbWwoY29uc3QgQ29kZWNTZXR0aW5ncyYgcmVzdWx0cykgeworICAgIEFTdHJpbmcgcmV0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7ICsraSkgeworICAgICAgICBBU3RyaW5nIHNldHRpbmcgPSBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICIgICAgICAgIDxTZXR0aW5nIG5hbWU9XCIlc1wiIHZhbHVlPVwiJXNcIiAvPlxuIiwKKyAgICAgICAgICAgICAgICByZXN1bHRzLmtleUF0KGkpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgcmVzdWx0cy52YWx1ZUF0KGkpLmNfc3RyKCkpOworICAgICAgICByZXQuYXBwZW5kKHNldHRpbmcpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgQVN0cmluZyBjb2RlY1Jlc3VsdHNUb1htbChjb25zdCBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiYgcmVzdWx0cykgeworICAgIEFTdHJpbmcgcmV0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7ICsraSkgeworICAgICAgICBBU3RyaW5nIG5hbWU7CisgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgaWYgKCFzcGxpdFN0cmluZyhyZXN1bHRzLmtleUF0KGkpLCAiICIsICZuYW1lLCAmbWltZSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEFTdHJpbmcgY29kZWMgPQorICAgICAgICAgICAgICAgIEFTdHJpbmdQcmludGYoIiAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT1cIiVzXCIgdHlwZT1cIiVzXCIgdXBkYXRlPVwidHJ1ZVwiID5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lLmNfc3RyKCkpOworICAgICAgICByZXQuYXBwZW5kKGNvZGVjKTsKKyAgICAgICAgQ29kZWNTZXR0aW5ncyBzZXR0aW5ncyA9IHJlc3VsdHMudmFsdWVBdChpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZXR0aW5ncy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgLy8gV0FSTklORzogd2UgYXNzdW1lIGFsbCB0aGUgc2V0dGluZ3MgYXJlICJMaW1pdCIuIEN1cnJlbnRseSB3ZSBoYXZlIG9ubHkgb25lIHR5cGUKKyAgICAgICAgICAgIC8vIG9mIHNldHRpbmcgaW4gdGhpcyBjYXNlLCB3aGljaCBpcyAibWF4LXN1cHBvcnRlZC1pbnN0YW5jZXMiLgorICAgICAgICAgICAgQVN0cmluZyBzZXR0aW5nID0gQVN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIDxMaW1pdCBuYW1lPVwiJXNcIiB2YWx1ZT1cIiVzXCIgLz5cbiIsCisgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmtleUF0KGkpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnZhbHVlQXQoaSkuY19zdHIoKSk7CisgICAgICAgICAgICByZXQuYXBwZW5kKHNldHRpbmcpOworICAgICAgICB9CisgICAgICAgIHJldC5hcHBlbmQoIiAgICAgICAgPC9NZWRpYUNvZGVjPlxuIik7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgZXhwb3J0UmVzdWx0c1RvWE1MKAorICAgICAgICBjb25zdCBjaGFyICpmaWxlTmFtZSwKKyAgICAgICAgY29uc3QgQ29kZWNTZXR0aW5ncyYgZ2xvYmFsX3Jlc3VsdHMsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+JiBlbmNvZGVyX3Jlc3VsdHMsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+JiBkZWNvZGVyX3Jlc3VsdHMpIHsKKyAgICBpZiAoZ2xvYmFsX3Jlc3VsdHMuc2l6ZSgpID09IDAgJiYgZW5jb2Rlcl9yZXN1bHRzLnNpemUoKSA9PSAwICYmIGRlY29kZXJfcmVzdWx0cy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVN0cmluZyBvdmVycmlkZXM7CisgICAgb3ZlcnJpZGVzLmFwcGVuZChnZXRQcm9maWxpbmdWZXJzaW9uU3RyaW5nKCkpOworICAgIG92ZXJyaWRlcy5hcHBlbmQoIlxuIik7CisgICAgb3ZlcnJpZGVzLmFwcGVuZCgiPE1lZGlhQ29kZWNzPlxuIik7CisgICAgaWYgKGdsb2JhbF9yZXN1bHRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgb3ZlcnJpZGVzLmFwcGVuZCgiICAgIDxTZXR0aW5ncz5cbiIpOworICAgICAgICBvdmVycmlkZXMuYXBwZW5kKGdsb2JhbFJlc3VsdHNUb1htbChnbG9iYWxfcmVzdWx0cykpOworICAgICAgICBvdmVycmlkZXMuYXBwZW5kKCIgICAgPC9TZXR0aW5ncz5cbiIpOworICAgIH0KKyAgICBpZiAoZW5jb2Rlcl9yZXN1bHRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgb3ZlcnJpZGVzLmFwcGVuZCgiICAgIDxFbmNvZGVycz5cbiIpOworICAgICAgICBvdmVycmlkZXMuYXBwZW5kKGNvZGVjUmVzdWx0c1RvWG1sKGVuY29kZXJfcmVzdWx0cykpOworICAgICAgICBvdmVycmlkZXMuYXBwZW5kKCIgICAgPC9FbmNvZGVycz5cbiIpOworICAgIH0KKyAgICBpZiAoZGVjb2Rlcl9yZXN1bHRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgb3ZlcnJpZGVzLmFwcGVuZCgiICAgIDxEZWNvZGVycz5cbiIpOworICAgICAgICBvdmVycmlkZXMuYXBwZW5kKGNvZGVjUmVzdWx0c1RvWG1sKGRlY29kZXJfcmVzdWx0cykpOworICAgICAgICBvdmVycmlkZXMuYXBwZW5kKCIgICAgPC9EZWNvZGVycz5cbiIpOworICAgIH0KKyAgICBvdmVycmlkZXMuYXBwZW5kKCI8L01lZGlhQ29kZWNzPlxuIik7CisKKyAgICBGSUxFICpmID0gZm9wZW4oZmlsZU5hbWUsICJ3YiIpOworICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuICVzIGZvciB3cml0aW5nLiIsIGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZndyaXRlKG92ZXJyaWRlcy5jX3N0cigpLCAxLCBvdmVycmlkZXMuc2l6ZSgpLCBmKSAhPSBvdmVycmlkZXMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gd3JpdGUgdG8gJXMuIiwgZmlsZU5hbWUpOworICAgIH0KKyAgICBmY2xvc2UoZik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGJiMjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0NPREVDX0xJU1RfT1ZFUlJJREVTX0hfCisKKyNkZWZpbmUgTUVESUFfQ09ERUNfTElTVF9PVkVSUklERVNfSF8KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitleHRlcm4gY29uc3QgY2hhciAqa1Byb2ZpbGluZ1ZlcnNpb25TdHJpbmc7CitleHRlcm4gY29uc3QgY2hhciAqa1Byb2ZpbGluZ1Jlc3VsdHM7CisKK3N0cnVjdCBNZWRpYUNvZGVjSW5mbzsKKworQVN0cmluZyBnZXRQcm9maWxpbmdWZXJzaW9uU3RyaW5nKCk7CisKK2Jvb2wgc3BsaXRTdHJpbmcoY29uc3QgQVN0cmluZyAmcywgY29uc3QgQVN0cmluZyAmZGVsaW1pdGVyLCBBU3RyaW5nICpzMSwgQVN0cmluZyAqczIpOworCisvLyBwcm9maWxlIGNvZGVjcyBhbmQgc2F2ZSB0aGUgcmVzdWx0IHRvIHhtbCBmaWxlIG5hbWVkIGtQcm9maWxpbmdSZXN1bHRzLgordm9pZCBwcm9maWxlQ29kZWNzKGNvbnN0IFZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+ICZpbmZvcyk7CisKKy8vIHByb2ZpbGUgY29kZWNzIGFuZCBzYXZlIHRoZSByZXN1bHQgdG8gZ2xvYmFsX3Jlc3VsdHMsIGVuY29kZXJfcmVzdWx0cyBhbmQgZGVjb2Rlcl9yZXN1bHRzLgordm9pZCBwcm9maWxlQ29kZWNzKAorICAgICAgICBjb25zdCBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiAmaW5mb3MsCisgICAgICAgIENvZGVjU2V0dGluZ3MgKmdsb2JhbF9yZXN1bHRzLAorICAgICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiAqZW5jb2Rlcl9yZXN1bHRzLAorICAgICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiAqZGVjb2Rlcl9yZXN1bHRzLAorICAgICAgICBib29sIGZvcmNlVG9NZWFzdXJlID0gZmFsc2UpOworCit2b2lkIGV4cG9ydFJlc3VsdHNUb1hNTCgKKyAgICAgICAgY29uc3QgY2hhciAqZmlsZU5hbWUsCisgICAgICAgIGNvbnN0IENvZGVjU2V0dGluZ3MmIGdsb2JhbF9yZXN1bHRzLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiYgZW5jb2Rlcl9yZXN1bHRzLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiYgZGVjb2Rlcl9yZXN1bHRzKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9DT0RFQ19MSVNUX09WRVJSSURFU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcAppbmRleCBjMjZlOTA5Li43ZjlmODI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlckNvbnN1bWVyLmg+CiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KQEAgLTI5LDE0ICszMCwxOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUGVyc2lzdGVudFN1cmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NvbnN0IGludCBrRGVmYXVsdFN3VmlkZW9FbmNvZGVyRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4OworY29uc3QgaW50IGtEZWZhdWx0U3dWaWRlb0VuY29kZXJEYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX0JUNzA5OworCiBzdHJ1Y3QgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBQdWxsZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOwogCkBAIC0xMjEsNyArMTI2LDcgQEAKICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CiAgICAgbU5vdGlmeSA9IG5vdGlmeTsKIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKTsKICAgICBtc2ctPnNldE9iamVjdCgibWV0YSIsIG1ldGEpOwogICAgIHJldHVybiBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKG1zZyk7CiB9CkBAIC0xMzcsMTkgKzE0MiwxOSBAQAogICAgIG1Tb3VyY2UtPnN0b3AoKTsKICAgICBBTE9HVigic291cmNlICglcykgc3RvcHBlZCIsIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6OnBhdXNlKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6OnJlc3VtZSgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6OnNjaGVkdWxlUHVsbCgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHVsbCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFB1bGwsIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUHVsbEdlbmVyYXRpb24pOwogICAgIG1zZy0+cG9zdCgpOwogfQpAQCAtMTgyLDcgKzE4Nyw3IEBACiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CiAKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTI1OCw5ICsyNjMsMTAgQEAKICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAorICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAmY29uc3VtZXIsCiAgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CiAgICAgc3A8TWVkaWFDb2RlY1NvdXJjZT4gbWVkaWFTb3VyY2UgPQotICAgICAgICAgICAgbmV3IE1lZGlhQ29kZWNTb3VyY2UobG9vcGVyLCBmb3JtYXQsIHNvdXJjZSwgZmxhZ3MpOworICAgICAgICAgICAgbmV3IE1lZGlhQ29kZWNTb3VyY2UobG9vcGVyLCBmb3JtYXQsIHNvdXJjZSwgY29uc3VtZXIsIGZsYWdzKTsKIAogICAgIGlmIChtZWRpYVNvdXJjZS0+aW5pdCgpID09IE9LKSB7CiAgICAgICAgIHJldHVybiBtZWRpYVNvdXJjZTsKQEAgLTI2OSwxMyArMjc1LDEzIEBACiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhKiBwYXJhbXMpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIG1SZWZsZWN0b3ItPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgbVJlZmxlY3Rvcik7CiAgICAgbXNnLT5zZXRPYmplY3QoIm1ldGEiLCBwYXJhbXMpOwogICAgIHJldHVybiBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKG1zZyk7CiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OnN0b3AoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIG1SZWZsZWN0b3ItPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBtUmVmbGVjdG9yKTsKICAgICBzdGF0dXNfdCBlcnIgPSBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKG1zZyk7CiAKICAgICAvLyBtUHVsbGVyLT5zdG9wKCkgbmVlZHMgdG8gYmUgZG9uZSBvdXRzaWRlIE1lZGlhQ29kZWNTb3VyY2UncyBsb29wZXIsCkBAIC0yOTQsNyArMzAwLDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6cGF1c2UoKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCBtUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIG1SZWZsZWN0b3IpKS0+cG9zdCgpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMzI4LDYgKzMzNCw3IEBACiAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAogICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gJmNvbnN1bWVyLAogICAgICAgICB1aW50MzJfdCBmbGFncykKICAgICA6IG1Mb29wZXIobG9vcGVyKSwKICAgICAgIG1PdXRwdXRGb3JtYXQob3V0cHV0Rm9ybWF0KSwKQEAgLTMzNyw2ICszNDQsMTAgQEAKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1TdG9wcGluZyhmYWxzZSksCiAgICAgICBtRG9Nb3JlV29ya1BlbmRpbmcoZmFsc2UpLAorICAgICAgbVNldEVuY29kZXJGb3JtYXQoZmFsc2UpLAorICAgICAgbUVuY29kZXJGb3JtYXQoMCksCisgICAgICBtRW5jb2RlckRhdGFTcGFjZSgwKSwKKyAgICAgIG1HcmFwaGljQnVmZmVyQ29uc3VtZXIoY29uc3VtZXIpLAogICAgICAgbUZpcnN0U2FtcGxlVGltZVVzKC0xbGwpLAogICAgICAgbUVuY29kZXJSZWFjaGVkRU9TKGZhbHNlKSwKICAgICAgIG1FcnJvckNvZGUoT0spIHsKQEAgLTM5OSw2ICs0MTAsOSBAQAogCiAgICAgQUxPR1YoIm91dHB1dCBmb3JtYXQgaXMgJyVzJyIsIG1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKDApLmNfc3RyKCkpOwogCisgICAgbUVuY29kZXJBY3Rpdml0eU5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEVuY29kZXJBY3Rpdml0eSwgbVJlZmxlY3Rvcik7CisgICAgbUVuY29kZXItPnNldENhbGxiYWNrKG1FbmNvZGVyQWN0aXZpdHlOb3RpZnkpOworCiAgICAgc3RhdHVzX3QgZXJyID0gbUVuY29kZXItPmNvbmZpZ3VyZSgKICAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LAogICAgICAgICAgICAgICAgIE5VTEwgLyogbmF0aXZlV2luZG93ICovLApAQCAtNDE1LDE2ICs0MjksMzIgQEAKICAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgewogICAgICAgICBDSEVDSyhtSXNWaWRlbyk7CiAKLSAgICAgICAgZXJyID0gbUVuY29kZXItPmNyZWF0ZUlucHV0U3VyZmFjZSgmbUdyYXBoaWNCdWZmZXJQcm9kdWNlcik7CisgICAgICAgIGlmIChtR3JhcGhpY0J1ZmZlckNvbnN1bWVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgcGVyc2lzdGVudCBzdXJmYWNlLCB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZQorICAgICAgICAgICAgLy8gY29uc3VtZXIsIGJ1dCBoYXZlIHRvIHVzZSBQZXJzaXN0ZW50U3VyZmFjZSBhcyBhIHdyYXBwZXIgdG8KKyAgICAgICAgICAgIC8vIHBhc3MgY29uc3VtZXIgb3ZlciBtZXNzYWdlcyAoc2ltaWxhciB0byBCdWZmZXJQcm9kdWNlcldyYXBwZXIpCisgICAgICAgICAgICBlcnIgPSBtRW5jb2Rlci0+c2V0SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgICAgICAgICBuZXcgUGVyc2lzdGVudFN1cmZhY2UoTlVMTCwgbUdyYXBoaWNCdWZmZXJDb25zdW1lcikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gbUVuY29kZXItPmNyZWF0ZUlucHV0U3VyZmFjZSgmbUdyYXBoaWNCdWZmZXJQcm9kdWNlcik7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQogCi0gICAgbUVuY29kZXJBY3Rpdml0eU5vdGlmeSA9IG5ldyBBTWVzc2FnZSgKLSAgICAgICAgICAgIGtXaGF0RW5jb2RlckFjdGl2aXR5LCBtUmVmbGVjdG9yLT5pZCgpKTsKLSAgICBtRW5jb2Rlci0+c2V0Q2FsbGJhY2sobUVuY29kZXJBY3Rpdml0eU5vdGlmeSk7CisgICAgc3A8QU1lc3NhZ2U+IGlucHV0Rm9ybWF0OworICAgIGludDMyX3QgdXNpbmdTd1JlYWRPZnRlbjsKKyAgICBtU2V0RW5jb2RlckZvcm1hdCA9IGZhbHNlOworICAgIGlmIChtRW5jb2Rlci0+Z2V0SW5wdXRGb3JtYXQoJmlucHV0Rm9ybWF0KSA9PSBPSworICAgICAgICAgICAgJiYgaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigidXNpbmctc3ctcmVhZC1vZnRlbiIsICZ1c2luZ1N3UmVhZE9mdGVuKQorICAgICAgICAgICAgJiYgdXNpbmdTd1JlYWRPZnRlbikgeworICAgICAgICAvLyB0aGlzIGlzIGEgU1cgZW5jb2Rlcjsgc2lnbmFsIHNvdXJjZSB0byBhbGxvY2F0ZSBTVyByZWFkYWJsZSBidWZmZXJzCisgICAgICAgIG1TZXRFbmNvZGVyRm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgbUVuY29kZXJGb3JtYXQgPSBrRGVmYXVsdFN3VmlkZW9FbmNvZGVyRm9ybWF0OworICAgICAgICBtRW5jb2RlckRhdGFTcGFjZSA9IGtEZWZhdWx0U3dWaWRlb0VuY29kZXJEYXRhU3BhY2U7CisgICAgfQogCiAgICAgZXJyID0gbUVuY29kZXItPnN0YXJ0KCk7CiAKQEAgLTQ5Miw3ICs1MjIsNyBAQAogICAgIGlmIChtU3RvcHBpbmcgJiYgbUVuY29kZXJSZWFjaGVkRU9TKSB7CiAgICAgICAgIEFMT0dJKCJlbmNvZGVyICglcykgc3RvcHBlZCIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOwogICAgICAgICAvLyBwb3N0aW5nIHJlcGx5IHRvIGV2ZXJ5b25lIHRoYXQncyB3YWl0aW5nCi0gICAgICAgIExpc3Q8dWludDMyX3Q+OjppdGVyYXRvciBpdDsKKyAgICAgICAgTGlzdDxzcDxBUmVwbHlUb2tlbj4+OjppdGVyYXRvciBpdDsKICAgICAgICAgZm9yIChpdCA9IG1TdG9wUmVwbHlJRFF1ZXVlLmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgaXQgIT0gbVN0b3BSZXBseUlEUXVldWUuZW5kKCk7IGl0KyspIHsKICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkoKml0KTsKQEAgLTYyMCw5ICs2NTAsMTcgQEAKICAgICAgICAgcmVzdW1lKHN0YXJ0VGltZVVzKTsKICAgICB9IGVsc2UgewogICAgICAgICBDSEVDSyhtUHVsbGVyICE9IE5VTEwpOwotICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKAotICAgICAgICAgICAgICAgIGtXaGF0UHVsbGVyTm90aWZ5LCBtUmVmbGVjdG9yLT5pZCgpKTsKLSAgICAgICAgZXJyID0gbVB1bGxlci0+c3RhcnQocGFyYW1zLCBub3RpZnkpOworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHBhcmFtczsKKyAgICAgICAgaWYgKG1TZXRFbmNvZGVyRm9ybWF0KSB7CisgICAgICAgICAgICBpZiAobWV0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlQaXhlbEZvcm1hdCwgbUVuY29kZXJGb3JtYXQpOworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yU3BhY2UsIG1FbmNvZGVyRGF0YVNwYWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQdWxsZXJOb3RpZnksIG1SZWZsZWN0b3IpOworICAgICAgICBlcnIgPSBtUHVsbGVyLT5zdGFydChtZXRhLmdldCgpLCBub3RpZnkpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CkBAIC02ODQsNyArNzIyLDYgQEAKICAgICAgICAgICAgIHNpemVfdCBzaXplOwogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgICAgICAgICBpbnQzMl90IGZsYWdzOwotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBOVUxMOwogCiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaW5kZXgiLCAmaW5kZXgpKTsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoIm9mZnNldCIsICZvZmZzZXQpKTsKQEAgLTc2OCw3ICs4MDUsNyBAQAogICAgIH0KICAgICBjYXNlIGtXaGF0U3RhcnQ6CiAgICAgewotICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKQEAgLTc4NCw3ICs4MjEsNyBAQAogICAgIHsKICAgICAgICAgQUxPR0koImVuY29kZXIgKCVzKSBzdG9wcGluZyIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOwogCi0gICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgaWYgKG1FbmNvZGVyUmVhY2hlZEVPUykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAKaW5kZXggYzQ4YTVhZS4uMmE1MDY5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYURlZnMuY3BwCkBAIC02Miw1ICs2Miw2IEBACiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX1NVQlJJUCA9ICJhcHBsaWNhdGlvbi94LXN1YnJpcCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX1ZUVCA9ICJ0ZXh0L3Z0dCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX0NFQV82MDggPSAidGV4dC9jZWEtNjA4IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0RBVEFfVElNRURfSUQzID0gImFwcGxpY2F0aW9uL3gtaWQzdjQiOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcAppbmRleCBjN2M2ZjM0Li5iMTM4NzdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcApAQCAtMzgsMjEgKzM4LDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1NZWRpYU11eGVyOjpNZWRpYU11eGVyKGNvbnN0IGNoYXIgKnBhdGgsIE91dHB1dEZvcm1hdCBmb3JtYXQpCi0gICAgOiBtRm9ybWF0KGZvcm1hdCksCi0gICAgICBtU3RhdGUoVU5JTklUSUFMSVpFRCkgewotICAgIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9NUEVHXzQpIHsKLSAgICAgICAgbVdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihwYXRoKTsKLSAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKLSAgICAgICAgbVdyaXRlciA9IG5ldyBXZWJtV3JpdGVyKHBhdGgpOwotICAgIH0KLQotICAgIGlmIChtV3JpdGVyICE9IE5VTEwpIHsKLSAgICAgICAgbUZpbGVNZXRhID0gbmV3IE1ldGFEYXRhOwotICAgICAgICBtU3RhdGUgPSBJTklUSUFMSVpFRDsKLSAgICB9Ci19Ci0KIE1lZGlhTXV4ZXI6Ok1lZGlhTXV4ZXIoaW50IGZkLCBPdXRwdXRGb3JtYXQgZm9ybWF0KQogICAgIDogbUZvcm1hdChmb3JtYXQpLAogICAgICAgbVN0YXRlKFVOSU5JVElBTElaRUQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU3luYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVN5bmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNDVlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVN5bmMuY3BwCkBAIC0wLDAgKzEsODYxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhU3luYyIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8Z3VpL0J1ZmZlclF1ZXVlLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyQ29uc3VtZXIuaD4KKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVN5bmMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisKKy8vIE1heGltdW0gbGF0ZSB0aW1lIGFsbG93ZWQgZm9yIGEgdmlkZW8gZnJhbWUgdG8gYmUgcmVuZGVyZWQuIFdoZW4gYSB2aWRlbworLy8gZnJhbWUgYXJyaXZlcyBsYXRlciB0aGFuIHRoaXMgbnVtYmVyLCBpdCB3aWxsIGJlIGRpc2NhcmRlZCB3aXRob3V0IHJlbmRlcmluZy4KK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhBbGxvd2VkVmlkZW9MYXRlVGltZVVzID0gNDAwMDBsbDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3NwPE1lZGlhU3luYz4gTWVkaWFTeW5jOjpjcmVhdGUoKSB7CisgICAgc3A8TWVkaWFTeW5jPiBzeW5jID0gbmV3IE1lZGlhU3luYygpOworICAgIHN5bmMtPm1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihzeW5jKTsKKyAgICByZXR1cm4gc3luYzsKK30KKworTWVkaWFTeW5jOjpNZWRpYVN5bmMoKQorICAgICAgOiBtSXNBYmFuZG9uZWQoZmFsc2UpLAorICAgICAgICBtTXV0ZXgoKSwKKyAgICAgICAgbVJlbGVhc2VDb25kaXRpb24oKSwKKyAgICAgICAgbU51bU91dHN0YW5kaW5nQnVmZmVycygwKSwKKyAgICAgICAgbVVzYWdlRmxhZ3NGcm9tT3V0cHV0KDApLAorICAgICAgICBtTWF4QWNxdWlyZWRCdWZmZXJDb3VudCgxKSwKKyAgICAgICAgbVJldHVyblBlbmRpbmdJbnB1dEZyYW1lKGZhbHNlKSwKKyAgICAgICAgbU5hdGl2ZVNhbXBsZVJhdGVJbkh6KDApLAorICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbigwKSwKKyAgICAgICAgbUhhc0F1ZGlvKGZhbHNlKSwKKyAgICAgICAgbU5leHRCdWZmZXJJdGVtTWVkaWFVcygtMSksCisgICAgICAgIG1QbGF5YmFja1JhdGUoMC4wKSB7CisgICAgbU1lZGlhQ2xvY2sgPSBuZXcgTWVkaWFDbG9jazsKKworICAgIC8vIGluaXRpYWxpemUgc2V0dGluZ3MKKyAgICBtUGxheWJhY2tTZXR0aW5ncyA9IEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVDsKKyAgICBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQgPSBtUGxheWJhY2tSYXRlOworCisgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1Mb29wZXItPnNldE5hbWUoIk1lZGlhU3luYyIpOworICAgIG1Mb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7Cit9CisKK01lZGlhU3luYzo6fk1lZGlhU3luYygpIHsKKyAgICBpZiAobUlucHV0ICE9IE5VTEwpIHsKKyAgICAgICAgbUlucHV0LT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKKyAgICB9CisgICAgaWYgKG1PdXRwdXQgIT0gTlVMTCkgeworICAgICAgICBtT3V0cHV0LT5kaXNjb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKyAgICB9CisKKyAgICBpZiAobUxvb3BlciAhPSBOVUxMKSB7CisgICAgICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOworICAgICAgICBtTG9vcGVyLT5zdG9wKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBNZWRpYVN5bmM6OnNldFN1cmZhY2UoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJm91dHB1dCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisKKyAgICBpZiAob3V0cHV0ID09IG1PdXRwdXQpIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOyAgLy8gc2FtZSBvdXRwdXQgc3VyZmFjZS4KKyAgICB9CisKKyAgICBpZiAob3V0cHV0ID09IE5VTEwgJiYgbVN5bmNTZXR0aW5ncy5tU291cmNlID09IEFWU1lOQ19TT1VSQ0VfVlNZTkMpIHsKKyAgICAgICAgQUxPR0UoInNldFN1cmZhY2U6IG91dHB1dCBzdXJmYWNlIGlzIHVzZWQgYXMgc3luYyBzb3VyY2UgYW5kIGNhbm5vdCBiZSByZW1vdmVkLiIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKG91dHB1dCAhPSBOVUxMKSB7CisgICAgICAgIGludCBuZXdVc2FnZSA9IDA7CisgICAgICAgIG91dHB1dC0+cXVlcnkoTkFUSVZFX1dJTkRPV19DT05TVU1FUl9VU0FHRV9CSVRTLCAmbmV3VXNhZ2UpOworCisgICAgICAgIC8vIENoZWNrIHVzYWdlIGZsYWdzIG9ubHkgd2hlbiBjdXJyZW50IG91dHB1dCBzdXJmYWNlIGhhcyBiZWVuIHVzZWQgdG8gY3JlYXRlIGlucHV0IHN1cmZhY2UuCisgICAgICAgIGlmIChtT3V0cHV0ICE9IE5VTEwgJiYgbUlucHV0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludCBpZ25vcmVkRmxhZ3MgPSAoR1JBTExPQ19VU0FHRV9IV19URVhUVVJFIHwgR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUgorICAgICAgICAgICAgICAgICAgICB8IEdSQUxMT0NfVVNBR0VfRVhURVJOQUxfRElTUCk7CisgICAgICAgICAgICAvLyBOZXcgb3V0cHV0IHN1cmZhY2UgaXMgbm90IGFsbG93ZWQgdG8gYWRkIG5ldyB1c2FnZSBmbGFnIGV4Y2VwdCBpZ25vcmVkIG9uZXMuCisgICAgICAgICAgICBpZiAoKG5ld1VzYWdlICYgfihtVXNhZ2VGbGFnc0Zyb21PdXRwdXQgfCBpZ25vcmVkRmxhZ3MpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInNldFN1cmZhY2U6IG5ldyBvdXRwdXQgc3VyZmFjZSBoYXMgbmV3IHVzYWdlIGZsYWcgbm90IHVzZWQgYnkgY3VycmVudCBvbmUuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRyeSB0byBjb25uZWN0IHRvIG5ldyBvdXRwdXQgc3VyZmFjZS4gSWYgZmFpbGVkLCBjdXJyZW50IG91dHB1dCBzdXJmYWNlIHdpbGwgbm90CisgICAgICAgIC8vIGJlIGNoYW5nZWQuCisgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IHF1ZXVlQnVmZmVyT3V0cHV0OworICAgICAgICBzcDxPdXRwdXRMaXN0ZW5lcj4gbGlzdGVuZXIobmV3IE91dHB1dExpc3RlbmVyKHRoaXMsIG91dHB1dCkpOworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihvdXRwdXQpLT5saW5rVG9EZWF0aChsaXN0ZW5lcik7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBvdXRwdXQtPmNvbm5lY3QobGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfTUVESUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBwcm9kdWNlckNvbnRyb2xsZWRCeUFwcCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVldWVCdWZmZXJPdXRwdXQpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0U3VyZmFjZTogZmFpbGVkIHRvIGNvbm5lY3QgKCVkKSIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1GcmFtZVNjaGVkdWxlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBtRnJhbWVTY2hlZHVsZXIgPSBuZXcgVmlkZW9GcmFtZVNjaGVkdWxlcigpOworICAgICAgICAgICAgbUZyYW1lU2NoZWR1bGVyLT5pbml0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU91dHB1dCAhPSBOVUxMKSB7CisgICAgICAgIG1PdXRwdXQtPmRpc2Nvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworICAgICAgICB3aGlsZSAoIW1CdWZmZXJzU2VudFRvT3V0cHV0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuQnVmZmVyVG9JbnB1dF9sKG1CdWZmZXJzU2VudFRvT3V0cHV0LnZhbHVlQXQoMCksIEZlbmNlOjpOT19GRU5DRSk7CisgICAgICAgICAgICBtQnVmZmVyc1NlbnRUb091dHB1dC5yZW1vdmVJdGVtc0F0KDApOworICAgICAgICB9CisgICAgfQorCisgICAgbU91dHB1dCA9IG91dHB1dDsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gfGF1ZGlvVHJhY2t8IGlzIHVzZWQgb25seSBmb3IgcXVlcnlpbmcgaW5mb3JtYXRpb24uCitzdGF0dXNfdCBNZWRpYVN5bmM6OnNldEF1ZGlvVHJhY2soY29uc3Qgc3A8QXVkaW9UcmFjaz4gJmF1ZGlvVHJhY2spIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworCisgICAgLy8gVE9ETzogc3VwcG9ydCBhdWRpbyB0cmFjayBjaGFuZ2UuCisgICAgaWYgKG1BdWRpb1RyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoInNldEF1ZGlvVHJhY2s6IGF1ZGlvVHJhY2sgaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLiIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKGF1ZGlvVHJhY2sgPT0gTlVMTCAmJiBtU3luY1NldHRpbmdzLm1Tb3VyY2UgPT0gQVZTWU5DX1NPVVJDRV9BVURJTykgeworICAgICAgICBBTE9HRSgic2V0QXVkaW9UcmFjazogYXVkaW9UcmFjayBpcyB1c2VkIGFzIHN5bmMgc291cmNlIGFuZCBjYW5ub3QgYmUgcmVtb3ZlZC4iKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChhdWRpb1RyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgLy8gY2hlY2sgaWYgYXVkaW8gdHJhY2sgc3VwcG9ydHMgdGhlIHBsYXliYWNrIHNldHRpbmdzCisgICAgICAgIGlmIChtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQgIT0gMC5mCisgICAgICAgICAgICAgICAgJiYgYXVkaW9UcmFjay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoInBsYXliYWNrIHNldHRpbmdzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBhdWRpbyB0cmFjayIpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IG5hdGl2ZVNhbXBsZVJhdGVJbkh6ID0gYXVkaW9UcmFjay0+Z2V0T3JpZ2luYWxTYW1wbGVSYXRlKCk7CisgICAgICAgIGlmIChuYXRpdmVTYW1wbGVSYXRlSW5IeiA8PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0QXVkaW9UcmFjazogbmF0aXZlIHNhbXBsZSByYXRlIHNob3VsZCBiZSBwb3NpdGl2ZS4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgbUF1ZGlvVHJhY2sgPSBhdWRpb1RyYWNrOworICAgICAgICBtTmF0aXZlU2FtcGxlUmF0ZUluSHogPSBuYXRpdmVTYW1wbGVSYXRlSW5IejsKKyAgICAgICAgKHZvaWQpc2V0UGxheWJhY2tTZXR0aW5nc19sKG1QbGF5YmFja1NldHRpbmdzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG1BdWRpb1RyYWNrID0gTlVMTDsKKyAgICAgICAgbU5hdGl2ZVNhbXBsZVJhdGVJbkh6ID0gMDsKKyAgICB9CisKKyAgICAvLyBwb3RlbnRpYWxseSByZXN5bmMgdG8gbmV3IHNvdXJjZQorICAgIHJlc3luY19sKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYVN5bmM6OmNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKm91dEJ1ZmZlclByb2R1Y2VyKSB7CisgICAgaWYgKG91dEJ1ZmZlclByb2R1Y2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworCisgICAgaWYgKG1PdXRwdXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAobUlucHV0ICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGJ1ZmZlclByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGJ1ZmZlckNvbnN1bWVyOworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmYnVmZmVyUHJvZHVjZXIsICZidWZmZXJDb25zdW1lcik7CisKKyAgICBzcDxJbnB1dExpc3RlbmVyPiBsaXN0ZW5lcihuZXcgSW5wdXRMaXN0ZW5lcih0aGlzKSk7CisgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyQ29uc3VtZXIpLT5saW5rVG9EZWF0aChsaXN0ZW5lcik7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgYnVmZmVyQ29uc3VtZXItPmNvbnN1bWVyQ29ubmVjdChsaXN0ZW5lciwgZmFsc2UgLyogY29udHJvbGxlZEJ5QXBwICovKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGJ1ZmZlckNvbnN1bWVyLT5zZXRDb25zdW1lck5hbWUoU3RyaW5nOCgiTWVkaWFTeW5jIikpOworICAgICAgICAvLyBwcm9wYWdhdGUgdXNhZ2UgYml0cyBmcm9tIG91dHB1dCBzdXJmYWNlCisgICAgICAgIG1Vc2FnZUZsYWdzRnJvbU91dHB1dCA9IDA7CisgICAgICAgIG1PdXRwdXQtPnF1ZXJ5KE5BVElWRV9XSU5ET1dfQ09OU1VNRVJfVVNBR0VfQklUUywgJm1Vc2FnZUZsYWdzRnJvbU91dHB1dCk7CisgICAgICAgIGJ1ZmZlckNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhtVXNhZ2VGbGFnc0Zyb21PdXRwdXQpOworICAgICAgICAqb3V0QnVmZmVyUHJvZHVjZXIgPSBidWZmZXJQcm9kdWNlcjsKKyAgICAgICAgbUlucHV0ID0gYnVmZmVyQ29uc3VtZXI7CisKKyAgICAgICAgLy8gc2V0IHVuZGVxdWV1ZWQgYnVmZmVyIGNvdW50CisgICAgICAgIGludCBtaW5VbmRlcXVldWVkQnVmZmVyczsKKyAgICAgICAgbU91dHB1dC0+cXVlcnkoTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLCAmbWluVW5kZXF1ZXVlZEJ1ZmZlcnMpOworICAgICAgICBtTWF4QWNxdWlyZWRCdWZmZXJDb3VudCA9IG1pblVuZGVxdWV1ZWRCdWZmZXJzOworICAgICAgICBidWZmZXJDb25zdW1lci0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChtTWF4QWNxdWlyZWRCdWZmZXJDb3VudCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgTWVkaWFTeW5jOjpyZXN5bmNfbCgpIHsKKyAgICBBVlN5bmNTb3VyY2Ugc3JjID0gbVN5bmNTZXR0aW5ncy5tU291cmNlOworICAgIGlmIChzcmMgPT0gQVZTWU5DX1NPVVJDRV9ERUZBVUxUKSB7CisgICAgICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMKSB7CisgICAgICAgICAgICBzcmMgPSBBVlNZTkNfU09VUkNFX0FVRElPOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3JjID0gQVZTWU5DX1NPVVJDRV9TWVNURU1fQ0xPQ0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPOiByZXN5bmMgb3Vyc2VsdmVzIHRvIHRoZSBjdXJyZW50IGNsb2NrIChlLmcuIG9uIHN5bmMgc291cmNlIGNoYW5nZSkKKyAgICB1cGRhdGVQbGF5YmFja1JhdGVfbChtUGxheWJhY2tSYXRlKTsKK30KKwordm9pZCBNZWRpYVN5bmM6OnVwZGF0ZVBsYXliYWNrUmF0ZV9sKGZsb2F0IHJhdGUpIHsKKyAgICBpZiAocmF0ZSA+IG1QbGF5YmFja1JhdGUpIHsKKyAgICAgICAgbU5leHRCdWZmZXJJdGVtTWVkaWFVcyA9IC0xOworICAgIH0KKyAgICBtUGxheWJhY2tSYXRlID0gcmF0ZTsKKyAgICAvLyBUT0RPOiB1cGRhdGUgZnJhbWUgc2NoZWR1bGVyIHdpdGggdGhpcyBpbmZvCisgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICBvbkRyYWluVmlkZW9fbCgpOworfQorCitzcDxjb25zdCBNZWRpYUNsb2NrPiBNZWRpYVN5bmM6OmdldE1lZGlhQ2xvY2soKSB7CisgICAgcmV0dXJuIG1NZWRpYUNsb2NrOworfQorCitzdGF0dXNfdCBNZWRpYVN5bmM6OmdldFBsYXlUaW1lRm9yUGVuZGluZ0F1ZGlvRnJhbWVzKGludDY0X3QgKm91dFRpbWVVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisgICAgLy8gVXNlciBzaG91bGQgY2hlY2sgdGhlIHBsYXliYWNrIHJhdGUgaWYgaXQgZG9lc24ndCB3YW50IHRvIHJlY2VpdmUgYQorICAgIC8vIGh1Z2UgbnVtYmVyIGZvciBwbGF5IHRpbWUuCisgICAgaWYgKG1QbGF5YmFja1JhdGUgPT0gMC4wZikgeworICAgICAgICAqb3V0VGltZVVzID0gSU5UNjRfTUFYOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgdWludDMyX3QgbnVtRnJhbWVzUGxheWVkID0gMDsKKyAgICBpZiAobUF1ZGlvVHJhY2sgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBtQXVkaW9UcmFjay0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1BsYXllZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQ2NF90IG51bVBlbmRpbmdGcmFtZXMgPSBtTnVtRnJhbWVzV3JpdHRlbiAtIG51bUZyYW1lc1BsYXllZDsKKyAgICBpZiAobnVtUGVuZGluZ0ZyYW1lcyA8IDApIHsKKyAgICAgICAgbnVtUGVuZGluZ0ZyYW1lcyA9IDA7CisgICAgICAgIEFMT0dXKCJnZXRQbGF5VGltZUZvclBlbmRpbmdBdWRpb0ZyYW1lczogcGVuZGluZyBmcmFtZSBjb3VudCBpcyBuZWdhdGl2ZS4iKTsKKyAgICB9CisgICAgZG91YmxlIHRpbWVVcyA9IG51bVBlbmRpbmdGcmFtZXMgKiAxMDAwMDAwLjAKKyAgICAgICAgICAgIC8gKG1OYXRpdmVTYW1wbGVSYXRlSW5IeiAqIChkb3VibGUpbVBsYXliYWNrUmF0ZSk7CisgICAgaWYgKHRpbWVVcyA+IChkb3VibGUpSU5UNjRfTUFYKSB7CisgICAgICAgIC8vIE92ZXJmbG93LgorICAgICAgICAqb3V0VGltZVVzID0gSU5UNjRfTUFYOworICAgICAgICBBTE9HVygiZ2V0UGxheVRpbWVGb3JQZW5kaW5nQXVkaW9GcmFtZXM6IHBsYXkgdGltZSBmb3IgcGVuZGluZyBhdWRpbyBmcmFtZXMgIgorICAgICAgICAgICAgICAiaXMgdG9vIGhpZ2gsIHBvc3NpYmx5IGR1ZSB0byBzdXBlciBsb3cgcGxheWJhY2sgcmF0ZSglZikiLCBtUGxheWJhY2tSYXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICAqb3V0VGltZVVzID0gKGludDY0X3QpdGltZVVzOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFTeW5jOjp1cGRhdGVRdWV1ZWRBdWRpb0RhdGEoCisgICAgICAgIHNpemVfdCBzaXplSW5CeXRlcywgaW50NjRfdCBwcmVzZW50YXRpb25UaW1lVXMpIHsKKyAgICBpZiAoc2l6ZUluQnl0ZXMgPT0gMCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKworICAgIGlmIChtQXVkaW9UcmFjayA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJ1cGRhdGVRdWV1ZWRBdWRpb0RhdGE6IGF1ZGlvVHJhY2sgaGFzIE5PVCBiZWVuIGNvbmZpZ3VyZWQuIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpbnQ2NF90IG51bUZyYW1lcyA9IHNpemVJbkJ5dGVzIC8gbUF1ZGlvVHJhY2stPmZyYW1lU2l6ZSgpOworICAgIGludDY0X3QgbWF4TWVkaWFUaW1lVXMgPSBwcmVzZW50YXRpb25UaW1lVXMKKyAgICAgICAgICAgICsgZ2V0RHVyYXRpb25JZlBsYXllZEF0TmF0aXZlU2FtcGxlUmF0ZV9sKG51bUZyYW1lcyk7CisKKyAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpbnQ2NF90IG5vd01lZGlhVXMgPSBwcmVzZW50YXRpb25UaW1lVXMKKyAgICAgICAgICAgIC0gZ2V0RHVyYXRpb25JZlBsYXllZEF0TmF0aXZlU2FtcGxlUmF0ZV9sKG1OdW1GcmFtZXNXcml0dGVuKQorICAgICAgICAgICAgKyBnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uTWVkaWFfbChub3dVcyk7CisKKyAgICBtTnVtRnJhbWVzV3JpdHRlbiArPSBudW1GcmFtZXM7CisKKyAgICBpbnQ2NF90IG9sZFJlYWxUaW1lID0gLTE7CisgICAgaWYgKG1OZXh0QnVmZmVySXRlbU1lZGlhVXMgIT0gLTEpIHsKKyAgICAgICAgb2xkUmVhbFRpbWUgPSBnZXRSZWFsVGltZShtTmV4dEJ1ZmZlckl0ZW1NZWRpYVVzLCBub3dVcyk7CisgICAgfQorCisgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZUFuY2hvcihub3dNZWRpYVVzLCBub3dVcywgbWF4TWVkaWFUaW1lVXMpOworICAgIG1IYXNBdWRpbyA9IHRydWU7CisKKyAgICBpZiAob2xkUmVhbFRpbWUgIT0gLTEpIHsKKyAgICAgICAgaW50NjRfdCBuZXdSZWFsVGltZSA9IGdldFJlYWxUaW1lKG1OZXh0QnVmZmVySXRlbU1lZGlhVXMsIG5vd1VzKTsKKyAgICAgICAgaWYgKG5ld1JlYWxUaW1lID49IG9sZFJlYWxUaW1lKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtTmV4dEJ1ZmZlckl0ZW1NZWRpYVVzID0gLTE7CisgICAgb25EcmFpblZpZGVvX2woKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTWVkaWFTeW5jOjpzZXROYW1lKGNvbnN0IEFTdHJpbmcgJm5hbWUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgIG1JbnB1dC0+c2V0Q29uc3VtZXJOYW1lKFN0cmluZzgobmFtZS5jX3N0cigpKSk7Cit9CisKK3ZvaWQgTWVkaWFTeW5jOjpmbHVzaCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgIGlmIChtRnJhbWVTY2hlZHVsZXIgIT0gTlVMTCkgeworICAgICAgICBtRnJhbWVTY2hlZHVsZXItPnJlc3RhcnQoKTsKKyAgICB9CisgICAgd2hpbGUgKCFtQnVmZmVySXRlbXMuZW1wdHkoKSkgeworICAgICAgICBCdWZmZXJJdGVtICpidWZmZXJJdGVtID0gJiptQnVmZmVySXRlbXMuYmVnaW4oKTsKKyAgICAgICAgcmV0dXJuQnVmZmVyVG9JbnB1dF9sKGJ1ZmZlckl0ZW0tPm1HcmFwaGljQnVmZmVyLCBidWZmZXJJdGVtLT5tRmVuY2UpOworICAgICAgICBtQnVmZmVySXRlbXMuZXJhc2UobUJ1ZmZlckl0ZW1zLmJlZ2luKCkpOworICAgIH0KKyAgICBtTmV4dEJ1ZmZlckl0ZW1NZWRpYVVzID0gLTE7CisgICAgbU51bUZyYW1lc1dyaXR0ZW4gPSAwOworICAgIG1SZXR1cm5QZW5kaW5nSW5wdXRGcmFtZSA9IHRydWU7CisgICAgbVJlbGVhc2VDb25kaXRpb24uc2lnbmFsKCk7CisgICAgbU1lZGlhQ2xvY2stPmNsZWFyQW5jaG9yKCk7Cit9CisKK3N0YXR1c190IE1lZGlhU3luYzo6c2V0VmlkZW9GcmFtZVJhdGVIaW50KGZsb2F0IHJhdGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgIGlmIChyYXRlIDwgMC5mKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChtRnJhbWVTY2hlZHVsZXIgIT0gTlVMTCkgeworICAgICAgICBtRnJhbWVTY2hlZHVsZXItPmluaXQocmF0ZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworZmxvYXQgTWVkaWFTeW5jOjpnZXRWaWRlb0ZyYW1lUmF0ZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgIGlmIChtRnJhbWVTY2hlZHVsZXIgIT0gTlVMTCkgeworICAgICAgICBmbG9hdCBmcHMgPSBtRnJhbWVTY2hlZHVsZXItPmdldEZyYW1lUmF0ZSgpOworICAgICAgICBpZiAoZnBzID4gMC5mKSB7CisgICAgICAgICAgICByZXR1cm4gZnBzOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gd2UgZG9uJ3QgaGF2ZSBvciBrbm93IHRoZSBmcmFtZSByYXRlCisgICAgcmV0dXJuIC0xLmY7Cit9CisKK3N0YXR1c190IE1lZGlhU3luYzo6c2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jU2V0dGluZ3MpIHsKKyAgICAvLyB2YWxpZGF0ZSBzZXR0aW5ncworICAgIGlmIChzeW5jU2V0dGluZ3MubVNvdXJjZSA+PSBBVlNZTkNfU09VUkNFX01BWAorICAgICAgICAgICAgfHwgc3luY1NldHRpbmdzLm1BdWRpb0FkanVzdE1vZGUgPj0gQVZTWU5DX0FVRElPX0FESlVTVF9NT0RFX01BWAorICAgICAgICAgICAgfHwgc3luY1NldHRpbmdzLm1Ub2xlcmFuY2UgPCAwLmYKKyAgICAgICAgICAgIHx8IHN5bmNTZXR0aW5ncy5tVG9sZXJhbmNlID49IEFWU1lOQ19UT0xFUkFOQ0VfTUFYKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKworICAgIC8vIHZlcmlmeSB0aGF0IHdlIGhhdmUgdGhlIHN5bmMgc291cmNlCisgICAgc3dpdGNoIChzeW5jU2V0dGluZ3MubVNvdXJjZSkgeworICAgICAgICBjYXNlIEFWU1lOQ19TT1VSQ0VfQVVESU86CisgICAgICAgICAgICBpZiAobUF1ZGlvVHJhY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJzZXRTeW5jU2V0dGluZ3M6IGF1ZGlvIHN5bmMgc291cmNlIHJlcXVpcmVzIGFuIGF1ZGlvIHRyYWNrIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWU1lOQ19TT1VSQ0VfVlNZTkM6CisgICAgICAgICAgICBpZiAobU91dHB1dCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInNldFN5bmNTZXR0aW5nczogdnN5bmMgc3luYyBzb3VyY2UgcmVxdWlyZXMgYW4gb3V0cHV0IHN1cmZhY2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBtU3luY1NldHRpbmdzID0gc3luY1NldHRpbmdzOworICAgIHJlc3luY19sKCk7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE1lZGlhU3luYzo6Z2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jU2V0dGluZ3MpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgICpzeW5jU2V0dGluZ3MgPSBtU3luY1NldHRpbmdzOworfQorCitzdGF0dXNfdCBNZWRpYVN5bmM6OnNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworCisgICAgc3RhdHVzX3QgZXJyID0gc2V0UGxheWJhY2tTZXR0aW5nc19sKHJhdGUpOworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgLy8gVE9ETzogYWRqdXN0IHJhdGUgaWYgdXNpbmcgVlNZTkMgYXMgc291cmNlCisgICAgICAgIHVwZGF0ZVBsYXliYWNrUmF0ZV9sKHJhdGUubVNwZWVkKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTWVkaWFTeW5jOjpzZXRQbGF5YmFja1NldHRpbmdzX2woY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpIHsKKyAgICBpZiAocmF0ZS5tU3BlZWQgPCAwLmYgfHwgcmF0ZS5tUGl0Y2ggPCAwLmYpIHsKKyAgICAgICAgLy8gV2UgZG9uJ3QgdmFsaWRhdGUgb3RoZXIgYXVkaW8gc2V0dGluZ3MuCisgICAgICAgIC8vIFRoZXkgd2lsbCBiZSB2YWxpZGF0ZWQgd2hlbi9pZiBhdWRpb3RyYWNrIGlzIHNldC4KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAobUF1ZGlvVHJhY2sgIT0gTlVMTCkgeworICAgICAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mKSB7CisgICAgICAgICAgICBtQXVkaW9UcmFjay0+cGF1c2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1RyYWNrLT5zZXRQbGF5YmFja1JhdGUocmF0ZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWdub3JlIGVycm9ycworICAgICAgICAgICAgKHZvaWQpbUF1ZGlvVHJhY2stPnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBNZWRpYVN5bmM6OmdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgICpyYXRlID0gbVBsYXliYWNrU2V0dGluZ3M7Cit9CisKK2ludDY0X3QgTWVkaWFTeW5jOjpnZXRSZWFsVGltZShpbnQ2NF90IG1lZGlhVGltZVVzLCBpbnQ2NF90IG5vd1VzKSB7CisgICAgaW50NjRfdCByZWFsVXM7CisgICAgaWYgKG1NZWRpYUNsb2NrLT5nZXRSZWFsVGltZUZvcihtZWRpYVRpbWVVcywgJnJlYWxVcykgIT0gT0spIHsKKyAgICAgICAgLy8gSWYgZmFpbGVkIHRvIGdldCBjdXJyZW50IHBvc2l0aW9uLCBlLmcuIGR1ZSB0byBhdWRpbyBjbG9jayBpcworICAgICAgICAvLyBub3QgcmVhZHksIHRoZW4ganVzdCBwbGF5IG91dCB2aWRlbyBpbW1lZGlhdGVseSB3aXRob3V0IGRlbGF5LgorICAgICAgICByZXR1cm4gbm93VXM7CisgICAgfQorICAgIHJldHVybiByZWFsVXM7Cit9CisKK2ludDY0X3QgTWVkaWFTeW5jOjpnZXREdXJhdGlvbklmUGxheWVkQXROYXRpdmVTYW1wbGVSYXRlX2woaW50NjRfdCBudW1GcmFtZXMpIHsKKyAgICByZXR1cm4gKG51bUZyYW1lcyAqIDEwMDAwMDBMTCAvIG1OYXRpdmVTYW1wbGVSYXRlSW5Ieik7Cit9CisKK2ludDY0X3QgTWVkaWFTeW5jOjpnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uTWVkaWFfbChpbnQ2NF90IG5vd1VzKSB7CisgICAgQ0hFQ0sobUF1ZGlvVHJhY2sgIT0gTlVMTCk7CisKKyAgICB1aW50MzJfdCBudW1GcmFtZXNQbGF5ZWQ7CisgICAgaW50NjRfdCBudW1GcmFtZXNQbGF5ZWRBdDsKKyAgICBBdWRpb1RpbWVzdGFtcCB0czsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrU3RhbGVUaW1lc3RhbXAxMDBtcyA9IDEwMDAwMDsKKworICAgIHN0YXR1c190IHJlcyA9IG1BdWRpb1RyYWNrLT5nZXRUaW1lc3RhbXAodHMpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgLy8gY2FzZSAxOiBtaXhpbmcgYXVkaW8gdHJhY2tzLgorICAgICAgICBudW1GcmFtZXNQbGF5ZWQgPSB0cy5tUG9zaXRpb247CisgICAgICAgIG51bUZyYW1lc1BsYXllZEF0ID0KKyAgICAgICAgICAgIHRzLm1UaW1lLnR2X3NlYyAqIDEwMDAwMDBMTCArIHRzLm1UaW1lLnR2X25zZWMgLyAxMDAwOworICAgICAgICBjb25zdCBpbnQ2NF90IHRpbWVzdGFtcEFnZSA9IG5vd1VzIC0gbnVtRnJhbWVzUGxheWVkQXQ7CisgICAgICAgIGlmICh0aW1lc3RhbXBBZ2UgPiBrU3RhbGVUaW1lc3RhbXAxMDBtcykgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBhdWRpbyBGSVhNRS4KKyAgICAgICAgICAgIC8vIGdldFRpbWVzdGFtcCByZXR1cm5zIGEgdGltZXN0YW1wIHdoaWNoIG1heSBjb21lIGZyb20gYXVkaW8KKyAgICAgICAgICAgIC8vIG1peGluZyB0aHJlYWRzLiBBZnRlciBwYXVzaW5nLCB0aGUgTWl4ZXJUaHJlYWQgbWF5IGdvIGlkbGUsCisgICAgICAgICAgICAvLyB0aHVzIHRoZSBtVGltZSBlc3RpbWF0ZSBtYXkgYmVjb21lIHN0YWxlLiBBc3N1bWluZyB0aGF0IHRoZQorICAgICAgICAgICAgLy8gTWl4ZXJUaHJlYWQgcnVucyAyMG1zLCB3aXRoIEZhc3RNaXhlciBhdCA1bXMsIHRoZSBtYXggbGF0ZW5jeQorICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFib3V0IDI1bXMgd2l0aCBhbiBhdmVyYWdlIGFyb3VuZCAxMm1zICh0byBiZQorICAgICAgICAgICAgLy8gdmVyaWZpZWQpLiBGb3Igc2FmZXR5IHdlIHVzZSAxMDBtcy4KKyAgICAgICAgICAgIEFMT0dWKCJnZXRUaW1lc3RhbXA6IHJldHVybmVkIHN0YWxlIHRpbWVzdGFtcCBub3dVcyglbGxkKSAiCisgICAgICAgICAgICAgICAgICAibnVtRnJhbWVzUGxheWVkQXQoJWxsZCkiLAorICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylub3dVcywgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdCk7CisgICAgICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdCA9IG5vd1VzIC0ga1N0YWxlVGltZXN0YW1wMTAwbXM7CisgICAgICAgIH0KKyAgICAgICAgLy9BTE9HRCgiZ2V0VGltZXN0YW1wOiBPSyAlZCAlbGxkIiwKKyAgICAgICAgLy8gICAgICBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXQpOworICAgIH0gZWxzZSBpZiAocmVzID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgIC8vIGNhc2UgMjogdHJhbnNpdG9yeSBzdGF0ZSBvbiBzdGFydCBvZiBhIG5ldyB0cmFjaworICAgICAgICBudW1GcmFtZXNQbGF5ZWQgPSAwOworICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdCA9IG5vd1VzOworICAgICAgICAvL0FMT0dEKCJnZXRUaW1lc3RhbXA6IFdPVUxEX0JMT0NLICVkICVsbGQiLAorICAgICAgICAvLyAgICAgIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gY2FzZSAzOiB0cmFuc2l0b3J5IGF0IG5ldyB0cmFjayBvciBhdWRpbyBmYXN0IHRyYWNrcy4KKyAgICAgICAgcmVzID0gbUF1ZGlvVHJhY2stPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWQpOworICAgICAgICBDSEVDS19FUShyZXMsIChzdGF0dXNfdClPSyk7CisgICAgICAgIG51bUZyYW1lc1BsYXllZEF0ID0gbm93VXM7CisgICAgICAgIG51bUZyYW1lc1BsYXllZEF0ICs9IDEwMDBMTCAqIG1BdWRpb1RyYWNrLT5sYXRlbmN5KCkgLyAyOyAvKiBYWFggKi8KKyAgICAgICAgLy9BTE9HRCgiZ2V0UG9zaXRpb246ICVkICVsbGQiLCBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXQpOworICAgIH0KKworICAgIC8vY2FuJ3QgYmUgbmVnYXRpdmUgdW50aWwgMTIuNCBocnMsIHRlc3QuCisgICAgLy9DSEVDS19FUShudW1GcmFtZXNQbGF5ZWQgJiAoMSA8PCAzMSksIDApOworICAgIGludDY0X3QgZHVyYXRpb25VcyA9CisgICAgICAgIGdldER1cmF0aW9uSWZQbGF5ZWRBdE5hdGl2ZVNhbXBsZVJhdGVfbChudW1GcmFtZXNQbGF5ZWQpCisgICAgICAgICAgICArIG5vd1VzIC0gbnVtRnJhbWVzUGxheWVkQXQ7CisgICAgaWYgKGR1cmF0aW9uVXMgPCAwKSB7CisgICAgICAgIC8vIE9jY3VycyB3aGVuIG51bUZyYW1lc1BsYXllZCBwb3NpdGlvbiBpcyB2ZXJ5IHNtYWxsIGFuZCB0aGUgZm9sbG93aW5nOgorICAgICAgICAvLyAoMSkgSW4gY2FzZSAxLCB0aGUgdGltZSBub3dVcyBpcyBjb21wdXRlZCBiZWZvcmUgZ2V0VGltZXN0YW1wKCkgaXMKKyAgICAgICAgLy8gICAgIGNhbGxlZCBhbmQgbnVtRnJhbWVzUGxheWVkQXQgaXMgZ3JlYXRlciB0aGFuIG5vd1VzIGJ5IHRpbWUgbW9yZQorICAgICAgICAvLyAgICAgdGhhbiBudW1GcmFtZXNQbGF5ZWQuCisgICAgICAgIC8vICgyKSBJbiBjYXNlIDMsIHVzaW5nIGdldFBvc2l0aW9uIGFuZCBhZGRpbmcgbUF1ZGlvVHJhY2stPmxhdGVuY3koKQorICAgICAgICAvLyAgICAgdG8gbnVtRnJhbWVzUGxheWVkQXQsIGJ5IGEgdGltZSBhbW91bnQgZ3JlYXRlciB0aGFuCisgICAgICAgIC8vICAgICBudW1GcmFtZXNQbGF5ZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEJvdGggb2YgdGhlc2UgYXJlIHRyYW5zaXRvcnkgY29uZGl0aW9ucy4KKyAgICAgICAgQUxPR1YoImdldFBsYXllZE91dEF1ZGlvRHVyYXRpb25NZWRpYV9sOiBuZWdhdGl2ZSBkdXJhdGlvbiAlbGxkICIKKyAgICAgICAgICAgICAgInNldCB0byB6ZXJvIiwgKGxvbmcgbG9uZylkdXJhdGlvblVzKTsKKyAgICAgICAgZHVyYXRpb25VcyA9IDA7CisgICAgfQorICAgIEFMT0dWKCJnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uTWVkaWFfbCglbGxkKSBub3dVcyglbGxkKSBmcmFtZXMoJXUpICIKKyAgICAgICAgICAiZnJhbWVzQXQoJWxsZCkiLAorICAgICAgICAgIChsb25nIGxvbmcpZHVyYXRpb25VcywgKGxvbmcgbG9uZylub3dVcywgbnVtRnJhbWVzUGxheWVkLAorICAgICAgICAgIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXQpOworICAgIHJldHVybiBkdXJhdGlvblVzOworfQorCit2b2lkIE1lZGlhU3luYzo6b25EcmFpblZpZGVvX2woKSB7CisgICAgaWYgKCFpc1BsYXlpbmcoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKCFtQnVmZmVySXRlbXMuZW1wdHkoKSkgeworICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICAgICAgQnVmZmVySXRlbSAqYnVmZmVySXRlbSA9ICYqbUJ1ZmZlckl0ZW1zLmJlZ2luKCk7CisgICAgICAgIGludDY0X3QgaXRlbU1lZGlhVXMgPSBidWZmZXJJdGVtLT5tVGltZXN0YW1wIC8gMTAwMDsKKyAgICAgICAgaW50NjRfdCBpdGVtUmVhbFVzID0gZ2V0UmVhbFRpbWUoaXRlbU1lZGlhVXMsIG5vd1VzKTsKKworICAgICAgICAvLyBhZGp1c3QgdmlkZW8gZnJhbWUgUFRTIGJhc2VkIG9uIHZzeW5jCisgICAgICAgIGl0ZW1SZWFsVXMgPSBtRnJhbWVTY2hlZHVsZXItPnNjaGVkdWxlKGl0ZW1SZWFsVXMgKiAxMDAwKSAvIDEwMDA7CisgICAgICAgIGludDY0X3QgdHdvVnN5bmNzVXMgPSAyICogKG1GcmFtZVNjaGVkdWxlci0+Z2V0VnN5bmNQZXJpb2QoKSAvIDEwMDApOworCisgICAgICAgIC8vIHBvc3QgMiBkaXNwbGF5IHJlZnJlc2hlcyBiZWZvcmUgcmVuZGVyaW5nIGlzIGR1ZQorICAgICAgICBpZiAoaXRlbVJlYWxVcyA8PSBub3dVcyArIHR3b1ZzeW5jc1VzKSB7CisgICAgICAgICAgICBBTE9HVigiYWRqdXN0aW5nIFBUUyBmcm9tICVsbGQgdG8gJWxsZCIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpYnVmZmVySXRlbS0+bVRpbWVzdGFtcCAvIDEwMDAsIChsb25nIGxvbmcpaXRlbVJlYWxVcyk7CisgICAgICAgICAgICBidWZmZXJJdGVtLT5tVGltZXN0YW1wID0gaXRlbVJlYWxVcyAqIDEwMDA7CisgICAgICAgICAgICBidWZmZXJJdGVtLT5tSXNBdXRvVGltZXN0YW1wID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmIChtSGFzQXVkaW8pIHsKKyAgICAgICAgICAgICAgICBpZiAobm93VXMgLSBpdGVtUmVhbFVzIDw9IGtNYXhBbGxvd2VkVmlkZW9MYXRlVGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbmRlck9uZUJ1ZmZlckl0ZW1fbCgqYnVmZmVySXRlbSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdG9vIGxhdGUuCisgICAgICAgICAgICAgICAgICAgIHJldHVybkJ1ZmZlclRvSW5wdXRfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJdGVtLT5tR3JhcGhpY0J1ZmZlciwgYnVmZmVySXRlbS0+bUZlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgbUZyYW1lU2NoZWR1bGVyLT5yZXN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBhbHdheXMgcmVuZGVyIHZpZGVvIGJ1ZmZlciBpbiB2aWRlby1vbmx5IG1vZGUuCisgICAgICAgICAgICAgICAgcmVuZGVyT25lQnVmZmVySXRlbV9sKCpidWZmZXJJdGVtKTsKKworICAgICAgICAgICAgICAgIC8vIHNtb290aCBvdXQgdmlkZW9zID49IDEwZnBzCisgICAgICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZUFuY2hvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1NZWRpYVVzLCBub3dVcywgaXRlbU1lZGlhVXMgKyAxMDAwMDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQnVmZmVySXRlbXMuZXJhc2UobUJ1ZmZlckl0ZW1zLmJlZ2luKCkpOworICAgICAgICAgICAgbU5leHRCdWZmZXJJdGVtTWVkaWFVcyA9IC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1OZXh0QnVmZmVySXRlbU1lZGlhVXMgPT0gLTEKKyAgICAgICAgICAgICAgICAgICAgfHwgbU5leHRCdWZmZXJJdGVtTWVkaWFVcyA+IGl0ZW1NZWRpYVVzKSB7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERyYWluVmlkZW8sIHRoaXMpOworICAgICAgICAgICAgICAgIG1zZy0+cG9zdChpdGVtUmVhbFVzIC0gbm93VXMgLSB0d29Wc3luY3NVcyk7CisgICAgICAgICAgICAgICAgbU5leHRCdWZmZXJJdGVtTWVkaWFVcyA9IGl0ZW1NZWRpYVVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFTeW5jOjpvbkZyYW1lQXZhaWxhYmxlRnJvbUlucHV0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisKKyAgICBjb25zdCBzdGF0aWMgbnNlY3NfdCBrQWNxdWlyZVdhaXRUaW1lb3V0ID0gMjAwMDAwMDAwMDsgLy8gMiBzZWNvbmRzCisKKyAgICBtUmV0dXJuUGVuZGluZ0lucHV0RnJhbWUgPSBmYWxzZTsKKworICAgIC8vIElmIHRoZXJlIGFyZSB0b28gbWFueSBvdXRzdGFuZGluZyBidWZmZXJzLCB3YWl0IHVudGlsIGEgYnVmZmVyIGlzCisgICAgLy8gcmVsZWFzZWQgYmFjayB0byB0aGUgaW5wdXQgaW4gb25CdWZmZXJSZWxlYXNlZC4KKyAgICAvLyBOT1RFOiBCdWZmZXJRdWV1ZSBhbGxvd3MgZGVxdWV1aW5nIG1heEFjcXVpcmVkQnVmZmVyQ291bnQgKyAxIGJ1ZmZlcnMKKyAgICB3aGlsZSAobU51bU91dHN0YW5kaW5nQnVmZmVycyA+IG1NYXhBY3F1aXJlZEJ1ZmZlckNvdW50CisgICAgICAgICAgICAmJiAhbUlzQWJhbmRvbmVkICYmICFtUmV0dXJuUGVuZGluZ0lucHV0RnJhbWUpIHsKKyAgICAgICAgaWYgKG1SZWxlYXNlQ29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTXV0ZXgsIGtBY3F1aXJlV2FpdFRpbWVvdXQpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HSV9JRihtUGxheWJhY2tSYXRlICE9IDAuZiwgInN0aWxsIHdhaXRpbmcgdG8gcmVsZWFzZSBhIGJ1ZmZlciBiZWZvcmUgYWNxdWlyZSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIHN5bmMgaXMgYWJhbmRvbmVkIHdoaWxlIHdlIGFyZSB3YWl0aW5nLCB0aGUgcmVsZWFzZQorICAgICAgICAvLyBjb25kaXRpb24gdmFyaWFibGUgd2lsbCBiZSBicm9hZGNhc3QsIGFuZCB3ZSBzaG91bGQganVzdCByZXR1cm4KKyAgICAgICAgLy8gd2l0aG91dCBhdHRlbXB0aW5nIHRvIGRvIGFueXRoaW5nIG1vcmUgKHNpbmNlIHRoZSBpbnB1dCBxdWV1ZSB3aWxsCisgICAgICAgIC8vIGFsc28gYmUgYWJhbmRvbmVkKS4KKyAgICAgICAgaWYgKG1Jc0FiYW5kb25lZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQWNxdWlyZSBhbmQgZGV0YWNoIHRoZSBidWZmZXIgZnJvbSB0aGUgaW5wdXQuCisgICAgQnVmZmVySXRlbSBidWZmZXJJdGVtOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1JbnB1dC0+YWNxdWlyZUJ1ZmZlcigmYnVmZmVySXRlbSwgMCAvKiBwcmVzZW50V2hlbiAqLyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiYWNxdWlyaW5nIGJ1ZmZlciBmcm9tIGlucHV0IGZhaWxlZCAoJWQpIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICArK21OdW1PdXRzdGFuZGluZ0J1ZmZlcnM7CisKKyAgICBBTE9HVigiYWNxdWlyZWQgYnVmZmVyICUjbGx4IGZyb20gaW5wdXQiLCAobG9uZyBsb25nKWJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXItPmdldElkKCkpOworCisgICAgc3RhdHVzID0gbUlucHV0LT5kZXRhY2hCdWZmZXIoYnVmZmVySXRlbS5tQnVmKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJkZXRhY2hpbmcgYnVmZmVyIGZyb20gaW5wdXQgZmFpbGVkICglZCkiLCBzdGF0dXMpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0lOSVQpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBpbnB1dCBoYXMgYmVlbiBhYmFuZG9uZWQsIG1vdmUgb24uCisgICAgICAgICAgICBvbkFiYW5kb25lZF9sKHRydWUgLyogaXNJbnB1dCAqLyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtQnVmZmVyc0Zyb21JbnB1dC5pbmRleE9mS2V5KGJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXItPmdldElkKCkpID49IDApIHsKKyAgICAgICAgLy8gU29tZXRoaW5nIGlzIHdyb25nIHNpbmNlIHRoaXMgYnVmZmVyIHNob3VsZCBiZSBhdCBvdXIgaGFuZHMsIGJhaWwuCisgICAgICAgIEFMT0dFKCJyZWNlaXZlZCBidWZmZXIgbXVsdGlwbGUgdGltZXMgZnJvbSBpbnB1dCIpOworICAgICAgICBtSW5wdXQtPmNvbnN1bWVyRGlzY29ubmVjdCgpOworICAgICAgICBvbkFiYW5kb25lZF9sKHRydWUgLyogaXNJbnB1dCAqLyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUJ1ZmZlcnNGcm9tSW5wdXQuYWRkKGJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXItPmdldElkKCksIGJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXIpOworCisgICAgLy8gSWYgZmx1c2ggaGFwcGVuZWQgd2hpbGUgd2FpdGluZyBmb3IgYSBidWZmZXIgdG8gYmUgcmVsZWFzZWQsIHNpbXBseSByZXR1cm4gaXQKKyAgICAvLyBUUklDS1k6IGRvIGl0IGhlcmUgYWZ0ZXIgaXQgaXMgZGV0YWNoZWQgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNhY2hlIG1HcmFwaGljQnVmZmVyLgorICAgIGlmIChtUmV0dXJuUGVuZGluZ0lucHV0RnJhbWUpIHsKKyAgICAgICAgbVJldHVyblBlbmRpbmdJbnB1dEZyYW1lID0gZmFsc2U7CisgICAgICAgIHJldHVybkJ1ZmZlclRvSW5wdXRfbChidWZmZXJJdGVtLm1HcmFwaGljQnVmZmVyLCBidWZmZXJJdGVtLm1GZW5jZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQnVmZmVySXRlbXMucHVzaF9iYWNrKGJ1ZmZlckl0ZW0pOworCisgICAgaWYgKG1CdWZmZXJJdGVtcy5zaXplKCkgPT0gMSkgeworICAgICAgICBvbkRyYWluVmlkZW9fbCgpOworICAgIH0KK30KKwordm9pZCBNZWRpYVN5bmM6OnJlbmRlck9uZUJ1ZmZlckl0ZW1fbChjb25zdCBCdWZmZXJJdGVtICZidWZmZXJJdGVtKSB7CisgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBxdWV1ZUlucHV0KAorICAgICAgICAgICAgYnVmZmVySXRlbS5tVGltZXN0YW1wLAorICAgICAgICAgICAgYnVmZmVySXRlbS5tSXNBdXRvVGltZXN0YW1wLAorICAgICAgICAgICAgYnVmZmVySXRlbS5tRGF0YVNwYWNlLAorICAgICAgICAgICAgYnVmZmVySXRlbS5tQ3JvcCwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGJ1ZmZlckl0ZW0ubVNjYWxpbmdNb2RlKSwKKyAgICAgICAgICAgIGJ1ZmZlckl0ZW0ubVRyYW5zZm9ybSwKKyAgICAgICAgICAgIGJ1ZmZlckl0ZW0ubUlzRHJvcHBhYmxlLAorICAgICAgICAgICAgYnVmZmVySXRlbS5tRmVuY2UpOworCisgICAgLy8gQXR0YWNoIGFuZCBxdWV1ZSB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQuCisgICAgaW50IHNsb3Q7CisgICAgbU91dHB1dC0+c2V0R2VuZXJhdGlvbk51bWJlcihidWZmZXJJdGVtLm1HcmFwaGljQnVmZmVyLT5nZXRHZW5lcmF0aW9uTnVtYmVyKCkpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PdXRwdXQtPmF0dGFjaEJ1ZmZlcigmc2xvdCwgYnVmZmVySXRlbS5tR3JhcGhpY0J1ZmZlcik7CisgICAgQUxPR0VfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiYXR0YWNoaW5nIGJ1ZmZlciB0byBvdXRwdXQgZmFpbGVkICglZCkiLCBzdGF0dXMpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgcXVldWVPdXRwdXQ7CisgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnF1ZXVlQnVmZmVyKHNsb3QsIHF1ZXVlSW5wdXQsICZxdWV1ZU91dHB1dCk7CisgICAgICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgInF1ZXVlaW5nIGJ1ZmZlciB0byBvdXRwdXQgZmFpbGVkICglZCkiLCBzdGF0dXMpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuQnVmZmVyVG9JbnB1dF9sKGJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXIsIGJ1ZmZlckl0ZW0ubUZlbmNlKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19JTklUKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgb3V0cHV0IGhhcyBiZWVuIGFiYW5kb25lZCwgbW92ZSBvbi4KKyAgICAgICAgICAgIG9uQWJhbmRvbmVkX2woZmFsc2UgLyogaXNJbnB1dCAqLyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtQnVmZmVyc1NlbnRUb091dHB1dC5pbmRleE9mS2V5KGJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXItPmdldElkKCkpID49IDApIHsKKyAgICAgICAgLy8gU29tZXRoaW5nIGlzIHdyb25nIHNpbmNlIHRoaXMgYnVmZmVyIHNob3VsZCBiZSBoZWxkIGJ5IG91dHB1dCBub3csIGJhaWwuCisgICAgICAgIG1JbnB1dC0+Y29uc3VtZXJEaXNjb25uZWN0KCk7CisgICAgICAgIG9uQWJhbmRvbmVkX2wodHJ1ZSAvKiBpc0lucHV0ICovKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQnVmZmVyc1NlbnRUb091dHB1dC5hZGQoYnVmZmVySXRlbS5tR3JhcGhpY0J1ZmZlci0+Z2V0SWQoKSwgYnVmZmVySXRlbS5tR3JhcGhpY0J1ZmZlcik7CisKKyAgICBBTE9HVigicXVldWVkIGJ1ZmZlciAlI2xseCB0byBvdXRwdXQiLCAobG9uZyBsb25nKWJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXItPmdldElkKCkpOworfQorCit2b2lkIE1lZGlhU3luYzo6b25CdWZmZXJSZWxlYXNlZEJ5T3V0cHV0KHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZvdXRwdXQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworCisgICAgaWYgKG91dHB1dCAhPSBtT3V0cHV0KSB7CisgICAgICAgIHJldHVybjsgIC8vIFRoaXMgaXMgbm90IHRoZSBjdXJyZW50IG91dHB1dCwgaWdub3JlLgorICAgIH0KKworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcjsKKyAgICBzcDxGZW5jZT4gZmVuY2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU91dHB1dC0+ZGV0YWNoTmV4dEJ1ZmZlcigmYnVmZmVyLCAmZmVuY2UpOworICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgImRldGFjaGluZyBidWZmZXIgZnJvbSBvdXRwdXQgZmFpbGVkICglZCkiLCBzdGF0dXMpOworCisgICAgaWYgKHN0YXR1cyA9PSBOT19JTklUKSB7CisgICAgICAgIC8vIElmIHRoZSBvdXRwdXQgaGFzIGJlZW4gYWJhbmRvbmVkLCB3ZSBjYW4ndCBkbyBhbnl0aGluZyBlbHNlLAorICAgICAgICAvLyBzaW5jZSBidWZmZXIgaXMgaW52YWxpZC4KKyAgICAgICAgb25BYmFuZG9uZWRfbChmYWxzZSAvKiBpc0lucHV0ICovKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJkZXRhY2hlZCBidWZmZXIgJSNsbHggZnJvbSBvdXRwdXQiLCAobG9uZyBsb25nKWJ1ZmZlci0+Z2V0SWQoKSk7CisKKyAgICAvLyBJZiB3ZSd2ZSBiZWVuIGFiYW5kb25lZCwgd2UgY2FuJ3QgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlIGlucHV0LCBzbyBqdXN0CisgICAgLy8gbW92ZSBvbi4KKyAgICBpZiAobUlzQWJhbmRvbmVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzc2l6ZV90IGl4ID0gbUJ1ZmZlcnNTZW50VG9PdXRwdXQuaW5kZXhPZktleShidWZmZXItPmdldElkKCkpOworICAgIGlmIChpeCA8IDApIHsKKyAgICAgICAgLy8gVGhlIGJ1ZmZlciBpcyB1bmtub3duLCBtYXliZSBsZWZ0b3ZlciwgaWdub3JlLgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1CdWZmZXJzU2VudFRvT3V0cHV0LnJlbW92ZUl0ZW1zQXQoaXgpOworCisgICAgcmV0dXJuQnVmZmVyVG9JbnB1dF9sKGJ1ZmZlciwgZmVuY2UpOworfQorCit2b2lkIE1lZGlhU3luYzo6cmV0dXJuQnVmZmVyVG9JbnB1dF9sKAorICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmYnVmZmVyLCBjb25zdCBzcDxGZW5jZT4gJmZlbmNlKSB7CisgICAgc3NpemVfdCBpeCA9IG1CdWZmZXJzRnJvbUlucHV0LmluZGV4T2ZLZXkoYnVmZmVyLT5nZXRJZCgpKTsKKyAgICBpZiAoaXggPCAwKSB7CisgICAgICAgIC8vIFRoZSBidWZmZXIgaXMgdW5rbm93biwgc29tZXRoaW5nIGlzIHdyb25nLCBiYWlsLgorICAgICAgICBBTE9HRSgib3V0cHV0IHJldHVybmVkIHVua25vd24gYnVmZmVyIik7CisgICAgICAgIG1PdXRwdXQtPmRpc2Nvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworICAgICAgICBvbkFiYW5kb25lZF9sKGZhbHNlIC8qIGlzSW5wdXQgKi8pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPEdyYXBoaWNCdWZmZXI+IG9sZEJ1ZmZlciA9IG1CdWZmZXJzRnJvbUlucHV0LnZhbHVlQXQoaXgpOworICAgIG1CdWZmZXJzRnJvbUlucHV0LnJlbW92ZUl0ZW1zQXQoaXgpOworCisgICAgLy8gQXR0YWNoIGFuZCByZWxlYXNlIHRoZSBidWZmZXIgYmFjayB0byB0aGUgaW5wdXQuCisgICAgaW50IGNvbnN1bWVyU2xvdDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtSW5wdXQtPmF0dGFjaEJ1ZmZlcigmY29uc3VtZXJTbG90LCBvbGRCdWZmZXIpOworICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgImF0dGFjaGluZyBidWZmZXIgdG8gaW5wdXQgZmFpbGVkICglZCkiLCBzdGF0dXMpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RhdHVzID0gbUlucHV0LT5yZWxlYXNlQnVmZmVyKGNvbnN1bWVyU2xvdCwgMCAvKiBmcmFtZU51bWJlciAqLywKKyAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBmZW5jZSk7CisgICAgICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgInJlbGVhc2luZyBidWZmZXIgdG8gaW5wdXQgZmFpbGVkICglZCkiLCBzdGF0dXMpOworICAgIH0KKworICAgIC8vIE5vdGlmeSBhbnkgd2FpdGluZyBvbkZyYW1lQXZhaWxhYmxlIGNhbGxzLgorICAgIC0tbU51bU91dHN0YW5kaW5nQnVmZmVyczsKKyAgICBtUmVsZWFzZUNvbmRpdGlvbi5zaWduYWwoKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1YoInJlbGVhc2VkIGJ1ZmZlciAlI2xseCB0byBpbnB1dCIsIChsb25nIGxvbmcpb2xkQnVmZmVyLT5nZXRJZCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFTeW5jOjpvbkFiYW5kb25lZF9sKGJvb2wgaXNJbnB1dCkgeworICAgIEFMT0dFKCJ0aGUgJXMgaGFzIGFiYW5kb25lZCBtZSIsIChpc0lucHV0ID8gImlucHV0IiA6ICJvdXRwdXQiKSk7CisgICAgaWYgKCFtSXNBYmFuZG9uZWQpIHsKKyAgICAgICAgaWYgKGlzSW5wdXQpIHsKKyAgICAgICAgICAgIG1PdXRwdXQtPmRpc2Nvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUlucHV0LT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKKyAgICAgICAgfQorICAgICAgICBtSXNBYmFuZG9uZWQgPSB0cnVlOworICAgIH0KKyAgICBtUmVsZWFzZUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKK30KKwordm9pZCBNZWRpYVN5bmM6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0RHJhaW5WaWRlbzoKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgIGlmIChtTmV4dEJ1ZmZlckl0ZW1NZWRpYVVzICE9IC0xKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgICAgICAgICAgaW50NjRfdCBpdGVtUmVhbFVzID0gZ2V0UmVhbFRpbWUobU5leHRCdWZmZXJJdGVtTWVkaWFVcywgbm93VXMpOworCisgICAgICAgICAgICAgICAgLy8gVGhlIG1lc3NhZ2UgY291bGQgYXJyaXZlIGVhcmxpZXIgdGhhbiBleHBlY3RlZCBkdWUgdG8KKyAgICAgICAgICAgICAgICAvLyB2YXJpb3VzIHJlYXNvbnMsIGUuZy4sIG1lZGlhIGNsb2NrIGhhcyBiZWVuIGNoYW5nZWQgYmVjYXVzZQorICAgICAgICAgICAgICAgIC8vIG9mIG5ldyBhbmNob3IgdGltZSBvciBwbGF5YmFjayByYXRlLiBJbiBzdWNoIGNhc2VzLCB0aGUKKyAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIG5lZWRzIHRvIGJlIHJlLXBvc3RlZC4KKyAgICAgICAgICAgICAgICBpZiAoaXRlbVJlYWxVcyA+IG5vd1VzKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+cG9zdChpdGVtUmVhbFVzIC0gbm93VXMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9uRHJhaW5WaWRlb19sKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitNZWRpYVN5bmM6OklucHV0TGlzdGVuZXI6OklucHV0TGlzdGVuZXIoY29uc3Qgc3A8TWVkaWFTeW5jPiAmc3luYykKKyAgICAgIDogbVN5bmMoc3luYykge30KKworTWVkaWFTeW5jOjpJbnB1dExpc3RlbmVyOjp+SW5wdXRMaXN0ZW5lcigpIHt9CisKK3ZvaWQgTWVkaWFTeW5jOjpJbnB1dExpc3RlbmVyOjpvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0gJi8qIGl0ZW0gKi8pIHsKKyAgICBtU3luYy0+b25GcmFtZUF2YWlsYWJsZUZyb21JbnB1dCgpOworfQorCisvLyBXZSBkb24ndCBjYXJlIGFib3V0IHNpZGViYW5kIHN0cmVhbXMsIHNpbmNlIHdlIHdvbid0IHJlbGF5IHRoZW0uCit2b2lkIE1lZGlhU3luYzo6SW5wdXRMaXN0ZW5lcjo6b25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKSB7CisgICAgQUxPR0UoIm9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkOiBnb3Qgc2lkZWJhbmQgc3RyZWFtIHVuZXhwZWN0ZWRseS4iKTsKK30KKworCit2b2lkIE1lZGlhU3luYzo6SW5wdXRMaXN0ZW5lcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmLyogd2hvICovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN5bmMtPm1NdXRleCk7CisgICAgbVN5bmMtPm9uQWJhbmRvbmVkX2wodHJ1ZSAvKiBpc0lucHV0ICovKTsKK30KKworTWVkaWFTeW5jOjpPdXRwdXRMaXN0ZW5lcjo6T3V0cHV0TGlzdGVuZXIoY29uc3Qgc3A8TWVkaWFTeW5jPiAmc3luYywKKyAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJm91dHB1dCkKKyAgICAgIDogbVN5bmMoc3luYyksCisgICAgICAgIG1PdXRwdXQob3V0cHV0KSB7fQorCitNZWRpYVN5bmM6Ok91dHB1dExpc3RlbmVyOjp+T3V0cHV0TGlzdGVuZXIoKSB7fQorCit2b2lkIE1lZGlhU3luYzo6T3V0cHV0TGlzdGVuZXI6Om9uQnVmZmVyUmVsZWFzZWQoKSB7CisgICAgbVN5bmMtPm9uQnVmZmVyUmVsZWFzZWRCeU91dHB1dChtT3V0cHV0KTsKK30KKwordm9pZCBNZWRpYVN5bmM6Ok91dHB1dExpc3RlbmVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICYvKiB3aG8gKi8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3luYy0+bU11dGV4KTsKKyAgICBtU3luYy0+b25BYmFuZG9uZWRfbChmYWxzZSAvKiBpc0lucHV0ICovKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWlkaUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NaWRpRXh0cmFjdG9yLmNwcAppbmRleCA2NmZhYjc3Li5mNmI4Yzg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NaWRpRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NaWRpRXh0cmFjdG9yLmNwcApAQCAtMjE3LDcgKzIxNyw3IEBACiB9CiAKIHN0YXR1c190IE1pZGlFbmdpbmU6OnNlZWtUbyhpbnQ2NF90IHBvc2l0aW9uVXMpIHsKLSAgICBBTE9HVigic2Vla1RvICVsbGQiLCBwb3NpdGlvblVzKTsKKyAgICBBTE9HVigic2Vla1RvICVsbGQiLCAobG9uZyBsb25nKXBvc2l0aW9uVXMpOwogICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gRUFTX0xvY2F0ZShtRWFzRGF0YSwgbUVhc0hhbmRsZSwgcG9zaXRpb25VcyAvIDEwMDAsIGZhbHNlKTsKICAgICByZXR1cm4gcmVzdWx0ID09IEVBU19TVUNDRVNTID8gT0sgOiBVTktOT1dOX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKaW5kZXggNjRiY2Q4Yy4uZDYyNTVkNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCkBAIC0yNDIsNyArMjQyLDcgQEAKICAgICBzcDxOdUNhY2hlZFNvdXJjZTI+IGluc3RhbmNlID0gbmV3IE51Q2FjaGVkU291cmNlMigKICAgICAgICAgICAgIHNvdXJjZSwgY2FjaGVDb25maWcsIGRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmspOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhpbnN0YW5jZS0+bUxvY2spOwotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaE1vcmUsIGluc3RhbmNlLT5tUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hNb3JlLCBpbnN0YW5jZS0+bVJlZmxlY3RvcikpLT5wb3N0KCk7CiAgICAgcmV0dXJuIGluc3RhbmNlOwogfQogCkBAIC00NDIsNyArNDQyLDcgQEAKICAgICAgICAgZGVsYXlVcyA9IDEwMDAwMGxsOwogICAgIH0KIAotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaE1vcmUsIG1SZWZsZWN0b3ItPmlkKCkpKS0+cG9zdChkZWxheVVzKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hNb3JlLCBtUmVmbGVjdG9yKSktPnBvc3QoZGVsYXlVcyk7CiB9CiAKIHZvaWQgTnVDYWNoZWRTb3VyY2UyOjpvblJlYWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKQEAgLTUxMiw3ICs1MTIsNyBAQAogc3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b1NlcmlhbGl6ZXIobVNlcmlhbGl6ZXIpOwogCi0gICAgQUxPR1YoInJlYWRBdCBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBvZmZzZXQsIHNpemUpOworICAgIEFMT0dWKCJyZWFkQXQgb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBpZiAobURpc2Nvbm5lY3RpbmcpIHsKQEAgLTUzMSw3ICs1MzEsNyBAQAogICAgICAgICByZXR1cm4gc2l6ZTsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVhZCwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlYWQsIG1SZWZsZWN0b3IpOwogICAgIG1zZy0+c2V0SW50NjQoIm9mZnNldCIsIG9mZnNldCk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJkYXRhIiwgZGF0YSk7CiAgICAgbXNnLT5zZXRTaXplKCJzaXplIiwgc2l6ZSk7CkBAIC01ODgsMTAgKzU4OCwxNyBAQAogc3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OnJlYWRJbnRlcm5hbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBDSEVDS19MRShzaXplLCAoc2l6ZV90KW1IaWdod2F0ZXJUaHJlc2hvbGRCeXRlcyk7CiAKLSAgICBBTE9HVigicmVhZEludGVybmFsIG9mZnNldCAlbGxkIHNpemUgJXp1Iiwgb2Zmc2V0LCBzaXplKTsKKyAgICBBTE9HVigicmVhZEludGVybmFsIG9mZnNldCAlbGxkIHNpemUgJXp1IiwgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAorICAgIC8vIElmIHdlJ3JlIGRpc2Nvbm5lY3RpbmcsIHJldHVybiBFT1MgYW5kIGRvbid0IGFjY2VzcyAqZGF0YSBwb2ludGVyLgorICAgIC8vIGRhdGEgY291bGQgYmUgb24gdGhlIHN0YWNrIG9mIHRoZSBjYWxsZXIgdG8gTnVDYWNoZWRTb3VyY2UyOjpyZWFkQXQoKSwKKyAgICAvLyB3aGljaCBtYXkgaGF2ZSBleGl0ZWQgYWxyZWFkeS4KKyAgICBpZiAobURpc2Nvbm5lY3RpbmcpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQorCiAgICAgaWYgKCFtRmV0Y2hpbmcpIHsKICAgICAgICAgbUxhc3RBY2Nlc3NQb3MgPSBvZmZzZXQ7CiAgICAgICAgIHJlc3RhcnRQcmVmZXRjaGVySWZOZWNlc3NhcnlfbCgKQEAgLTY0OSw3ICs2NTYsNyBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgQUxPR0koIm5ldyByYW5nZTogb2Zmc2V0PSAlbGxkIiwgb2Zmc2V0KTsKKyAgICBBTE9HSSgibmV3IHJhbmdlOiBvZmZzZXQ9ICVsbGQiLCAobG9uZyBsb25nKW9mZnNldCk7CiAKICAgICBtQ2FjaGVPZmZzZXQgPSBvZmZzZXQ7CiAKQEAgLTcyOCwxMCArNzM1LDEwIEBACiAgICAgICAgIG1LZWVwQWxpdmVJbnRlcnZhbFVzID0ga0RlZmF1bHRLZWVwQWxpdmVJbnRlcnZhbFVzOwogICAgIH0KIAotICAgIEFMT0dWKCJsb3d3YXRlciA9ICV6dSBieXRlcywgaGlnaHdhdGVyID0gJXp1IGJ5dGVzLCBrZWVwYWxpdmUgPSAlIiBQUklkNjQgIiB1cyIsCisgICAgQUxPR1YoImxvd3dhdGVyID0gJXp1IGJ5dGVzLCBoaWdod2F0ZXIgPSAlenUgYnl0ZXMsIGtlZXBhbGl2ZSA9ICVsbGQgdXMiLAogICAgICAgICAgbUxvd3dhdGVyVGhyZXNob2xkQnl0ZXMsCiAgICAgICAgICBtSGlnaHdhdGVyVGhyZXNob2xkQnl0ZXMsCi0gICAgICAgICBtS2VlcEFsaXZlSW50ZXJ2YWxVcyk7CisgICAgICAgICAobG9uZyBsb25nKW1LZWVwQWxpdmVJbnRlcnZhbFVzKTsKIH0KIAogLy8gc3RhdGljCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcAppbmRleCBmYTRhNTA5Li5kMjUyY2I2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAKQEAgLTcyLDcgKzcyLDcgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1NUQVRFVFlQRSogc3RhdGUpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzKAotICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUsCkBAIC05MCw3ICs5MCw3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAotICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9CT09MIGNyb3NzUHJvY2Vzcyk7CisgICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX1UzMiBhbGxvdHRlZFNpemUsIE9NWF9CT09MIGNyb3NzUHJvY2Vzcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUdyYXBoaWNCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKQEAgLTEwMiw3ICsxMDIsMTUgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdXJmYWNlKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsCi0gICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIpOworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQZXJzaXN0ZW50SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLAorICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gKmJ1ZmZlckNvbnN1bWVyKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsCisgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAmYnVmZmVyQ29uc3VtZXIsIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0obm9kZV9pZCBub2RlKTsKIApAQCAtMTEyLDE4ICsxMjAsMTggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJXaXRoQmFja3VwKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCi0gICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKTsKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfVTMyIGFsbG90dGVkU2l6ZSwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZnJlZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBidWZmZXJfaWQgYnVmZmVyKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmlsbEJ1ZmZlcihub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZmlsbEJ1ZmZlcihub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIsIGludCBmZW5jZUZkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZW1wdHlCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsCiAgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyLAogICAgICAgICAgICAgT01YX1UzMiByYW5nZV9vZmZzZXQsIE9NWF9VMzIgcmFuZ2VfbGVuZ3RoLAotICAgICAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCk7CisgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEV4dGVuc2lvbkluZGV4KAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLApAQCAtMjg0LDggKzI5Miw4IEBACiB9CiAKIHN0YXR1c190IE11eE9NWDo6c3RvcmVNZXRhRGF0YUluQnVmZmVycygKLSAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSkgewotICAgIHJldHVybiBnZXRPTVgobm9kZSktPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMobm9kZSwgcG9ydF9pbmRleCwgZW5hYmxlKTsKKyAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKSB7CisgICAgcmV0dXJuIGdldE9NWChub2RlKS0+c3RvcmVNZXRhRGF0YUluQnVmZmVycyhub2RlLCBwb3J0X2luZGV4LCBlbmFibGUsIHR5cGUpOwogfQogCiBzdGF0dXNfdCBNdXhPTVg6OnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKApAQCAtMzE0LDkgKzMyMiw5IEBACiAKIHN0YXR1c190IE11eE9NWDo6dXNlQnVmZmVyKAogICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKLSAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9CT09MIC8qIGNyb3NzUHJvY2VzcyAqLykgeworICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX1UzMiBhbGxvdHRlZFNpemUsIE9NWF9CT09MIC8qIGNyb3NzUHJvY2VzcyAqLykgewogICAgIHJldHVybiBnZXRPTVgobm9kZSktPnVzZUJ1ZmZlcigKLSAgICAgICAgICAgIG5vZGUsIHBvcnRfaW5kZXgsIHBhcmFtcywgYnVmZmVyLCBPTVhfRkFMU0UgLyogY3Jvc3NQcm9jZXNzICovKTsKKyAgICAgICAgICAgIG5vZGUsIHBvcnRfaW5kZXgsIHBhcmFtcywgYnVmZmVyLCBhbGxvdHRlZFNpemUsIE9NWF9GQUxTRSAvKiBjcm9zc1Byb2Nlc3MgKi8pOwogfQogCiBzdGF0dXNfdCBNdXhPTVg6OnVzZUdyYXBoaWNCdWZmZXIoCkBAIC0zMzUsMTIgKzM0MywyNiBAQAogCiBzdGF0dXNfdCBNdXhPTVg6OmNyZWF0ZUlucHV0U3VyZmFjZSgKICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsCi0gICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlcikgeworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIsIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSkgewogICAgIHN0YXR1c190IGVyciA9IGdldE9NWChub2RlKS0+Y3JlYXRlSW5wdXRTdXJmYWNlKAotICAgICAgICAgICAgbm9kZSwgcG9ydF9pbmRleCwgYnVmZmVyUHJvZHVjZXIpOworICAgICAgICAgICAgbm9kZSwgcG9ydF9pbmRleCwgYnVmZmVyUHJvZHVjZXIsIHR5cGUpOwogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IE11eE9NWDo6Y3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLAorICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAqYnVmZmVyQ29uc3VtZXIpIHsKKyAgICAvLyBUT0RPOiBsb2NhbCBvciByZW1vdGU/IEFsd2F5cyB1c2UgcmVtb3RlIGZvciBub3cKKyAgICByZXR1cm4gbVJlbW90ZU9NWC0+Y3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGJ1ZmZlclByb2R1Y2VyLCBidWZmZXJDb25zdW1lcik7Cit9CisKK3N0YXR1c190IE11eE9NWDo6c2V0SW5wdXRTdXJmYWNlKAorICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKKyAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gJmJ1ZmZlckNvbnN1bWVyLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpIHsKKyAgICByZXR1cm4gZ2V0T01YKG5vZGUpLT5zZXRJbnB1dFN1cmZhY2Uobm9kZSwgcG9ydF9pbmRleCwgYnVmZmVyQ29uc3VtZXIsIHR5cGUpOworfQorCiBzdGF0dXNfdCBNdXhPTVg6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0obm9kZV9pZCBub2RlKSB7CiAgICAgcmV0dXJuIGdldE9NWChub2RlKS0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShub2RlKTsKIH0KQEAgLTM1NCw5ICszNzYsOSBAQAogCiBzdGF0dXNfdCBNdXhPTVg6OmFsbG9jYXRlQnVmZmVyV2l0aEJhY2t1cCgKICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCi0gICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfQk9PTCAvKiBjcm9zc1Byb2Nlc3MgKi8pIHsKKyAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9VMzIgYWxsb3R0ZWRTaXplLCBPTVhfQk9PTCAvKiBjcm9zc1Byb2Nlc3MgKi8pIHsKICAgICByZXR1cm4gZ2V0T01YKG5vZGUpLT5hbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCi0gICAgICAgICAgICBub2RlLCBwb3J0X2luZGV4LCBwYXJhbXMsIGJ1ZmZlciwgT01YX0ZBTFNFIC8qIGNyb3NzUHJvY2VzcyAqLyk7CisgICAgICAgICAgICBub2RlLCBwb3J0X2luZGV4LCBwYXJhbXMsIGJ1ZmZlciwgYWxsb3R0ZWRTaXplLCBPTVhfRkFMU0UgLyogY3Jvc3NQcm9jZXNzICovKTsKIH0KIAogc3RhdHVzX3QgTXV4T01YOjpmcmVlQnVmZmVyKApAQCAtMzY0LDE3ICszODYsMTcgQEAKICAgICByZXR1cm4gZ2V0T01YKG5vZGUpLT5mcmVlQnVmZmVyKG5vZGUsIHBvcnRfaW5kZXgsIGJ1ZmZlcik7CiB9CiAKLXN0YXR1c190IE11eE9NWDo6ZmlsbEJ1ZmZlcihub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIpIHsKLSAgICByZXR1cm4gZ2V0T01YKG5vZGUpLT5maWxsQnVmZmVyKG5vZGUsIGJ1ZmZlcik7CitzdGF0dXNfdCBNdXhPTVg6OmZpbGxCdWZmZXIobm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyLCBpbnQgZmVuY2VGZCkgeworICAgIHJldHVybiBnZXRPTVgobm9kZSktPmZpbGxCdWZmZXIobm9kZSwgYnVmZmVyLCBmZW5jZUZkKTsKIH0KIAogc3RhdHVzX3QgTXV4T01YOjplbXB0eUJ1ZmZlcigKICAgICAgICAgbm9kZV9pZCBub2RlLAogICAgICAgICBidWZmZXJfaWQgYnVmZmVyLAogICAgICAgICBPTVhfVTMyIHJhbmdlX29mZnNldCwgT01YX1UzMiByYW5nZV9sZW5ndGgsCi0gICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXApIHsKKyAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50IGZlbmNlRmQpIHsKICAgICByZXR1cm4gZ2V0T01YKG5vZGUpLT5lbXB0eUJ1ZmZlcigKLSAgICAgICAgICAgIG5vZGUsIGJ1ZmZlciwgcmFuZ2Vfb2Zmc2V0LCByYW5nZV9sZW5ndGgsIGZsYWdzLCB0aW1lc3RhbXApOworICAgICAgICAgICAgbm9kZSwgYnVmZmVyLCByYW5nZV9vZmZzZXQsIHJhbmdlX2xlbmd0aCwgZmxhZ3MsIHRpbWVzdGFtcCwgZmVuY2VGZCk7CiB9CiAKIHN0YXR1c190IE11eE9NWDo6Z2V0RXh0ZW5zaW9uSW5kZXgoCkBAIC00MDEsMTAgKzQyMywxNiBAQAogICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5wbGF5ZXIiKSk7CiAgICAgc3A8SU1lZGlhUGxheWVyU2VydmljZT4gc2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllclNlcnZpY2U+KGJpbmRlcik7CiAKLSAgICBDSEVDSyhzZXJ2aWNlLmdldCgpICE9IE5VTEwpOworICAgIGlmIChzZXJ2aWNlLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBvYnRhaW4gSU1lZGlhUGxheWVyU2VydmljZSIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CiAKICAgICBtT01YID0gc2VydmljZS0+Z2V0T01YKCk7Ci0gICAgQ0hFQ0sobU9NWC5nZXQoKSAhPSBOVUxMKTsKKyAgICBpZiAobU9NWC5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3Qgb2J0YWluIElPTVgiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQogCiAgICAgaWYgKCFtT01YLT5saXZlc0xvY2FsbHkoMCAvKiBub2RlICovLCBnZXRwaWQoKSkpIHsKICAgICAgICAgQUxPR0koIlVzaW5nIGNsaWVudC1zaWRlIE9NWCBtdXguIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKaW5kZXggMmEwMTJmMS4uN2UxNWUxOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcApAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMTE1LDEyICsxMTYsMTUgQEAKICAgICB9CiAKICAgICAvLyBmcm9tIElPTVhPYnNlcnZlcgotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZykgeworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VzKGNvbnN0IHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKSB7CiAgICAgICAgIHNwPE9NWENvZGVjPiBjb2RlYyA9IG1UYXJnZXQucHJvbW90ZSgpOwogCiAgICAgICAgIGlmIChjb2RlYy5nZXQoKSAhPSBOVUxMKSB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soY29kZWMtPm1Mb2NrKTsKLSAgICAgICAgICAgIGNvZGVjLT5vbl9tZXNzYWdlKG1zZyk7CisgICAgICAgICAgICBmb3IgKHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVzc2FnZXMuY2JlZ2luKCk7CisgICAgICAgICAgICAgICAgICBpdCAhPSBtZXNzYWdlcy5jZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBjb2RlYy0+b25fbWVzc2FnZSgqaXQpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY29kZWMuY2xlYXIoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTM0NSwyMSArMzQ5LDYgQEAKIAogICAgICAgICBBTE9HVigiQXR0ZW1wdGluZyB0byBhbGxvY2F0ZSBPTVggbm9kZSAnJXMnIiwgY29tcG9uZW50TmFtZSk7CiAKLSAgICAgICAgaWYgKCFjcmVhdGVFbmNvZGVyCi0gICAgICAgICAgICAgICAgJiYgKHF1aXJrcyAmIGtPdXRwdXRCdWZmZXJzQXJlVW5yZWFkYWJsZSkKLSAgICAgICAgICAgICAgICAmJiAoZmxhZ3MgJiBrQ2xpZW50TmVlZHNGcmFtZWJ1ZmZlcikpIHsKLSAgICAgICAgICAgIGlmIChzdHJuY21wKGNvbXBvbmVudE5hbWUsICJPTVguU0VDLiIsIDgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRm9yIE9NWC5TRUMuKiBkZWNvZGVycyB3ZSBjYW4gZW5hYmxlIGEgc3BlY2lhbCBtb2RlIHRoYXQKLSAgICAgICAgICAgICAgICAvLyBnaXZlcyB0aGUgY2xpZW50IGFjY2VzcyB0byB0aGUgZnJhbWVidWZmZXIgY29udGVudHMuCi0KLSAgICAgICAgICAgICAgICBBTE9HVygiQ29tcG9uZW50ICclcycgZG9lcyBub3QgZ2l2ZSB0aGUgY2xpZW50IGFjY2VzcyB0byAiCi0gICAgICAgICAgICAgICAgICAgICAidGhlIGZyYW1lYnVmZmVyIGNvbnRlbnRzLiBTa2lwcGluZy4iLAotICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSk7Ci0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHN0YXR1c190IGVyciA9IG9teC0+YWxsb2NhdGVOb2RlKGNvbXBvbmVudE5hbWUsIG9ic2VydmVyLCAmbm9kZSk7CiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgIEFMT0dWKCJTdWNjZXNzZnVsbHkgYWxsb2NhdGVkIE9NWCBub2RlICclcyciLCBjb21wb25lbnROYW1lKTsKQEAgLTY2OCwzNSArNjU3LDYgQEAKIAogICAgIGluaXRPdXRwdXRGb3JtYXQobWV0YSk7CiAKLSAgICBpZiAoKG1GbGFncyAmIGtDbGllbnROZWVkc0ZyYW1lYnVmZmVyKQotICAgICAgICAgICAgJiYgIXN0cm5jbXAobUNvbXBvbmVudE5hbWUsICJPTVguU0VDLiIsIDgpKSB7Ci0gICAgICAgIC8vIFRoaXMgYXBwZWFycyB0byBubyBsb25nZXIgYmUgbmVlZGVkPz8/Ci0KLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleDsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPQotICAgICAgICAgICAgbU9NWC0+Z2V0RXh0ZW5zaW9uSW5kZXgoCi0gICAgICAgICAgICAgICAgICAgIG1Ob2RlLAotICAgICAgICAgICAgICAgICAgICAiT01YLlNFQy5pbmRleC5UaHVtYm5haWxNb2RlIiwKLSAgICAgICAgICAgICAgICAgICAgJmluZGV4KTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgT01YX0JPT0wgZW5hYmxlID0gT01YX1RSVUU7Ci0gICAgICAgIGVyciA9IG1PTVgtPnNldENvbmZpZyhtTm9kZSwgaW5kZXgsICZlbmFibGUsIHNpemVvZihlbmFibGUpKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBDT0RFQ19MT0dFKCJzZXRDb25maWcoJ09NWC5TRUMuaW5kZXguVGh1bWJuYWlsTW9kZScpICIKLSAgICAgICAgICAgICAgICAgICAgICAgInJldHVybmVkIGVycm9yIDB4JTA4eCIsIGVycik7Ci0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtUXVpcmtzICY9IH5rT3V0cHV0QnVmZmVyc0FyZVVucmVhZGFibGU7Ci0gICAgfQotCiAgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTAogICAgICAgICAmJiAhbUlzRW5jb2RlcgogICAgICAgICAmJiAhc3RybmNhc2VjbXAobU1JTUUsICJ2aWRlby8iLCA2KQpAQCAtMTA1Nyw3ICsxMDE3LDcgQEAKICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLAogICAgICAgICBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCYgZGVmYXVsdFByb2ZpbGVMZXZlbCwKICAgICAgICAgQ29kZWNQcm9maWxlTGV2ZWwgJnByb2ZpbGVMZXZlbCkgewotICAgIENPREVDX0xPR1YoIkRlZmF1bHQgcHJvZmlsZTogJWxkLCBsZXZlbCAlbGQiLAorICAgIENPREVDX0xPR1YoIkRlZmF1bHQgcHJvZmlsZTogJXUsIGxldmVsICN4JXgiLAogICAgICAgICAgICAgZGVmYXVsdFByb2ZpbGVMZXZlbC5tUHJvZmlsZSwgZGVmYXVsdFByb2ZpbGVMZXZlbC5tTGV2ZWwpOwogCiAgICAgLy8gQXJlIHRoZSBkZWZhdWx0IHByb2ZpbGUgYW5kIGxldmVsIG92ZXJ3cml0ZW4/CkBAIC0xMjgzLDcgKzEyNDMsNyBAQAogICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KTsKICAgICBDSEVDSyhzdWNjZXNzKTsKIAotICAgIENPREVDX0xPR1YoInNldFZpZGVvT3V0cHV0Rm9ybWF0IHdpZHRoPSVsZCwgaGVpZ2h0PSVsZCIsIHdpZHRoLCBoZWlnaHQpOworICAgIENPREVDX0xPR1YoInNldFZpZGVvT3V0cHV0Rm9ybWF0IHdpZHRoPSVkLCBoZWlnaHQ9JWQiLCB3aWR0aCwgaGVpZ2h0KTsKIAogICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtaW1lKSkgewpAQCAtMTY1MCw3ICsxNjEwLDcgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBDT0RFQ19MT0dWKCJhbGxvY2F0aW5nICVsdSBidWZmZXJzIG9mIHNpemUgJWx1IG9uICVzIHBvcnQiLAorICAgIENPREVDX0xPR1YoImFsbG9jYXRpbmcgJXUgYnVmZmVycyBvZiBzaXplICV1IG9uICVzIHBvcnQiLAogICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwgZGVmLm5CdWZmZXJTaXplLAogICAgICAgICAgICAgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCA/ICJpbnB1dCIgOiAib3V0cHV0Iik7CiAKQEAgLTE2ODIsNyArMTY0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mby5tRGF0YSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPmFsbG9jYXRlQnVmZmVyV2l0aEJhY2t1cCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBwb3J0SW5kZXgsIG1lbSwgJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgcG9ydEluZGV4LCBtZW0sICZidWZmZXIsIG1lbS0+c2l6ZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dAogICAgICAgICAgICAgICAgICYmIChtUXVpcmtzICYga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzKSkgewpAQCAtMTY5NCwxMCArMTY1NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8ubURhdGEpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlcnIgPSBtT01YLT5hbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCi0gICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgcG9ydEluZGV4LCBtZW0sICZidWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIHBvcnRJbmRleCwgbWVtLCAmYnVmZmVyLCBtZW0tPnNpemUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnIgPSBtT01YLT51c2VCdWZmZXIobU5vZGUsIHBvcnRJbmRleCwgbWVtLCAmYnVmZmVyKTsKKyAgICAgICAgICAgIGVyciA9IG1PTVgtPnVzZUJ1ZmZlcihtTm9kZSwgcG9ydEluZGV4LCBtZW0sICZidWZmZXIsIG1lbS0+c2l6ZSgpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE3MjgsNyArMTY4OCw3IEBACiAKICAgICAgICAgbVBvcnRCdWZmZXJzW3BvcnRJbmRleF0ucHVzaChpbmZvKTsKIAotICAgICAgICBDT0RFQ19MT0dWKCJhbGxvY2F0ZWQgYnVmZmVyICVwIG9uICVzIHBvcnQiLCBidWZmZXIsCisgICAgICAgIENPREVDX0xPR1YoImFsbG9jYXRlZCBidWZmZXIgJXUgb24gJXMgcG9ydCIsIGJ1ZmZlciwKICAgICAgICAgICAgICBwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0ID8gImlucHV0IiA6ICJvdXRwdXQiKTsKICAgICB9CiAKQEAgLTE3NTAsNyArMTcxMCw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHByZXZidWZmZXJzaXplID0gbVNraXBDdXRCdWZmZXItPnNpemUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZidWZmZXJzaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJSZXBsYWNpbmcgU2tpcEN1dEJ1ZmZlciBob2xkaW5nICVkIGJ5dGVzIiwgcHJldmJ1ZmZlcnNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIlJlcGxhY2luZyBTa2lwQ3V0QnVmZmVyIGhvbGRpbmcgJXp1IGJ5dGVzIiwgcHJldmJ1ZmZlcnNpemUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1Ta2lwQ3V0QnVmZmVyID0gbmV3IFNraXBDdXRCdWZmZXIoZGVsYXkgKiBmcmFtZVNpemUsIHBhZGRpbmcgKiBmcmFtZVNpemUpOwpAQCAtMTc4OCwzNSArMTc0OCw2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBPTVhDb2RlYzo6YXBwbHlSb3RhdGlvbigpIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotCi0gICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7Ci0gICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgewotICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOwotICAgIH0KLQotICAgIHVpbnQzMl90IHRyYW5zZm9ybTsKLSAgICBzd2l0Y2ggKHJvdGF0aW9uRGVncmVlcykgewotICAgICAgICBjYXNlIDA6IHRyYW5zZm9ybSA9IDA7IGJyZWFrOwotICAgICAgICBjYXNlIDkwOiB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF85MDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgwOiB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF8xODA7IGJyZWFrOwotICAgICAgICBjYXNlIDI3MDogdHJhbnNmb3JtID0gSEFMX1RSQU5TRk9STV9ST1RfMjcwOyBicmVhazsKLSAgICAgICAgZGVmYXVsdDogdHJhbnNmb3JtID0gMDsgYnJlYWs7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBpZiAodHJhbnNmb3JtKSB7Ci0gICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtKAotICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIHRyYW5zZm9ybSk7Ci0gICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybSBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCiBzdGF0dXNfdCBPTVhDb2RlYzo6YWxsb2NhdGVPdXRwdXRCdWZmZXJzRnJvbU5hdGl2ZVdpbmRvdygpIHsKICAgICAvLyBHZXQgdGhlIG51bWJlciBvZiBidWZmZXJzIG5lZWRlZC4KICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKQEAgLTE4MzAsMjEgKzE3NjEsMTEgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KAotICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCi0gICAgICAgICAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCwKLSAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0KTsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwogCi0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IGFwcGx5Um90YXRpb24oKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7CisgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CisgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOwogICAgIH0KIAogICAgIC8vIFNldCB1cCB0aGUgbmF0aXZlIHdpbmRvdy4KQEAgLTE4NTUsMzQgKzE3NzYsMTkgQEAKICAgICAgICAgLy8gWFhYOiBDdXJyZW50bHkgdGhpcyBlcnJvciBpcyBsb2dnZWQsIGJ1dCBub3QgZmF0YWwuCiAgICAgICAgIHVzYWdlID0gMDsKICAgICB9CisKICAgICBpZiAobUZsYWdzICYga0VuYWJsZUdyYWxsb2NVc2FnZVByb3RlY3RlZCkgewogICAgICAgICB1c2FnZSB8PSBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRDsKICAgICB9CiAKLSAgICAvLyBNYWtlIHN1cmUgdG8gY2hlY2sgd2hldGhlciBlaXRoZXIgU3RhZ2VmcmlnaHQgb3IgdGhlIHZpZGVvIGRlY29kZXIKLSAgICAvLyByZXF1ZXN0ZWQgcHJvdGVjdGVkIGJ1ZmZlcnMuCi0gICAgaWYgKHVzYWdlICYgR1JBTExPQ19VU0FHRV9QUk9URUNURUQpIHsKLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIEFOYXRpdmVXaW5kb3cgc2VuZHMgaW1hZ2VzIGRpcmVjdGx5IHRvCi0gICAgICAgIC8vIFN1cmZhY2VGbGluZ2VyLgotICAgICAgICBpbnQgcXVldWVzVG9OYXRpdmVXaW5kb3cgPSAwOwotICAgICAgICBlcnIgPSBtTmF0aXZlV2luZG93LT5xdWVyeSgKLSAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBOQVRJVkVfV0lORE9XX1FVRVVFU19UT19XSU5ET1dfQ09NUE9TRVIsCi0gICAgICAgICAgICAgICAgJnF1ZXVlc1RvTmF0aXZlV2luZG93KTsKLSAgICAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgYXV0aGVudGljYXRpbmcgbmF0aXZlIHdpbmRvdzogJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBpZiAocXVldWVzVG9OYXRpdmVXaW5kb3cgIT0gMSkgewotICAgICAgICAgICAgQUxPR0UoIm5hdGl2ZSB3aW5kb3cgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJuYXRpdmVfd2luZG93X3NldF91c2FnZSB1c2FnZT0weCVseCIsIHVzYWdlKTsKLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF91c2FnZSgKLSAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIHVzYWdlIHwgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFIHwgR1JBTExPQ19VU0FHRV9FWFRFUk5BTF9ESVNQKTsKKyAgICBlcnIgPSBzZXROYXRpdmVXaW5kb3dTaXplRm9ybWF0QW5kVXNhZ2UoCisgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLAorICAgICAgICAgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCwKKyAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LAorICAgICAgICAgICAgZGVmLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQsCisgICAgICAgICAgICByb3RhdGlvbkRlZ3JlZXMsCisgICAgICAgICAgICB1c2FnZSB8IEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSB8IEdSQUxMT0NfVVNBR0VfRVhURVJOQUxfRElTUCk7CiAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF91c2FnZSBmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCkBAIC0yMDQ5LDE1MCArMTk1NSw2IEBACiAgICAgcmV0dXJuIGJ1ZkluZm87CiB9CiAKLXN0YXR1c190IE9NWENvZGVjOjpwdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3coKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gTk9fRVJST1I7Ci0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iID0gTlVMTDsKLSAgICBpbnQgbnVtQnVmcyA9IDA7Ci0gICAgaW50IG1pblVuZGVxdWV1ZWRCdWZzID0gMDsKLQotICAgIC8vIFdlIG5lZWQgdG8gcmVjb25uZWN0IHRvIHRoZSBBTmF0aXZlV2luZG93IGFzIGEgQ1BVIGNsaWVudCB0byBlbnN1cmUgdGhhdAotICAgIC8vIG5vIGZyYW1lcyBnZXQgZHJvcHBlZCBieSBTdXJmYWNlRmxpbmdlciBhc3N1bWluZyB0aGF0IHRoZXNlIGFyZSB2aWRlbwotICAgIC8vIGZyYW1lcy4KLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGFwaV9kaXNjb25uZWN0IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX0NQVSk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGFwaV9jb25uZWN0IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobU5hdGl2ZVdpbmRvdy5nZXQoKSwgMSwgMSwKLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4KTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogc2V0X2J1ZmZlcnNfZ2VvbWV0cnkgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBzZXRfdXNhZ2UgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfc2NhbGluZ19tb2RlKG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1cpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBzZXRfc2NhbGluZ19tb2RlIGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXJ5KG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsICZtaW5VbmRlcXVldWVkQnVmcyk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMgcXVlcnkgIgotICAgICAgICAgICAgICAgICJmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgbnVtQnVmcyA9IG1pblVuZGVxdWV1ZWRCdWZzICsgMTsKLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobU5hdGl2ZVdpbmRvdy5nZXQoKSwgbnVtQnVmcyk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IHNldF9idWZmZXJfY291bnQgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgLy8gV2UgIHB1c2ggbnVtQnVmcyArIDEgYnVmZmVycyB0byBlbnN1cmUgdGhhdCB3ZSd2ZSBkcmF3biBpbnRvIHRoZSBzYW1lCi0gICAgLy8gYnVmZmVyIHR3aWNlLiAgVGhpcyBzaG91bGQgZ3VhcmFudGVlIHRoYXQgdGhlIGJ1ZmZlciBoYXMgYmVlbiBkaXNwbGF5ZWQKLSAgICAvLyBvbiB0aGUgc2NyZWVuIGFuZCB0aGVuIGJlZW4gcmVwbGFjZWQsIHNvIGFuIHByZXZpb3VzIHZpZGVvIGZyYW1lcyBhcmUKLSAgICAvLyBndWFyYW50ZWVkIE5PVCB0byBiZSBjdXJyZW50bHkgZGlzcGxheWVkLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQnVmcyArIDE7IGkrKykgewotICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1OYXRpdmVXaW5kb3cuZ2V0KCksICZhbmIpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGRlcXVldWVCdWZmZXIgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZihuZXcgR3JhcGhpY0J1ZmZlcihhbmIsIGZhbHNlKSk7Ci0KLSAgICAgICAgLy8gRmlsbCB0aGUgYnVmZmVyIHdpdGggdGhlIGEgMXgxIGNoZWNrZXJib2FyZCBwYXR0ZXJuIDspCi0gICAgICAgIHVpbnQzMl90KiBpbWcgPSBOVUxMOwotICAgICAgICBlcnIgPSBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmltZykpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGxvY2sgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgICppbWcgPSAwOwotCi0gICAgICAgIGVyciA9IGJ1Zi0+dW5sb2NrKCk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogdW5sb2NrIGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBtTmF0aXZlV2luZG93LT5xdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgICAgIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCksIC0xKTsKLSAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBxdWV1ZUJ1ZmZlciBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgYW5iID0gTlVMTDsKLSAgICB9Ci0KLWVycm9yOgotCi0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAvLyBDbGVhbiB1cCBhZnRlciBhbiBlcnJvci4KLSAgICAgICAgaWYgKGFuYiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtTmF0aXZlV2luZG93LT5jYW5jZWxCdWZmZXIobU5hdGl2ZVdpbmRvdy5nZXQoKSwgYW5iLCAtMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfQ1BVKTsKLSAgICAgICAgbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIENsZWFuIHVwIGFmdGVyIHN1Y2Nlc3MuCi0gICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9DUFUpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGFwaV9kaXNjb25uZWN0IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGFwaV9jb25uZWN0IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotfQotCiBpbnQ2NF90IE9NWENvZGVjOjpnZXREZWNvZGluZ1RpbWVVcygpIHsKICAgICBDSEVDSyhtSXNFbmNvZGVyICYmIG1Jc1ZpZGVvKTsKIApAQCAtMjcxMyw3ICsyNDc1LDcgQEAKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7Ci0gICAgICAgICAgICBDT0RFQ19MT0dWKCJDTURfQ09NUExFVEUoJWQsICVsZCkiLCBjbWQsIGRhdGEpOworICAgICAgICAgICAgQ09ERUNfTE9HVigiQ01EX0NPTVBMRVRFKCVkLCAldSkiLCBjbWQsIGRhdGEpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0yNzM5LDcgKzI1MDEsNyBAQAogICAgICAgICAgICAgICAgIGlmIChjb3VudEJ1ZmZlcnNXZU93bihtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XSkgIT0KICAgICAgICAgICAgICAgICAgICAgbVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyBkaWQgbm90IHJldHVybiBhbGwgaW5wdXQgYnVmZmVycyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIocmVjZWl2ZWQgJWQgLyAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKHJlY2VpdmVkICV6dSAvICV6dSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyc1dlT3duKG1Qb3J0QnVmZmVyc1trUG9ydEluZGV4SW5wdXRdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOwpAQCAtMjc0OCw3ICsyNTEwLDcgQEAKICAgICAgICAgICAgICAgICBpZiAoY291bnRCdWZmZXJzV2VPd24obVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdKSAhPQogICAgICAgICAgICAgICAgICAgICBtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyBkaWQgbm90IHJldHVybiBhbGwgb3V0cHV0IGJ1ZmZlcnMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiKHJlY2VpdmVkICVkIC8gJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihyZWNlaXZlZCAlenUgLyAlenUpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlcnNXZU93bihtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0QnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOwpAQCAtMjc3NCw3ICsyNTM2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbSBoYXMgbWFkZSBpdCB0byB0aGUgZGlzcGxheS4gIFRoaXMgYWxsb3dzIHRoZSBPTVgKICAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50IHRlYXJkb3duIHRvIHplcm8gb3V0IGFueSBwcm90ZWN0ZWQgYnVmZmVycwogICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IHRoZSByaXNrIG9mIHNjYW5uaW5nIG91dCBvbmUgb2YgdGhvc2UgYnVmZmVycy4KLSAgICAgICAgICAgICAgICAgICAgcHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93KCk7CisgICAgICAgICAgICAgICAgICAgIHB1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvdyhtTmF0aXZlV2luZG93LmdldCgpKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBzZXRTdGF0ZShJRExFX1RPX0xPQURFRCk7CkBAIC0yODUyLDcgKzI2MTQsNyBAQAogICAgICAgICBDSEVDSyhpbmZvLT5tU3RhdHVzID09IE9XTkVEX0JZX1VTCiAgICAgICAgICAgICAgICAgfHwgaW5mby0+bVN0YXR1cyA9PSBPV05FRF9CWV9OQVRJVkVfV0lORE9XKTsKIAotICAgICAgICBDT0RFQ19MT0dWKCJmcmVlaW5nIGJ1ZmZlciAlcCBvbiBwb3J0ICVsZCIsIGluZm8tPm1CdWZmZXIsIHBvcnRJbmRleCk7CisgICAgICAgIENPREVDX0xPR1YoImZyZWVpbmcgYnVmZmVyICV1IG9uIHBvcnQgJXUiLCBpbmZvLT5tQnVmZmVyLCBwb3J0SW5kZXgpOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IGZyZWVCdWZmZXIocG9ydEluZGV4LCBpKTsKIApAQCAtMjg5OSw3ICsyNjYxLDcgQEAKIH0KIAogdm9pZCBPTVhDb2RlYzo6b25Qb3J0U2V0dGluZ3NDaGFuZ2VkKE9NWF9VMzIgcG9ydEluZGV4KSB7Ci0gICAgQ09ERUNfTE9HVigiUE9SVF9TRVRUSU5HU19DSEFOR0VEKCVsZCkiLCBwb3J0SW5kZXgpOworICAgIENPREVDX0xPR1YoIlBPUlRfU0VUVElOR1NfQ0hBTkdFRCgldSkiLCBwb3J0SW5kZXgpOwogCiAgICAgQ0hFQ0sobVN0YXRlID09IEVYRUNVVElORyB8fCBtU3RhdGUgPT0gRVhFQ1VUSU5HX1RPX0lETEUpOwogICAgIENIRUNLX0VRKHBvcnRJbmRleCwgKE9NWF9VMzIpa1BvcnRJbmRleE91dHB1dCk7CkBAIC0yOTI2LDcgKzI2ODgsNyBAQAogICAgIENIRUNLKG1TdGF0ZSA9PSBFWEVDVVRJTkcgfHwgbVN0YXRlID09IFJFQ09ORklHVVJJTkcKICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBFWEVDVVRJTkdfVE9fSURMRSk7CiAKLSAgICBDT0RFQ19MT0dWKCJmbHVzaFBvcnRBc3luYyglbGQpOiB3ZSBvd24gJWQgb3V0IG9mICVkIGJ1ZmZlcnMgYWxyZWFkeS4iLAorICAgIENPREVDX0xPR1YoImZsdXNoUG9ydEFzeW5jKCV1KTogd2Ugb3duICV6dSBvdXQgb2YgJXp1IGJ1ZmZlcnMgYWxyZWFkeS4iLAogICAgICAgICAgcG9ydEluZGV4LCBjb3VudEJ1ZmZlcnNXZU93bihtUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XSksCiAgICAgICAgICBtUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XS5zaXplKCkpOwogCkBAIC0yOTU1LDcgKzI3MTcsNyBAQAogICAgIENIRUNLX0VRKChpbnQpbVBvcnRTdGF0dXNbcG9ydEluZGV4XSwgKGludClFTkFCTEVEKTsKICAgICBtUG9ydFN0YXR1c1twb3J0SW5kZXhdID0gRElTQUJMSU5HOwogCi0gICAgQ09ERUNfTE9HVigic2VuZGluZyBPTVhfQ29tbWFuZFBvcnREaXNhYmxlKCVsZCkiLCBwb3J0SW5kZXgpOworICAgIENPREVDX0xPR1YoInNlbmRpbmcgT01YX0NvbW1hbmRQb3J0RGlzYWJsZSgldSkiLCBwb3J0SW5kZXgpOwogICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgIG1PTVgtPnNlbmRDb21tYW5kKG1Ob2RlLCBPTVhfQ29tbWFuZFBvcnREaXNhYmxlLCBwb3J0SW5kZXgpOwogICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKQEAgLTI5NjksNyArMjczMSw3IEBACiAgICAgQ0hFQ0tfRVEoKGludCltUG9ydFN0YXR1c1twb3J0SW5kZXhdLCAoaW50KURJU0FCTEVEKTsKICAgICBtUG9ydFN0YXR1c1twb3J0SW5kZXhdID0gRU5BQkxJTkc7CiAKLSAgICBDT0RFQ19MT0dWKCJzZW5kaW5nIE9NWF9Db21tYW5kUG9ydEVuYWJsZSglbGQpIiwgcG9ydEluZGV4KTsKKyAgICBDT0RFQ19MT0dWKCJzZW5kaW5nIE9NWF9Db21tYW5kUG9ydEVuYWJsZSgldSkiLCBwb3J0SW5kZXgpOwogICAgIHJldHVybiBtT01YLT5zZW5kQ29tbWFuZChtTm9kZSwgT01YX0NvbW1hbmRQb3J0RW5hYmxlLCBwb3J0SW5kZXgpOwogfQogCkBAIC0zMDQyLDcgKzI4MDQsNyBAQAogCiAgICAgICAgIGlmIChpbmZvLT5tRGF0YSA9PSBwdHIpIHsKICAgICAgICAgICAgIENPREVDX0xPR1YoCi0gICAgICAgICAgICAgICAgICAgICJpbnB1dCBidWZmZXIgZGF0YSBwdHIgPSAlcCwgYnVmZmVyX2lkID0gJXAiLAorICAgICAgICAgICAgICAgICAgICAiaW5wdXQgYnVmZmVyIGRhdGEgcHRyID0gJXAsIGJ1ZmZlcl9pZCA9ICV1IiwKICAgICAgICAgICAgICAgICAgICAgcHRyLAogICAgICAgICAgICAgICAgICAgICBpbmZvLT5tQnVmZmVyKTsKIApAQCAtMzE1Miw3ICsyOTE0LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoc3JjQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCAmdGFyZ2V0VGltZVVzKQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGFyZ2V0VGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQ09ERUNfTE9HVigidGFyZ2V0VGltZVVzID0gJWxsZCB1cyIsIHRhcmdldFRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIENPREVDX0xPR1YoInRhcmdldFRpbWVVcyA9ICVsbGQgdXMiLCAobG9uZyBsb25nKXRhcmdldFRpbWVVcyk7CiAgICAgICAgICAgICAgICAgICAgIG1UYXJnZXRUaW1lVXMgPSB0YXJnZXRUaW1lVXM7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbVRhcmdldFRpbWVVcyA9IC0xOwpAQCAtMzE4Niw3ICsyOTQ4LDcgQEAKICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gMCkgewogICAgICAgICAgICAgICAgIENPREVDX0xPR0UoCiAgICAgICAgICAgICAgICAgICAgICAiQ29kZWMncyBpbnB1dCBidWZmZXJzIGFyZSB0b28gc21hbGwgdG8gYWNjb21vZGF0ZSAiCi0gICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIHJlYWQgZnJvbSBzb3VyY2UgKGluZm8tPm1TaXplID0gJWQsIHNyY0xlbmd0aCA9ICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIHJlYWQgZnJvbSBzb3VyY2UgKGluZm8tPm1TaXplID0gJXp1LCBzcmNMZW5ndGggPSAlenUpIiwKICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1TaXplLCBzcmNCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKIAogICAgICAgICAgICAgICAgIHNyY0J1ZmZlci0+cmVsZWFzZSgpOwpAQCAtMzI5MiwxMCArMzA1NCwxMCBAQAogICAgICAgICBpbmZvID0gZmluZEVtcHR5SW5wdXRCdWZmZXIoKTsKICAgICB9CiAKLSAgICBDT0RFQ19MT0dWKCJDYWxsaW5nIGVtcHR5QnVmZmVyIG9uIGJ1ZmZlciAlcCAobGVuZ3RoICVkKSwgIgorICAgIENPREVDX0xPR1YoIkNhbGxpbmcgZW1wdHlCdWZmZXIgb24gYnVmZmVyICV1IChsZW5ndGggJXp1KSwgIgogICAgICAgICAgICAgICAgInRpbWVzdGFtcCAlbGxkIHVzICglLjJmIHNlY3MpIiwKICAgICAgICAgICAgICAgIGluZm8tPm1CdWZmZXIsIG9mZnNldCwKLSAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCB0aW1lc3RhbXBVcyAvIDFFNik7CisgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcFVzLCB0aW1lc3RhbXBVcyAvIDFFNik7CiAKICAgICBlcnIgPSBtT01YLT5lbXB0eUJ1ZmZlcigKICAgICAgICAgICAgIG1Ob2RlLCBpbmZvLT5tQnVmZmVyLCAwLCBvZmZzZXQsCkBAIC0zMzIwLDcgKzMwODIsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQ09ERUNfTE9HVigiQ2FsbGluZyBmaWxsQnVmZmVyIG9uIGJ1ZmZlciAlcCIsIGluZm8tPm1CdWZmZXIpOworICAgIENPREVDX0xPR1YoIkNhbGxpbmcgZmlsbEJ1ZmZlciBvbiBidWZmZXIgJXUiLCBpbmZvLT5tQnVmZmVyKTsKICAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5maWxsQnVmZmVyKG1Ob2RlLCBpbmZvLT5tQnVmZmVyKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTMzNzcsNyArMzEzOSw3IEBACiAgICAgfQogICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJGaWxsZWQud2FpdFJlbGF0aXZlKG1Mb2NrLCBrQnVmZmVyRmlsbGVkRXZlbnRUaW1lT3V0TnMpOwogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQ09ERUNfTE9HRSgiVGltZWQgb3V0IHdhaXRpbmcgZm9yIG91dHB1dCBidWZmZXJzOiAlZC8lZCIsCisgICAgICAgIENPREVDX0xPR0UoIlRpbWVkIG91dCB3YWl0aW5nIGZvciBvdXRwdXQgYnVmZmVyczogJXp1LyV6dSIsCiAgICAgICAgICAgICBjb3VudEJ1ZmZlcnNXZU93bihtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XSksCiAgICAgICAgICAgICBjb3VudEJ1ZmZlcnNXZU93bihtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0pKTsKICAgICB9CkBAIC0zNjMyLDcgKzMzOTQsNyBAQAogCiB2b2lkIE9NWENvZGVjOjpzZXRJbWFnZU91dHB1dEZvcm1hdCgKICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZm9ybWF0LCBPTVhfVTMyIHdpZHRoLCBPTVhfVTMyIGhlaWdodCkgewotICAgIENPREVDX0xPR1YoInNldEltYWdlT3V0cHV0Rm9ybWF0KCVsZCwgJWxkKSIsIHdpZHRoLCBoZWlnaHQpOworICAgIENPREVDX0xPR1YoInNldEltYWdlT3V0cHV0Rm9ybWF0KCV1LCAldSkiLCB3aWR0aCwgaGVpZ2h0KTsKIAogI2lmIDAKICAgICBPTVhfSU5ERVhUWVBFIGluZGV4OwpAQCAtNDI4NiwxNCArNDA0OCwxNCBAQAogICAgICAgICAgICAgICAgIGlmICgoT01YX1UzMiludW1DaGFubmVscyAhPSBwYXJhbXMubkNoYW5uZWxzKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJDb2RlYyBvdXRwdXRzIGEgZGlmZmVyZW50IG51bWJlciBvZiBjaGFubmVscyB0aGFuICIKICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGlucHV0IHN0cmVhbSBjb250YWlucyAoY29udGFpbnMgJWQgY2hhbm5lbHMsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiY29kZWMgb3V0cHV0cyAlbGQgY2hhbm5lbHMpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGVjIG91dHB1dHMgJXUgY2hhbm5lbHMpLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsIHBhcmFtcy5uQ2hhbm5lbHMpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IChpbnQzMl90KXBhcmFtcy5uU2FtcGxpbmdSYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJDb2RlYyBvdXRwdXRzIGF0IGRpZmZlcmVudCBzYW1wbGluZyByYXRlIHRoYW4gIgogICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGF0IHRoZSBpbnB1dCBzdHJlYW0gY29udGFpbnMgKGNvbnRhaW5zIGRhdGEgYXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICIlZCBIeiwgY29kZWMgb3V0cHV0cyAlbHUgSHopIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJWQgSHosIGNvZGVjIG91dHB1dHMgJXUgSHopIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBwYXJhbXMublNhbXBsaW5nUmF0ZSk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC00Mzk1LDggKzQxNTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN0LCBzaXplb2YocmVjdCkpOwogCi0gICAgICAgICAgICAgICAgQ09ERUNfTE9HSSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlbyBkaW1lbnNpb25zIGFyZSAlbGQgeCAlbGQiLAorICAgICAgICAgICAgICAgIENPREVDX0xPR0koInZpZGVvIGRpbWVuc2lvbnMgYXJlICV1IHggJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fZGVmLT5uRnJhbWVXaWR0aCwgdmlkZW9fZGVmLT5uRnJhbWVIZWlnaHQpOwogCiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewpAQCAtNDQxNCw4ICs0MTc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0ICsgcmVjdC5uV2lkdGggLSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCArIHJlY3QubkhlaWdodCAtIDEpOwogCi0gICAgICAgICAgICAgICAgICAgIENPREVDX0xPR0koCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyb3AgcmVjdCBpcyAlbGQgeCAlbGQgQCAoJWxkLCAlbGQpIiwKKyAgICAgICAgICAgICAgICAgICAgQ09ERUNfTE9HSSgiQ3JvcCByZWN0IGlzICV1IHggJXUgQCAoJWQsICVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uV2lkdGgsIHJlY3QubkhlaWdodCwgcmVjdC5uTGVmdCwgcmVjdC5uVG9wKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRSZWN0KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKaW5kZXggYmNhMjZiOS4uNTc4MTcxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwCkBAIC02NywyNCArNjcsMjggQEAKICAgICBPZ2dTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBPZ2dTb3VyY2UgJik7CiB9OwogCi1zdHJ1Y3QgTXlWb3JiaXNFeHRyYWN0b3IgewotICAgIE15Vm9yYmlzRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOwotICAgIHZpcnR1YWwgfk15Vm9yYmlzRXh0cmFjdG9yKCk7CitzdHJ1Y3QgTXlPZ2dFeHRyYWN0b3IgeworICAgIE15T2dnRXh0cmFjdG9yKAorICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlLAorICAgICAgICAgICAgc2l6ZV90IG51bUhlYWRlcnMsCisgICAgICAgICAgICBpbnQ2NF90IHNlZWtQcmVSb2xsVXMpOworICAgIHZpcnR1YWwgfk15T2dnRXh0cmFjdG9yKCk7CiAKICAgICBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCkgY29uc3Q7CiAKICAgICAvLyBSZXR1cm5zIGFuIGFwcHJveGltYXRlIGJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLgotICAgIHVpbnQ2NF90IGFwcHJveEJpdHJhdGUoKTsKKyAgICB2aXJ0dWFsIHVpbnQ2NF90IGFwcHJveEJpdHJhdGUoKSBjb25zdCA9IDA7CiAKICAgICBzdGF0dXNfdCBzZWVrVG9UaW1lKGludDY0X3QgdGltZVVzKTsKICAgICBzdGF0dXNfdCBzZWVrVG9PZmZzZXQob2ZmNjRfdCBvZmZzZXQpOwotICAgIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyICoqYnVmZmVyLCBib29sIGNvbmYpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipidWZmZXIpID0gMDsKIAogICAgIHN0YXR1c190IGluaXQoKTsKIAogICAgIHNwPE1ldGFEYXRhPiBnZXRGaWxlTWV0YURhdGEoKSB7IHJldHVybiBtRmlsZU1ldGE7IH0KIAotcHJpdmF0ZToKK3Byb3RlY3RlZDoKICAgICBzdHJ1Y3QgUGFnZSB7CiAgICAgICAgIHVpbnQ2NF90IG1HcmFudWxlUG9zaXRpb247CiAgICAgICAgIGludDMyX3QgbVByZXZQYWNrZXRTaXplOwpAQCAtMTA0LDEyICsxMDgsMTcgQEAKICAgICBzcDxEYXRhU291cmNlPiBtU291cmNlOwogICAgIG9mZjY0X3QgbU9mZnNldDsKICAgICBQYWdlIG1DdXJyZW50UGFnZTsKKyAgICB1aW50NjRfdCBtQ3VyR3JhbnVsZVBvc2l0aW9uOwogICAgIHVpbnQ2NF90IG1QcmV2R3JhbnVsZVBvc2l0aW9uOwogICAgIHNpemVfdCBtQ3VycmVudFBhZ2VTaXplOwogICAgIGJvb2wgbUZpcnN0UGFja2V0SW5QYWdlOwogICAgIHVpbnQ2NF90IG1DdXJyZW50UGFnZVNhbXBsZXM7CiAgICAgc2l6ZV90IG1OZXh0TGFjZUluZGV4OwogCisgICAgY29uc3QgY2hhciAqbU1pbWVUeXBlOworICAgIHNpemVfdCBtTnVtSGVhZGVyczsKKyAgICBpbnQ2NF90IG1TZWVrUHJlUm9sbFVzOworCiAgICAgb2ZmNjRfdCBtRmlyc3REYXRhT2Zmc2V0OwogCiAgICAgdm9yYmlzX2luZm8gbVZpOwpAQCAtMTIzLDEwICsxMzIsMjYgQEAKICAgICBzc2l6ZV90IHJlYWRQYWdlKG9mZjY0X3Qgb2Zmc2V0LCBQYWdlICpwYWdlKTsKICAgICBzdGF0dXNfdCBmaW5kTmV4dFBhZ2Uob2ZmNjRfdCBzdGFydE9mZnNldCwgb2ZmNjRfdCAqcGFnZU9mZnNldCk7CiAKLSAgICBzdGF0dXNfdCB2ZXJpZnlIZWFkZXIoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpOworICAgIHZpcnR1YWwgaW50NjRfdCBnZXRUaW1lVXNPZkdyYW51bGUodWludDY0X3QgZ3JhbnVsZVBvcykgY29uc3QgPSAwOwogCi0gICAgaW50MzJfdCBwYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisgICAgLy8gRXh0cmFjdCBjb2RlYyBmb3JtYXQsIG1ldGFkYXRhIHRhZ3MsIGFuZCB2YXJpb3VzIGNvZGVjIHNwZWNpZmljIGRhdGE7CisgICAgLy8gdGhlIGZvcm1hdCBhbmQgQ1NEJ3MgYXJlIHJlcXVpcmVkIHRvIHNldHVwIHRoZSBkZWNvZGVycyBmb3IgdGhlIGVuY2xvc2VkIG1lZGlhIGNvbnRlbnQuCisgICAgLy8KKyAgICAvLyBWYWxpZCB2YWx1ZXMgZm9yIGB0eXBlYCBhcmU6CisgICAgLy8gMSAtIGJpdHN0cmVhbSBpZGVudGlmaWNhdGlvbiBoZWFkZXIKKyAgICAvLyAzIC0gY29tbWVudCBoZWFkZXIKKyAgICAvLyA1IC0gY29kZWMgc2V0dXAgaGVhZGVyIChWb3JiaXMgb25seSkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpID0gMDsKKworICAgIC8vIFJlYWQgdGhlIG5leHQgb2dnIHBhY2tldCBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlOyBvcHRpb25hbGx5CisgICAgLy8gY2FsY3VsYXRlIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBvdXRwdXQgcGFja2V0IHdoaWxzdCBwcmV0ZW5kaW5nCisgICAgLy8gdGhhdCB3ZSBhcmUgcGFyc2luZyBhbiBPZ2cgVm9yYmlzIHN0cmVhbS4KKyAgICAvLworICAgIC8vICpidWZmZXIgaXMgTlVMTCdlZCBvdXQgaW1tZWRpYXRlbHkgdXBvbiBlbnRyeSwgYW5kIGlmIHN1Y2Nlc3NmdWwgYSBuZXcgYnVmZmVyIGlzIGFsbG9jYXRlZDsKKyAgICAvLyBjbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIHRoZSBvcmlnaW5hbCBidWZmZXIuCisgICAgc3RhdHVzX3QgX3JlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyICoqYnVmZmVyLCBib29sIGNhbGNWb3JiaXNUaW1lc3RhbXApOworCisgICAgaW50MzJfdCBnZXRQYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CiAKICAgICB2b2lkIHBhcnNlRmlsZU1ldGFEYXRhKCk7CiAKQEAgLTEzNCw4ICsxNTksNjEgQEAKIAogICAgIHZvaWQgYnVpbGRUYWJsZU9mQ29udGVudHMoKTsKIAotICAgIE15Vm9yYmlzRXh0cmFjdG9yKGNvbnN0IE15Vm9yYmlzRXh0cmFjdG9yICYpOwotICAgIE15Vm9yYmlzRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTXlWb3JiaXNFeHRyYWN0b3IgJik7CisgICAgTXlPZ2dFeHRyYWN0b3IoY29uc3QgTXlPZ2dFeHRyYWN0b3IgJik7CisgICAgTXlPZ2dFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNeU9nZ0V4dHJhY3RvciAmKTsKK307CisKK3N0cnVjdCBNeVZvcmJpc0V4dHJhY3RvciA6IHB1YmxpYyBNeU9nZ0V4dHJhY3RvciB7CisgICAgTXlWb3JiaXNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKKyAgICAgICAgOiBNeU9nZ0V4dHJhY3Rvcihzb3VyY2UsCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAorICAgICAgICAgICAgICAgIC8qIG51bUhlYWRlcnMgKi8gMywKKyAgICAgICAgICAgICAgICAvKiBzZWVrUHJlUm9sbFVzICovIDApIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVpbnQ2NF90IGFwcHJveEJpdHJhdGUoKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipidWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIF9yZWFkTmV4dFBhY2tldChidWZmZXIsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqLyB0cnVlKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZVVzT2ZHcmFudWxlKHVpbnQ2NF90IGdyYW51bGVQb3MpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGdyYW51bGVQb3MgKiAxMDAwMDAwbGwgLyBtVmkucmF0ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpOworfTsKKworc3RydWN0IE15T3B1c0V4dHJhY3RvciA6IHB1YmxpYyBNeU9nZ0V4dHJhY3RvciB7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga09wdXNTYW1wbGVSYXRlID0gNDgwMDA7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga09wdXNTZWVrUHJlUm9sbFVzID0gODAwMDA7IC8vIDgwIG1zCisKKyAgICBNeU9wdXNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKKyAgICAgICAgOiBNeU9nZ0V4dHJhY3Rvcihzb3VyY2UsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsIC8qbnVtSGVhZGVycyovIDIsIGtPcHVzU2Vla1ByZVJvbGxVcyksCisgICAgICAgICAgbUNoYW5uZWxDb3VudCgwKSwKKyAgICAgICAgICBtQ29kZWNEZWxheSgwKSwKKyAgICAgICAgICBtU3RhcnRHcmFudWxlUG9zaXRpb24oLTEpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVpbnQ2NF90IGFwcHJveEJpdHJhdGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipidWZmZXIpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBpbnQ2NF90IGdldFRpbWVVc09mR3JhbnVsZSh1aW50NjRfdCBncmFudWxlUG9zKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpOworCitwcml2YXRlOgorICAgIHN0YXR1c190IHZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisgICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVyICpidWZmZXIpOworICAgIHVpbnQzMl90IGdldE51bVNhbXBsZXNJblBhY2tldChNZWRpYUJ1ZmZlciAqYnVmZmVyKSBjb25zdDsKKworICAgIHVpbnQ4X3QgbUNoYW5uZWxDb3VudDsKKyAgICB1aW50MTZfdCBtQ29kZWNEZWxheTsKKyAgICBpbnQ2NF90IG1TdGFydEdyYW51bGVQb3NpdGlvbjsKIH07CiAKIHN0YXRpYyB2b2lkIGV4dHJhY3RBbGJ1bUFydCgKQEAgLTE4MSwxMyArMjU5LDE0IEBACiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwogICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgIGlmIChtRXh0cmFjdG9yLT5tSW1wbC0+c2Vla1RvVGltZShzZWVrVGltZVVzKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5zZWVrVG9UaW1lKHNlZWtUaW1lVXMpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQogCiAgICAgTWVkaWFCdWZmZXIgKnBhY2tldDsKLSAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5tSW1wbC0+cmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY29uZiA9ICovIGZhbHNlKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5tSW1wbC0+cmVhZE5leHRQYWNrZXQoJnBhY2tldCk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CkBAIC0yMTEsMTQgKzI5MCwyMiBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1NeVZvcmJpc0V4dHJhY3Rvcjo6TXlWb3JiaXNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKK015T2dnRXh0cmFjdG9yOjpNeU9nZ0V4dHJhY3RvcigKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsCisgICAgICAgIHNpemVfdCBudW1IZWFkZXJzLAorICAgICAgICBpbnQ2NF90IHNlZWtQcmVSb2xsVXMpCiAgICAgOiBtU291cmNlKHNvdXJjZSksCiAgICAgICBtT2Zmc2V0KDApLAorICAgICAgbUN1ckdyYW51bGVQb3NpdGlvbigwKSwKICAgICAgIG1QcmV2R3JhbnVsZVBvc2l0aW9uKDApLAogICAgICAgbUN1cnJlbnRQYWdlU2l6ZSgwKSwKICAgICAgIG1GaXJzdFBhY2tldEluUGFnZSh0cnVlKSwKICAgICAgIG1DdXJyZW50UGFnZVNhbXBsZXMoMCksCiAgICAgICBtTmV4dExhY2VJbmRleCgwKSwKKyAgICAgIG1NaW1lVHlwZShtaW1lVHlwZSksCisgICAgICBtTnVtSGVhZGVycyhudW1IZWFkZXJzKSwKKyAgICAgIG1TZWVrUHJlUm9sbFVzKHNlZWtQcmVSb2xsVXMpLAogICAgICAgbUZpcnN0RGF0YU9mZnNldCgtMSkgewogICAgIG1DdXJyZW50UGFnZS5tTnVtU2VnbWVudHMgPSAwOwogCkBAIC0yMjYsMTYgKzMxMywxNiBAQAogICAgIHZvcmJpc19jb21tZW50X2luaXQoJm1WYyk7CiB9CiAKLU15Vm9yYmlzRXh0cmFjdG9yOjp+TXlWb3JiaXNFeHRyYWN0b3IoKSB7CitNeU9nZ0V4dHJhY3Rvcjo6fk15T2dnRXh0cmFjdG9yKCkgewogICAgIHZvcmJpc19jb21tZW50X2NsZWFyKCZtVmMpOwogICAgIHZvcmJpc19pbmZvX2NsZWFyKCZtVmkpOwogfQogCi1zcDxNZXRhRGF0YT4gTXlWb3JiaXNFeHRyYWN0b3I6OmdldEZvcm1hdCgpIGNvbnN0IHsKK3NwPE1ldGFEYXRhPiBNeU9nZ0V4dHJhY3Rvcjo6Z2V0Rm9ybWF0KCkgY29uc3QgewogICAgIHJldHVybiBtTWV0YTsKIH0KIAotc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OmZpbmROZXh0UGFnZSgKK3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpmaW5kTmV4dFBhZ2UoCiAgICAgICAgIG9mZjY0X3Qgc3RhcnRPZmZzZXQsIG9mZjY0X3QgKnBhZ2VPZmZzZXQpIHsKICAgICAqcGFnZU9mZnNldCA9IHN0YXJ0T2Zmc2V0OwogCkBAIC0yNTIsNyArMzM5LDcgQEAKICAgICAgICAgaWYgKCFtZW1jbXAoc2lnbmF0dXJlLCAiT2dnUyIsIDQpKSB7CiAgICAgICAgICAgICBpZiAoKnBhZ2VPZmZzZXQgPiBzdGFydE9mZnNldCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJza2lwcGVkICVsbGQgYnl0ZXMgb2YganVuayB0byByZWFjaCBuZXh0IGZyYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICpwYWdlT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykoKnBhZ2VPZmZzZXQgLSBzdGFydE9mZnNldCkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gT0s7CkBAIC0yNjYsNyArMzUzLDcgQEAKIC8vIGl0IChpZiBhbnkpIGFuZCByZXR1cm4gaXRzIGdyYW51bGUgcG9zaXRpb24uCiAvLyBUbyBkbyB0aGlzIHdlIGJhY2sgdXAgZnJvbSB0aGUgImN1cnJlbnQiIHBhZ2UncyBvZmZzZXQgdW50aWwgd2UgZmluZCBhbnkKIC8vIHBhZ2UgcHJlY2VkaW5nIGl0IGFuZCB0aGVuIHNjYW4gZm9yd2FyZCB0byBqdXN0IGJlZm9yZSB0aGUgY3VycmVudCBwYWdlLgotc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OmZpbmRQcmV2R3JhbnVsZVBvc2l0aW9uKAorc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmZpbmRQcmV2R3JhbnVsZVBvc2l0aW9uKAogICAgICAgICBvZmY2NF90IHBhZ2VPZmZzZXQsIHVpbnQ2NF90ICpncmFudWxlUG9zKSB7CiAgICAgKmdyYW51bGVQb3MgPSAwOwogCkBAIC0yNzksMTAgKzM2NiwxNCBAQAogICAgICAgICAgICAgcHJldkd1ZXNzID0gMDsKICAgICAgICAgfQogCi0gICAgICAgIEFMT0dWKCJiYWNraW5nIHVwICVsbGQgYnl0ZXMiLCBwYWdlT2Zmc2V0IC0gcHJldkd1ZXNzKTsKKyAgICAgICAgQUxPR1YoImJhY2tpbmcgdXAgJWxsZCBieXRlcyIsIChsb25nIGxvbmcpKHBhZ2VPZmZzZXQgLSBwcmV2R3Vlc3MpKTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSBmaW5kTmV4dFBhZ2UocHJldkd1ZXNzLCAmcHJldlBhZ2VPZmZzZXQpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgLy8gV2UgYXJlIGF0IHRoZSBsYXN0IHBhZ2UgYW5kIGRpZG4ndCBiYWNrIG9mZiBlbm91Z2g7CisgICAgICAgICAgICAvLyBiYWNrIG9mZiA1MDAwIGJ5dGVzIG1vcmUgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCkBAIC0yOTcsNyArMzg4LDcgQEAKICAgICB9CiAKICAgICBBTE9HVigicHJldlBhZ2VPZmZzZXQgYXQgJWxsZCwgcGFnZU9mZnNldCBhdCAlbGxkIiwKLSAgICAgICAgIHByZXZQYWdlT2Zmc2V0LCBwYWdlT2Zmc2V0KTsKKyAgICAgICAgICAgIChsb25nIGxvbmcpcHJldlBhZ2VPZmZzZXQsIChsb25nIGxvbmcpcGFnZU9mZnNldCk7CiAKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIFBhZ2UgcHJldlBhZ2U7CkBAIC0zMTYsMTMgKzQwNywyMiBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OnNlZWtUb1RpbWUoaW50NjRfdCB0aW1lVXMpIHsKK3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpzZWVrVG9UaW1lKGludDY0X3QgdGltZVVzKSB7CisgICAgdGltZVVzIC09IG1TZWVrUHJlUm9sbFVzOworICAgIGlmICh0aW1lVXMgPCAwKSB7CisgICAgICAgIHRpbWVVcyA9IDA7CisgICAgfQorCiAgICAgaWYgKG1UYWJsZU9mQ29udGVudHMuaXNFbXB0eSgpKSB7CiAgICAgICAgIC8vIFBlcmZvcm0gYXBwcm94aW1hdGUgc2Vla2luZyBiYXNlZCBvbiBhdmcuIGJpdHJhdGUuCisgICAgICAgIHVpbnQ2NF90IGJwcyA9IGFwcHJveEJpdHJhdGUoKTsKKyAgICAgICAgaWYgKGJwcyA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KIAotICAgICAgICBvZmY2NF90IHBvcyA9IHRpbWVVcyAqIGFwcHJveEJpdHJhdGUoKSAvIDgwMDAwMDBsbDsKKyAgICAgICAgb2ZmNjRfdCBwb3MgPSB0aW1lVXMgKiBicHMgLyA4MDAwMDAwbGw7CiAKLSAgICAgICAgQUxPR1YoInNlZWtpbmcgdG8gb2Zmc2V0ICVsbGQiLCBwb3MpOworICAgICAgICBBTE9HVigic2Vla2luZyB0byBvZmZzZXQgJWxsZCIsIChsb25nIGxvbmcpcG9zKTsKICAgICAgICAgcmV0dXJuIHNlZWtUb09mZnNldChwb3MpOwogICAgIH0KIApAQCAtMzUwLDEyICs0NTAsMTIgQEAKICAgICBjb25zdCBUT0NFbnRyeSAmZW50cnkgPSBtVGFibGVPZkNvbnRlbnRzLml0ZW1BdChsZWZ0KTsKIAogICAgIEFMT0dWKCJzZWVraW5nIHRvIGVudHJ5ICV6dSAvICV6dSBhdCBvZmZzZXQgJWxsZCIsCi0gICAgICAgICBsZWZ0LCBtVGFibGVPZkNvbnRlbnRzLnNpemUoKSwgZW50cnkubVBhZ2VPZmZzZXQpOworICAgICAgICAgbGVmdCwgbVRhYmxlT2ZDb250ZW50cy5zaXplKCksIChsb25nIGxvbmcpZW50cnkubVBhZ2VPZmZzZXQpOwogCiAgICAgcmV0dXJuIHNlZWtUb09mZnNldChlbnRyeS5tUGFnZU9mZnNldCk7CiB9CiAKLXN0YXR1c190IE15Vm9yYmlzRXh0cmFjdG9yOjpzZWVrVG9PZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKK3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpzZWVrVG9PZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKICAgICBpZiAobUZpcnN0RGF0YU9mZnNldCA+PSAwICYmIG9mZnNldCA8IG1GaXJzdERhdGFPZmZzZXQpIHsKICAgICAgICAgLy8gT25jZSB3ZSBrbm93IHdoZXJlIHRoZSBhY3R1YWwgYXVkaW8gZGF0YSBzdGFydHMgKHBhc3QgdGhlIGhlYWRlcnMpCiAgICAgICAgIC8vIGRvbid0IGV2ZXIgc2VlayB0byBhbnl3aGVyZSBiZWZvcmUgdGhhdC4KQEAgLTM4OCwxMyArNDg4LDEzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zc2l6ZV90IE15Vm9yYmlzRXh0cmFjdG9yOjpyZWFkUGFnZShvZmY2NF90IG9mZnNldCwgUGFnZSAqcGFnZSkgeworc3NpemVfdCBNeU9nZ0V4dHJhY3Rvcjo6cmVhZFBhZ2Uob2ZmNjRfdCBvZmZzZXQsIFBhZ2UgKnBhZ2UpIHsKICAgICB1aW50OF90IGhlYWRlclsyN107CiAgICAgc3NpemVfdCBuOwogICAgIGlmICgobiA9IG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpKQogICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewotICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0IG9mZnNldCAweCUwMTZsbHgsIGdvdCAlemQgYnl0ZXMiLAotICAgICAgICAgICAgIHNpemVvZihoZWFkZXIpLCBvZmZzZXQsIG4pOworICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0IG9mZnNldCAlIzAxNmxseCwgZ290ICV6ZCBieXRlcyIsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGhlYWRlciksIChsb25nIGxvbmcpb2Zmc2V0LCBuKTsKIAogICAgICAgICBpZiAobiA8IDApIHsKICAgICAgICAgICAgIHJldHVybiBuOwpAQCAtNDU5LDcgKzU1OSwxMTAgQEAKICAgICByZXR1cm4gc2l6ZW9mKGhlYWRlcikgKyBwYWdlLT5tTnVtU2VnbWVudHMgKyB0b3RhbFNpemU7CiB9CiAKLXN0YXR1c190IE15Vm9yYmlzRXh0cmFjdG9yOjpyZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlciAqKm91dCwgYm9vbCBjb25mKSB7CitzdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyICoqb3V0KSB7CisgICAgaWYgKG1PZmZzZXQgPD0gbUZpcnN0RGF0YU9mZnNldCAmJiBtU3RhcnRHcmFudWxlUG9zaXRpb24gPCAwKSB7CisgICAgICAgIC8vIFRoZSBmaXJzdCBzYW1wbGUgbWlnaHQgbm90IHN0YXJ0IGF0IHRpbWUgMDsgZmluZCBvdXQgd2hlcmUgYnkgc3VidHJhY3RpbmcKKyAgICAgICAgLy8gdGhlIG51bWJlciBvZiBzYW1wbGVzIG9uIHRoZSBmaXJzdCBwYWdlIGZyb20gdGhlIGdyYW51bGUgcG9zaXRpb24KKyAgICAgICAgLy8gKHBvc2l0aW9uIG9mIGxhc3QgY29tcGxldGUgc2FtcGxlKSBvZiB0aGUgZmlyc3QgcGFnZS4gVGhpcyBoYXBwZW5zCisgICAgICAgIC8vIHRoZSBmaXJzdCB0aW1lIGJlZm9yZSB3ZSBhdHRlbXB0IHRvIHJlYWQgYSBwYWNrZXQgZnJvbSB0aGUgZmlyc3QgcGFnZS4KKyAgICAgICAgTWVkaWFCdWZmZXIgKm1CdWY7CisgICAgICAgIHVpbnQzMl90IG51bVNhbXBsZXMgPSAwOworICAgICAgICB1aW50NjRfdCBjdXJHcmFudWxlUG9zaXRpb24gPSAwOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KCZtQnVmLCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZpcnN0IHR3byBwYWdlcyBhcmUgaGVhZGVyIHBhZ2VzLgorICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNIHx8IG1DdXJyZW50UGFnZS5tUGFnZU5vID4gMikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VyR3JhbnVsZVBvc2l0aW9uID0gbUN1cnJlbnRQYWdlLm1HcmFudWxlUG9zaXRpb247CisgICAgICAgICAgICBudW1TYW1wbGVzICs9IGdldE51bVNhbXBsZXNJblBhY2tldChtQnVmKTsKKyAgICAgICAgICAgIG1CdWYtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWYgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1ckdyYW51bGVQb3NpdGlvbiA+IG51bVNhbXBsZXMpIHsKKyAgICAgICAgICAgIG1TdGFydEdyYW51bGVQb3NpdGlvbiA9IGN1ckdyYW51bGVQb3NpdGlvbiAtIG51bVNhbXBsZXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3RhcnRHcmFudWxlUG9zaXRpb24gPSAwOworICAgICAgICB9CisgICAgICAgIHNlZWtUb09mZnNldCgwKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBfcmVhZE5leHRQYWNrZXQob3V0LCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludDMyX3QgY3VycmVudFBhZ2VTYW1wbGVzOworICAgIC8vIENhbGN1bGF0ZSB0aW1lc3RhbXBzIGJ5IGFjY3VtdWxhdGluZyBkdXJhdGlvbnMgc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3Qgc2FtcGxlIG9mIGEgcGFnZTsKKyAgICAvLyBXZSBhc3N1bWUgdGhhdCB3ZSBvbmx5IHNlZWsgdG8gcGFnZSBib3VuZGFyaWVzLgorICAgIGlmICgoKm91dCktPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleVZhbGlkU2FtcGxlcywgJmN1cnJlbnRQYWdlU2FtcGxlcykpIHsKKyAgICAgICAgLy8gZmlyc3QgcGFja2V0IGluIHBhZ2UKKyAgICAgICAgaWYgKG1PZmZzZXQgPT0gbUZpcnN0RGF0YU9mZnNldCkgeworICAgICAgICAgICAgY3VycmVudFBhZ2VTYW1wbGVzIC09IG1TdGFydEdyYW51bGVQb3NpdGlvbjsKKyAgICAgICAgICAgICgqb3V0KS0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlWYWxpZFNhbXBsZXMsIGN1cnJlbnRQYWdlU2FtcGxlcyk7CisgICAgICAgIH0KKyAgICAgICAgbUN1ckdyYW51bGVQb3NpdGlvbiA9IG1DdXJyZW50UGFnZS5tR3JhbnVsZVBvc2l0aW9uIC0gY3VycmVudFBhZ2VTYW1wbGVzOworICAgIH0KKworICAgIGludDY0X3QgdGltZVVzID0gZ2V0VGltZVVzT2ZHcmFudWxlKG1DdXJHcmFudWxlUG9zaXRpb24pOworICAgICgqb3V0KS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworCisgICAgdWludDMyX3QgZnJhbWVzID0gZ2V0TnVtU2FtcGxlc0luUGFja2V0KCpvdXQpOworICAgIG1DdXJHcmFudWxlUG9zaXRpb24gKz0gZnJhbWVzOworICAgIHJldHVybiBPSzsKK30KKwordWludDMyX3QgTXlPcHVzRXh0cmFjdG9yOjpnZXROdW1TYW1wbGVzSW5QYWNrZXQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgY29uc3QgeworICAgIGlmIChidWZmZXIgPT0gTlVMTCB8fCBidWZmZXItPnJhbmdlX2xlbmd0aCgpIDwgMSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1aW50OF90ICpkYXRhID0gKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgdWludDhfdCB0b2MgPSBkYXRhWzBdOworICAgIHVpbnQ4X3QgY29uZmlnID0gKHRvYyA+PiAzKSAmIDB4MWY7CisgICAgdWludDMyX3QgZnJhbWVTaXplc1VzW10gPSB7CisgICAgICAgIDEwMDAwLCAyMDAwMCwgNDAwMDAsIDYwMDAwLCAvLyAwLi4uMworICAgICAgICAxMDAwMCwgMjAwMDAsIDQwMDAwLCA2MDAwMCwgLy8gNC4uLjcKKyAgICAgICAgMTAwMDAsIDIwMDAwLCA0MDAwMCwgNjAwMDAsIC8vIDguLi4xMQorICAgICAgICAxMDAwMCwgMjAwMDAsICAgICAgICAgICAgICAgLy8gMTIuLi4xMworICAgICAgICAxMDAwMCwgMjAwMDAsICAgICAgICAgICAgICAgLy8gMTQuLi4xNQorICAgICAgICAyNTAwLCA1MDAwLCAxMDAwMCwgMjAwMDAsICAgLy8gMTYuLi4xOQorICAgICAgICAyNTAwLCA1MDAwLCAxMDAwMCwgMjAwMDAsICAgLy8gMjAuLi4yMworICAgICAgICAyNTAwLCA1MDAwLCAxMDAwMCwgMjAwMDAsICAgLy8gMjQuLi4yNworICAgICAgICAyNTAwLCA1MDAwLCAxMDAwMCwgMjAwMDAgICAgLy8gMjguLi4zMQorICAgIH07CisgICAgdWludDMyX3QgZnJhbWVTaXplVXMgPSBmcmFtZVNpemVzVXNbY29uZmlnXTsKKworICAgIHVpbnQzMl90IG51bUZyYW1lczsKKyAgICB1aW50OF90IGMgPSB0b2MgJiAzOworICAgIHN3aXRjaCAoYykgeworICAgIGNhc2UgMDoKKyAgICAgICAgbnVtRnJhbWVzID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICAgICAgbnVtRnJhbWVzID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBpZiAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA8IDMpIHsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1GcmFtZXMgPSBkYXRhWzJdICYgMHgzZjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKworICAgIHVpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZVNpemVVcyAqIG51bUZyYW1lcyAqIGtPcHVzU2FtcGxlUmF0ZSAvIDEwMDAwMDA7CisgICAgcmV0dXJuIG51bVNhbXBsZXM7Cit9CisKK3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipvdXQsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCkgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IE5VTEw7CkBAIC01MDcsOCArNzEwLDggQEAKICAgICAgICAgICAgICAgICAgICAgcGFja2V0U2l6ZSk7CiAKICAgICAgICAgICAgIGlmIChuIDwgKHNzaXplX3QpcGFja2V0U2l6ZSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlenUgYnl0ZXMgYXQgMHglMDE2bGx4LCBnb3QgJXpkIGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgIHBhY2tldFNpemUsIGRhdGFPZmZzZXQsIG4pOworICAgICAgICAgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlenUgYnl0ZXMgYXQgJSMwMTZsbHgsIGdvdCAlemQgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0U2l6ZSwgKGxvbmcgbG9uZylkYXRhT2Zmc2V0LCBuKTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKQEAgLTUyNSw5ICs3MjgsOCBAQAogICAgICAgICAgICAgICAgICAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGltZXN0YW1wIGZvciBjb25maWd1cmF0aW9uIHBhY2tldHMKLSAgICAgICAgICAgICAgICBpZiAoIWNvbmYpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjdXJCbG9ja1NpemUgPSBwYWNrZXRCbG9ja1NpemUoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FsY1ZvcmJpc1RpbWVzdGFtcCkgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGN1ckJsb2NrU2l6ZSA9IGdldFBhY2tldEJsb2NrU2l6ZShidWZmZXIpOwogICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0U2l6ZSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFNpemUgPSBjdXJCbG9ja1NpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRQb3MgPQpAQCAtNTk5LDQzICs4MDEsMjQgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE15Vm9yYmlzRXh0cmFjdG9yOjppbml0KCkgeworc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmluaXQoKSB7CiAgICAgbU1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpOworICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbU1pbWVUeXBlKTsKIAotICAgIE1lZGlhQnVmZmVyICpwYWNrZXQ7CiAgICAgc3RhdHVzX3QgZXJyOwotICAgIGlmICgoZXJyID0gcmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY29uZiA9ICovIHRydWUpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIDEpOwotICAgIHBhY2tldC0+cmVsZWFzZSgpOwotICAgIHBhY2tldCA9IE5VTEw7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmICgoZXJyID0gcmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY29uZiA9ICovIHRydWUpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIDMpOwotICAgIHBhY2tldC0+cmVsZWFzZSgpOwotICAgIHBhY2tldCA9IE5VTEw7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmICgoZXJyID0gcmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY29uZiA9ICovIHRydWUpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIDUpOwotICAgIHBhY2tldC0+cmVsZWFzZSgpOwotICAgIHBhY2tldCA9IE5VTEw7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgIE1lZGlhQnVmZmVyICpwYWNrZXQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtSGVhZGVyczsgKytpKSB7CisgICAgICAgIC8vIGlnbm9yZSB0aW1lc3RhbXAgZm9yIGNvbmZpZ3VyYXRpb24gcGFja2V0cworICAgICAgICBpZiAoKGVyciA9IF9yZWFkTmV4dFBhY2tldCgmcGFja2V0LCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi8gZmFsc2UpKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICBlcnIgPSB2ZXJpZnlIZWFkZXIocGFja2V0LCAvKiB0eXBlID0gKi8gaSAqIDIgKyAxKTsKKyAgICAgICAgcGFja2V0LT5yZWxlYXNlKCk7CisgICAgICAgIHBhY2tldCA9IE5VTEw7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KICAgICB9CiAKICAgICBtRmlyc3REYXRhT2Zmc2V0ID0gbU9mZnNldCArIG1DdXJyZW50UGFnZVNpemU7CkBAIC02NTEsNyArODM0LDcgQEAKICAgICAgICAgLy8gd2UgY2FuIG9ubHkgYXBwcm94aW1hdGUgdXNpbmcgYXZnLiBiaXRyYXRlIGlmIHNlZWtpbmcgdG8KICAgICAgICAgLy8gdGhlIGVuZCBpcyB0b28gZXhwZW5zaXZlIG9yIGltcG9zc2libGUgKGxpdmUgc3RyZWFtaW5nKS4KIAotICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBsYXN0R3JhbnVsZVBvc2l0aW9uICogMTAwMDAwMGxsIC8gbVZpLnJhdGU7CisgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IGdldFRpbWVVc09mR3JhbnVsZShsYXN0R3JhbnVsZVBvc2l0aW9uKTsKIAogICAgICAgICBtTWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKIApAQCAtNjYxLDcgKzg0NCw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE15Vm9yYmlzRXh0cmFjdG9yOjpidWlsZFRhYmxlT2ZDb250ZW50cygpIHsKK3ZvaWQgTXlPZ2dFeHRyYWN0b3I6OmJ1aWxkVGFibGVPZkNvbnRlbnRzKCkgewogICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbUZpcnN0RGF0YU9mZnNldDsKICAgICBQYWdlIHBhZ2U7CiAgICAgc3NpemVfdCBwYWdlU2l6ZTsKQEAgLTY3Miw3ICs4NTUsNyBAQAogICAgICAgICAgICAgbVRhYmxlT2ZDb250ZW50cy5lZGl0SXRlbUF0KG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpIC0gMSk7CiAKICAgICAgICAgZW50cnkubVBhZ2VPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIGVudHJ5Lm1UaW1lVXMgPSBwYWdlLm1HcmFudWxlUG9zaXRpb24gKiAxMDAwMDAwbGwgLyBtVmkucmF0ZTsKKyAgICAgICAgZW50cnkubVRpbWVVcyA9IGdldFRpbWVVc09mR3JhbnVsZShwYWdlLm1HcmFudWxlUG9zaXRpb24pOwogCiAgICAgICAgIG9mZnNldCArPSAoc2l6ZV90KXBhZ2VTaXplOwogICAgIH0KQEAgLTcwMCw3ICs4ODMsNyBAQAogICAgIH0KIH0KIAotaW50MzJfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6cGFja2V0QmxvY2tTaXplKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKK2ludDMyX3QgTXlPZ2dFeHRyYWN0b3I6OmdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwogCkBAIC03MjksNiArOTEyLDE0NCBAQAogICAgIHJldHVybiB2b3JiaXNfcGFja2V0X2Jsb2Nrc2l6ZSgmbVZpLCAmcGFjayk7CiB9CiAKK2ludDY0X3QgTXlPcHVzRXh0cmFjdG9yOjpnZXRUaW1lVXNPZkdyYW51bGUodWludDY0X3QgZ3JhbnVsZVBvcykgY29uc3QgeworICAgIHVpbnQ2NF90IHBjbVNhbXBsZVBvc2l0aW9uID0gMDsKKyAgICBpZiAoZ3JhbnVsZVBvcyA+IG1Db2RlY0RlbGF5KSB7CisgICAgICAgIHBjbVNhbXBsZVBvc2l0aW9uID0gZ3JhbnVsZVBvcyAtIG1Db2RlY0RlbGF5OworICAgIH0KKyAgICByZXR1cm4gcGNtU2FtcGxlUG9zaXRpb24gKiAxMDAwMDAwbGwgLyBrT3B1c1NhbXBsZVJhdGU7Cit9CisKK3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAvLyB0aGVyZSBhcmUgYWN0dWFsbHkgbm8gaGVhZGVyIHR5cGVzIGRlZmluZWQgaW4gdGhlIE9wdXMgc3BlYzsgd2UgY2hvb3NlIDEgYW5kIDMgdG8gbWVhbgorICAgICAgICAvLyBoZWFkZXIgYW5kIGNvbW1lbnRzIHN1Y2ggdGhhdCB3ZSBjYW4gc2hhcmUgY29kZSB3aXRoIE15Vm9yYmlzRXh0cmFjdG9yLgorICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICByZXR1cm4gdmVyaWZ5T3B1c0hlYWRlcihidWZmZXIpOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICByZXR1cm4gdmVyaWZ5T3B1c0NvbW1lbnRzKGJ1ZmZlcik7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorfQorCitzdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlclNpemUgPSAxOTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisKKyAgICBpZiAoc2l6ZSA8IGtPcHVzSGVhZGVyU2l6ZQorICAgICAgICAgICAgfHwgbWVtY21wKGRhdGEsICJPcHVzSGVhZCIsIDgpCisgICAgICAgICAgICB8fCAvKiB2ZXJzaW9uID0gKi8gZGF0YVs4XSAhPSAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgbUNoYW5uZWxDb3VudCA9IGRhdGFbOV07CisgICAgbUNvZGVjRGVsYXkgPSBVMTZMRV9BVCgmZGF0YVsxMF0pOworCisgICAgbU1ldGEtPnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGRhdGEsIHNpemUpOworICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwga09wdXNTYW1wbGVSYXRlKTsKKyAgICBtTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUNoYW5uZWxDb3VudCk7CisgICAgbU1ldGEtPnNldEludDY0KGtLZXlPcHVzU2Vla1ByZVJvbGwgLyogbnMgKi8sIGtPcHVzU2Vla1ByZVJvbGxVcyAqIDEwMDAgLyogPSA4MCBtcyovKTsKKyAgICBtTWV0YS0+c2V0SW50NjQoa0tleU9wdXNDb2RlY0RlbGF5IC8qIG5zICovLAorICAgICAgICAgICAgbUNvZGVjRGVsYXkgLyogc2FtcGxlL3MgKi8gKiAxMDAwMDAwMDAwIC8ga09wdXNTYW1wbGVSYXRlKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlPcHVzQ29tbWVudHMoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIC8vIGFkZCBhcnRpZmljaWFsIGZyYW1pbmcgYml0IHNvIHdlIGNhbiByZXVzZSBfdm9yYmlzX3VucGFja19jb21tZW50CisgICAgaW50MzJfdCBjb21tZW50U2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKyAxOworICAgIHNwPEFCdWZmZXI+IGFCdWYgPSBuZXcgQUJ1ZmZlcihjb21tZW50U2l6ZSk7CisgICAgaWYgKGFCdWYtPmNhcGFjaXR5KCkgPD0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQ4X3QqIGNvbW1lbnREYXRhID0gYUJ1Zi0+ZGF0YSgpOworICAgIG1lbWNweShjb21tZW50RGF0YSwKKyAgICAgICAgICAgICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICBidWYuZGF0YSA9IGNvbW1lbnREYXRhOworICAgIGJ1Zi5zaXplID0gY29tbWVudFNpemU7CisgICAgYnVmLnJlZmNvdW50ID0gMTsKKyAgICBidWYucHRyLm93bmVyID0gTlVMTDsKKworICAgIG9nZ19yZWZlcmVuY2UgcmVmOworICAgIHJlZi5idWZmZXIgPSAmYnVmOworICAgIHJlZi5iZWdpbiA9IDA7CisgICAgcmVmLmxlbmd0aCA9IGNvbW1lbnRTaXplOworICAgIHJlZi5uZXh0ID0gTlVMTDsKKworICAgIG9nZ3BhY2tfYnVmZmVyIGJpdHM7CisgICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7CisKKyAgICAvLyBza2lwICdPcHVzVGFncycKKyAgICBjb25zdCBjaGFyICpPcHVzVGFncyA9ICJPcHVzVGFncyI7CisgICAgY29uc3QgaW50MzJfdCBoZWFkZXJMZW4gPSBzdHJsZW4oT3B1c1RhZ3MpOworICAgIGludDMyX3QgZnJhbWluZ0JpdE9mZnNldCA9IGhlYWRlckxlbjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlckxlbjsgKytpKSB7CisgICAgICAgIGNoYXIgY2hyID0gb2dncGFja19yZWFkKCZiaXRzLCA4KTsKKyAgICAgICAgaWYgKGNociAhPSBPcHVzVGFnc1tpXSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3QgdmVuZG9yTGVuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CisgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OworICAgIGlmICh2ZW5kb3JMZW4gPCAwIHx8IHZlbmRvckxlbiA+IGNvbW1lbnRTaXplIC0gOCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICAvLyBza2lwIHZlbmRvciBzdHJpbmcKKyAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IHZlbmRvckxlbjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlbmRvckxlbjsgKytpKSB7CisgICAgICAgIG9nZ3BhY2tfcmVhZCgmYml0cywgOCk7CisgICAgfQorCisgICAgaW50MzJfdCBuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CisgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OworICAgIGlmIChuIDwgMCB8fCBuID4gKChjb21tZW50U2l6ZSAtIG9nZ3BhY2tfYnl0ZXMoJmJpdHMpKSA+PiAyKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBpbnQzMl90IGxlbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOworICAgICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IDQ7CisgICAgICAgIGlmIChsZW4gIDwgMCB8fCBsZW4gID4gKGNvbW1lbnRTaXplIC0gb2dncGFja19ieXRlcygmYml0cykpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gbGVuOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbjsgKytqKSB7CisgICAgICAgICAgICBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmcmFtaW5nQml0T2Zmc2V0IDwgMCB8fCBmcmFtaW5nQml0T2Zmc2V0ID49IGNvbW1lbnRTaXplKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGNvbW1lbnREYXRhW2ZyYW1pbmdCaXRPZmZzZXRdID0gMTsKKworICAgIGJ1Zi5kYXRhID0gY29tbWVudERhdGEgKyBoZWFkZXJMZW47CisgICAgYnVmLnNpemUgPSBjb21tZW50U2l6ZSAtIGhlYWRlckxlbjsKKyAgICBidWYucmVmY291bnQgPSAxOworICAgIGJ1Zi5wdHIub3duZXIgPSBOVUxMOworCisgICAgcmVmLmJ1ZmZlciA9ICZidWY7CisgICAgcmVmLmJlZ2luID0gMDsKKyAgICByZWYubGVuZ3RoID0gY29tbWVudFNpemUgLSBoZWFkZXJMZW47CisgICAgcmVmLm5leHQgPSBOVUxMOworCisgICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7CisgICAgaW50IGVyciA9IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQoJm1WYywgJmJpdHMpOworICAgIGlmICgwICE9IGVycikgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHBhcnNlRmlsZU1ldGFEYXRhKCk7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKAogICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0KQEAgLTc1NSw3ICsxMDc2LDkgQEAKICAgICBvZ2dwYWNrX2J1ZmZlciBiaXRzOwogICAgIG9nZ3BhY2tfcmVhZGluaXQoJmJpdHMsICZyZWYpOwogCi0gICAgQ0hFQ0tfRVEob2dncGFja19yZWFkKCZiaXRzLCA4KSwgdHlwZSk7CisgICAgaWYgKG9nZ3BhY2tfcmVhZCgmYml0cywgOCkgIT0gdHlwZSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDY7ICsraSkgewogICAgICAgICBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOyAgLy8gc2tpcCAndm9yYmlzJwogICAgIH0KQEAgLTc2Myw3ICsxMDg2LDkgQEAKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgY2FzZSAxOgogICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDS19FUSgwLCBfdm9yYmlzX3VucGFja19pbmZvKCZtVmksICZiaXRzKSk7CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19pbmZvKCZtVmksICZiaXRzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1NZXRhLT5zZXREYXRhKGtLZXlWb3JiaXNJbmZvLCAwLCBkYXRhLCBzaXplKTsKICAgICAgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVZpLnJhdGUpOwpAQCAtODEyLDcgKzExMzcsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdWludDY0X3QgTXlWb3JiaXNFeHRyYWN0b3I6OmFwcHJveEJpdHJhdGUoKSB7Cit1aW50NjRfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6YXBwcm94Qml0cmF0ZSgpIGNvbnN0IHsKICAgICBpZiAobVZpLmJpdHJhdGVfbm9taW5hbCAhPSAwKSB7CiAgICAgICAgIHJldHVybiBtVmkuYml0cmF0ZV9ub21pbmFsOwogICAgIH0KQEAgLTgyMCw3ICsxMTQ1LDcgQEAKICAgICByZXR1cm4gKG1WaS5iaXRyYXRlX2xvd2VyICsgbVZpLmJpdHJhdGVfdXBwZXIpIC8gMjsKIH0KIAotdm9pZCBNeVZvcmJpc0V4dHJhY3Rvcjo6cGFyc2VGaWxlTWV0YURhdGEoKSB7Cit2b2lkIE15T2dnRXh0cmFjdG9yOjpwYXJzZUZpbGVNZXRhRGF0YSgpIHsKICAgICBtRmlsZU1ldGEgPSBuZXcgTWV0YURhdGE7CiAgICAgbUZpbGVNZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyk7CiAKQEAgLTk2MCwxMSArMTI4NSwyMyBAQAogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtSW1wbChOVUxMKSB7Ci0gICAgbUltcGwgPSBuZXcgTXlWb3JiaXNFeHRyYWN0b3IobURhdGFTb3VyY2UpOwotICAgIG1Jbml0Q2hlY2sgPSBtSW1wbC0+c2Vla1RvT2Zmc2V0KDApOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgIGlmIChtSW1wbCAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZWxldGUgbUltcGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgbUltcGwgPSBuZXcgTXlWb3JiaXNFeHRyYWN0b3IobURhdGFTb3VyY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUltcGwgPSBuZXcgTXlPcHVzRXh0cmFjdG9yKG1EYXRhU291cmNlKTsKKyAgICAgICAgfQorICAgICAgICBtSW5pdENoZWNrID0gbUltcGwtPnNlZWtUb09mZnNldCgwKTsKIAotICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBtSW1wbC0+aW5pdCgpOworICAgICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgeworICAgICAgICAgICAgbUluaXRDaGVjayA9IG1JbXBsLT5pbml0KCk7CisgICAgICAgICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Qcm9jZXNzSW5mby5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Qcm9jZXNzSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxNzJiMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmNwcApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJQcm9jZXNzSW5mbyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSVByb2Nlc3NJbmZvU2VydmljZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitQcm9jZXNzSW5mbzo6UHJvY2Vzc0luZm8oKSB7fQorCitib29sIFByb2Nlc3NJbmZvOjpnZXRQcmlvcml0eShpbnQgcGlkLCBpbnQqIHByaW9yaXR5KSB7CisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoInByb2Nlc3NpbmZvIikpOworICAgIHNwPElQcm9jZXNzSW5mb1NlcnZpY2U+IHNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJUHJvY2Vzc0luZm9TZXJ2aWNlPihiaW5kZXIpOworCisgICAgc2l6ZV90IGxlbmd0aCA9IDE7CisgICAgaW50MzJfdCBzdGF0ZXM7CisgICAgc3RhdHVzX3QgZXJyID0gc2VydmljZS0+Z2V0UHJvY2Vzc1N0YXRlc0Zyb21QaWRzKGxlbmd0aCwgJnBpZCwgJnN0YXRlcyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZ2V0UHJvY2Vzc1N0YXRlc0Zyb21QaWRzIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEFMT0dWKCJwaWQgJWQgc3RhdGVzICVkIiwgcGlkLCBzdGF0ZXMpOworICAgIGlmIChzdGF0ZXMgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBVc2UgcHJvY2VzcyBzdGF0ZSBhcyB0aGUgcHJpb3JpdHkuIExvd2VyIHRoZSB2YWx1ZSwgaGlnaGVyIHRoZSBwcmlvcml0eS4KKyAgICAqcHJpb3JpdHkgPSBzdGF0ZXM7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1Byb2Nlc3NJbmZvOjp+UHJvY2Vzc0luZm8oKSB7fQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwCmluZGV4IDM0NzFkZWEuLmFjODY3NzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAKQEAgLTE4LDYgKzE4LDggQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGxpbWl0cz4KKwogI2luY2x1ZGUgImluY2x1ZGUvU2FtcGxlVGFibGUuaCIKICNpbmNsdWRlICJpbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmgiCiAKQEAgLTQwLDcgKzQyLDcgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotY29uc3Qgb2ZmNjRfdCBrTWF4T2Zmc2V0ID0gSU5UNjRfTUFYOworY29uc3Qgb2ZmNjRfdCBrTWF4T2Zmc2V0ID0gc3RkOjpudW1lcmljX2xpbWl0czxvZmY2NF90Pjo6bWF4KCk7CiAKIHN0cnVjdCBTYW1wbGVUYWJsZTo6Q29tcG9zaXRpb25EZWx0YUxvb2t1cCB7CiAgICAgQ29tcG9zaXRpb25EZWx0YUxvb2t1cCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCAxMDFmYzhhLi5lMzdlOTA5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMjAsMjIgKzIwLDM1IEBACiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCIKIAorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKwogI2luY2x1ZGUgPENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdGF0aWMgY29uc3QgaW50NjRfdCBrQnVmZmVyVGltZU91dFVzID0gMzAwMDBsbDsgLy8gMzAgbXNlYworc3RhdGljIGNvbnN0IHNpemVfdCBrUmV0cnlDb3VudCA9IDIwOyAvLyBtdXN0IGJlID4wCisKIFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OlN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoKQogICAgIDogbVBhcnNlZE1ldGFEYXRhKGZhbHNlKSwKICAgICAgIG1BbGJ1bUFydChOVUxMKSB7CkBAIC00NywxMCArNjAsNyBAQAogCiBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjp+U3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpIHsKICAgICBBTE9HVigiflN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoKSIpOwotCi0gICAgZGVsZXRlIG1BbGJ1bUFydDsKLSAgICBtQWxidW1BcnQgPSBOVUxMOwotCisgICAgY2xlYXJNZXRhZGF0YSgpOwogICAgIG1DbGllbnQuZGlzY29ubmVjdCgpOwogfQogCkBAIC02MCwxMSArNzAsNyBAQAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIHVyaSk7CiAKLSAgICBtUGFyc2VkTWV0YURhdGEgPSBmYWxzZTsKLSAgICBtTWV0YURhdGEuY2xlYXIoKTsKLSAgICBkZWxldGUgbUFsYnVtQXJ0OwotICAgIG1BbGJ1bUFydCA9IE5VTEw7Ci0KKyAgICBjbGVhck1ldGFkYXRhKCk7CiAgICAgbVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoaHR0cFNlcnZpY2UsIHVyaSwgaGVhZGVycyk7CiAKICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CkBAIC05MiwxMSArOTgsNyBAQAogCiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJWQsICUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIikiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwogCi0gICAgbVBhcnNlZE1ldGFEYXRhID0gZmFsc2U7Ci0gICAgbU1ldGFEYXRhLmNsZWFyKCk7Ci0gICAgZGVsZXRlIG1BbGJ1bUFydDsKLSAgICBtQWxidW1BcnQgPSBOVUxMOwotCisgICAgY2xlYXJNZXRhZGF0YSgpOwogICAgIG1Tb3VyY2UgPSBuZXcgRmlsZVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpOwogCiAgICAgc3RhdHVzX3QgZXJyOwpAQCAtMTE3LDczICsxMTksNzIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXRpYyBib29sIGlzWVVWNDIwUGxhbmFyU3VwcG9ydGVkKAotICAgICAgICAgICAgT01YQ2xpZW50ICpjbGllbnQsCi0gICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YSkgeworc3RhdHVzX3QgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4mIHNvdXJjZSkgeworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKERhdGFTb3VyY2UpIik7CiAKLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgIGNsZWFyTWV0YWRhdGEoKTsKKyAgICBtU291cmNlID0gc291cmNlOworICAgIG1FeHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKG1Tb3VyY2UpOwogCi0gICAgVmVjdG9yPENvZGVjQ2FwYWJpbGl0aWVzPiBjYXBzOwotICAgIGlmIChRdWVyeUNvZGVjcyhjbGllbnQtPmludGVyZmFjZSgpLCBtaW1lLAotICAgICAgICAgICAgICAgICAgICB0cnVlLCAvKiBxdWVyeURlY29kZXJzICovCi0gICAgICAgICAgICAgICAgICAgIHRydWUsIC8qIGh3Q29kZWNPbmx5ICovCi0gICAgICAgICAgICAgICAgICAgICZjYXBzKSA9PSBPSykgewotCi0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgY2Fwcy5zaXplKCk7ICsraikgewotICAgICAgICAgICAgQ29kZWNDYXBhYmlsaXRpZXMgY2FwID0gY2Fwc1tqXTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwLm1Db2xvckZvcm1hdHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2FwLm1Db2xvckZvcm1hdHNbaV0gPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBpZiAobUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5zdGFudGlhdGUgYSBNZWRpYUV4dHJhY3Rvci4iKTsKKyAgICAgICAgbVNvdXJjZS5jbGVhcigpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0aWMgVmlkZW9GcmFtZSAqZXh0cmFjdFZpZGVvRnJhbWVXaXRoQ29kZWNGbGFncygKLSAgICAgICAgT01YQ2xpZW50ICpjbGllbnQsCitzdGF0aWMgVmlkZW9GcmFtZSAqZXh0cmFjdFZpZGVvRnJhbWUoCisgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsCiAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhLAogICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwKLSAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGludDY0X3QgZnJhbWVUaW1lVXMsCiAgICAgICAgIGludCBzZWVrTW9kZSkgewogCiAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CiAKLSAgICAvLyBYWFg6Ci0gICAgLy8gT25jZSBhbGwgdmVuZG9ycyBzdXBwb3J0IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIsIHdlIGNhbgotICAgIC8vIHJlbW92ZSB0aGlzIGNoZWNrIGFuZCBhbHdheXMgc2V0IHRoZSBkZWNvZGVyIG91dHB1dCBjb2xvciBmb3JtYXQKLSAgICBpZiAoaXNZVVY0MjBQbGFuYXJTdXBwb3J0ZWQoY2xpZW50LCB0cmFja01ldGEpKSB7Ci0gICAgICAgIGZvcm1hdC0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKLSAgICB9Ci0KLSAgICBzcDxNZWRpYVNvdXJjZT4gZGVjb2RlciA9Ci0gICAgICAgIE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgY2xpZW50LT5pbnRlcmZhY2UoKSwgZm9ybWF0LCBmYWxzZSwgc291cmNlLAotICAgICAgICAgICAgICAgIE5VTEwsIGZsYWdzIHwgT01YQ29kZWM6OmtDbGllbnROZWVkc0ZyYW1lYnVmZmVyKTsKLQotICAgIGlmIChkZWNvZGVyLmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoInVuYWJsZSB0byBpbnN0YW50aWF0ZSB2aWRlbyBkZWNvZGVyLiIpOwotCisgICAgc3A8QU1lc3NhZ2U+IHZpZGVvRm9ybWF0OworICAgIGlmIChjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UodHJhY2tNZXRhLCAmdmlkZW9Gb3JtYXQpICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gY29udmVydCBtZXRhIGRhdGEgdG8gbWVzc2FnZSIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBkZWNvZGVyLT5zdGFydCgpOworICAgIC8vIFRPRE86IFVzZSBGbGV4aWJsZSBjb2xvciBpbnN0ZWFkCisgICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKworICAgIHN0YXR1c190IGVycjsKKyAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBsb29wZXItPnN0YXJ0KCk7CisgICAgc3A8TWVkaWFDb2RlYz4gZGVjb2RlciA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgIGxvb3BlciwgY29tcG9uZW50TmFtZSwgJmVycik7CisKKyAgICBpZiAoZGVjb2Rlci5nZXQoKSA9PSBOVUxMIHx8IGVyciAhPSBPSykgeworICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGluc3RhbnRpYXRlIGRlY29kZXIgWyVzXSIsIGNvbXBvbmVudE5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBlcnIgPSBkZWNvZGVyLT5jb25maWd1cmUodmlkZW9Gb3JtYXQsIE5VTEwgLyogc3VyZmFjZSAqLywgTlVMTCAvKiBjcnlwdG8gKi8sIDAgLyogZmxhZ3MgKi8pOwogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR1coIk9NWENvZGVjOjpzdGFydCByZXR1cm5lZCBlcnJvciAlZCAoMHglMDh4KVxuIiwgZXJyLCBlcnIpOworICAgICAgICBBTE9HVygiY29uZmlndXJlIHJldHVybmVkIGVycm9yICVkICglcykiLCBlcnIsIGFzU3RyaW5nKGVycikpOworICAgICAgICBkZWNvZGVyLT5yZWxlYXNlKCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIC8vIFJlYWQgb25lIG91dHB1dCBidWZmZXIsIGlnbm9yZSBmb3JtYXQgY2hhbmdlIG5vdGlmaWNhdGlvbnMKLSAgICAvLyBhbmQgc3B1cmlvdXMgZW1wdHkgYnVmZmVycy4KKyAgICBlcnIgPSBkZWNvZGVyLT5zdGFydCgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR1coInN0YXJ0IHJldHVybmVkIGVycm9yICVkICglcykiLCBlcnIsIGFzU3RyaW5nKGVycikpOworICAgICAgICBkZWNvZGVyLT5yZWxlYXNlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwogICAgIGlmIChzZWVrTW9kZSA8IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DIHx8CiAgICAgICAgIHNlZWtNb2RlID4gTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpIHsKIAogICAgICAgICBBTE9HRSgiVW5rbm93biBzZWVrIG1vZGU6ICVkIiwgc2Vla01vZGUpOworICAgICAgICBkZWNvZGVyLT5yZWxlYXNlKCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMjAyLDY0ICsyMDMsMTU1IEBACiAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKGZyYW1lVGltZVVzLCBtb2RlKTsKICAgICB9CiAKLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gTlVMTDsKLSAgICBkbyB7Ci0gICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBidWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IGRlY29kZXItPnJlYWQoJmJ1ZmZlciwgJm9wdGlvbnMpOwotICAgICAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7Ci0gICAgfSB3aGlsZSAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQKLSAgICAgICAgICAgICB8fCAoYnVmZmVyICE9IE5VTEwgJiYgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSk7Ci0KKyAgICBlcnIgPSBzb3VyY2UtPnN0YXJ0KCk7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBDSEVDSyhidWZmZXIgPT0gTlVMTCk7CisgICAgICAgIEFMT0dXKCJzb3VyY2UgZmFpbGVkIHRvIHN0YXJ0OiAlZCAoJXMpIiwgZXJyLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgZGVjb2Rlci0+cmVsZWFzZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLSAgICAgICAgQUxPR1YoImRlY29kaW5nIGZyYW1lIGZhaWxlZC4iKTsKKyAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBpbnB1dEJ1ZmZlcnM7CisgICAgZXJyID0gZGVjb2Rlci0+Z2V0SW5wdXRCdWZmZXJzKCZpbnB1dEJ1ZmZlcnMpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR1coImZhaWxlZCB0byBnZXQgaW5wdXQgYnVmZmVyczogJWQgKCVzKSIsIGVyciwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgIGRlY29kZXItPnJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gb3V0cHV0QnVmZmVyczsKKyAgICBlcnIgPSBkZWNvZGVyLT5nZXRPdXRwdXRCdWZmZXJzKCZvdXRwdXRCdWZmZXJzKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gZ2V0IG91dHB1dCBidWZmZXJzOiAlZCAoJXMpIiwgZXJyLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgZGVjb2Rlci0+cmVsZWFzZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0ID0gTlVMTDsKKyAgICBib29sIGhhdmVNb3JlSW5wdXRzID0gdHJ1ZTsKKyAgICBzaXplX3QgaW5kZXgsIG9mZnNldCwgc2l6ZTsKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBzaXplX3QgcmV0cmllc0xlZnQgPSBrUmV0cnlDb3VudDsKKyAgICBib29sIGRvbmUgPSBmYWxzZTsKKworICAgIGRvIHsKKyAgICAgICAgc2l6ZV90IGlucHV0SW5kZXggPSAtMTsKKyAgICAgICAgaW50NjRfdCBwdHNVcyA9IDBsbDsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBzcDxBQnVmZmVyPiBjb2RlY0J1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgd2hpbGUgKGhhdmVNb3JlSW5wdXRzKSB7CisgICAgICAgICAgICBlcnIgPSBkZWNvZGVyLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJmlucHV0SW5kZXgsIGtCdWZmZXJUaW1lT3V0VXMpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dXKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgaW5wdXQiKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0cmllc0xlZnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZWNCdWZmZXIgPSBpbnB1dEJ1ZmZlcnNbaW5wdXRJbmRleF07CisKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICptZWRpYUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgIGVyciA9IHNvdXJjZS0+cmVhZCgmbWVkaWFCdWZmZXIsICZvcHRpb25zKTsKKyAgICAgICAgICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiSW5wdXQgRXJyb3Igb3IgRU9TIik7CisgICAgICAgICAgICAgICAgaGF2ZU1vcmVJbnB1dHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+IGNvZGVjQnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciBzaXplICglenUpIHRvbyBsYXJnZSBmb3IgY29kZWMgaW5wdXQgc2l6ZSAoJXp1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksIGNvZGVjQnVmZmVyLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBCQURfVkFMVUU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCBtZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworCisgICAgICAgICAgICAgICAgQ0hFQ0sobWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZwdHNVcykpOworICAgICAgICAgICAgICAgIG1lbWNweShjb2RlY0J1ZmZlci0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKW1lZGlhQnVmZmVyLT5kYXRhKCkgKyBtZWRpYUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyID09IE9LICYmIGlucHV0SW5kZXggPCBpbnB1dEJ1ZmZlcnMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HVigiUXVldWVJbnB1dDogc2l6ZT0lenUgdHM9JSIgUFJJZDY0ICIgdXMgZmxhZ3M9JXgiLAorICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2l6ZSgpLCBwdHNVcywgZmxhZ3MpOworICAgICAgICAgICAgZXJyID0gZGVjb2Rlci0+cXVldWVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPm9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICBwdHNVcywKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworCisgICAgICAgICAgICAvLyB3ZSBkb24ndCBleHBlY3QgYW4gb3V0cHV0IGZyb20gY29kZWMgY29uZmlnIGJ1ZmZlcgorICAgICAgICAgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIC8vIHdhaXQgZm9yIGEgZGVjb2RlZCBidWZmZXIKKyAgICAgICAgICAgIGVyciA9IGRlY29kZXItPmRlcXVldWVPdXRwdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICZ0aW1lVXMsCisgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAga0J1ZmZlclRpbWVPdXRVcyk7CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJSZWNlaXZlZCBmb3JtYXQgY2hhbmdlIik7CisgICAgICAgICAgICAgICAgZXJyID0gZGVjb2Rlci0+Z2V0T3V0cHV0Rm9ybWF0KCZvdXRwdXRGb3JtYXQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIk91dHB1dCBidWZmZXJzIGNoYW5nZWQiKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBkZWNvZGVyLT5nZXRPdXRwdXRCdWZmZXJzKCZvdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOIC8qIElORk9fVFJZX0FHQUlOX0xBVEVSICovICYmIC0tcmV0cmllc0xlZnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUaW1lZC1vdXQgd2FpdGluZyBmb3Igb3V0cHV0Li4gcmV0cmllcyBsZWZ0ID0gJXp1IiwgcmV0cmllc0xlZnQpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiUmVjZWl2ZWQgYW4gb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiUmVjZWl2ZWQgZXJyb3IgJWQgKCVzKSBpbnN0ZWFkIG9mIG91dHB1dCIsIGVyciwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGVyciA9PSBPSyAmJiAhZG9uZSk7CisKKyAgICBpZiAoZXJyICE9IE9LIHx8IHNpemUgPD0gMCB8fCBvdXRwdXRGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlY29kZSB0aHVtYm5haWwgZnJhbWUiKTsKKyAgICAgICAgc291cmNlLT5zdG9wKCk7CiAgICAgICAgIGRlY29kZXItPnN0b3AoKTsKLQorICAgICAgICBkZWNvZGVyLT5yZWxlYXNlKCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIEFMT0dWKCJzdWNjZXNzZnVsbHkgZGVjb2RlZCB2aWRlbyBmcmFtZS4iKTsKKyAgICBzcDxBQnVmZmVyPiB2aWRlb0ZyYW1lQnVmZmVyID0gb3V0cHV0QnVmZmVycy5pdGVtQXQoaW5kZXgpOwogCi0gICAgaW50MzJfdCB1bnJlYWRhYmxlOwotICAgIGlmIChidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzVW5yZWFkYWJsZSwgJnVucmVhZGFibGUpCi0gICAgICAgICAgICAmJiB1bnJlYWRhYmxlICE9IDApIHsKLSAgICAgICAgQUxPR1YoInZpZGVvIGZyYW1lIGlzIHVucmVhZGFibGUsIGRlY29kZXIgZG9lcyBub3QgZ2l2ZSB1cyBhY2Nlc3MgIgotICAgICAgICAgICAgICJ0byB0aGUgdmlkZW8gZGF0YS4iKTsKLQotICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgYnVmZmVyID0gTlVMTDsKLQotICAgICAgICBkZWNvZGVyLT5zdG9wKCk7Ci0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CiAgICAgaWYgKHRodW1iTmFpbFRpbWUgPj0gMCkgewogICAgICAgICBpZiAodGltZVVzICE9IHRodW1iTmFpbFRpbWUpIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CiAKLSAgICAgICAgICAgIEFMT0dWKCJ0aHVtYk5haWxUaW1lID0gJSIgUFJJZDY0ICIgdXMsIHRpbWVVcyA9ICUiIFBSSWQ2NCAiIHVzLCBtaW1lID0gJXMiLAotICAgICAgICAgICAgICAgICB0aHVtYk5haWxUaW1lLCB0aW1lVXMsIG1pbWUpOworICAgICAgICAgICAgQUxPR1YoInRodW1iTmFpbFRpbWUgPSAlbGxkIHVzLCB0aW1lVXMgPSAlbGxkIHVzLCBtaW1lID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRodW1iTmFpbFRpbWUsIChsb25nIGxvbmcpdGltZVVzLCBtaW1lLmNfc3RyKCkpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBkZWNvZGVyLT5nZXRGb3JtYXQoKTsKLQogICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpKTsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOworICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOworICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7CiAKICAgICBpbnQzMl90IGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tOwotICAgIGlmICghbWV0YS0+ZmluZFJlY3QoCi0gICAgICAgICAgICAgICAga0tleUNyb3BSZWN0LAotICAgICAgICAgICAgICAgICZjcm9wX2xlZnQsICZjcm9wX3RvcCwgJmNyb3BfcmlnaHQsICZjcm9wX2JvdHRvbSkpIHsKKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZFJlY3QoImNyb3AiLCAmY3JvcF9sZWZ0LCAmY3JvcF90b3AsICZjcm9wX3JpZ2h0LCAmY3JvcF9ib3R0b20pKSB7CiAgICAgICAgIGNyb3BfbGVmdCA9IGNyb3BfdG9wID0gMDsKICAgICAgICAgY3JvcF9yaWdodCA9IHdpZHRoIC0gMTsKICAgICAgICAgY3JvcF9ib3R0b20gPSBoZWlnaHQgLSAxOwpAQCAtMjc5LDIzICszNzEsMjEgQEAKICAgICBmcmFtZS0+bURhdGEgPSBuZXcgdWludDhfdFtmcmFtZS0+bVNpemVdOwogICAgIGZyYW1lLT5tUm90YXRpb25BbmdsZSA9IHJvdGF0aW9uQW5nbGU7CiAKLSAgICBpbnQzMl90IGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodDsKLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5V2lkdGgsICZkaXNwbGF5V2lkdGgpKSB7Ci0gICAgICAgIGZyYW1lLT5tRGlzcGxheVdpZHRoID0gZGlzcGxheVdpZHRoOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCAmZGlzcGxheUhlaWdodCkpIHsKLSAgICAgICAgZnJhbWUtPm1EaXNwbGF5SGVpZ2h0ID0gZGlzcGxheUhlaWdodDsKKyAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7CisgICAgaWYgKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlTQVJXaWR0aCwgJnNhcldpZHRoKQorICAgICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVNBUkhlaWdodCwgJnNhckhlaWdodCkKKyAgICAgICAgICAgICYmIHNhckhlaWdodCAhPSAwKSB7CisgICAgICAgIGZyYW1lLT5tRGlzcGxheVdpZHRoID0gKGZyYW1lLT5tRGlzcGxheVdpZHRoICogc2FyV2lkdGgpIC8gc2FySGVpZ2h0OwogICAgIH0KIAogICAgIGludDMyX3Qgc3JjRm9ybWF0OwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZzcmNGb3JtYXQpKTsKKyAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJnNyY0Zvcm1hdCkpOwogCi0gICAgQ29sb3JDb252ZXJ0ZXIgY29udmVydGVyKAotICAgICAgICAgICAgKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXNyY0Zvcm1hdCwgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1KTsKKyAgICBDb2xvckNvbnZlcnRlciBjb252ZXJ0ZXIoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXNyY0Zvcm1hdCwgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1KTsKIAogICAgIGlmIChjb252ZXJ0ZXIuaXNWYWxpZCgpKSB7CiAgICAgICAgIGVyciA9IGNvbnZlcnRlci5jb252ZXJ0KAotICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopdmlkZW9GcmFtZUJ1ZmZlci0+ZGF0YSgpLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b20sCiAgICAgICAgICAgICAgICAgZnJhbWUtPm1EYXRhLApAQCAtMzAzLDE3ICszOTMsMTYgQEAKICAgICAgICAgICAgICAgICBmcmFtZS0+bUhlaWdodCwKICAgICAgICAgICAgICAgICAwLCAwLCBmcmFtZS0+bVdpZHRoIC0gMSwgZnJhbWUtPm1IZWlnaHQgLSAxKTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGNvbG9yIGNvbnZlcnNpb24gZnJvbSBmb3JtYXQgMHglMDh4IHRvICIKLSAgICAgICAgICAgICAgIlJHQjU2NSIsCi0gICAgICAgICAgICAgIHNyY0Zvcm1hdCk7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY29udmVydCBmcm9tIGZvcm1hdCAweCUwOHggdG8gUkdCNTY1Iiwgc3JjRm9ybWF0KTsKIAogICAgICAgICBlcnIgPSBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKLSAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICBidWZmZXIgPSBOVUxMOwotCisgICAgdmlkZW9GcmFtZUJ1ZmZlci5jbGVhcigpOworICAgIHNvdXJjZS0+c3RvcCgpOworICAgIGRlY29kZXItPnJlbGVhc2VPdXRwdXRCdWZmZXIoaW5kZXgpOwogICAgIGRlY29kZXItPnN0b3AoKTsKKyAgICBkZWNvZGVyLT5yZWxlYXNlKCk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJDb2xvcmNvbnZlcnRlciBmYWlsZWQgdG8gY29udmVydCBmcmFtZS4iKTsKQEAgLTM4NCwyMCArNDczLDI5IEBACiAgICAgICAgIG1BbGJ1bUFydCA9IE1lZGlhQWxidW1BcnQ6OmZyb21EYXRhKGRhdGFTaXplLCBkYXRhKTsKICAgICB9CiAKLSAgICBWaWRlb0ZyYW1lICpmcmFtZSA9Ci0gICAgICAgIGV4dHJhY3RWaWRlb0ZyYW1lV2l0aENvZGVjRmxhZ3MoCi0gICAgICAgICAgICAgICAgJm1DbGllbnQsIHRyYWNrTWV0YSwgc291cmNlLCBPTVhDb2RlYzo6a1ByZWZlclNvZnR3YXJlQ29kZWNzLAotICAgICAgICAgICAgICAgIHRpbWVVcywgb3B0aW9uKTsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwogCi0gICAgaWYgKGZyYW1lID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIlNvZnR3YXJlIGRlY29kZXIgZmFpbGVkIHRvIGV4dHJhY3QgdGh1bWJuYWlsLCAiCi0gICAgICAgICAgICAgInRyeWluZyBoYXJkd2FyZSBkZWNvZGVyLiIpOworICAgIFZlY3RvcjxPTVhDb2RlYzo6Q29kZWNOYW1lQW5kUXVpcmtzPiBtYXRjaGluZ0NvZGVjczsKKyAgICBPTVhDb2RlYzo6ZmluZE1hdGNoaW5nQ29kZWNzKAorICAgICAgICAgICAgbWltZSwKKyAgICAgICAgICAgIGZhbHNlLCAvKiBlbmNvZGVyICovCisgICAgICAgICAgICBOVUxMLCAvKiBtYXRjaENvbXBvbmVudE5hbWUgKi8KKyAgICAgICAgICAgIE9NWENvZGVjOjprUHJlZmVyU29mdHdhcmVDb2RlY3MsCisgICAgICAgICAgICAmbWF0Y2hpbmdDb2RlY3MpOwogCi0gICAgICAgIGZyYW1lID0gZXh0cmFjdFZpZGVvRnJhbWVXaXRoQ29kZWNGbGFncygmbUNsaWVudCwgdHJhY2tNZXRhLCBzb3VyY2UsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMsIG9wdGlvbik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lID0gbWF0Y2hpbmdDb2RlY3NbaV0ubU5hbWUuc3RyaW5nKCk7CisgICAgICAgIFZpZGVvRnJhbWUgKmZyYW1lID0KKyAgICAgICAgICAgIGV4dHJhY3RWaWRlb0ZyYW1lKGNvbXBvbmVudE5hbWUsIHRyYWNrTWV0YSwgc291cmNlLCB0aW1lVXMsIG9wdGlvbik7CisKKyAgICAgICAgaWYgKGZyYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBmcmFtZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiJXMgZmFpbGVkIHRvIGV4dHJhY3QgdGh1bWJuYWlsLCB0cnlpbmcgbmV4dCBkZWNvZGVyLiIsIGNvbXBvbmVudE5hbWUpOwogICAgIH0KIAotICAgIHJldHVybiBmcmFtZTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogTWVkaWFBbGJ1bUFydCAqU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6ZXh0cmFjdEFsYnVtQXJ0KCkgewpAQCAtNTE5LDYgKzYxNywxMiBAQAogCiAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfTlVNX1RSQUNLUywgU3RyaW5nOCh0bXApKTsKIAorICAgIGZsb2F0IGNhcHR1cmVGcHM7CisgICAgaWYgKG1ldGEtPmZpbmRGbG9hdChrS2V5Q2FwdHVyZUZyYW1lcmF0ZSwgJmNhcHR1cmVGcHMpKSB7CisgICAgICAgIHNwcmludGYodG1wLCAiJWYiLCBjYXB0dXJlRnBzKTsKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfQ0FQVFVSRV9GUkFNRVJBVEUsIFN0cmluZzgodG1wKSk7CisgICAgfQorCiAgICAgYm9vbCBoYXNBdWRpbyA9IGZhbHNlOwogICAgIGJvb2wgaGFzVmlkZW8gPSBmYWxzZTsKICAgICBpbnQzMl90IHZpZGVvV2lkdGggPSAtMTsKQEAgLTYyOSw0ICs3MzMsMTEgQEAKICAgICB9CiB9CiAKK3ZvaWQgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6Y2xlYXJNZXRhZGF0YSgpIHsKKyAgICBtUGFyc2VkTWV0YURhdGEgPSBmYWxzZTsKKyAgICBtTWV0YURhdGEuY2xlYXIoKTsKKyAgICBkZWxldGUgbUFsYnVtQXJ0OworICAgIG1BbGJ1bUFydCA9IE5VTEw7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjYyZTQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmNwcApAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTdXJmYWNlVXRpbHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaD4KKworI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3Qgc2V0TmF0aXZlV2luZG93U2l6ZUZvcm1hdEFuZFVzYWdlKAorICAgICAgICBBTmF0aXZlV2luZG93ICpuYXRpdmVXaW5kb3cgLyogbm9ubnVsbCAqLywKKyAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgcm90YXRpb24sIGludCB1c2FnZSkgeworICAgIHN0YXR1c190IGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhuYXRpdmVXaW5kb3csIHdpZHRoLCBoZWlnaHQpOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIm5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyBmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQobmF0aXZlV2luZG93LCBmb3JtYXQpOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIm5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0IGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQgdHJhbnNmb3JtID0gMDsKKyAgICBpZiAoKHJvdGF0aW9uICUgOTApID09IDApIHsKKyAgICAgICAgc3dpdGNoICgocm90YXRpb24gLyA5MCkgJiAzKSB7CisgICAgICAgICAgICBjYXNlIDE6ICB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF85MDsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiAgdHJhbnNmb3JtID0gSEFMX1RSQU5TRk9STV9ST1RfMTgwOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzogIHRyYW5zZm9ybSA9IEhBTF9UUkFOU0ZPUk1fUk9UXzI3MDsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiB0cmFuc2Zvcm0gPSAwOyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0obmF0aXZlV2luZG93LCB0cmFuc2Zvcm0pOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIm5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtIGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgdG8gY2hlY2sgd2hldGhlciBlaXRoZXIgU3RhZ2VmcmlnaHQgb3IgdGhlIHZpZGVvIGRlY29kZXIKKyAgICAvLyByZXF1ZXN0ZWQgcHJvdGVjdGVkIGJ1ZmZlcnMuCisgICAgaWYgKHVzYWdlICYgR1JBTExPQ19VU0FHRV9QUk9URUNURUQpIHsKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIEFOYXRpdmVXaW5kb3cgc2VuZHMgaW1hZ2VzIGRpcmVjdGx5IHRvCisgICAgICAgIC8vIFN1cmZhY2VGbGluZ2VyLgorICAgICAgICBpbnQgcXVldWVzVG9OYXRpdmVXaW5kb3cgPSAwOworICAgICAgICBlcnIgPSBuYXRpdmVXaW5kb3ctPnF1ZXJ5KAorICAgICAgICAgICAgICAgIG5hdGl2ZVdpbmRvdywgTkFUSVZFX1dJTkRPV19RVUVVRVNfVE9fV0lORE9XX0NPTVBPU0VSLCAmcXVldWVzVG9OYXRpdmVXaW5kb3cpOworICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiZXJyb3IgYXV0aGVudGljYXRpbmcgbmF0aXZlIHdpbmRvdzogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHF1ZXVlc1RvTmF0aXZlV2luZG93ICE9IDEpIHsKKyAgICAgICAgICAgIEFMT0dFKCJuYXRpdmUgd2luZG93IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIik7CisgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgY29uc3VtZXJVc2FnZSA9IDA7CisgICAgZXJyID0gbmF0aXZlV2luZG93LT5xdWVyeShuYXRpdmVXaW5kb3csIE5BVElWRV9XSU5ET1dfQ09OU1VNRVJfVVNBR0VfQklUUywgJmNvbnN1bWVyVXNhZ2UpOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coImZhaWxlZCB0byBnZXQgY29uc3VtZXIgdXNhZ2UgYml0cy4gaWdub3JpbmciKTsKKyAgICAgICAgZXJyID0gTk9fRVJST1I7CisgICAgfQorCisgICAgaW50IGZpbmFsVXNhZ2UgPSB1c2FnZSB8IGNvbnN1bWVyVXNhZ2U7CisgICAgQUxPR1YoImdyYWxsb2MgdXNhZ2U6ICUjeChwcm9kdWNlcikgKyAlI3goY29uc3VtZXIpID0gJSN4IiwgdXNhZ2UsIGNvbnN1bWVyVXNhZ2UsIGZpbmFsVXNhZ2UpOworICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKG5hdGl2ZVdpbmRvdywgZmluYWxVc2FnZSk7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgibmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZSgKKyAgICAgICAgICAgIG5hdGl2ZVdpbmRvdywgTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XKTsKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF9zY2FsaW5nX21vZGUgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIEFMT0dEKCJzZXQgdXAgbmF0aXZlV2luZG93ICVwIGZvciAlZHglZCwgY29sb3IgJSN4LCByb3RhdGlvbiAlZCwgdXNhZ2UgJSN4IiwKKyAgICAgICAgICAgIG5hdGl2ZVdpbmRvdywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCByb3RhdGlvbiwgZmluYWxVc2FnZSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBwdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3coQU5hdGl2ZVdpbmRvdyAqbmF0aXZlV2luZG93IC8qIG5vbm51bGwgKi8pIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBOT19FUlJPUjsKKyAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmIgPSBOVUxMOworICAgIGludCBudW1CdWZzID0gMDsKKyAgICBpbnQgbWluVW5kZXF1ZXVlZEJ1ZnMgPSAwOworCisgICAgLy8gV2UgbmVlZCB0byByZWNvbm5lY3QgdG8gdGhlIEFOYXRpdmVXaW5kb3cgYXMgYSBDUFUgY2xpZW50IHRvIGVuc3VyZSB0aGF0CisgICAgLy8gbm8gZnJhbWVzIGdldCBkcm9wcGVkIGJ5IFN1cmZhY2VGbGluZ2VyIGFzc3VtaW5nIHRoYXQgdGhlc2UgYXJlIHZpZGVvCisgICAgLy8gZnJhbWVzLgorICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QobmF0aXZlV2luZG93LCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGFwaV9kaXNjb25uZWN0IGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KG5hdGl2ZVdpbmRvdywgTkFUSVZFX1dJTkRPV19BUElfQ1BVKTsKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogYXBpX2Nvbm5lY3QgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgICAgICAodm9pZCluYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KG5hdGl2ZVdpbmRvdywgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGVyciA9IHNldE5hdGl2ZVdpbmRvd1NpemVGb3JtYXRBbmRVc2FnZSgKKyAgICAgICAgICAgIG5hdGl2ZVdpbmRvdywgMSwgMSwgSEFMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODgsIDAsIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBzdGF0aWNfY2FzdDxTdXJmYWNlKj4obmF0aXZlV2luZG93KS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpLT5hbGxvd0FsbG9jYXRpb24odHJ1ZSk7CisKKyAgICBlcnIgPSBuYXRpdmVXaW5kb3ctPnF1ZXJ5KG5hdGl2ZVdpbmRvdywKKyAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywgJm1pblVuZGVxdWV1ZWRCdWZzKTsKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogTUlOX1VOREVRVUVVRURfQlVGRkVSUyBxdWVyeSAiCisgICAgICAgICAgICAgICAgImZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBudW1CdWZzID0gbWluVW5kZXF1ZXVlZEJ1ZnMgKyAxOworICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChuYXRpdmVXaW5kb3csIG51bUJ1ZnMpOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBzZXRfYnVmZmVyX2NvdW50IGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvLyBXZSBwdXNoIG51bUJ1ZnMgKyAxIGJ1ZmZlcnMgdG8gZW5zdXJlIHRoYXQgd2UndmUgZHJhd24gaW50byB0aGUgc2FtZQorICAgIC8vIGJ1ZmZlciB0d2ljZS4gIFRoaXMgc2hvdWxkIGd1YXJhbnRlZSB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4gZGlzcGxheWVkCisgICAgLy8gb24gdGhlIHNjcmVlbiBhbmQgdGhlbiBiZWVuIHJlcGxhY2VkLCBzbyBhbiBwcmV2aW91cyB2aWRlbyBmcmFtZXMgYXJlCisgICAgLy8gZ3VhcmFudGVlZCBOT1QgdG8gYmUgY3VycmVudGx5IGRpc3BsYXllZC4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJ1ZnMgKyAxOyBpKyspIHsKKyAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19kZXF1ZXVlX2J1ZmZlcl9hbmRfd2FpdChuYXRpdmVXaW5kb3csICZhbmIpOworICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGRlcXVldWVCdWZmZXIgZmFpbGVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYobmV3IEdyYXBoaWNCdWZmZXIoYW5iLCBmYWxzZSkpOworCisgICAgICAgIC8vIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoZSBhIDF4MSBjaGVja2VyYm9hcmQgcGF0dGVybiA7KQorICAgICAgICB1aW50MzJfdCAqaW1nID0gTlVMTDsKKyAgICAgICAgZXJyID0gYnVmLT5sb2NrKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICh2b2lkKiopKCZpbWcpKTsKKyAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBsb2NrIGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgKmltZyA9IDA7CisKKyAgICAgICAgZXJyID0gYnVmLT51bmxvY2soKTsKKyAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiB1bmxvY2sgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBuYXRpdmVXaW5kb3ctPnF1ZXVlQnVmZmVyKG5hdGl2ZVdpbmRvdywgYnVmLT5nZXROYXRpdmVCdWZmZXIoKSwgLTEpOworICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IHF1ZXVlQnVmZmVyIGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYW5iID0gTlVMTDsKKyAgICB9CisKK2Vycm9yOgorCisgICAgaWYgKGFuYiAhPSBOVUxMKSB7CisgICAgICAgIG5hdGl2ZVdpbmRvdy0+Y2FuY2VsQnVmZmVyKG5hdGl2ZVdpbmRvdywgYW5iLCAtMSk7CisgICAgICAgIGFuYiA9IE5VTEw7CisgICAgfQorCisgICAgLy8gQ2xlYW4gdXAgYWZ0ZXIgc3VjY2VzcyBvciBlcnJvci4KKyAgICBzdGF0dXNfdCBlcnIyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChuYXRpdmVXaW5kb3csIE5BVElWRV9XSU5ET1dfQVBJX0NQVSk7CisgICAgaWYgKGVycjIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBhcGlfZGlzY29ubmVjdCBmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyMiksIC1lcnIyKTsKKyAgICAgICAgaWYgKGVyciA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgZXJyID0gZXJyMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVycjIgPSBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KG5hdGl2ZVdpbmRvdywgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworICAgIGlmIChlcnIyICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogYXBpX2Nvbm5lY3QgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgICAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBlcnIgPSBlcnIyOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCmluZGV4IDk4N2YxMmQuLjI5NmMyMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKQEAgLTE4MywxMSArMTgzLDI2IEBACiAgICAgICAgIG1zZy0+c2V0SW50MzIoIm1heC1pbnB1dC1zaXplIiwgbWF4SW5wdXRTaXplKTsKICAgICB9CiAKKyAgICBpbnQzMl90IG1heFdpZHRoOworICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleU1heFdpZHRoLCAmbWF4V2lkdGgpKSB7CisgICAgICAgIG1zZy0+c2V0SW50MzIoIm1heC13aWR0aCIsIG1heFdpZHRoKTsKKyAgICB9CisKKyAgICBpbnQzMl90IG1heEhlaWdodDsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlNYXhIZWlnaHQsICZtYXhIZWlnaHQpKSB7CisgICAgICAgIG1zZy0+c2V0SW50MzIoIm1heC1oZWlnaHQiLCBtYXhIZWlnaHQpOworICAgIH0KKwogICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOwogICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgewogICAgICAgICBtc2ctPnNldEludDMyKCJyb3RhdGlvbi1kZWdyZWVzIiwgcm90YXRpb25EZWdyZWVzKTsKICAgICB9CiAKKyAgICBpbnQzMl90IGZwczsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlGcmFtZVJhdGUsICZmcHMpKSB7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImZyYW1lLXJhdGUiLCBmcHMpOworICAgIH0KKwogICAgIHVpbnQzMl90IHR5cGU7CiAgICAgY29uc3Qgdm9pZCAqZGF0YTsKICAgICBzaXplX3Qgc2l6ZTsKQEAgLTQwOCw2ICs0MjMsMzQgQEAKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKICAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0wIiwgYnVmZmVyKTsKKworICAgICAgICBpZiAoIW1ldGEtPmZpbmREYXRhKGtLZXlPcHVzQ29kZWNEZWxheSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0xIiwgYnVmZmVyKTsKKworICAgICAgICBpZiAoIW1ldGEtPmZpbmREYXRhKGtLZXlPcHVzU2Vla1ByZVJvbGwsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOworCisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMiIsIGJ1ZmZlcik7CiAgICAgfQogCiAgICAgKmZvcm1hdCA9IG1zZzsKQEAgLTYxMCwyMSArNjUzLDQ4IEBACiAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heElucHV0U2l6ZSk7CiAgICAgfQogCisgICAgaW50MzJfdCBtYXhXaWR0aDsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoIm1heC13aWR0aCIsICZtYXhXaWR0aCkpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heFdpZHRoLCBtYXhXaWR0aCk7CisgICAgfQorCisgICAgaW50MzJfdCBtYXhIZWlnaHQ7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJtYXgtaGVpZ2h0IiwgJm1heEhlaWdodCkpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heEhlaWdodCwgbWF4SGVpZ2h0KTsKKyAgICB9CisKKyAgICBpbnQzMl90IGZwczsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoImZyYW1lLXJhdGUiLCAmZnBzKSkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5RnJhbWVSYXRlLCBmcHMpOworICAgIH0KKwogICAgIC8vIHJlYXNzZW1ibGUgdGhlIGNzZCBkYXRhIGludG8gaXRzIG9yaWdpbmFsIGZvcm0KICAgICBzcDxBQnVmZmVyPiBjc2QwOwogICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNzZC0wIiwgJmNzZDApKSB7Ci0gICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7IC8vIGRvIHdlIG5lZWQgdG8gYmUgc3RyaWN0ZXIgdGhhbiB0aGlzPworICAgICAgICBpbnQgY3NkMHNpemUgPSBjc2QwLT5zaXplKCk7CisgICAgICAgIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykgewogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY3NkMTsKICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNzZC0xIiwgJmNzZDEpKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBhdmNjWzEwMjRdOyAvLyB0aGF0IG91Z2h0YSBiZSBlbm91Z2gsIHJpZ2h0PwotICAgICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUFWQ0MoY3NkMCwgY3NkMSwgYXZjYyk7Ci0gICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga0tleUFWQ0MsIGF2Y2MsIG91dHNpemUpOworICAgICAgICAgICAgICAgIFZlY3RvcjxjaGFyPiBhdmNjOworICAgICAgICAgICAgICAgIGludCBhdmNjU2l6ZSA9IGNzZDBzaXplICsgY3NkMS0+c2l6ZSgpICsgMTAyNDsKKyAgICAgICAgICAgICAgICBpZiAoYXZjYy5yZXNpemUoYXZjY1NpemUpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3IgYWxsb2NhdGluZyBhdmNjIChzaXplICVkKTsgYWJvcnQgc2V0dGluZyBhdmNjLiIsIGF2Y2NTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0c2l6ZSA9IHJlYXNzZW1ibGVBVkNDKGNzZDAsIGNzZDEsIGF2Y2MuZWRpdEFycmF5KCkpOworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrS2V5QVZDQywgYXZjYy5hcnJheSgpLCBvdXRzaXplKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobWltZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgewotICAgICAgICAgICAgaW50IGNzZDBzaXplID0gY3NkMC0+c2l6ZSgpOwotICAgICAgICAgICAgY2hhciBlc2RzW2NzZDBzaXplICsgMzFdOwotICAgICAgICAgICAgcmVhc3NlbWJsZUVTRFMoY3NkMCwgZXNkcyk7Ci0gICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrS2V5RVNEUywgZXNkcywgc2l6ZW9mKGVzZHMpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyB8fCBtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSB7CisgICAgICAgICAgICBWZWN0b3I8Y2hhcj4gZXNkczsKKyAgICAgICAgICAgIGludCBlc2RzU2l6ZSA9IGNzZDBzaXplICsgMzE7CisgICAgICAgICAgICBpZiAoZXNkcy5yZXNpemUoZXNkc1NpemUpIDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvciBhbGxvY2F0aW5nIGVzZHMgKHNpemUgJWQpOyBhYm9ydCBzZXR0aW5nIGVzZHMuIiwgZXNkc1NpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgd3JpdHRlbiBFU0RTIGlzIGFjdHVhbGx5IGZvciBhbiBhdWRpbyBzdHJlYW0sIGJ1dCBpdCdzIGVub3VnaAorICAgICAgICAgICAgICAgIC8vIGZvciB0cmFuc3BvcnRpbmcgdGhlIENTRCB0byBtdXhlcnMuCisgICAgICAgICAgICAgICAgcmVhc3NlbWJsZUVTRFMoY3NkMCwgZXNkcy5lZGl0QXJyYXkoKSk7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RVNEUywga0tleUVTRFMsIGVzZHMuYXJyYXkoKSwgZXNkcy5zaXplKCkpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC04NjQsNSArOTM0LDg4IEBACiAgICAgcmV0dXJuIEFTdHJpbmcoIjxuby1zY2hlbWUgVVJJIHN1cHByZXNzZWQ+Iik7CiB9CiAKK0hMU1RpbWU6OkhMU1RpbWUoY29uc3Qgc3A8QU1lc3NhZ2U+JiBtZXRhKSA6CisgICAgbVNlcSgtMSksCisgICAgbVRpbWVVcygtMWxsKSwKKyAgICBtTWV0YShtZXRhKSB7CisgICAgaWYgKG1ldGEgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCAmbVNlcSkpOworICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZtVGltZVVzKSk7CisgICAgfQorfQorCitpbnQ2NF90IEhMU1RpbWU6OmdldFNlZ21lbnRUaW1lVXMoKSBjb25zdCB7CisgICAgaW50NjRfdCBzZWdtZW50U3RhcnRUaW1lVXMgPSAtMWxsOworICAgIGlmIChtTWV0YSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKG1NZXRhLT5maW5kSW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsICZzZWdtZW50U3RhcnRUaW1lVXMpKTsKKworICAgICAgICBpbnQ2NF90IHNlZ21lbnRGaXJzdFRpbWVVczsKKyAgICAgICAgaWYgKG1NZXRhLT5maW5kSW50NjQoInNlZ21lbnRGaXJzdFRpbWVVcyIsICZzZWdtZW50Rmlyc3RUaW1lVXMpKSB7CisgICAgICAgICAgICBzZWdtZW50U3RhcnRUaW1lVXMgKz0gbVRpbWVVcyAtIHNlZ21lbnRGaXJzdFRpbWVVczsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkanVzdCBzZWdtZW50IHRpbWUgYnkgcGxheWxpc3QgYWdlIChmb3IgbGl2ZSBzdHJlYW1pbmcpCisgICAgICAgIGludDY0X3QgcGxheWxpc3RUaW1lVXM7CisgICAgICAgIGlmIChtTWV0YS0+ZmluZEludDY0KCJwbGF5bGlzdFRpbWVVcyIsICZwbGF5bGlzdFRpbWVVcykpIHsKKyAgICAgICAgICAgIGludDY0X3QgcGxheWxpc3RBZ2VVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBwbGF5bGlzdFRpbWVVczsKKworICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICAgICAgQ0hFQ0sobU1ldGEtPmZpbmRJbnQ2NCgic2VnbWVudER1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpOworCisgICAgICAgICAgICAvLyByb3VuZCB0byBuZWFyZXN0IHdob2xlIHNlZ21lbnQKKyAgICAgICAgICAgIHBsYXlsaXN0QWdlVXMgPSAocGxheWxpc3RBZ2VVcyArIGR1cmF0aW9uVXMgLyAyKQorICAgICAgICAgICAgICAgICAgICAvIGR1cmF0aW9uVXMgKiBkdXJhdGlvblVzOworCisgICAgICAgICAgICBzZWdtZW50U3RhcnRUaW1lVXMgLT0gcGxheWxpc3RBZ2VVczsKKyAgICAgICAgICAgIGlmIChzZWdtZW50U3RhcnRUaW1lVXMgPCAwKSB7CisgICAgICAgICAgICAgICAgc2VnbWVudFN0YXJ0VGltZVVzID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2VnbWVudFN0YXJ0VGltZVVzOworfQorCitib29sIG9wZXJhdG9yIDwoY29uc3QgSExTVGltZSAmdDAsIGNvbnN0IEhMU1RpbWUgJnQxKSB7CisgICAgLy8gd2UgY2FuIG9ubHkgY29tcGFyZSBkaXNjb250aW51aXR5IHNlcXVlbmNlIGFuZCB0aW1lc3RhbXAuCisgICAgLy8gKG1TZWdtZW50VGltZVVzIGlzIG5vdCByZWxpYWJsZSBpbiBsaXZlIHN0cmVhbWluZyBjYXNlLCBpdCdzIHRoZQorICAgIC8vIHRpbWUgc3RhcnRpbmcgZnJvbSBiZWdpbm5pbmcgb2YgcGxheWxpc3QgYnV0IHBsYXlsaXN0IGNvdWxkIGNoYW5nZS4pCisgICAgcmV0dXJuIHQwLm1TZXEgPCB0MS5tU2VxCisgICAgICAgICAgICB8fCAodDAubVNlcSA9PSB0MS5tU2VxICYmIHQwLm1UaW1lVXMgPCB0MS5tVGltZVVzKTsKK30KKwordm9pZCB3cml0ZVRvQU1lc3NhZ2Uoc3A8QU1lc3NhZ2U+IG1zZywgY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpIHsKKyAgICBtc2ctPnNldEZsb2F0KCJzcGVlZCIsIHJhdGUubVNwZWVkKTsKKyAgICBtc2ctPnNldEZsb2F0KCJwaXRjaCIsIHJhdGUubVBpdGNoKTsKKyAgICBtc2ctPnNldEludDMyKCJhdWRpby1mYWxsYmFjay1tb2RlIiwgcmF0ZS5tRmFsbGJhY2tNb2RlKTsKKyAgICBtc2ctPnNldEludDMyKCJhdWRpby1zdHJldGNoLW1vZGUiLCByYXRlLm1TdHJldGNoTW9kZSk7Cit9CisKK3ZvaWQgcmVhZEZyb21BTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLykgeworICAgICpyYXRlID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOworICAgIENIRUNLKG1zZy0+ZmluZEZsb2F0KCJzcGVlZCIsICZyYXRlLT5tU3BlZWQpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRGbG9hdCgicGl0Y2giLCAmcmF0ZS0+bVBpdGNoKSk7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvLWZhbGxiYWNrLW1vZGUiLCAoaW50MzJfdCAqKSZyYXRlLT5tRmFsbGJhY2tNb2RlKSk7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvLXN0cmV0Y2gtbW9kZSIsIChpbnQzMl90ICopJnJhdGUtPm1TdHJldGNoTW9kZSkpOworfQorCit2b2lkIHdyaXRlVG9BTWVzc2FnZShzcDxBTWVzc2FnZT4gbXNnLCBjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KSB7CisgICAgbXNnLT5zZXRJbnQzMigic3luYy1zb3VyY2UiLCBzeW5jLm1Tb3VyY2UpOworICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvLWFkanVzdC1tb2RlIiwgc3luYy5tQXVkaW9BZGp1c3RNb2RlKTsKKyAgICBtc2ctPnNldEZsb2F0KCJ0b2xlcmFuY2UiLCBzeW5jLm1Ub2xlcmFuY2UpOworICAgIG1zZy0+c2V0RmxvYXQoInZpZGVvLWZwcyIsIHZpZGVvRnBzSGludCk7Cit9CisKK3ZvaWQgcmVhZEZyb21BTWVzc2FnZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csCisgICAgICAgIEFWU3luY1NldHRpbmdzICpzeW5jIC8qIG5vbm51bGwgKi8sCisgICAgICAgIGZsb2F0ICp2aWRlb0ZwcyAvKiBub25udWxsICovKSB7CisgICAgQVZTeW5jU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInN5bmMtc291cmNlIiwgKGludDMyX3QgKikmc2V0dGluZ3MubVNvdXJjZSkpOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpby1hZGp1c3QtbW9kZSIsIChpbnQzMl90ICopJnNldHRpbmdzLm1BdWRpb0FkanVzdE1vZGUpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRGbG9hdCgidG9sZXJhbmNlIiwgJnNldHRpbmdzLm1Ub2xlcmFuY2UpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRGbG9hdCgidmlkZW8tZnBzIiwgdmlkZW9GcHMpKTsKKyAgICAqc3luYyA9IHNldHRpbmdzOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WQlJJU2Vla2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZCUklTZWVrZXIuY3BwCmluZGV4IGU5ODhmNmQuLjhhMGZjYWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZCUklTZWVrZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZCUklTZWVrZXIuY3BwCkBAIC0xMjIsNyArMTIyLDcgQEAKIAogICAgICAgICBzZWVrZXItPm1TZWdtZW50cy5wdXNoKG51bUJ5dGVzKTsKIAotICAgICAgICBBTE9HVigiZW50cnkgIyV6dTogJXUgb2Zmc2V0IDB4JTAxNmxseCIsIGksIG51bUJ5dGVzLCBvZmZzZXQpOworICAgICAgICBBTE9HVigiZW50cnkgIyV6dTogJXUgb2Zmc2V0ICUjMDE2bGx4IiwgaSwgbnVtQnl0ZXMsIChsb25nIGxvbmcpb2Zmc2V0KTsKICAgICAgICAgb2Zmc2V0ICs9IG51bUJ5dGVzOwogICAgIH0KIApAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgICAgICpwb3MgKz0gbVNlZ21lbnRzLml0ZW1BdChzZWdtZW50SW5kZXgrKyk7CiAgICAgfQogCi0gICAgQUxPR1YoImdldE9mZnNldEZvclRpbWUgJSIgUFJJZDY0ICIgdXMgPT4gMHglMDE2bGx4IiwgKnRpbWVVcywgKnBvcyk7CisgICAgQUxPR1YoImdldE9mZnNldEZvclRpbWUgJWxsZCB1cyA9PiAweCUwMTZsbHgiLCAobG9uZyBsb25nKSp0aW1lVXMsIChsb25nIGxvbmcpKnBvcyk7CiAKICAgICAqdGltZVVzID0gbm93VXM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKaW5kZXggY2U1ZjVmZS4uNWZlOWJmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwCkBAIC0yOCw4ICsyOCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+Ci0KLSNpbmNsdWRlICJWaWRlb0ZyYW1lU2NoZWR1bGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTU2LDcgKzU1LDcgQEAKIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gVmlkZW9GcmFtZVNjaGVkdWxlcjo6a0hpc3RvcnlTaXplOwogCiBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQcmVjaXNpb24gPSAxMjsKLXN0YXRpYyBjb25zdCBzaXplX3Qga0Vycm9yVGhyZXNob2xkID0gKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkgLyAxMDsKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtFcnJvclRocmVzaG9sZCA9ICgxIDw8IChrUHJlY2lzaW9uICogMikpIC8gMTA7CiBzdGF0aWMgY29uc3QgaW50NjRfdCBrTXVsdGlwbGVzVGhyZXNob2xkRGl2ID0gNDsgICAgICAgICAgICAvLyAyNSUKIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtSZUZpdFRocmVzaG9sZERpdiA9IDEwMDsgICAgICAgICAgICAgIC8vIDElCiBzdGF0aWMgY29uc3QgbnNlY3NfdCBrTWF4QWxsb3dlZEZyYW1lU2tpcCA9IGtOYW5vc0luMXM7ICAgICAvLyAxIHNlYwpAQCAtMjU4LDcgKzI1Nyw4IEBACiAgICAgICAgICAgICBtUGhhc2UgPSBmaXJzdFRpbWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgQUxPR1YoInByaW1pbmdbJXp1XSBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwgbnVtU2FtcGxlc1RvVXNlLCBtUGhhc2UsIG1QZXJpb2QpOworICAgIEFMT0dWKCJwcmltaW5nWyV6dV0gcGhhc2U6JWxsZCBwZXJpb2Q6JWxsZCIsCisgICAgICAgICAgICBudW1TYW1wbGVzVG9Vc2UsIChsb25nIGxvbmcpbVBoYXNlLCAobG9uZyBsb25nKW1QZXJpb2QpOwogfQogCiBuc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6YWRkU2FtcGxlKG5zZWNzX3QgdGltZSkgewpAQCAtMzE2LDYgKzMxNiwxMCBAQAogICAgIHJldHVybiBtUGVyaW9kOwogfQogCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6Z2V0UGVyaW9kKCkgY29uc3QgeworICAgIHJldHVybiBtUHJpbWVkID8gbVBlcmlvZCA6IDA7Cit9CisKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWUgU2NoZWR1bGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KQEAgLTM4Miw2ICszODYsMTQgQEAKICAgICByZXR1cm4ga0RlZmF1bHRWc3luY1BlcmlvZDsKIH0KIAorZmxvYXQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6Z2V0RnJhbWVSYXRlKCkgeworICAgIG5zZWNzX3QgdmlkZW9QZXJpb2QgPSBtUGxsLmdldFBlcmlvZCgpOworICAgIGlmICh2aWRlb1BlcmlvZCA+IDApIHsKKyAgICAgICAgcmV0dXJuIDFlOSAvIHZpZGVvUGVyaW9kOworICAgIH0KKyAgICByZXR1cm4gMC5mOworfQorCiBuc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXI6OnNjaGVkdWxlKG5zZWNzX3QgcmVuZGVyVGltZSkgewogICAgIG5zZWNzX3Qgb3JpZ1JlbmRlclRpbWUgPSByZW5kZXJUaW1lOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcAppbmRleCA1ZWMzNDM4Li44ZWYyZGNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTE4NiwxNyArMTg3LDMxIEBACiAgICAgICAgICAgICBpZiAoYXNwZWN0X3JhdGlvX2lkYyA9PSAyNTUgLyogZXh0ZW5kZWRTQVIgKi8pIHsKICAgICAgICAgICAgICAgICBzYXJfd2lkdGggPSBici5nZXRCaXRzKDE2KTsKICAgICAgICAgICAgICAgICBzYXJfaGVpZ2h0ID0gYnIuZ2V0Qml0cygxNik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFzcGVjdF9yYXRpb19pZGMgPiAwICYmIGFzcGVjdF9yYXRpb19pZGMgPCAxNCkgewotICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtGaXhlZFNBUldpZHRoW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgIDEsIDEyLCAxMCwgMTYsIDQwLCAyNCwgMjAsIDMyLCA4MCwgMTgsIDE1LCA2NCwgMTYwCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeyB1bnNpZ25lZCB3aWR0aCwgaGVpZ2h0OyB9IGtGaXhlZFNBUnNbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgICAwLCAgMCB9LCAvLyBJbnZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDEyLCAxMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgMTAsIDExIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAxNiwgMTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDQwLCAzMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgMjQsIDExIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAyMCwgMTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDMyLCAxMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgODAsIDMzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAxOCwgMTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDE1LCAxMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgNjQsIDMzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDE2MCwgOTkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgICA0LCAgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgIDMsICAyIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDEgfSwKICAgICAgICAgICAgICAgICB9OwogCi0gICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0ZpeGVkU0FSSGVpZ2h0W10gPSB7Ci0gICAgICAgICAgICAgICAgICAgIDEsIDExLCAxMSwgMTEsIDMzLCAxMSwgMTEsIDExLCAzMywgMTEsIDExLCAzMywgOTkKLSAgICAgICAgICAgICAgICB9OwotCi0gICAgICAgICAgICAgICAgc2FyX3dpZHRoID0ga0ZpeGVkU0FSV2lkdGhbYXNwZWN0X3JhdGlvX2lkYyAtIDFdOwotICAgICAgICAgICAgICAgIHNhcl9oZWlnaHQgPSBrRml4ZWRTQVJIZWlnaHRbYXNwZWN0X3JhdGlvX2lkYyAtIDFdOworICAgICAgICAgICAgICAgIGlmIChhc3BlY3RfcmF0aW9faWRjID4gMCAmJiBhc3BlY3RfcmF0aW9faWRjIDwgTkVMRU0oa0ZpeGVkU0FScykpIHsKKyAgICAgICAgICAgICAgICAgICAgc2FyX3dpZHRoID0ga0ZpeGVkU0FSc1thc3BlY3RfcmF0aW9faWRjXS53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgc2FyX2hlaWdodCA9IGtGaXhlZFNBUnNbYXNwZWN0X3JhdGlvX2lkY10uaGVpZ2h0OworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCmluZGV4IDk0YjFjNWIuLjhkZGZmOTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCkBAIC03NSw3ICs3NSw3IEBACiAKIFNvZnRBQUMyOjp+U29mdEFBQzIoKSB7CiAgICAgYWFjRGVjb2Rlcl9DbG9zZShtQUFDRGVjb2Rlcik7Ci0gICAgZGVsZXRlIG1PdXRwdXREZWxheVJpbmdCdWZmZXI7CisgICAgZGVsZXRlW10gbU91dHB1dERlbGF5UmluZ0J1ZmZlcjsKIH0KIAogdm9pZCBTb2Z0QUFDMjo6aW5pdFBvcnRzKCkgewpAQCAtNjUxLDcgKzY1MSw3IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50VGltZSA9IG1CdWZmZXJUaW1lc3RhbXBzLnRvcCgpOwogICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGltZSArPSBtU3RyZWFtSW5mby0+YWFjU2FtcGxlc1BlckZyYW1lICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwbGwgLyBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwbGwgLyBtU3RyZWFtSW5mby0+YWFjU2FtcGxlUmF0ZTsKICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclRpbWVzdGFtcHMuYWRkKGN1cnJlbnRUaW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtOTAyLDcgKzkwMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGp1c3QvaW50ZXJwb2xhdGUgbmV4dCB0aW1lIHN0YW1wCiAgICAgICAgICAgICAgICAgICAgICAgICAqY3VycmVudEJ1ZkxlZnQgLT0gZGVjb2RlZFNpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAqbmV4dFRpbWVTdGFtcCArPSBtU3RyZWFtSW5mby0+YWFjU2FtcGxlc1BlckZyYW1lICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMGxsIC8gbVN0cmVhbUluZm8tPnNhbXBsZVJhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBsbCAvIG1TdHJlYW1JbmZvLT5hYWNTYW1wbGVSYXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImFkanVzdGVkIG5leHRUaW1lU3RhbXAvc2l6ZSB0byAlbGxkLyVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgKm5leHRUaW1lU3RhbXAsICpjdXJyZW50QnVmTGVmdCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xMDAzLDYgKzEwMDMsNyBAQAogICAgICAgICBtQnVmZmVyU2l6ZXMuY2xlYXIoKTsKICAgICAgICAgbURlY29kZWRTaXplcy5jbGVhcigpOwogICAgICAgICBtTGFzdEluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgbUVuZE9mSW5wdXQgPSBmYWxzZTsKICAgICB9IGVsc2UgewogICAgICAgICBpbnQgYXZhaWw7CiAgICAgICAgIHdoaWxlICgoYXZhaWwgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkpID4gMCkgewpAQCAtMTAxNyw2ICsxMDE4LDcgQEAKICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb3VudCsrOwogICAgICAgICB9CiAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID0gbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zOworICAgICAgICBtRW5kT2ZPdXRwdXQgPSBmYWxzZTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCmluZGV4IDBiYWY1ZmQuLmVkZjY0OGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcApAQCAtNDg5LDcgKzQ4OSwxNSBAQAogICAgIH0KIH0KIAotdm9pZCBTb2Z0QU1SOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewordm9pZCBTb2Z0QU1SOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIEFMT0dWKCJvblBvcnRGbHVzaENvbXBsZXRlZCBwb3J0aW5kZXggJWQsIHJlc2V0dGluZyBmcmFtZSAiLCBwb3J0SW5kZXgpOworICAgIGlmIChwb3J0SW5kZXggPT0gMCkgeworICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9OQVJST1cpIHsKKyAgICAgICAgICAgU3BlZWNoX0RlY29kZV9GcmFtZV9yZXNldChtU3RhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICBwdkRlY29kZXJfQW1yV2JfUmVzZXQobVN0YXRlLCAwIC8qIHJlc2V0X2FsbCAqLyk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHZvaWQgU29mdEFNUjo6b25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuY3BwCmluZGV4IDgzODg0NzIuLjNjMWUxYTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcApAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgImloMjY0X3R5cGVkZWZzLmgiCiAjaW5jbHVkZSAiaXYuaCIKICNpbmNsdWRlICJpdmQuaCIKLSNpbmNsdWRlICJpdGhyZWFkLmgiCiAjaW5jbHVkZSAiaWgyNjRkLmgiCiAjaW5jbHVkZSAiU29mdEFWQ0RlYy5oIgogCkBAIC0xMTUsMTMgKzExNCwxNiBAQAogICAgICAgICAgICAga1Byb2ZpbGVMZXZlbHMsIEFSUkFZX1NJWkUoa1Byb2ZpbGVMZXZlbHMpLAogICAgICAgICAgICAgMzIwIC8qIHdpZHRoICovLCAyNDAgLyogaGVpZ2h0ICovLCBjYWxsYmFja3MsCiAgICAgICAgICAgICBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgbUNvZGVjQ3R4KE5VTEwpLAogICAgICAgbU1lbVJlY29yZHMoTlVMTCksCiAgICAgICBtRmx1c2hPdXRCdWZmZXIoTlVMTCksCiAgICAgICBtT214Q29sb3JGb3JtYXQoT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciksCiAgICAgICBtSXZDb2xvckZvcm1hdChJVl9ZVVZfNDIwUCksCiAgICAgICBtTmV3V2lkdGgobVdpZHRoKSwKICAgICAgIG1OZXdIZWlnaHQobUhlaWdodCksCi0gICAgICBtQ2hhbmdpbmdSZXNvbHV0aW9uKGZhbHNlKSB7CisgICAgICBtTmV3TGV2ZWwoMCksCisgICAgICBtQ2hhbmdpbmdSZXNvbHV0aW9uKGZhbHNlKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSkgewogICAgIGluaXRQb3J0cygKICAgICAgICAgICAgIGtOdW1CdWZmZXJzLCBJTlBVVF9CVUZfU0laRSwga051bUJ1ZmZlcnMsIENPREVDX01JTUVfVFlQRSk7CiAKQEAgLTEzMSw3ICsxMzMsNyBAQAogICAgIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKTsKICAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOwogCi0gICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKKyAgICBDSEVDS19FUShpbml0RGVjb2RlcihtV2lkdGgsIG1IZWlnaHQpLCAoc3RhdHVzX3QpT0spOwogfQogCiBTb2Z0QVZDOjp+U29mdEFWQygpIHsKQEAgLTE5MSw3ICsxOTMsNyBAQAogICAgIHNfY3RsX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QpOwogICAgIHNfY3RsX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOwogCi0gICAgQUxPR1YoIlNldCB0aGUgcnVuLXRpbWUgKGR5bmFtaWMpIHBhcmFtZXRlcnMgc3RyaWRlID0gJXUiLCBzdHJpZGUpOworICAgIEFMT0dWKCJTZXQgdGhlIHJ1bi10aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzIHN0cmlkZSA9ICV6dSIsIHN0cmlkZSk7CiAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19jdGxfaXAsICh2b2lkICopJnNfY3RsX29wKTsKIAogICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgewpAQCAtMjMxLDYgKzIzMyw3IEBACiAgICAgICAgIEFMT0dFKCJFcnJvciBpbiByZXNldDogMHgleCIsIHNfY3RsX29wLnU0X2Vycm9yX2NvZGUpOwogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CiAKICAgICAvKiBTZXQgdGhlIHJ1bi10aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzICovCiAgICAgc2V0UGFyYW1zKG91dHB1dEJ1ZmZlcldpZHRoKCkpOwpAQCAtMjg0LDcgKzI4Nyw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTb2Z0QVZDOjppbml0RGVjb2RlcigpIHsKK3N0YXR1c190IFNvZnRBVkM6OmluaXREZWNvZGVyKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKICAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CiAKICAgICBVV09SRDMyIHU0X251bV9yZW9yZGVyX2ZyYW1lczsKQEAgLTI5MywyOCArMjk2LDMzIEBACiAgICAgV09SRDMyIGk0X2xldmVsOwogCiAgICAgbU51bUNvcmVzID0gR2V0Q1BVQ29yZUNvdW50KCk7CisgICAgbUNvZGVjQ3R4ID0gTlVMTDsKIAogICAgIC8qIEluaXRpYWxpemUgbnVtYmVyIG9mIHJlZiBhbmQgcmVvcmRlciBtb2RlcyAoZm9yIEgyNjQpICovCiAgICAgdTRfbnVtX3Jlb3JkZXJfZnJhbWVzID0gMTY7CiAgICAgdTRfbnVtX3JlZl9mcmFtZXMgPSAxNjsKICAgICB1NF9zaGFyZV9kaXNwX2J1ZiA9IDA7CiAKLSAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gb3V0cHV0QnVmZmVyV2lkdGgoKTsKLSAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gb3V0cHV0QnVmZmVySGVpZ2h0KCk7CisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1Jc0FkYXB0aXZlID8gbUFkYXB0aXZlTWF4V2lkdGggOiB3aWR0aDsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gbUlzQWRhcHRpdmUgPyBtQWRhcHRpdmVNYXhIZWlnaHQgOiBoZWlnaHQ7CiAgICAgdWludDMyX3QgZGlzcGxheVNpemVZID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQ7CiAKLSAgICBpZiAoZGlzcGxheVNpemVZID4gKDE5MjAgKiAxMDg4KSkgewotICAgICAgICBpNF9sZXZlbCA9IDUwOwotICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDEyODAgKiA3MjApKSB7Ci0gICAgICAgIGk0X2xldmVsID0gNDA7Ci0gICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoNzIwICogNTc2KSkgewotICAgICAgICBpNF9sZXZlbCA9IDMxOwotICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDYyNCAqIDMyMCkpIHsKLSAgICAgICAgaTRfbGV2ZWwgPSAzMDsKLSAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICgzNTIgKiAyODgpKSB7Ci0gICAgICAgIGk0X2xldmVsID0gMjE7CisgICAgaWYobU5ld0xldmVsID09IDApeworICAgICAgICBpZiAoZGlzcGxheVNpemVZID4gKDE5MjAgKiAxMDg4KSkgeworICAgICAgICAgICAgaTRfbGV2ZWwgPSA1MDsKKyAgICAgICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoMTI4MCAqIDcyMCkpIHsKKyAgICAgICAgICAgIGk0X2xldmVsID0gNDA7CisgICAgICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDcyMCAqIDU3NikpIHsKKyAgICAgICAgICAgIGk0X2xldmVsID0gMzE7CisgICAgICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDYyNCAqIDMyMCkpIHsKKyAgICAgICAgICAgIGk0X2xldmVsID0gMzA7CisgICAgICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDM1MiAqIDI4OCkpIHsKKyAgICAgICAgICAgIGk0X2xldmVsID0gMjE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpNF9sZXZlbCA9IDIwOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaTRfbGV2ZWwgPSAyMDsKKyAgICAgICAgaTRfbGV2ZWwgPSBtTmV3TGV2ZWw7CiAgICAgfQogCiAgICAgewpAQCAtNDMwLDYgKzQzOCw3IEBACiAKICAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19pbml0X2lwLCAodm9pZCAqKSZzX2luaXRfb3ApOwogICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIG1Db2RlY0N0eCA9IE5VTEw7CiAgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gaW5pdDogMHgleCIsCiAgICAgICAgICAgICAgICAgICAgIHNfaW5pdF9vcC5zX2l2ZF9pbml0X29wX3QudTRfZXJyb3JfY29kZSk7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKQEAgLTQ1Miw3ICs0NjEsNyBAQAogICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkaXNwbGF5U2l6ZVkgKiAzIC8gMjsKICAgICBtRmx1c2hPdXRCdWZmZXIgPSAodWludDhfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYygxMjgsIGJ1ZmZlclNpemUpOwogICAgIGlmIChOVUxMID09IG1GbHVzaE91dEJ1ZmZlcikgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGFsbG9jYXRlIGZsdXNoT3V0cHV0QnVmZmVyIG9mIHNpemUgJXp1IiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgYWxsb2NhdGUgZmx1c2hPdXRwdXRCdWZmZXIgb2Ygc2l6ZSAldSIsIGJ1ZmZlclNpemUpOwogICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgIH0KIApAQCAtNDg5LDEyICs0OTgsMTIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFNvZnRBVkM6OnJlSW5pdERlY29kZXIoKSB7CitzdGF0dXNfdCBTb2Z0QVZDOjpyZUluaXREZWNvZGVyKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKICAgICBzdGF0dXNfdCByZXQ7CiAKICAgICBkZUluaXREZWNvZGVyKCk7CiAKLSAgICByZXQgPSBpbml0RGVjb2RlcigpOworICAgIHJldCA9IGluaXREZWNvZGVyKHdpZHRoLCBoZWlnaHQpOwogICAgIGlmIChPSyAhPSByZXQpIHsKICAgICAgICAgQUxPR0UoIkNyZWF0ZSBmYWlsdXJlIik7CiAgICAgICAgIGRlSW5pdERlY29kZXIoKTsKQEAgLTUwNiw2ICs1MTUsNyBAQAogdm9pZCBTb2Z0QVZDOjpvblJlc2V0KCkgewogICAgIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6Om9uUmVzZXQoKTsKIAorICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOwogICAgIHJlc2V0RGVjb2RlcigpOwogICAgIHJlc2V0UGx1Z2luKCk7CiB9CkBAIC01MTUsMTIgKzUyNSwxOSBAQAogICAgIGNvbnN0IHVpbnQzMl90IG9sZEhlaWdodCA9IG1IZWlnaHQ7CiAgICAgT01YX0VSUk9SVFlQRSByZXQgPSBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKICAgICBpZiAobVdpZHRoICE9IG9sZFdpZHRoIHx8IG1IZWlnaHQgIT0gb2xkSGVpZ2h0KSB7Ci0gICAgICAgIHJlSW5pdERlY29kZXIoKTsKKyAgICAgICAgbU5ld1dpZHRoID0gbVdpZHRoOworICAgICAgICBtTmV3SGVpZ2h0ID0gbUhlaWdodDsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVJbml0RGVjb2RlcihtTmV3V2lkdGgsIG1OZXdIZWlnaHQpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZywgZXJyLCBOVUxMKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiByZXQ7CiB9CiAKLXZvaWQgU29mdEFWQzo6c2V0RGVjb2RlQXJncygKK2Jvb2wgU29mdEFWQzo6c2V0RGVjb2RlQXJncygKICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCiAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjX29wLAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIsCkBAIC01MjgsNyArNTQ1LDYgQEAKICAgICAgICAgc2l6ZV90IHRpbWVTdGFtcEl4KSB7CiAgICAgc2l6ZV90IHNpemVZID0gb3V0cHV0QnVmZmVyV2lkdGgoKSAqIG91dHB1dEJ1ZmZlckhlaWdodCgpOwogICAgIHNpemVfdCBzaXplVVY7Ci0gICAgdWludDhfdCAqcEJ1ZjsKIAogICAgIHBzX2RlY19pcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX2lwX3QpOwogICAgIHBzX2RlY19vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX29wX3QpOwpAQCAtNTQ4LDIyICs1NjQsMjggQEAKICAgICAgICAgcHNfZGVjX2lwLT51NF9udW1fQnl0ZXMgPSAwOwogICAgIH0KIAotICAgIGlmIChvdXRIZWFkZXIpIHsKLSAgICAgICAgcEJ1ZiA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKLSAgICB9IGVsc2UgewotICAgICAgICBwQnVmID0gbUZsdXNoT3V0QnVmZmVyOwotICAgIH0KLQogICAgIHNpemVVViA9IHNpemVZIC8gNDsKICAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzBdID0gc2l6ZVk7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsxXSA9IHNpemVVVjsKICAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzJdID0gc2l6ZVVWOwogCisgICAgdWludDhfdCAqcEJ1ZjsKKyAgICBpZiAob3V0SGVhZGVyKSB7CisgICAgICAgIGlmIChvdXRIZWFkZXItPm5BbGxvY0xlbiA8IHNpemVZICsgKHNpemVVViAqIDIpKSB7CisgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3ODMzNjE2Iik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcEJ1ZiA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBtRmx1c2hPdXRCdWZmZXIgYWx3YXlzIGhhcyB0aGUgcmlnaHQgc2l6ZS4KKyAgICAgICAgcEJ1ZiA9IG1GbHVzaE91dEJ1ZmZlcjsKKyAgICB9CisKICAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IHBCdWY7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBwQnVmICsgc2l6ZVk7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBwQnVmICsgc2l6ZVkgKyBzaXplVVY7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOwotICAgIHJldHVybjsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgU29mdEFWQzo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKICAgICAvKiBPbmNlIHRoZSBvdXRwdXQgYnVmZmVycyBhcmUgZmx1c2hlZCwgaWdub3JlIGFueSBidWZmZXJzIHRoYXQgYXJlIGhlbGQgaW4gZGVjb2RlciAqLwpAQCAtNTkwLDYgKzYxMiw5IEBACiB2b2lkIFNvZnRBVkM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKICAgICBVTlVTRUQocG9ydEluZGV4KTsKIAorICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC02MjIsNiArNjQ3LDExIEBACiAgICAgICAgICAgICBpZiAoIWluUXVldWUuZW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTYzMywxNCArNjYzLDIxIEBACiAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IDA7CiAgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7CiAKLSAgICAgICAgaWYgKGluSGVhZGVyICE9IE5VTEwgJiYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7Ci0gICAgICAgICAgICBtUmVjZWl2ZWRFT1MgPSB0cnVlOworICAgICAgICBpZiAoaW5IZWFkZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKICAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKworICAgICAgICAgICAgICAgIGlmICghKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1SZWNlaXZlZEVPUyA9IHRydWU7CiAgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOwogICAgICAgICAgICAgICAgIHNldEZsdXNoTW9kZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICAgICAgbVJlY2VpdmVkRU9TID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC02NDgsOSArNjg1LDE1IEBACiAgICAgICAgIC8vIHVwZGF0ZSBvdXRwdXQgcG9ydCdzIGRlZmluaXRpb24gYW5kIHJlaW5pdGlhbGl6ZSBkZWNvZGVyLgogICAgICAgICBpZiAobUluaXROZWVkZWQgJiYgIW1Jc0luRmx1c2gpIHsKICAgICAgICAgICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOwotICAgICAgICAgICAgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCZwb3J0V2lsbFJlc2V0LCBtTmV3V2lkdGgsIG1OZXdIZWlnaHQpOwogCi0gICAgICAgICAgICBDSEVDS19FUShyZUluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSByZUluaXREZWNvZGVyKG1OZXdXaWR0aCwgbU5ld0hlaWdodCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcsIGVyciwgTlVMTCk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgbU5ld1dpZHRoLCBtTmV3SGVpZ2h0KTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC02NzYsNyArNzE5LDEyIEBACiAgICAgICAgICAgICBXT1JEMzIgdGltZURlbGF5LCB0aW1lVGFrZW47CiAgICAgICAgICAgICBzaXplX3Qgc2l6ZVksIHNpemVVVjsKIAotICAgICAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpOworICAgICAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRGVjb2RlciBhcmcgc2V0dXAgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gSWYgaW5wdXQgZHVtcCBpcyBlbmFibGVkLCB0aGVuIHdyaXRlIHRvIGZpbGUKICAgICAgICAgICAgIERVTVBfVE9fRklMRShtSW5GaWxlLCBzX2RlY19pcC5wdl9zdHJlYW1fYnVmZmVyLCBzX2RlY19pcC51NF9udW1fQnl0ZXMpOwogCkBAIC02OTEsNiArNzM5LDcgQEAKICAgICAgICAgICAgIGJvb2wgdW5zdXBwb3J0ZWREaW1lbnNpb25zID0KICAgICAgICAgICAgICAgICAoSVZEX1NUUkVBTV9XSURUSF9IRUlHSFRfTk9UX1NVUFBPUlRFRCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKTsKICAgICAgICAgICAgIGJvb2wgcmVzQ2hhbmdlZCA9IChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSk7CisgICAgICAgICAgICBib29sIHVuc3VwcG9ydGVkTGV2ZWwgPSAoSUgyNjREX1VOU1VQUE9SVEVEX0xFVkVMID09IChzX2RlY19vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpOwogCiAgICAgICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgTlVMTCk7CiAgICAgICAgICAgICAvKiBDb21wdXRlIHRpbWUgdGFrZW4gZm9yIGRlY29kZSgpICovCkBAIC03MDgsMTMgKzc1NywzOSBAQAogICAgICAgICAgICAgICAgIG1UaW1lU3RhbXBzVmFsaWRbdGltZVN0YW1wSXhdID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAKKwogICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gaGFuZGxlIENUUyBEZWNvZGVyVGVzdCB0ZXN0Q29kZWNSZXNldHNIMjY0V2l0aG91dFN1cmZhY2UsCiAgICAgICAgICAgICAvLyB3aGljaCBpcyBub3Qgc2VuZGluZyBTUFMvUFBTIGFmdGVyIHBvcnQgcmVjb25maWd1cmF0aW9uIGFuZCBmbHVzaCB0byB0aGUgY29kZWMuCiAgICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWREaW1lbnNpb25zICYmICFtRmx1c2hOZWVkZWQpIHsKICAgICAgICAgICAgICAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoJnBvcnRXaWxsUmVzZXQsIHNfZGVjX29wLnU0X3BpY193ZCwgc19kZWNfb3AudTRfcGljX2h0KTsKKyAgICAgICAgICAgICAgICBtTmV3V2lkdGggPSBzX2RlY19vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgbU5ld0hlaWdodCA9IHNfZGVjX29wLnU0X3BpY19odDsKIAotICAgICAgICAgICAgICAgIENIRUNLX0VRKHJlSW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSByZUluaXREZWNvZGVyKG1OZXdXaWR0aCwgbU5ld0hlaWdodCk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZywgZXJyLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgbU5ld1dpZHRoLCBtTmV3SGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjX2lwLCAmc19kZWNfb3AsIGluSGVhZGVyLCBvdXRIZWFkZXIsIHRpbWVTdGFtcEl4KTsKKworICAgICAgICAgICAgICAgIGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfZGVjX2lwLCAodm9pZCAqKSZzX2RlY19vcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWRMZXZlbCAmJiAhbUZsdXNoTmVlZGVkKSB7CisKKyAgICAgICAgICAgICAgICBtTmV3TGV2ZWwgPSA1MTsKKworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHJlSW5pdERlY29kZXIobU5ld1dpZHRoLCBtTmV3SGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nLCBlcnIsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpOwogCkBAIC03NDUsNiArODIwLDE3IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZExldmVsKSB7CisKKyAgICAgICAgICAgICAgICBpZiAobUZsdXNoTmVlZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHNldEZsdXNoTW9kZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1OZXdMZXZlbCA9IDUxOworICAgICAgICAgICAgICAgIG1Jbml0TmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKCgwIDwgc19kZWNfb3AudTRfcGljX3dkKSAmJiAoMCA8IHNfZGVjX29wLnU0X3BpY19odCkpIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCA9IHNfZGVjX29wLnU0X3BpY193ZDsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBzX2RlY19vcC51NF9waWNfaHQ7CkBAIC03NTgsNyArODQ0LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50KSB7Ci0gICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG1XaWR0aCAqIG1IZWlnaHQgKiAzKSAvIDI7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKSAqIDMpIC8gMjsKIAogICAgICAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IG1UaW1lU3RhbXBzW3NfZGVjX29wLnU0X3RzXTsKICAgICAgICAgICAgICAgICBtVGltZVN0YW1wc1ZhbGlkW3NfZGVjX29wLnU0X3RzXSA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuaAppbmRleCAxOTFhNzFkLi5lOGM2YWIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuaApAQCAtMTAwLDEyICsxMDAsMTQgQEAKICAgICBib29sIG1Jbml0TmVlZGVkOwogICAgIHVpbnQzMl90IG1OZXdXaWR0aDsKICAgICB1aW50MzJfdCBtTmV3SGVpZ2h0OworICAgIHVpbnQzMl90IG1OZXdMZXZlbDsKICAgICAvLyBUaGUgaW5wdXQgc3RyZWFtIGhhcyBjaGFuZ2VkIHRvIGEgZGlmZmVyZW50IHJlc29sdXRpb24sIHdoaWNoIGlzIHN0aWxsIHN1cHBvcnRlZCBieSB0aGUKICAgICAvLyBjb2RlYy4gU28gdGhlIGNvZGVjIGlzIHN3aXRjaGluZyB0byBkZWNvZGUgdGhlIG5ldyByZXNvbHV0aW9uLgogICAgIGJvb2wgbUNoYW5naW5nUmVzb2x1dGlvbjsKICAgICBib29sIG1GbHVzaE5lZWRlZDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKIAotICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7CiAgICAgc3RhdHVzX3QgZGVJbml0RGVjb2RlcigpOwogICAgIHN0YXR1c190IHNldEZsdXNoTW9kZSgpOwogICAgIHN0YXR1c190IHNldFBhcmFtcyhzaXplX3Qgc3RyaWRlKTsKQEAgLTExMyw5ICsxMTUsOSBAQAogICAgIHN0YXR1c190IHNldE51bUNvcmVzKCk7CiAgICAgc3RhdHVzX3QgcmVzZXREZWNvZGVyKCk7CiAgICAgc3RhdHVzX3QgcmVzZXRQbHVnaW4oKTsKLSAgICBzdGF0dXNfdCByZUluaXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgcmVJbml0RGVjb2Rlcih1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKIAotICAgIHZvaWQgc2V0RGVjb2RlQXJncygKKyAgICBib29sIHNldERlY29kZUFyZ3MoCiAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY19pcCwKICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjX29wLAogICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKaW5kZXggYmY1ZTM1My4uYjNmNTIwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCkBAIC00OSwxMCArNDksMTAgQEAKICAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOwogfQogCi10eXBlZGVmIHN0cnVjdCBMZXZlbENvbnZlcnNpb24geworc3RydWN0IExldmVsQ29udmVyc2lvbiB7CiAgICAgT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSBvbXhMZXZlbDsKICAgICBXT1JEMzIgYXZjTGV2ZWw7Ci19IExldmVsQ29uY2Vyc2lvbjsKK307CiAKIHN0YXRpYyBMZXZlbENvbnZlcnNpb24gQ29udmVyc2lvblRhYmxlW10gPSB7CiAgICAgeyBPTVhfVklERU9fQVZDTGV2ZWwxLCAgMTAgfSwKQEAgLTg3LDggKzg3LDIxIEBACiAgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwzMiB9LAogICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKICAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCi19OworICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwxICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwxYiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwxMSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwxMiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwxMyB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwyICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwyMSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwyMiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwzICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwzMSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwzMiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWw0ICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWw0MSB9LAogCit9OwogCiBzdGF0aWMgc2l6ZV90IEdldENQVUNvcmVDb3VudCgpIHsKICAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CkBAIC05OSw3ICsxMTIsNyBAQAogICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOwogI2VuZGlmCiAgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOwotICAgIEFMT0dEKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOwogICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKIH0KIApAQCAtMTQ0LDE1ICsxNTcsMTUgQEAKICAgICAgICAgICAgIGtQcm9maWxlTGV2ZWxzLCBORUxFTShrUHJvZmlsZUxldmVscyksCiAgICAgICAgICAgICAxNzYgLyogd2lkdGggKi8sIDE0NCAvKiBoZWlnaHQgKi8sCiAgICAgICAgICAgICBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtQml0cmF0ZVVwZGF0ZWQoZmFsc2UpLAorICAgICAgbUtleUZyYW1lUmVxdWVzdGVkKGZhbHNlKSwKICAgICAgIG1JdlZpZGVvQ29sb3JGb3JtYXQoSVZfWVVWXzQyMFApLAotICAgICAgbUlEUkZyYW1lUmVmcmVzaEludGVydmFsSW5TZWMoMSksCiAgICAgICBtQVZDRW5jUHJvZmlsZShJVl9QUk9GSUxFX0JBU0UpLAotICAgICAgbUFWQ0VuY0xldmVsKDMxKSwKLSAgICAgIG1QcmV2VGltZXN0YW1wVXMoLTEpLAorICAgICAgbUFWQ0VuY0xldmVsKDQxKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1TYXdJbnB1dEVPUyhmYWxzZSksCisgICAgICBtU2F3T3V0cHV0RU9TKGZhbHNlKSwKICAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCi0gICAgICBtQ29udmVyc2lvbkJ1ZmZlcihOVUxMKSwKICAgICAgIG1Db2RlY0N0eChOVUxMKSB7CiAKICAgICBpbml0UG9ydHMoa051bUJ1ZmZlcnMsIGtOdW1CdWZmZXJzLCAoKG1XaWR0aCAqIG1IZWlnaHQgKiAzKSA+PiAxKSwKQEAgLTE2Miw2ICsxNzUsMTAgQEAKICAgICBHRU5FUkFURV9GSUxFX05BTUVTKCk7CiAgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKICAgICBDUkVBVEVfRFVNUF9GSUxFKG1PdXRGaWxlKTsKKyAgICBtZW1zZXQobUNvbnZlcnNpb25CdWZmZXJzLCAwLCBzaXplb2YobUNvbnZlcnNpb25CdWZmZXJzKSk7CisgICAgbWVtc2V0KG1JbnB1dEJ1ZmZlckluZm8sIDAsIHNpemVvZihtSW5wdXRCdWZmZXJJbmZvKSk7CisKKyAgICBpbml0RW5jUGFyYW1zKCk7CiAKIH0KIApAQCAtMTczLDcgKzE5MCw3IEBACiAgICAgQ0hFQ0soaW5RdWV1ZS5lbXB0eSgpKTsKIH0KIAotT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjppbml0RW5jUGFyYW1zKCkgewordm9pZCAgU29mdEFWQzo6aW5pdEVuY1BhcmFtcygpIHsKICAgICBtQ29kZWNDdHggPSBOVUxMOwogICAgIG1NZW1SZWNvcmRzID0gTlVMTDsKICAgICBtTnVtTWVtUmVjb3JkcyA9IERFRkFVTFRfTUVNX1JFQ19DTlQ7CkBAIC0xODYsNyArMjAzLDYgQEAKICAgICBtSUludGVydmFsID0gREVGQVVMVF9JX0lOVEVSVkFMOwogICAgIG1JRFJJbnRlcnZhbCA9IERFRkFVTFRfSURSX0lOVEVSVkFMOwogICAgIG1EaXNhYmxlRGVibGtMZXZlbCA9IERFRkFVTFRfRElTQUJMRV9ERUJMS19MRVZFTDsKLSAgICBtRnJhbWVSYXRlID0gREVGQVVMVF9TUkNfRlJBTUVfUkFURTsKICAgICBtRW5hYmxlRmFzdFNhZCA9IERFRkFVTFRfRU5BQkxFX0ZBU1RfU0FEOwogICAgIG1FbmFibGVBbHRSZWYgPSBERUZBVUxUX0VOQUJMRV9BTFRfUkVGOwogICAgIG1FbmNTcGVlZCA9IERFRkFVTFRfRU5DX1NQRUVEOwpAQCAtMTk1LDExICsyMTEsMTIgQEAKICAgICBtQUlSUmVmcmVzaFBlcmlvZCA9IERFRkFVTFRfQUlSX1JFRlJFU0hfUEVSSU9EOwogICAgIG1QU05SRW5hYmxlID0gREVGQVVMVF9QU05SX0VOQUJMRTsKICAgICBtUmVjb25FbmFibGUgPSBERUZBVUxUX1JFQ09OX0VOQUJMRTsKKyAgICBtRW50cm9weU1vZGUgPSBERUZBVUxUX0VOVFJPUFlfTU9ERTsKKyAgICBtQmZyYW1lcyA9IERFRkFVTFRfQl9GUkFNRVM7CiAKICAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIE5VTEwpOwogICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIE5VTEwpOwogCi0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiB9CiAKIApAQCAtMjEyLDcgKzIyOSw2IEBACiAgICAgc19kaW1lbnNpb25zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9ESU1FTlNJT05TOwogICAgIHNfZGltZW5zaW9uc19pcC51NF9odCA9IG1IZWlnaHQ7CiAgICAgc19kaW1lbnNpb25zX2lwLnU0X3dkID0gbVdpZHRoOwotICAgIHNfZGltZW5zaW9uc19pcC51NF9zdHJkID0gbVN0cmlkZTsKIAogICAgIHNfZGltZW5zaW9uc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOwogICAgIHNfZGltZW5zaW9uc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CkBAIC0yNjAsOCArMjc2LDggQEAKICAgICBzX2ZyYW1lX3JhdGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKICAgICBzX2ZyYW1lX3JhdGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0ZSQU1FUkFURTsKIAotICAgIHNfZnJhbWVfcmF0ZV9pcC51NF9zcmNfZnJhbWVfcmF0ZSA9IG1GcmFtZVJhdGU7Ci0gICAgc19mcmFtZV9yYXRlX2lwLnU0X3RndF9mcmFtZV9yYXRlID0gbUZyYW1lUmF0ZTsKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfc3JjX2ZyYW1lX3JhdGUgPSBtRnJhbWVyYXRlID4+IDE2OworICAgIHNfZnJhbWVfcmF0ZV9pcC51NF90Z3RfZnJhbWVfcmF0ZSA9IG1GcmFtZXJhdGUgPj4gMTY7CiAKICAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKICAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOwpAQCAtMzMyLDcgKzM0OCw2IEBACiAgICAgaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9pcF90IHNfZnJhbWVfdHlwZV9pcDsKICAgICBpdmVfY3RsX3NldF9mcmFtZV90eXBlX29wX3Qgc19mcmFtZV90eXBlX29wOwogICAgIElWX1NUQVRVU19UIHN0YXR1czsKLQogICAgIHNfZnJhbWVfdHlwZV9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOwogICAgIHNfZnJhbWVfdHlwZV9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfRlJBTUVUWVBFOwogCkBAIC01MDMsNyArNTE4LDYgQEAKIAogICAgIHNfZ29wX3BhcmFtc19pcC51NF9pX2ZybV9pbnRlcnZhbCA9IG1JSW50ZXJ2YWw7CiAgICAgc19nb3BfcGFyYW1zX2lwLnU0X2lkcl9mcm1faW50ZXJ2YWwgPSBtSURSSW50ZXJ2YWw7Ci0gICAgc19nb3BfcGFyYW1zX2lwLnU0X251bV9iX2ZyYW1lcyA9IERFRkFVTFRfQl9GUkFNRVM7CiAKICAgICBzX2dvcF9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKICAgICBzX2dvcF9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOwpAQCAtNTI5LDcgKzU0Myw3IEBACiAgICAgc19wcm9maWxlX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfUFJPRklMRV9QQVJBTVM7CiAKICAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLmVfcHJvZmlsZSA9IERFRkFVTFRfRVBST0ZJTEU7Ci0KKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X2VudHJvcHlfY29kaW5nX21vZGUgPSBtRW50cm9weU1vZGU7CiAgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOwogICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOwogCkBAIC01OTUsNyArNjA5LDYgQEAKIAogT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjppbml0RW5jb2RlcigpIHsKICAgICBJVl9TVEFUVVNfVCBzdGF0dXM7Ci0gICAgc2l6ZV90IGk7CiAgICAgV09SRDMyIGxldmVsOwogICAgIHVpbnQzMl90IGRpc3BsYXlTaXplWTsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwpAQCAtNjE4LDI3ICs2MzEsMjYgQEAKICAgICB9CiAgICAgbUFWQ0VuY0xldmVsID0gTUFYKGxldmVsLCBtQVZDRW5jTGV2ZWwpOwogCi0gICAgaWYgKE9NWF9FcnJvck5vbmUgIT0gKGVyclR5cGUgPSBpbml0RW5jUGFyYW1zKCkpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIHBhcmFtcyIpOwotICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7Ci0gICAgICAgIHJldHVybiBlcnJUeXBlOwotICAgIH0KLQotICAgIG1TdHJpZGUgPSBBTElHTjE2KG1XaWR0aCk7CisgICAgbVN0cmlkZSA9IG1XaWR0aDsKIAogICAgIGlmIChtSW5wdXREYXRhSXNNZXRhKSB7Ci0gICAgICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlcikgewotICAgICAgICAgICAgZnJlZShtQ29udmVyc2lvbkJ1ZmZlcik7Ci0gICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfQ09OVkVSU0lPTl9CVUZGRVJTOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlcnNbaV0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZyZWUobUNvbnZlcnNpb25CdWZmZXJzW2ldKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhtU3RyaWRlICogbUhlaWdodCAqIDMgLyAyKTsKLSAgICAgICAgICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoKCh1aW50NjRfdCltU3RyaWRlICogbUhlaWdodCkgPiAoKHVpbnQ2NF90KUlOVDMyX01BWCAvIDMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkJ1ZmZlciBzaXplIGlzIHRvbyBiaWcuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc1tpXSA9ICh1aW50OF90ICopbWFsbG9jKG1TdHJpZGUgKiBtSGVpZ2h0ICogMyAvIDIpOworCisgICAgICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXJzW2ldID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGluZyBjb252ZXJzaW9uIGJ1ZmZlciBmYWlsZWQuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzRnJlZVtpXSA9IDE7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY1NCw3ICs2NjYsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgQUxPR1YoIlBhcmFtcyB3aWR0aCAlZCBoZWlnaHQgJWQgbGV2ZWwgJWQgY29sb3JGb3JtYXQgJWQiLCBtV2lkdGgsCisgICAgQUxPR0QoIlBhcmFtcyB3aWR0aCAlZCBoZWlnaHQgJWQgbGV2ZWwgJWQgY29sb3JGb3JtYXQgJWQiLCBtV2lkdGgsCiAgICAgICAgICAgICBtSGVpZ2h0LCBtQVZDRW5jTGV2ZWwsIG1JdlZpZGVvQ29sb3JGb3JtYXQpOwogCiAgICAgLyogR2V0dGluZyBOdW1iZXIgb2YgTWVtUmVjb3JkcyAqLwpAQCAtNjc5LDkgKzY5MSwxMyBAQAogICAgIH0KIAogICAgIC8qIEFsbG9jYXRlIGFycmF5IHRvIGhvbGQgbWVtb3J5IHJlY29yZHMgKi8KKyAgICBpZiAobU51bU1lbVJlY29yZHMgPiBTSVpFX01BWCAvIHNpemVvZihpdl9tZW1fcmVjX3QpKSB7CisgICAgICAgIEFMT0dFKCJyZXF1ZXN0ZWQgbWVtb3J5IHNpemUgaXMgdG9vIGJpZy4iKTsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CiAgICAgbU1lbVJlY29yZHMgPSAoaXZfbWVtX3JlY190ICopbWFsbG9jKG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOwogICAgIGlmIChOVUxMID09IG1NZW1SZWNvcmRzKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBob2xkIG1lbW9yeSByZWNvcmRzOiBTaXplICVkIiwKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGhvbGQgbWVtb3J5IHJlY29yZHM6IFNpemUgJXp1IiwKICAgICAgICAgICAgICAgICBtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOwpAQCAtNjkxLDcgKzcwNyw3IEBACiAgICAgewogICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CiAgICAgICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKSB7CiAgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9zaXplID0gc2l6ZW9mKGl2X21lbV9yZWNfdCk7CiAgICAgICAgICAgICBwc19tZW1fcmVjLT5wdl9iYXNlID0gTlVMTDsKICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9zaXplID0gMDsKQEAgLTczOCwxMyArNzU0LDEzIEBACiAgICAgICAgIFdPUkQzMiB0b3RhbF9zaXplOwogICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CiAgICAgICAgIHRvdGFsX3NpemUgPSAwOwotCiAgICAgICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspIHsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspIHsKICAgICAgICAgICAgIHBzX21lbV9yZWMtPnB2X2Jhc2UgPSBpdmVfYWxpZ25lZF9tYWxsb2MoCiAgICAgICAgICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9hbGlnbm1lbnQsIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKICAgICAgICAgICAgIGlmIChwc19tZW1fcmVjLT5wdl9iYXNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGZvciBtZW0gcmVjb3JkIGlkICVkIHNpemUgJWRcbiIsIGksCisgICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBmb3IgbWVtIHJlY29yZCBpZCAlenUgc2l6ZSAldVxuIiwgaSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKQEAgLTc1NSw3ICs3NzEsNiBAQAogCiAgICAgICAgICAgICBwc19tZW1fcmVjKys7CiAgICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCJcblRvdGFsIG1lbW9yeSBmb3IgY29kZWMgJWRcbiIsIHRvdGFsX3NpemUpOwogICAgIH0KIAogICAgIC8qIENvZGVjIEluc3RhbmNlIENyZWF0aW9uICovCkBAIC03ODksNyArODA0LDcgQEAKICAgICAgICAgc19pbml0X2lwLmVfcmNfbW9kZSA9IERFRkFVTFRfUkNfTU9ERTsKICAgICAgICAgc19pbml0X2lwLnU0X21heF9mcmFtZXJhdGUgPSBERUZBVUxUX01BWF9GUkFNRVJBVEU7CiAgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfYml0cmF0ZSA9IERFRkFVTFRfTUFYX0JJVFJBVEU7Ci0gICAgICAgIHNfaW5pdF9pcC51NF9tYXhfbnVtX2JmcmFtZXMgPSBERUZBVUxUX0JfRlJBTUVTOworICAgICAgICBzX2luaXRfaXAudTRfbnVtX2JmcmFtZXMgPSBtQmZyYW1lczsKICAgICAgICAgc19pbml0X2lwLmVfY29udGVudF90eXBlID0gSVZfUFJPR1JFU1NJVkU7CiAgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfc3JjaF9ybmdfeCA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWDsKICAgICAgICAgc19pbml0X2lwLnU0X21heF9zcmNoX3JuZ195ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9ZOwpAQCAtODY0LDcgKzg3OSw2IEBACiAgICAgaXZfcmV0cmlldmVfbWVtX3JlY19pcF90IHNfcmV0cmlldmVfbWVtX2lwOwogICAgIGl2X3JldHJpZXZlX21lbV9yZWNfb3BfdCBzX3JldHJpZXZlX21lbV9vcDsKICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7Ci0gICAgVVdPUkQzMiBpOwogCiAgICAgaWYgKCFtU3RhcnRlZCkgewogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKQEAgLTg4NSwxNiArODk5LDE4IEBACiAKICAgICAvKiBGcmVlIG1lbW9yeSByZWNvcmRzICovCiAgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOwotICAgIGZvciAoaSA9IDA7IGkgPCBzX3JldHJpZXZlX21lbV9vcC51NF9udW1fbWVtX3JlY19maWxsZWQ7IGkrKykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc19yZXRyaWV2ZV9tZW1fb3AudTRfbnVtX21lbV9yZWNfZmlsbGVkOyBpKyspIHsKICAgICAgICAgaXZlX2FsaWduZWRfZnJlZShwc19tZW1fcmVjLT5wdl9iYXNlKTsKICAgICAgICAgcHNfbWVtX3JlYysrOwogICAgIH0KIAogICAgIGZyZWUobU1lbVJlY29yZHMpOwogCi0gICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShtQ29udmVyc2lvbkJ1ZmZlcik7Ci0gICAgICAgIG1Db252ZXJzaW9uQnVmZmVyID0gTlVMTDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9DT05WRVJTSU9OX0JVRkZFUlM7IGkrKykgeworICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXJzW2ldKSB7CisgICAgICAgICAgICBmcmVlKG1Db252ZXJzaW9uQnVmZmVyc1tpXSk7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNbaV0gPSBOVUxMOworICAgICAgICB9CiAgICAgfQogCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKQEAgLTkwOSw2ICs5MjUsMTAgQEAKICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqYml0UmF0ZSA9CiAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oYml0UmF0ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoYml0UmF0ZS0+blBvcnRJbmRleCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTkyMiwyNyArOTQyLDI5IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICphdmNQYXJhbXMgPSAoT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGF2Y1BhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoYXZjUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhdmNQYXJhbXMtPmVQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZTsKLSAgICAgICAgICAgIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgb214TGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwzMTsKKyAgICAgICAgICAgIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgb214TGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWw0MTsKICAgICAgICAgICAgIGlmIChPTVhfRXJyb3JOb25lCiAgICAgICAgICAgICAgICAgICAgICE9IENvbnZlcnRBdmNTcGVjTGV2ZWxUb09teEF2Y0xldmVsKG1BVkNFbmNMZXZlbCwgJm9teExldmVsKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGF2Y1BhcmFtcy0+ZVByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lOwogICAgICAgICAgICAgYXZjUGFyYW1zLT5lTGV2ZWwgPSBvbXhMZXZlbDsKICAgICAgICAgICAgIGF2Y1BhcmFtcy0+blJlZkZyYW1lcyA9IDE7Ci0gICAgICAgICAgICBhdmNQYXJhbXMtPm5CRnJhbWVzID0gMDsKICAgICAgICAgICAgIGF2Y1BhcmFtcy0+YlVzZUhhZGFtYXJkID0gT01YX1RSVUU7CiAgICAgICAgICAgICBhdmNQYXJhbXMtPm5BbGxvd2VkUGljdHVyZVR5cGVzID0gKE9NWF9WSURFT19QaWN0dXJlVHlwZUkKLSAgICAgICAgICAgICAgICAgICAgfCBPTVhfVklERU9fUGljdHVyZVR5cGVQKTsKKyAgICAgICAgICAgICAgICAgICAgfCBPTVhfVklERU9fUGljdHVyZVR5cGVQIHwgT01YX1ZJREVPX1BpY3R1cmVUeXBlQik7CiAgICAgICAgICAgICBhdmNQYXJhbXMtPm5SZWZJZHgxMEFjdGl2ZU1pbnVzMSA9IDA7CiAgICAgICAgICAgICBhdmNQYXJhbXMtPm5SZWZJZHgxMUFjdGl2ZU1pbnVzMSA9IDA7CiAgICAgICAgICAgICBhdmNQYXJhbXMtPmJXZWlnaHRlZFBQcmVkaWN0aW9uID0gT01YX0ZBTFNFOwotICAgICAgICAgICAgYXZjUGFyYW1zLT5iRW50cm9weUNvZGluZ0NBQkFDID0gT01YX0ZBTFNFOwogICAgICAgICAgICAgYXZjUGFyYW1zLT5iY29uc3RJcHJlZCA9IE9NWF9GQUxTRTsKICAgICAgICAgICAgIGF2Y1BhcmFtcy0+YkRpcmVjdDh4OEluZmVyZW5jZSA9IE9NWF9GQUxTRTsKICAgICAgICAgICAgIGF2Y1BhcmFtcy0+YkRpcmVjdFNwYXRpYWxUZW1wb3JhbCA9IE9NWF9GQUxTRTsKQEAgLTk2MSwyNiArOTgzLDQ4IEBACiAgICAgc3dpdGNoIChpbmRleEZ1bGwpIHsKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZToKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGludGVybmFsU2V0Qml0cmF0ZVBhcmFtcygKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqKXBhcmFtcyk7CisgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKmJpdFJhdGUgPQorICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGJpdFJhdGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGludGVybmFsU2V0Qml0cmF0ZVBhcmFtcyhiaXRSYXRlKTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0F2YzoKICAgICAgICAgewogICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgKmF2Y1R5cGUgPSAoT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGF2Y1R5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGF2Y1R5cGUtPm5Qb3J0SW5kZXggIT0gMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChhdmNUeXBlLT5lUHJvZmlsZSAhPSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lCi0gICAgICAgICAgICAgICAgICAgIHx8IGF2Y1R5cGUtPm5SZWZGcmFtZXMgIT0gMSB8fCBhdmNUeXBlLT5uQkZyYW1lcyAhPSAwCisgICAgICAgICAgICBtRW50cm9weU1vZGUgPSAwOworCisgICAgICAgICAgICBpZiAoT01YX1RSVUUgPT0gYXZjVHlwZS0+YkVudHJvcHlDb2RpbmdDQUJBQykKKyAgICAgICAgICAgICAgICBtRW50cm9weU1vZGUgPSAxOworCisgICAgICAgICAgICBpZiAoKGF2Y1R5cGUtPm5BbGxvd2VkUGljdHVyZVR5cGVzICYgT01YX1ZJREVPX1BpY3R1cmVUeXBlQikgJiYKKyAgICAgICAgICAgICAgICAgICAgYXZjVHlwZS0+blBGcmFtZXMpIHsKKyAgICAgICAgICAgICAgICBtQmZyYW1lcyA9IGF2Y1R5cGUtPm5CRnJhbWVzIC8gYXZjVHlwZS0+blBGcmFtZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1JSW50ZXJ2YWwgPSBhdmNUeXBlLT5uUEZyYW1lcyArIGF2Y1R5cGUtPm5CRnJhbWVzOworCisgICAgICAgICAgICBpZiAoT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJEaXNhYmxlID09IGF2Y1R5cGUtPmVMb29wRmlsdGVyTW9kZSkKKyAgICAgICAgICAgICAgICBtRGlzYWJsZURlYmxrTGV2ZWwgPSA0OworCisgICAgICAgICAgICBpZiAoYXZjVHlwZS0+blJlZkZyYW1lcyAhPSAxCiAgICAgICAgICAgICAgICAgICAgIHx8IGF2Y1R5cGUtPmJVc2VIYWRhbWFyZCAhPSBPTVhfVFJVRQotICAgICAgICAgICAgICAgICAgICB8fCAoYXZjVHlwZS0+bkFsbG93ZWRQaWN0dXJlVHlwZXMgJiBPTVhfVklERU9fUGljdHVyZVR5cGVCKSAhPSAwCiAgICAgICAgICAgICAgICAgICAgIHx8IGF2Y1R5cGUtPm5SZWZJZHgxMEFjdGl2ZU1pbnVzMSAhPSAwCiAgICAgICAgICAgICAgICAgICAgIHx8IGF2Y1R5cGUtPm5SZWZJZHgxMUFjdGl2ZU1pbnVzMSAhPSAwCiAgICAgICAgICAgICAgICAgICAgIHx8IGF2Y1R5cGUtPmJXZWlnaHRlZFBQcmVkaWN0aW9uICE9IE9NWF9GQUxTRQotICAgICAgICAgICAgICAgICAgICB8fCBhdmNUeXBlLT5iRW50cm9weUNvZGluZ0NBQkFDICE9IE9NWF9GQUxTRQogICAgICAgICAgICAgICAgICAgICB8fCBhdmNUeXBlLT5iY29uc3RJcHJlZCAhPSBPTVhfRkFMU0UKICAgICAgICAgICAgICAgICAgICAgfHwgYXZjVHlwZS0+YkRpcmVjdDh4OEluZmVyZW5jZSAhPSBPTVhfRkFMU0UKICAgICAgICAgICAgICAgICAgICAgfHwgYXZjVHlwZS0+YkRpcmVjdFNwYXRpYWxUZW1wb3JhbCAhPSBPTVhfRkFMU0UKQEAgLTEwMDgsNiArMTA1MiwxMCBAQAogICAgICAgICAgICAgT01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFICpwYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfQ09ORklHX0lOVFJBUkVGUkVTSFZPUFRZUEUgKilfcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHBhcmFtcy0+blBvcnRJbmRleCAhPSBrT3V0cHV0UG9ydEluZGV4KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKICAgICAgICAgICAgIH0KQEAgLTEwMjEsNiArMTA2OSwxMCBAQAogICAgICAgICAgICAgT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRSAqcGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRSAqKV9wYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAocGFyYW1zLT5uUG9ydEluZGV4ICE9IGtPdXRwdXRQb3J0SW5kZXgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OwogICAgICAgICAgICAgfQpAQCAtMTA3NSwxNCArMTEyNywyNyBAQAogCiAgICAgLyogSW5pdGlhbGl6ZSBjb2xvciBmb3JtYXRzICovCiAgICAgcHNfaW5wX3Jhd19idWYtPmVfY29sb3JfZm10ID0gbUl2VmlkZW9Db2xvckZvcm1hdDsKLQogICAgIHNvdXJjZSA9IE5VTEw7Ci0gICAgaWYgKGlucHV0QnVmZmVySGVhZGVyKSB7CisgICAgaWYgKChpbnB1dEJ1ZmZlckhlYWRlciAhPSBOVUxMKSAmJiBpbnB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbikgewogICAgICAgICBzb3VyY2UgPSBpbnB1dEJ1ZmZlckhlYWRlci0+cEJ1ZmZlciArIGlucHV0QnVmZmVySGVhZGVyLT5uT2Zmc2V0OwogCiAgICAgICAgIGlmIChtSW5wdXREYXRhSXNNZXRhKSB7CisgICAgICAgICAgICB1aW50OF90ICpjb252ZXJzaW9uQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX0NPTlZFUlNJT05fQlVGRkVSUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyc0ZyZWVbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzRnJlZVtpXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25CdWZmZXIgPSBtQ29udmVyc2lvbkJ1ZmZlcnNbaV07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKE5VTEwgPT0gY29udmVyc2lvbkJ1ZmZlcikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJObyBmcmVlIGJ1ZmZlcnMgdG8gaG9sZCBjb252ZXJzaW9uIGRhdGEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBzb3VyY2UgPSBleHRyYWN0R3JhcGhpY0J1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIsIChtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDIpLCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25CdWZmZXIsIChtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDIpLCBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuLCBtV2lkdGgsIG1IZWlnaHQpOwogCiAgICAgICAgICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKQEAgLTEwOTEsNiArMTE1NiwxOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgcHNfZW5jb2RlX2lwLT51NF9pc19sYXN0ID0gMDsKKyAgICAgICAgcHNfZW5jb2RlX2lwLT51NF90aW1lc3RhbXBfaGlnaCA9IChpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCkgPj4gMzI7CisgICAgICAgIHBzX2VuY29kZV9pcC0+dTRfdGltZXN0YW1wX2xvdyA9IChpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCkgJiAweEZGRkZGRkZGOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKG1TYXdJbnB1dEVPUyl7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPnU0X2lzX2xhc3QgPSAxOworICAgICAgICB9CisgICAgICAgIG1lbXNldChwc19pbnBfcmF3X2J1ZiwgMCwgc2l6ZW9mKGl2X3Jhd19idWZfdCkpOworICAgICAgICBwc19pbnBfcmF3X2J1Zi0+ZV9jb2xvcl9mbXQgPSBtSXZWaWRlb0NvbG9yRm9ybWF0OworICAgICAgICBwc19pbnBfcmF3X2J1Zi0+dTRfc2l6ZSA9IHNpemVvZihpdl9yYXdfYnVmX3QpOworICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9CiAKICAgICBwdTFfYnVmID0gKFVXT1JEOCAqKXNvdXJjZTsKQEAgLTExNDUsMTQgKzEyMjIsNiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBwc19lbmNvZGVfaXAtPnU0X2lzX2xhc3QgPSAwOwotCi0gICAgaWYgKGlucHV0QnVmZmVySGVhZGVyKSB7Ci0gICAgICAgIHBzX2VuY29kZV9pcC0+dTRfdGltZXN0YW1wX2hpZ2ggPSAoaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXApID4+IDMyOwotICAgICAgICBwc19lbmNvZGVfaXAtPnU0X3RpbWVzdGFtcF9sb3cgPSAoaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXApICYgMHhGRkZGRkZGRjsKLSAgICB9Ci0KICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKIH0KIApAQCAtMTE3MCwzNSArMTIzOSwzMSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNhd0lucHV0RU9TKSB7CisgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgewogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CiAKLSAgICB3aGlsZSAoIW1TYXdJbnB1dEVPUyAmJiAhaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgd2hpbGUgKCFtU2F3T3V0cHV0RU9TICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisKICAgICAgICAgT01YX0VSUk9SVFlQRSBlcnJvcjsKICAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9pcF90IHNfZW5jb2RlX2lwOwogICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX29wX3Qgc19lbmNvZGVfb3A7Ci0KLSAgICAgICAgQnVmZmVySW5mbyAqaW5wdXRCdWZmZXJJbmZvID0gKmluUXVldWUuYmVnaW4oKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmlucHV0QnVmZmVySGVhZGVyID0gaW5wdXRCdWZmZXJJbmZvLT5tSGVhZGVyOwotCiAgICAgICAgIEJ1ZmZlckluZm8gKm91dHB1dEJ1ZmZlckluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dHB1dEJ1ZmZlckhlYWRlciA9IG91dHB1dEJ1ZmZlckluZm8tPm1IZWFkZXI7CiAKLSAgICAgICAgaWYgKGlucHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKLSAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIGlucHV0QnVmZmVySW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGlucHV0QnVmZmVySGVhZGVyKTsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5wdXRCdWZmZXJJbmZvOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5wdXRCdWZmZXJIZWFkZXI7CiAKLSAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiA9IDA7Ci0gICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKLQotICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBvdXRwdXRCdWZmZXJJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRwdXRCdWZmZXJIZWFkZXIpOworICAgICAgICBpZiAobVNhd0lucHV0RU9TKSB7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlckhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlckluZm8gPSBOVUxMOworICAgICAgICB9IGVsc2UgaWYgKCFpblF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGlucHV0QnVmZmVySW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlckhlYWRlciA9IGlucHV0QnVmZmVySW5mby0+bUhlYWRlcjsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0xMjA4LDYgKzEyNzMsMTAgQEAKICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uT2Zmc2V0ID0gMDsKIAorICAgICAgICBpZiAoaW5wdXRCdWZmZXJIZWFkZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgPSBpbnB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzOworICAgICAgICB9CisKICAgICAgICAgdWludDhfdCAqb3V0UHRyID0gKHVpbnQ4X3QgKilvdXRwdXRCdWZmZXJIZWFkZXItPnBCdWZmZXI7CiAKICAgICAgICAgaWYgKCFtU3BzUHBzSGVhZGVyUmVjZWl2ZWQpIHsKQEAgLTEyMzEsMTAgKzEzMDAsMTMgQEAKIAogICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRzsKICAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiA9IHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlczsKLSAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCA9IGlucHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVySGVhZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgPSBpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICBvdXRwdXRCdWZmZXJJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisKICAgICAgICAgICAgIERVTVBfVE9fRklMRSgKICAgICAgICAgICAgICAgICAgICAgbU91dEZpbGUsIG91dHB1dEJ1ZmZlckhlYWRlci0+cEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuKTsKQEAgLTEyNTIsMTQgKzEzMjQsMjQgQEAKICAgICAgICAgICAgIHNldEZyYW1lVHlwZShJVl9JRFJfRlJBTUUpOwogICAgICAgICB9CiAKLSAgICAgICAgbVByZXZUaW1lc3RhbXBVcyA9IGlucHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wOwotCi0gICAgICAgIGlmIChpbnB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgIGlmICgoaW5wdXRCdWZmZXJIZWFkZXIgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAmJiAoaW5wdXRCdWZmZXJIZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKICAgICAgICAgICAgIG1TYXdJbnB1dEVPUyA9IHRydWU7CiAgICAgICAgIH0KIAorICAgICAgICAvKiBJbiBub3JtYWwgbW9kZSwgc3RvcmUgaW5wdXRCdWZmZXJJbmZvIGFuZCB0aGlzIHdpbGwgYmUgcmV0dXJuZWQKKyAgICAgICAgICAgd2hlbiBlbmNvZGVyIGNvbnN1bWVzIHRoaXMgaW5wdXQgKi8KKyAgICAgICAgaWYgKCFtSW5wdXREYXRhSXNNZXRhICYmIChpbnB1dEJ1ZmZlckluZm8gIT0gTlVMTCkpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUl9IRUFERVJTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCA9PSBtSW5wdXRCdWZmZXJJbmZvW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckluZm9baV0gPSBpbnB1dEJ1ZmZlckluZm87CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBlcnJvciA9IHNldEVuY29kZUFyZ3MoCiAgICAgICAgICAgICAgICAgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3AsIGlucHV0QnVmZmVySGVhZGVyLCBvdXRwdXRCdWZmZXJIZWFkZXIpOworCiAgICAgICAgIGlmIChlcnJvciAhPSBPTVhfRXJyb3JOb25lKSB7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOwpAQCAtMTI2OSwxNCArMTM1MSwxMSBAQAogICAgICAgICBEVU1QX1RPX0ZJTEUoCiAgICAgICAgICAgICAgICAgbUluRmlsZSwgc19lbmNvZGVfaXAuc19pbnBfYnVmLmFwdl9idWZzWzBdLAogICAgICAgICAgICAgICAgIChtSGVpZ2h0ICogbVN0cmlkZSAqIDMgLyAyKSk7Ci0gICAgICAgIC8vRFVNUF9UT19GSUxFKG1JbkZpbGUsIGlucHV0QnVmZmVySGVhZGVyLT5wQnVmZmVyICsgaW5wdXRCdWZmZXJIZWFkZXItPm5PZmZzZXQsCi0gICAgICAgIC8vICAgIGlucHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuKTsKIAogICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsKICAgICAgICAgLyogQ29tcHV0ZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiBlbmQgb2YgcHJldmlvdXMgZGVjb2RlKCkKICAgICAgICAgICogdG8gc3RhcnQgb2YgY3VycmVudCBkZWNvZGUoKSAqLwogICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIHRpbWVEZWxheSk7Ci0KICAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wKTsKIAogICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKQEAgLTEyOTQsMzggKzEzNzMsNzcgQEAKICAgICAgICAgQUxPR1YoInRpbWVUYWtlbj0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIHRpbWVUYWtlbiwgdGltZURlbGF5LAogICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcyk7CiAKKyAgICAgICAgLyogSW4gZW5jb2RlciBmcmVlcyB1cCBhbiBpbnB1dCBidWZmZXIsIG1hcmsgaXQgYXMgZnJlZSAqLworICAgICAgICBpZiAoc19lbmNvZGVfb3Auc19pbnBfYnVmLmFwdl9idWZzWzBdICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChtSW5wdXREYXRhSXNNZXRhKSB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfQ09OVkVSU0lPTl9CVUZGRVJTOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyc1tpXSA9PSBzX2VuY29kZV9vcC5zX2lucF9idWYuYXB2X2J1ZnNbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0ZyZWVbaV0gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIEluIG5vcm1hbCBtb2RlLCBjYWxsIEVCRCBvbiBpbkJ1ZmZlSGVhZGVyIHRoYXQgaXMgZnJlZWQgYnkgdGhlIGNvZGVjICovCisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSX0hFQURFUlM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpidWYgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmSGRyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckluZm9baV0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmSGRyID0gbUlucHV0QnVmZmVySW5mb1tpXS0+bUhlYWRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGJ1Zkhkci0+cEJ1ZmZlciArIGJ1Zkhkci0+bk9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc19lbmNvZGVfb3Auc19pbnBfYnVmLmFwdl9idWZzWzBdID09IGJ1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVySW5mb1tpXS0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGJ1Zkhkcik7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJJbmZvW2ldID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgPSBpbnB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzOwogICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4gPSBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXM7Ci0gICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCA9IGlucHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wOwogCi0gICAgICAgIGlmIChJVl9JRFJfRlJBTUUKLSAgICAgICAgICAgICAgICA9PSBzX2VuY29kZV9vcC51NF9lbmNvZGVkX2ZyYW1lX3R5cGUpIHsKKyAgICAgICAgaWYgKElWX0lEUl9GUkFNRSA9PSBzX2VuY29kZV9vcC51NF9lbmNvZGVkX2ZyYW1lX3R5cGUpIHsKICAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX1NZTkNGUkFNRTsKICAgICAgICAgfQogCi0gICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgaW5wdXRCdWZmZXJJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIGlmIChpbnB1dEJ1ZmZlckhlYWRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CiAKLSAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGlucHV0QnVmZmVySGVhZGVyKTsKLQotICAgICAgICBpZiAobVNhd0lucHV0RU9TKSB7Ci0gICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICAvKiBJZiBpbiBtZXRhIGRhdGEsIGNhbGwgRUJEIG9uIGlucHV0ICovCisgICAgICAgICAgICAvKiBJbiBjYXNlIG9mIG5vcm1hbCBtb2RlLCBFQkQgd2lsbCBiZSBkb25lIG9uY2UgZW5jb2RlcgorICAgICAgICAgICAgcmVsZWFzZXMgdGhlIGlucHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgaWYgKG1JbnB1dERhdGFJc01ldGEpIHsKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlckluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5wdXRCdWZmZXJIZWFkZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgb3V0cHV0QnVmZmVySW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgaWYgKHNfZW5jb2RlX29wLnU0X2lzX2xhc3QpIHsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgIG1TYXdPdXRwdXRFT1MgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgJj0gfk9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgfQogCi0gICAgICAgIERVTVBfVE9fRklMRSgKLSAgICAgICAgICAgICAgICBtT3V0RmlsZSwgb3V0cHV0QnVmZmVySGVhZGVyLT5wQnVmZmVyLAotICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbik7Ci0gICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dHB1dEJ1ZmZlckhlYWRlcik7CisgICAgICAgIGlmIChvdXRwdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4gfHwgc19lbmNvZGVfb3AudTRfaXNfbGFzdCkgeworICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wID0gc19lbmNvZGVfb3AudTRfdGltZXN0YW1wX2hpZ2g7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgPDw9IDMyOworICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wIHw9IHNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9sb3c7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXJJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIERVTVBfVE9fRklMRShtT3V0RmlsZSwgb3V0cHV0QnVmZmVySGVhZGVyLT5wQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4pOworICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0cHV0QnVmZmVySGVhZGVyKTsKKyAgICAgICAgfQogCisgICAgICAgIGlmIChzX2VuY29kZV9vcC51NF9pc19sYXN0ID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgIH0KICAgICByZXR1cm47CiB9CiAKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmgKaW5kZXggYzRlMjZhOS4uNDQxOGE3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgX19TT0ZUX0FWQ19FTkNfSF9fCiAjZGVmaW5lIF9fU09GVF9BVkNfRU5DX0hfXwogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKwogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIApAQCAtMjUsMTQgKzI1LDE0IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IE1lZGlhQnVmZmVyOwotCisjZGVmaW5lIE1BWF9JTlBVVF9CVUZGRVJfSEVBREVSUyA0CisjZGVmaW5lIE1BWF9DT05WRVJTSU9OX0JVRkZFUlMgICA0CiAjZGVmaW5lIENPREVDX01BWF9DT1JFUyAgICAgICAgICA0CiAjZGVmaW5lIExFTl9TVEFUVVNfQlVGRkVSICAgICAgICAoMTAgICogMTAyNCkKICNkZWZpbmUgTUFYX1ZCVl9CVUZGX1NJWkUgICAgICAgICgxMjAgKiAxNjM4NCkKICNkZWZpbmUgTUFYX05VTV9JT19CVUZTICAgICAgICAgICAzCiAKLSNkZWZpbmUgREVGQVVMVF9NQVhfUkVGX0ZSTSAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9NQVhfUkVGX0ZSTSAgICAgICAgIDIKICNkZWZpbmUgREVGQVVMVF9NQVhfUkVPUkRFUl9GUk0gICAgIDAKICNkZWZpbmUgREVGQVVMVF9RUF9NSU4gICAgICAgICAgICAgIDEwCiAjZGVmaW5lIERFRkFVTFRfUVBfTUFYICAgICAgICAgICAgICA0MApAQCAtNTcsNyArNTcsNyBAQAogI2RlZmluZSBERUZBVUxUX1RHVF9GUkFNRV9SQVRFICAgICAgMzAKICNkZWZpbmUgREVGQVVMVF9NQVhfV0QgICAgICAgICAgICAgIDE5MjAKICNkZWZpbmUgREVGQVVMVF9NQVhfSFQgICAgICAgICAgICAgIDE5MjAKLSNkZWZpbmUgREVGQVVMVF9NQVhfTEVWRUwgICAgICAgICAgIDQwCisjZGVmaW5lIERFRkFVTFRfTUFYX0xFVkVMICAgICAgICAgICA0MQogI2RlZmluZSBERUZBVUxUX1NUUklERSAgICAgICAgICAgICAgMAogI2RlZmluZSBERUZBVUxUX1dEICAgICAgICAgICAgICAgICAgMTI4MAogI2RlZmluZSBERUZBVUxUX0hUICAgICAgICAgICAgICAgICAgNzIwCkBAIC04OCw2ICs4OCw3IEBACiAjZGVmaW5lIERFRkFVTFRfUVBFTCAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIERFRkFVTFRfSTQgICAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIERFRkFVTFRfRVBST0ZJTEUgICAgICAgICAgICBJVl9QUk9GSUxFX0JBU0UKKyNkZWZpbmUgREVGQVVMVF9FTlRST1BZX01PREUgICAgICAgIDAKICNkZWZpbmUgREVGQVVMVF9TTElDRV9NT0RFICAgICAgICAgIElWRV9TTElDRV9NT0RFX05PTkUKICNkZWZpbmUgREVGQVVMVF9TTElDRV9QQVJBTSAgICAgICAgIDI1NgogI2RlZmluZSBERUZBVUxUX0FSQ0ggICAgICAgICAgICAgICAgQVJDSF9BUk1fQTlRCkBAIC0xNDksOCArMTUwLDYgQEAKIAogICAgIGludDMyX3QgIG1TdHJpZGU7CiAKLSAgICB1aW50MzJfdCBtRnJhbWVSYXRlOwotCiAgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsgICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQogICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOyAgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCiAKQEAgLTE2NywzMiArMTY2LDMyIEBACiAKICAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZWaWRlb0NvbG9yRm9ybWF0OwogCi0gICAgaW50MzJfdCAgbUlEUkZyYW1lUmVmcmVzaEludGVydmFsSW5TZWM7CiAgICAgSVZfUFJPRklMRV9UIG1BVkNFbmNQcm9maWxlOwogICAgIFdPUkQzMiAgIG1BVkNFbmNMZXZlbDsKLSAgICBpbnQ2NF90ICBtTnVtSW5wdXRGcmFtZXM7Ci0gICAgaW50NjRfdCAgbVByZXZUaW1lc3RhbXBVczsKICAgICBib29sICAgICBtU3RhcnRlZDsKICAgICBib29sICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQ7CiAKICAgICBib29sICAgICBtU2F3SW5wdXRFT1M7CisgICAgYm9vbCAgICAgbVNhd091dHB1dEVPUzsKICAgICBib29sICAgICBtU2lnbmFsbGVkRXJyb3I7CiAgICAgYm9vbCAgICAgbUludHJhNHg0OwogICAgIGJvb2wgICAgIG1FbmFibGVGYXN0U2FkOwogICAgIGJvb2wgICAgIG1FbmFibGVBbHRSZWY7Ci0gICAgYm9vbCAgICBtUmVjb25FbmFibGU7Ci0gICAgYm9vbCAgICBtUFNOUkVuYWJsZTsKKyAgICBib29sICAgICBtUmVjb25FbmFibGU7CisgICAgYm9vbCAgICAgbVBTTlJFbmFibGU7CisgICAgYm9vbCAgICAgbUVudHJvcHlNb2RlOwogICAgIElWRV9TUEVFRF9DT05GSUcgICAgIG1FbmNTcGVlZDsKIAotICAgIHVpbnQ4X3QgKm1Db252ZXJzaW9uQnVmZmVyOwotCisgICAgdWludDhfdCAqbUNvbnZlcnNpb25CdWZmZXJzW01BWF9DT05WRVJTSU9OX0JVRkZFUlNdOworICAgIGJvb2wgICAgIG1Db252ZXJzaW9uQnVmZmVyc0ZyZWVbTUFYX0NPTlZFUlNJT05fQlVGRkVSU107CisgICAgQnVmZmVySW5mbyAqbUlucHV0QnVmZmVySW5mb1tNQVhfSU5QVVRfQlVGRkVSX0hFQURFUlNdOwogICAgIGl2X29ial90ICptQ29kZWNDdHg7ICAgICAgICAgLy8gQ29kZWMgY29udGV4dAogICAgIGl2X21lbV9yZWNfdCAqbU1lbVJlY29yZHM7ICAgLy8gTWVtb3J5IHJlY29yZHMgcmVxdWVzdGVkIGJ5IHRoZSBjb2RlYwogICAgIHNpemVfdCBtTnVtTWVtUmVjb3JkczsgICAgICAgLy8gTnVtYmVyIG9mIG1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSBjb2RlYwogICAgIHNpemVfdCBtTnVtQ29yZXM7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGNvcmVzIHVzZWQgYnkgdGhlIGNvZGVjCiAKICAgICBVV09SRDMyIG1IZWFkZXJHZW5lcmF0ZWQ7Ci0KKyAgICBVV09SRDMyIG1CZnJhbWVzOwogICAgIElWX0FSQ0hfVCBtQXJjaDsKICAgICBJVkVfU0xJQ0VfTU9ERV9UIG1TbGljZU1vZGU7CiAgICAgVVdPUkQzMiBtU2xpY2VQYXJhbTsKQEAgLTIwMyw3ICsyMDIsNyBAQAogICAgIElWRV9BSVJfTU9ERV9UIG1BSVJNb2RlOwogICAgIFVXT1JEMzIgbUFJUlJlZnJlc2hQZXJpb2Q7CiAKLSAgICBPTVhfRVJST1JUWVBFIGluaXRFbmNQYXJhbXMoKTsKKyAgICB2b2lkIGluaXRFbmNQYXJhbXMoKTsKICAgICBPTVhfRVJST1JUWVBFIGluaXRFbmNvZGVyKCk7CiAgICAgT01YX0VSUk9SVFlQRSByZWxlYXNlRW5jb2RlcigpOwogCkBAIC0yOTIsNiArMjkxLDggQEAKICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSAlcyIsIG1fZmlsZW5hbWUpO1wKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KICNlbHNlIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCmluZGV4IDNkZTk1YTUuLmM4Mjc3ZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcApAQCAtMjQwLDYgKzI0MCwxNSBAQAogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiAqIHNpemVvZihpbnQxNl90KSA+IG91dEhlYWRlci0+bkFsbG9jTGVuKSB7CisgICAgICAgICAgICBBTE9HRSgib3V0cHV0IGJ1ZmZlciB0b28gc21hbGwgKCVkKS4iLCBvdXRIZWFkZXItPm5BbGxvY0xlbik7CisgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3NzkzMTYzIik7CisKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dHB0ciA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CiAKICAgICAgICAgaWYgKG1Jc01MYXcpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAKaW5kZXggNzkxNmM0NS4uMDRkNWEzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAKQEAgLTIyOCw2ICsyMjgsMTQgQEAKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAob3V0SGVhZGVyLT5uQWxsb2NMZW4gPCAoaW5IZWFkZXItPm5GaWxsZWRMZW4gLyBrTVNHU01GcmFtZVNpemUpICogMzIwKSB7CisgICAgICAgICAgICBBTE9HRSgib3V0cHV0IGJ1ZmZlciBpcyBub3QgbGFyZ2UgZW5vdWdoICglZCkuIiwgb3V0SGVhZGVyLT5uQWxsb2NMZW4pOworICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzc5MzM2NyIpOworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIHVpbnQ4X3QgKmlucHV0cHRyID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKIAogICAgICAgICBpbnQgbiA9IG1TaWduYWxsZWRFcnJvciA/IDAgOiBEZWNvZGVHU00obUdzbSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcAppbmRleCBjZGRkMTc2Li5lN2Y5ZGYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuY3BwCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAiaWhldmNfdHlwZWRlZnMuaCIKICNpbmNsdWRlICJpdi5oIgogI2luY2x1ZGUgIml2ZC5oIgotI2luY2x1ZGUgIml0aHJlYWQuaCIKICNpbmNsdWRlICJpaGV2Y2RfY3hhLmgiCiAjaW5jbHVkZSAiU29mdEhFVkMuaCIKIApAQCAtODIsNyArODEsMTAgQEAKICAgICBpbml0UG9ydHMoCiAgICAgICAgICAgICBrTnVtQnVmZmVycywgbWF4KGtNYXhPdXRwdXRCdWZmZXJTaXplIC8ga01pbkNvbXByZXNzaW9uUmF0aW8sIChzaXplX3QpSU5QVVRfQlVGX1NJWkUpLAogICAgICAgICAgICAga051bUJ1ZmZlcnMsIENPREVDX01JTUVfVFlQRSwga01pbkNvbXByZXNzaW9uUmF0aW8pOwotICAgIENIRUNLX0VRKGluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7Cit9CisKK3N0YXR1c190IFNvZnRIRVZDOjppbml0KCkgeworICAgIHJldHVybiBpbml0RGVjb2RlcigpOwogfQogCiBTb2Z0SEVWQzo6flNvZnRIRVZDKCkgewpAQCAtMTQzLDcgKzE0NSw3IEBACiAgICAgc19jdGxfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfaXBfdCk7CiAgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfb3BfdCk7CiAKLSAgICBBTE9HVigiU2V0IHRoZSBydW4tdGltZSAoZHluYW1pYykgcGFyYW1ldGVycyBzdHJpZGUgPSAldSIsIHN0cmlkZSk7CisgICAgQUxPR1YoIlNldCB0aGUgcnVuLXRpbWUgKGR5bmFtaWMpIHBhcmFtZXRlcnMgc3RyaWRlID0gJXp1Iiwgc3RyaWRlKTsKICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2N0bF9pcCwKICAgICAgICAgICAgICh2b2lkICopJnNfY3RsX29wKTsKIApAQCAtNDA4LDcgKzQxMCw3IEBACiAgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGRpc3BsYXlTaXplWSAqIDMgLyAyOwogICAgIG1GbHVzaE91dEJ1ZmZlciA9ICh1aW50OF90ICopaXZkX2FsaWduZWRfbWFsbG9jKDEyOCwgYnVmZmVyU2l6ZSk7CiAgICAgaWYgKE5VTEwgPT0gbUZsdXNoT3V0QnVmZmVyKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgYWxsb2NhdGUgZmx1c2hPdXRwdXRCdWZmZXIgb2Ygc2l6ZSAlenUiLCBidWZmZXJTaXplKTsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBhbGxvY2F0ZSBmbHVzaE91dHB1dEJ1ZmZlciBvZiBzaXplICV1IiwgYnVmZmVyU2l6ZSk7CiAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgfQogCkBAIC00NzgsMTQgKzQ4MCwxMyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXZvaWQgU29mdEhFVkM6OnNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCitib29sIFNvZnRIRVZDOjpzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjX2lwLAogICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY19vcCwKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyLAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyLAogICAgICAgICBzaXplX3QgdGltZVN0YW1wSXgpIHsKICAgICBzaXplX3Qgc2l6ZVkgPSBvdXRwdXRCdWZmZXJXaWR0aCgpICogb3V0cHV0QnVmZmVySGVpZ2h0KCk7CiAgICAgc2l6ZV90IHNpemVVVjsKLSAgICB1aW50OF90ICpwQnVmOwogCiAgICAgcHNfZGVjX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CiAgICAgcHNfZGVjX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfb3BfdCk7CkBAIC01MDUsMjIgKzUwNiwyOCBAQAogICAgICAgICBwc19kZWNfaXAtPnU0X251bV9CeXRlcyA9IDA7CiAgICAgfQogCi0gICAgaWYgKG91dEhlYWRlcikgewotICAgICAgICBwQnVmID0gb3V0SGVhZGVyLT5wQnVmZmVyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBCdWYgPSBtRmx1c2hPdXRCdWZmZXI7Ci0gICAgfQotCiAgICAgc2l6ZVVWID0gc2l6ZVkgLyA0OwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMF0gPSBzaXplWTsKICAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzFdID0gc2l6ZVVWOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMl0gPSBzaXplVVY7CiAKKyAgICB1aW50OF90ICpwQnVmOworICAgIGlmIChvdXRIZWFkZXIpIHsKKyAgICAgICAgaWYgKG91dEhlYWRlci0+bkFsbG9jTGVuIDwgc2l6ZVkgKyAoc2l6ZVVWICogMikpIHsKKyAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjc4MzM2MTYiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwQnVmID0gb3V0SGVhZGVyLT5wQnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG1GbHVzaE91dEJ1ZmZlciBhbHdheXMgaGFzIHRoZSByaWdodCBzaXplLgorICAgICAgICBwQnVmID0gbUZsdXNoT3V0QnVmZmVyOworICAgIH0KKwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gcEJ1ZjsKICAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IHBCdWYgKyBzaXplWTsKICAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IHBCdWYgKyBzaXplWSArIHNpemVVVjsKICAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9udW1fYnVmcyA9IDM7Ci0gICAgcmV0dXJuOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBTb2Z0SEVWQzo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKICAgICAvKiBPbmNlIHRoZSBvdXRwdXQgYnVmZmVycyBhcmUgZmx1c2hlZCwgaWdub3JlIGFueSBidWZmZXJzIHRoYXQgYXJlIGhlbGQgaW4gZGVjb2RlciAqLwpAQCAtNjM1LDcgKzY0MiwxMSBAQAogICAgICAgICAgICAgV09SRDMyIHRpbWVEZWxheSwgdGltZVRha2VuOwogICAgICAgICAgICAgc2l6ZV90IHNpemVZLCBzaXplVVY7CiAKLSAgICAgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjX2lwLCAmc19kZWNfb3AsIGluSGVhZGVyLCBvdXRIZWFkZXIsIHRpbWVTdGFtcEl4KTsKKyAgICAgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkRlY29kZXIgYXJnIHNldHVwIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOwogICAgICAgICAgICAgLyogQ29tcHV0ZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiBlbmQgb2YgcHJldmlvdXMgZGVjb2RlKCkKQEAgLTc2Niw1ICs3NzcsMTAgQEAKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLCBPTVhfUFRSIGFwcERhdGEsCiAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7Ci0gICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpTb2Z0SEVWQyhuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCk7CisgICAgYW5kcm9pZDo6U29mdEhFVkMgKmNvZGVjID0gbmV3IGFuZHJvaWQ6OlNvZnRIRVZDKG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKKyAgICBpZiAoY29kZWMtPmluaXQoKSAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50PiByZWxlYXNlID0gY29kZWM7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gY29kZWM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuaAppbmRleCBhOTFmNTI4Li5kZmNjYTllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmgKQEAgLTU2LDYgKzU2LDggQEAKICAgICBTb2Z0SEVWQyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCiAgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKIAorICAgIHN0YXR1c190IGluaXQoKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflNvZnRIRVZDKCk7CiAKQEAgLTExMSw3ICsxMTMsNyBAQAogICAgIHN0YXR1c190IHJlc2V0UGx1Z2luKCk7CiAgICAgc3RhdHVzX3QgcmVJbml0RGVjb2RlcigpOwogCi0gICAgdm9pZCBzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjX2lwLAorICAgIGJvb2wgc2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY19pcCwKICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNfb3AsCiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciwKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcAppbmRleCBkYWZhOGE1Li4xZGQ2MzFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCkBAIC0xMDMsMzQgKzEwMyw0MSBAQAogICAgIHdoaWxlICghaW5RdWV1ZS5lbXB0eSgpICYmIG91dFF1ZXVlLnNpemUoKSA9PSBrTnVtT3V0cHV0QnVmZmVycykgewogICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgICAgIGlmIChpbkhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKICAgICAgICAgUG9ydEluZm8gKnBvcnQgPSBlZGl0UG9ydEluZm8oMSk7CiAKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9CiAgICAgICAgICAgICBwb3J0LT5tQnVmZmVycy5lZGl0SXRlbUF0KG1OdW1TYW1wbGVzT3V0cHV0ICYgMSkubUhlYWRlcjsKIAotICAgICAgICBpZiAoKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICYmIGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKIAogICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKIAotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKLSAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOwogCi0gICAgICAgICAgICBMaXN0PEJ1ZmZlckluZm8gKj46Oml0ZXJhdG9yIGl0ID0gb3V0UXVldWUuYmVnaW4oKTsKLSAgICAgICAgICAgIHdoaWxlICgoKml0KS0+bUhlYWRlciAhPSBvdXRIZWFkZXIpIHsKLSAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIExpc3Q8QnVmZmVySW5mbyAqPjo6aXRlcmF0b3IgaXQgPSBvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgICAgIHdoaWxlICgoKml0KS0+bUhlYWRlciAhPSBvdXRIZWFkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKml0OworICAgICAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqaXQ7Ci0gICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShpdCk7Ci0gICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKLQotICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKLSAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKaW5kZXggNDUxNjM2Yy4uOWY3ZGQ1OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCkBAIC0xMjAsNiArMTIwLDE3IEBACiAgICAgbUlzRmlyc3QgPSB0cnVlOwogfQogCit2b2lkICpTb2Z0TVAzOjptZW1zZXRTYWZlKE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIsIGludCBjLCBzaXplX3QgbGVuKSB7CisgICAgaWYgKGxlbiA+IG91dEhlYWRlci0+bkFsbG9jTGVuKSB7CisgICAgICAgIEFMT0dFKCJtZW1zZXQgYnVmZmVyIHRvbyBzbWFsbDogZ290ICV1LCBleHBlY3RlZCAlenUiLCBvdXRIZWFkZXItPm5BbGxvY0xlbiwgbGVuKTsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyOTQyMjAyMiIpOworICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgT1VUUFVUX0JVRkZFUl9UT09fU01BTEwsIE5VTEwpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG1lbXNldChvdXRIZWFkZXItPnBCdWZmZXIsIGMsIGxlbik7Cit9CisKIE9NWF9FUlJPUlRZUEUgU29mdE1QMzo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoIChpbmRleCkgewpAQCAtMzAwLDE2ICszMTEsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0ga1BWTVAzRGVjb2RlckRlbGF5ICogbU51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOwogCi0gICAgICAgICAgICAgICAgICAgIG1lbXNldChvdXRIZWFkZXItPnBCdWZmZXIsIDAsIG91dEhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgICAgICAgICAgICAgIGlmICghbWVtc2V0U2FmZShvdXRIZWFkZXIsIDAsIG91dEhlYWRlci0+bkZpbGxlZExlbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOwogICAgICAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHJlY292ZXJhYmxlLCBqdXN0IGlnbm9yZSB0aGUgY3VycmVudCBmcmFtZSBhbmQKICAgICAgICAgICAgICAgICAvLyBwbGF5IHNpbGVuY2UgaW5zdGVhZC4KLSAgICAgICAgICAgICAgICBtZW1zZXQob3V0SGVhZGVyLT5wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCkpOworCisgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIHNraXAgc2lsZW5jZSAoYW5kIGNvbnN1bWUgaW5wdXQgZGF0YSkKKyAgICAgICAgICAgICAgICAvLyBpZiBtSXNGaXJzdCBpcyB0cnVlIGFzIHdlIG1heSBub3QgaGF2ZSBhIHZhbGlkCisgICAgICAgICAgICAgICAgLy8gbUNvbmZpZy0+c2FtcGxpbmdSYXRlIGFuZCBtQ29uZmlnLT5udW1fY2hhbm5lbHM/CisgICAgICAgICAgICAgICAgQUxPR1ZfSUYobUlzRmlyc3QsICJpbnN1ZmZpY2llbnQgZGF0YSBmb3IgZmlyc3QgZnJhbWUsIHNlbmRpbmcgc2lsZW5jZSIpOworICAgICAgICAgICAgICAgIGlmICghbWVtc2V0U2FmZShvdXRIZWFkZXIsIDAsIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlcikgewogICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKQEAgLTM0MSw4ICszNjAsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0KLSAgICAgICAgICAgIG1BbmNob3JUaW1lVXMKLSAgICAgICAgICAgICAgICArIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMGxsKSAvIG1Db25maWctPnNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgKyAobU51bUZyYW1lc091dHB1dCAqIDEwMDAwMDBsbCkgLyBtU2FtcGxpbmdSYXRlOwogCiAgICAgICAgIGlmIChpbkhlYWRlcikgewogICAgICAgICAgICAgQ0hFQ0tfR0UoaW5IZWFkZXItPm5GaWxsZWRMZW4sIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5oCmluZGV4IGY5ZTdiNTMuLjNiZmE2YzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5oCkBAIC03Miw2ICs3Miw3IEBACiAKICAgICB2b2lkIGluaXRQb3J0cygpOwogICAgIHZvaWQgaW5pdERlY29kZXIoKTsKKyAgICB2b2lkICptZW1zZXRTYWZlKE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIsIGludCBjLCBzaXplX3QgbGVuKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRNUDMpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5jcHAKaW5kZXggN2U5ODkyOC4uMjliNjJmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlICJpdl9kYXRhdHlwZWRlZi5oIgogI2luY2x1ZGUgIml2LmgiCiAjaW5jbHVkZSAiaXZkLmgiCi0jaW5jbHVkZSAiaXRocmVhZC5oIgogI2luY2x1ZGUgImltcGVnMmQuaCIKICNpbmNsdWRlICJTb2Z0TVBFRzIuaCIKIApAQCAtMTU2LDcgKzE1NSw3IEBACiAgICAgc19jdGxfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfaXBfdCk7CiAgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfb3BfdCk7CiAKLSAgICBBTE9HVigiU2V0IHRoZSBydW4tdGltZSAoZHluYW1pYykgcGFyYW1ldGVycyBzdHJpZGUgPSAldSIsIHN0cmlkZSk7CisgICAgQUxPR1YoIlNldCB0aGUgcnVuLXRpbWUgKGR5bmFtaWMpIHBhcmFtZXRlcnMgc3RyaWRlID0gJXp1Iiwgc3RyaWRlKTsKICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2N0bF9pcCwgKHZvaWQgKikmc19jdGxfb3ApOwogCiAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CkBAIC0zOTYsNyArMzk1LDcgQEAKICAgICB1aW50MzJfdCBidWZmZXJTaXplID0gZGlzcGxheVNpemVZICogMyAvIDI7CiAgICAgbUZsdXNoT3V0QnVmZmVyID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MoMTI4LCBidWZmZXJTaXplKTsKICAgICBpZiAoTlVMTCA9PSBtRmx1c2hPdXRCdWZmZXIpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBhbGxvY2F0ZSBmbHVzaE91dHB1dEJ1ZmZlciBvZiBzaXplICV6dSIsIGJ1ZmZlclNpemUpOworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGFsbG9jYXRlIGZsdXNoT3V0cHV0QnVmZmVyIG9mIHNpemUgJXUiLCBidWZmZXJTaXplKTsKICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICB9CiAKQEAgLTQ2Niw3ICs0NjUsNyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXZvaWQgU29mdE1QRUcyOjpzZXREZWNvZGVBcmdzKAorYm9vbCBTb2Z0TVBFRzI6OnNldERlY29kZUFyZ3MoCiAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjX2lwLAogICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY19vcCwKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyLApAQCAtNDc0LDcgKzQ3Myw2IEBACiAgICAgICAgIHNpemVfdCB0aW1lU3RhbXBJeCkgewogICAgIHNpemVfdCBzaXplWSA9IG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKICAgICBzaXplX3Qgc2l6ZVVWOwotICAgIHVpbnQ4X3QgKnBCdWY7CiAKICAgICBwc19kZWNfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKICAgICBwc19kZWNfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKQEAgLTQ5NCwyMiArNDkyLDI4IEBACiAgICAgICAgIHBzX2RlY19pcC0+dTRfbnVtX0J5dGVzID0gMDsKICAgICB9CiAKLSAgICBpZiAob3V0SGVhZGVyKSB7Ci0gICAgICAgIHBCdWYgPSBvdXRIZWFkZXItPnBCdWZmZXI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcEJ1ZiA9IG1GbHVzaE91dEJ1ZmZlcjsKLSAgICB9Ci0KICAgICBzaXplVVYgPSBzaXplWSAvIDQ7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVswXSA9IHNpemVZOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMV0gPSBzaXplVVY7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsyXSA9IHNpemVVVjsKIAorICAgIHVpbnQ4X3QgKnBCdWY7CisgICAgaWYgKG91dEhlYWRlcikgeworICAgICAgICBpZiAob3V0SGVhZGVyLT5uQWxsb2NMZW4gPCBzaXplWSArIChzaXplVVYgKiAyKSkgeworICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzgzMzYxNiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBCdWYgPSBvdXRIZWFkZXItPnBCdWZmZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbUZsdXNoT3V0QnVmZmVyIGFsd2F5cyBoYXMgdGhlIHJpZ2h0IHNpemUuCisgICAgICAgIHBCdWYgPSBtRmx1c2hPdXRCdWZmZXI7CisgICAgfQorCiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBwQnVmOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gcEJ1ZiArIHNpemVZOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gcEJ1ZiArIHNpemVZICsgc2l6ZVVWOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKLSAgICByZXR1cm47CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIFNvZnRNUEVHMjo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKICAgICAvKiBPbmNlIHRoZSBvdXRwdXQgYnVmZmVycyBhcmUgZmx1c2hlZCwgaWdub3JlIGFueSBidWZmZXJzIHRoYXQgYXJlIGhlbGQgaW4gZGVjb2RlciAqLwpAQCAtNjIyLDcgKzYyNiwxMSBAQAogICAgICAgICAgICAgV09SRDMyIHRpbWVEZWxheSwgdGltZVRha2VuOwogICAgICAgICAgICAgc2l6ZV90IHNpemVZLCBzaXplVVY7CiAKLSAgICAgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjX2lwLCAmc19kZWNfb3AsIGluSGVhZGVyLCBvdXRIZWFkZXIsIHRpbWVTdGFtcEl4KTsKKyAgICAgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkRlY29kZXIgYXJnIHNldHVwIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBJZiBpbnB1dCBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gd3JpdGUgdG8gZmlsZQogICAgICAgICAgICAgRFVNUF9UT19GSUxFKG1JbkZpbGUsIHNfZGVjX2lwLnB2X3N0cmVhbV9idWZmZXIsIHNfZGVjX2lwLnU0X251bV9CeXRlcyk7CiAKQEAgLTY2NSw5ICs2NzMsOSBAQAogCiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEocmVJbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOwogCi0gICAgICAgICAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpOwotCi0gICAgICAgICAgICAgICAgaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsICh2b2lkICopJnNfZGVjX29wKTsKKyAgICAgICAgICAgICAgICBpZiAoc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpKSB7CisgICAgICAgICAgICAgICAgICAgIGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfZGVjX2lwLCAodm9pZCAqKSZzX2RlY19vcCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5oCmluZGV4IGE2MjVlMDguLmY0OGI3MGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmgKQEAgLTExNyw3ICsxMTcsNyBAQAogICAgIHN0YXR1c190IHJlc2V0UGx1Z2luKCk7CiAgICAgc3RhdHVzX3QgcmVJbml0RGVjb2RlcigpOwogCi0gICAgdm9pZCBzZXREZWNvZGVBcmdzKAorICAgIGJvb2wgc2V0RGVjb2RlQXJncygKICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjX2lwLAogICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNfb3AsCiAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCmluZGV4IDI1ODY2MDYuLjkxMmZhYzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCkBAIC0zOCw3ICszOCwxMCBAQAogICAgICAgICAgICAgTlVMTCAvKiBwcm9maWxlTGV2ZWxzICovLCAwIC8qIG51bVByb2ZpbGVMZXZlbHMgKi8sCiAgICAgICAgICAgICAzMjAgLyogd2lkdGggKi8sIDI0MCAvKiBoZWlnaHQgKi8sIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKICAgICAgIG1Nb2RlKGNvZGluZ1R5cGUgPT0gT01YX1ZJREVPX0NvZGluZ1ZQOCA/IE1PREVfVlA4IDogTU9ERV9WUDkpLAorICAgICAgbUVPU1N0YXR1cyhJTlBVVF9EQVRBX0FWQUlMQUJMRSksCiAgICAgICBtQ3R4KE5VTEwpLAorICAgICAgbUZyYW1lUGFyYWxsZWxNb2RlKGZhbHNlKSwKKyAgICAgIG1UaW1lU3RhbXBJZHgoMCksCiAgICAgICBtSW1nKE5VTEwpIHsKICAgICAvLyBhcmJpdHJhcnkgZnJvbSBhdmMvaGV2YyBhcyB2cHggZG9lcyBub3Qgc3BlY2lmeSBhIG1pbiBjb21wcmVzc2lvbiByYXRpbwogICAgIGNvbnN0IHNpemVfdCBrTWluQ29tcHJlc3Npb25SYXRpbyA9IG1Nb2RlID09IE1PREVfVlA4ID8gMiA6IDQ7CkBAIC01MSw5ICs1NCw3IEBACiB9CiAKIFNvZnRWUFg6On5Tb2Z0VlBYKCkgewotICAgIHZweF9jb2RlY19kZXN0cm95KCh2cHhfY29kZWNfY3R4X3QgKiltQ3R4KTsKLSAgICBkZWxldGUgKHZweF9jb2RlY19jdHhfdCAqKW1DdHg7Ci0gICAgbUN0eCA9IE5VTEw7CisgICAgZGVzdHJveURlY29kZXIoKTsKIH0KIAogc3RhdGljIGludCBHZXRDUFVDb3JlQ291bnQoKSB7CkBAIC03MywxMiArNzQsMTkgQEAKICAgICBtQ3R4ID0gbmV3IHZweF9jb2RlY19jdHhfdDsKICAgICB2cHhfY29kZWNfZXJyX3QgdnB4X2VycjsKICAgICB2cHhfY29kZWNfZGVjX2NmZ190IGNmZzsKKyAgICB2cHhfY29kZWNfZmxhZ3NfdCBmbGFnczsKICAgICBtZW1zZXQoJmNmZywgMCwgc2l6ZW9mKHZweF9jb2RlY19kZWNfY2ZnX3QpKTsKKyAgICBtZW1zZXQoJmZsYWdzLCAwLCBzaXplb2YodnB4X2NvZGVjX2ZsYWdzX3QpKTsKICAgICBjZmcudGhyZWFkcyA9IEdldENQVUNvcmVDb3VudCgpOworCisgICAgaWYgKG1GcmFtZVBhcmFsbGVsTW9kZSkgeworICAgICAgICBmbGFncyB8PSBWUFhfQ09ERUNfVVNFX0ZSQU1FX1RIUkVBRElORzsKKyAgICB9CisKICAgICBpZiAoKHZweF9lcnIgPSB2cHhfY29kZWNfZGVjX2luaXQoCiAgICAgICAgICAgICAgICAgKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsCiAgICAgICAgICAgICAgICAgIG1Nb2RlID09IE1PREVfVlA4ID8gJnZweF9jb2RlY192cDhfZHhfYWxnbyA6ICZ2cHhfY29kZWNfdnA5X2R4X2FsZ28sCi0gICAgICAgICAgICAgICAgICZjZmcsIDApKSkgeworICAgICAgICAgICAgICAgICAmY2ZnLCBmbGFncykpKSB7CiAgICAgICAgIEFMT0dFKCJvbjIgZGVjb2RlciBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4gKCVkKSIsIHZweF9lcnIpOwogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CkBAIC04Niw5MSArOTQsMTc3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBTb2Z0VlBYOjpkZXN0cm95RGVjb2RlcigpIHsKKyAgICB2cHhfY29kZWNfZGVzdHJveSgodnB4X2NvZGVjX2N0eF90ICopbUN0eCk7CisgICAgZGVsZXRlICh2cHhfY29kZWNfY3R4X3QgKiltQ3R4OworICAgIG1DdHggPSBOVUxMOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBTb2Z0VlBYOjpvdXRwdXRCdWZmZXJzKGJvb2wgZmx1c2hEZWNvZGVyLCBib29sIGRpc3BsYXksIGJvb2wgZW9zLCBib29sICpwb3J0V2lsbFJlc2V0KSB7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CisgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9IE5VTEw7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IE5VTEw7CisgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gTlVMTDsKKworICAgIGlmIChmbHVzaERlY29kZXIgJiYgbUZyYW1lUGFyYWxsZWxNb2RlKSB7CisgICAgICAgIC8vIEZsdXNoIGRlY29kZXIgYnkgcGFzc2luZyBOVUxMIGRhdGEgcHRyIGFuZCAwIHNpemUuCisgICAgICAgIC8vIElkZWFsbHksIHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuCisgICAgICAgIGlmICh2cHhfY29kZWNfZGVjb2RlKCh2cHhfY29kZWNfY3R4X3QgKiltQ3R4LCBOVUxMLCAwLCBOVUxMLCAwKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmbHVzaCBvbjIgZGVjb2Rlci4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZGlzcGxheSkgeworICAgICAgICBpZiAoIWZsdXNoRGVjb2RlcikgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgb3BlcmF0aW9uLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIERyb3AgYWxsIHRoZSBkZWNvZGVkIGZyYW1lcyBpbiBkZWNvZGVyLgorICAgICAgICB3aGlsZSAoKG1JbWcgPSB2cHhfY29kZWNfZ2V0X2ZyYW1lKCh2cHhfY29kZWNfY3R4X3QgKiltQ3R4LCAmaXRlcikpKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgd2hpbGUgKCFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIGlmIChtSW1nID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1JbWcgPSB2cHhfY29kZWNfZ2V0X2ZyYW1lKCh2cHhfY29kZWNfY3R4X3QgKiltQ3R4LCAmaXRlcik7CisgICAgICAgICAgICBpZiAobUltZyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3Qgd2lkdGggPSBtSW1nLT5kX3c7CisgICAgICAgIHVpbnQzMl90IGhlaWdodCA9IG1JbWctPmRfaDsKKyAgICAgICAgb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICBvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworICAgICAgICBDSEVDS19FUShtSW1nLT5mbXQsIFZQWF9JTUdfRk1UX0k0MjApOworICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UocG9ydFdpbGxSZXNldCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmICgqcG9ydFdpbGxSZXNldCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOworICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IChvdXRwdXRCdWZmZXJXaWR0aCgpICogb3V0cHV0QnVmZmVySGVpZ2h0KCkgKiAzKSAvIDI7CisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9ICooT01YX1RJQ0tTICopbUltZy0+dXNlcl9wcml2OworICAgICAgICBpZiAob3V0cHV0QnVmZmVyU2FmZShvdXRIZWFkZXIpKSB7CisgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBvdXRIZWFkZXItPnBCdWZmZXI7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZID0gKGNvbnN0IHVpbnQ4X3QgKiltSW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ldOworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopbUltZy0+cGxhbmVzW1ZQWF9QTEFORV9VXTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tWUFhfUExBTkVfVl07CisgICAgICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IG1JbWctPnN0cmlkZVtWUFhfUExBTkVfWV07CisgICAgICAgICAgICBzaXplX3Qgc3JjVVN0cmlkZSA9IG1JbWctPnN0cmlkZVtWUFhfUExBTkVfVV07CisgICAgICAgICAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IG1JbWctPnN0cmlkZVtWUFhfUExBTkVfVl07CisgICAgICAgICAgICBjb3B5WVYxMkZyYW1lVG9PdXRwdXRCdWZmZXIoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtSW1nID0gTlVMTDsKKyAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKCFlb3MpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKCFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIG91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgIG91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IDA7CisgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgIG1FT1NTdGF0dXMgPSBPVVRQVVRfRlJBTUVTX0ZMVVNIRUQ7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFNvZnRWUFg6Om91dHB1dEJ1ZmZlclNhZmUoT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlcikgeworICAgIHVpbnQzMl90IHdpZHRoID0gb3V0cHV0QnVmZmVyV2lkdGgoKTsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKKyAgICB1aW50NjRfdCBuRmlsbGVkTGVuID0gd2lkdGg7CisgICAgbkZpbGxlZExlbiAqPSBoZWlnaHQ7CisgICAgaWYgKG5GaWxsZWRMZW4gPiBVSU5UMzJfTUFYIC8gMykgeworICAgICAgICBBTE9HRSgiYi8yOTQyMTY3NSwgbkZpbGxlZExlbiBvdmVyZmxvdyAlbGx1IHcgJXUgaCAldSIsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyluRmlsbGVkTGVuLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyOTQyMTY3NSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChvdXRIZWFkZXItPm5BbGxvY0xlbiA8IG91dEhlYWRlci0+bkZpbGxlZExlbikgeworICAgICAgICBBTE9HRSgiYi8yNzU5NzEwMywgYnVmZmVyIHRvbyBzbWFsbCIpOworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3NTk3MTAzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogdm9pZCBTb2Z0VlBYOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7Ci0gICAgaWYgKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgeworICAgIGlmIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUgfHwgbUVPU1N0YXR1cyA9PSBPVVRQVVRfRlJBTUVTX0ZMVVNIRUQpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOwogICAgIGJvb2wgRU9Tc2VlbiA9IGZhbHNlOworICAgIHZweF9jb2RlY19lcnJfdCBlcnI7CisgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CiAKLSAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgewotICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7Ci0KLSAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKLQotICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewotICAgICAgICAgICAgRU9Tc2VlbiA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgewotICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwotCi0gICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKLSAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKLQotICAgICAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW1nID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmICh2cHhfY29kZWNfZGVjb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgMCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZS4iKTsKLQorICAgIHdoaWxlICgobUVPU1N0YXR1cyA9PSBJTlBVVF9FT1NfU0VFTiB8fCAhaW5RdWV1ZS5lbXB0eSgpKQorICAgICAgICAgICAgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gT3V0cHV0IHRoZSBwZW5kaW5nIGZyYW1lcyB0aGF0IGxlZnQgZnJvbSBsYXN0IHBvcnQgcmVzZXQgb3IgZGVjb2RlciBmbHVzaC4KKyAgICAgICAgaWYgKG1FT1NTdGF0dXMgPT0gSU5QVVRfRU9TX1NFRU4gfHwgbUltZyAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIW91dHB1dEJ1ZmZlcnMoCisgICAgICAgICAgICAgICAgICAgICBtRU9TU3RhdHVzID09IElOUFVUX0VPU19TRUVOLCB0cnVlIC8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgICAgICAgICBtRU9TU3RhdHVzID09IElOUFVUX0VPU19TRUVOLCAmcG9ydFdpbGxSZXNldCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIG91dHB1dCBmcmFtZS4iKTsKICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gTlVMTDsKLSAgICAgICAgICAgIG1JbWcgPSB2cHhfY29kZWNfZ2V0X2ZyYW1lKCh2cHhfY29kZWNfY3R4X3QgKiltQ3R4LCAmaXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUltZyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBDSEVDS19FUShtSW1nLT5mbXQsIElNR19GTVRfSTQyMCk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoID0gbUltZy0+ZF93OwotICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gbUltZy0+ZF9oOwotICAgICAgICAgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoJnBvcnRXaWxsUmVzZXQsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgaWYgKHBvcnRXaWxsUmVzZXQpIHsKKyAgICAgICAgICAgIGlmIChwb3J0V2lsbFJlc2V0IHx8IG1FT1NTdGF0dXMgPT0gT1VUUFVUX0ZSQU1FU19GTFVTSEVEIHx8CisgICAgICAgICAgICAgICAgICAgIG1FT1NTdGF0dXMgPT0gSU5QVVRfRU9TX1NFRU4pIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgICAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IChvdXRwdXRCdWZmZXJXaWR0aCgpICogb3V0cHV0QnVmZmVySGVpZ2h0KCkgKiAzKSAvIDI7Ci0gICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IEVPU3NlZW4gPyBPTVhfQlVGRkVSRkxBR19FT1MgOiAwOwotICAgICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7Ci0gICAgICAgICAgICBpZiAob3V0SGVhZGVyLT5uQWxsb2NMZW4gPj0gb3V0SGVhZGVyLT5uRmlsbGVkTGVuKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gb3V0SGVhZGVyLT5wQnVmZmVyOwotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tWUFhfUExBTkVfWV07Ci0gICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopbUltZy0+cGxhbmVzW1ZQWF9QTEFORV9VXTsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKiltSW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ZdOwotICAgICAgICAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlID0gbUltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXTsKLSAgICAgICAgICAgICAgICBzaXplX3Qgc3JjVVN0cmlkZSA9IG1JbWctPnN0cmlkZVtWUFhfUExBTkVfVV07Ci0gICAgICAgICAgICAgICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBtSW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ZdOwotICAgICAgICAgICAgICAgIGNvcHlZVjEyRnJhbWVUb091dHB1dEJ1ZmZlcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNzU5NzEwMywgYnVmZmVyIHRvbyBzbWFsbCIpOwotICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjc1OTcxMDMiKTsKLSAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOwotICAgICAgICAgICAgfQorICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgICAgIG1UaW1lU3RhbXBzW21UaW1lU3RhbXBJZHhdID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CiAKLSAgICAgICAgICAgIG1JbWcgPSBOVUxMOwotICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKLSAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7Ci0gICAgICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOworICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgbUVPU1N0YXR1cyA9IElOUFVUX0VPU19TRUVOOworICAgICAgICAgICAgRU9Tc2VlbiA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPiAwICYmCisgICAgICAgICAgICB2cHhfY29kZWNfZGVjb2RlKCh2cHhfY29kZWNfY3R4X3QgKiltQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1UaW1lU3RhbXBzW21UaW1lU3RhbXBJZHhdLCAwKSkgeworICAgICAgICAgICAgQUxPR0UoIm9uMiBkZWNvZGVyIGZhaWxlZCB0byBkZWNvZGUgZnJhbWUuIik7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbVRpbWVTdGFtcElkeCA9IChtVGltZVN0YW1wSWR4ICsgMSkgJSBrTnVtQnVmZmVyczsKKworICAgICAgICBpZiAoIW91dHB1dEJ1ZmZlcnMoCisgICAgICAgICAgICAgICAgIEVPU3NlZW4gLyogZmx1c2hEZWNvZGVyICovLCB0cnVlIC8qIGRpc3BsYXkgKi8sIEVPU3NlZW4sICZwb3J0V2lsbFJlc2V0KSkgeworICAgICAgICAgICAgQUxPR0UoIm9uMiBkZWNvZGVyIGZhaWxlZCB0byBvdXRwdXQgZnJhbWUuIik7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBvcnRXaWxsUmVzZXQpIHsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwpAQCAtMTgxLDYgKzI3NSwzMCBAQAogICAgIH0KIH0KIAordm9pZCBTb2Z0VlBYOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIGlmIChwb3J0SW5kZXggPT0ga0lucHV0UG9ydEluZGV4KSB7CisgICAgICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgICAgICBpZiAoIW91dHB1dEJ1ZmZlcnMoCisgICAgICAgICAgICAgICAgIHRydWUgLyogZmx1c2hEZWNvZGVyICovLCBmYWxzZSAvKiBkaXNwbGF5ICovLCBmYWxzZSAvKiBlb3MgKi8sICZwb3J0V2lsbFJlc2V0KSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmbHVzaCBkZWNvZGVyLiIpOworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1FT1NTdGF0dXMgPSBJTlBVVF9EQVRBX0FWQUlMQUJMRTsKKyAgICB9Cit9CisKK3ZvaWQgU29mdFZQWDo6b25SZXNldCgpIHsKKyAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKKyAgICBpZiAoIW91dHB1dEJ1ZmZlcnMoCisgICAgICAgICAgICAgdHJ1ZSAvKiBmbHVzaERlY29kZXIgKi8sIGZhbHNlIC8qIGRpc3BsYXkgKi8sIGZhbHNlIC8qIGVvcyAqLywgJnBvcnRXaWxsUmVzZXQpKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gZmx1c2ggZGVjb2Rlci4gVHJ5IHRvIGhhcmQgcmVzZXQgZGVjb2RlciIpOworICAgICAgICBkZXN0cm95RGVjb2RlcigpOworICAgICAgICBpbml0RGVjb2RlcigpOworICAgIH0KKyAgICBtRU9TU3RhdHVzID0gSU5QVVRfREFUQV9BVkFJTEFCTEU7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKaW5kZXggOGY2ODY5My4uODRjZjc5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaApAQCAtMzgsNiArMzgsOCBAQAogICAgIHZpcnR1YWwgflNvZnRWUFgoKTsKIAogICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCk7CiAKIHByaXZhdGU6CiAgICAgZW51bSB7CkBAIC00OSwxMSArNTEsMjIgQEAKICAgICAgICAgTU9ERV9WUDkKICAgICB9IG1Nb2RlOwogCi0gICAgdm9pZCAqbUN0eDsKKyAgICBlbnVtIHsKKyAgICAgICAgSU5QVVRfREFUQV9BVkFJTEFCTEUsICAvLyBWUFggY29tcG9uZW50IGlzIHJlYWR5IHRvIGRlY29kZSBkYXRhLgorICAgICAgICBJTlBVVF9FT1NfU0VFTiwgICAgICAgIC8vIFZQWCBjb21wb25lbnQgc2F3IEVPUyBhbmQgaXMgZmx1c2hpbmcgT24yIGRlY29kZXIuCisgICAgICAgIE9VVFBVVF9GUkFNRVNfRkxVU0hFRCAgLy8gVlBYIGNvbXBvbmVudCBmaW5pc2hlZCBmbHVzaGluZyBPbjIgZGVjb2Rlci4KKyAgICB9IG1FT1NTdGF0dXM7CiAKKyAgICB2b2lkICptQ3R4OworICAgIGJvb2wgbUZyYW1lUGFyYWxsZWxNb2RlOyAgLy8gRnJhbWUgcGFyYWxsZWwgaXMgb25seSBzdXBwb3J0ZWQgYnkgVlA5IGRlY29kZXIuCisgICAgT01YX1RJQ0tTIG1UaW1lU3RhbXBzW2tOdW1CdWZmZXJzXTsKKyAgICB1aW50OF90IG1UaW1lU3RhbXBJZHg7CiAgICAgdnB4X2ltYWdlX3QgKm1JbWc7CiAKICAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIHN0YXR1c190IGRlc3Ryb3lEZWNvZGVyKCk7CisgICAgYm9vbCBvdXRwdXRCdWZmZXJzKGJvb2wgZmx1c2hEZWNvZGVyLCBib29sIGRpc3BsYXksIGJvb2wgZW9zLCBib29sICpwb3J0V2lsbFJlc2V0KTsKKyAgICBib29sIG91dHB1dEJ1ZmZlclNhZmUoT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlcik7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0VlBYKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKaW5kZXggM2YyMjM1Yi4uNWM5NTBjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcApAQCAtNzExLDcgKzcxMSw4IEBACiAgICAgICAgIEJ1ZmZlckluZm8gKm91dHB1dEJ1ZmZlckluZm8gPSAqb3V0cHV0QnVmZmVySW5mb1F1ZXVlLmJlZ2luKCk7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRwdXRCdWZmZXJIZWFkZXIgPSBvdXRwdXRCdWZmZXJJbmZvLT5tSGVhZGVyOwogCi0gICAgICAgIGlmIChpbnB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgIGlmICgoaW5wdXRCdWZmZXJIZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgJiYKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CiAgICAgICAgICAgICBpbnB1dEJ1ZmZlckluZm9RdWV1ZS5lcmFzZShpbnB1dEJ1ZmZlckluZm9RdWV1ZS5iZWdpbigpKTsKICAgICAgICAgICAgIGlucHV0QnVmZmVySW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGlucHV0QnVmZmVySGVhZGVyKTsKQEAgLTgyOCw2ICs4MjksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5zeik7CiAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVySW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlckluZm9RdWV1ZS5lcmFzZShvdXRwdXRCdWZmZXJJbmZvUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRwdXRCdWZmZXJIZWFkZXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcAppbmRleCBhNzA1NmQxLi4yZTQ0ZWQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKQEAgLTM2MSw5ICszNjEsMTUgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDhfdCBjaGFubmVsX21hcHBpbmdba01heENoYW5uZWxzXSA9IHswfTsKLSAgICAgICAgICAgIG1lbWNweSgmY2hhbm5lbF9tYXBwaW5nLAotICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0T3B1c0NoYW5uZWxMYXlvdXQsCi0gICAgICAgICAgICAgICAgICAga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpOworICAgICAgICAgICAgaWYgKG1IZWFkZXItPmNoYW5uZWxzIDw9IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0T3B1c0NoYW5uZWxMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPnN0cmVhbV9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPmNoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50IHN0YXR1cyA9IE9QVVNfSU5WQUxJRF9TVEFURTsKICAgICAgICAgICAgIG1EZWNvZGVyID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZShrUmF0ZSwKQEAgLTQxMyw2ICs0MTksMTQgQEAKICAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOwogCisgICAgICAgIC8vIElnbm9yZSBDU0QgcmUtc3VibWlzc2lvbnMuCisgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpIHsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CiAKQEAgLTQ0NCwxMiArNDU4LDE3IEBACiAKICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CiAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXM7CisgICAgICAgIGlmIChmcmFtZVNpemUgPiBvdXRIZWFkZXItPm5BbGxvY0xlbiAvIHNpemVvZihpbnQxNl90KSAvIG1IZWFkZXItPmNoYW5uZWxzKSB7CisgICAgICAgICAgICBmcmFtZVNpemUgPSBvdXRIZWFkZXItPm5BbGxvY0xlbiAvIHNpemVvZihpbnQxNl90KSAvIG1IZWFkZXItPmNoYW5uZWxzOworICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzgzMzYxNiIpOworICAgICAgICB9CiAKICAgICAgICAgaW50IG51bUZyYW1lcyA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlKG1EZWNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKW91dEhlYWRlci0+cEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKICAgICAgICAgaWYgKG51bUZyYW1lcyA8IDApIHsKICAgICAgICAgICAgIEFMT0dFKCJvcHVzX211bHRpc3RyZWFtX2RlY29kZSByZXR1cm5lZCAlZCIsIG51bUZyYW1lcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwCmluZGV4IDRlMWU2YTUuLjVmNGUzNDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwCkBAIC0yNzMsNiArMjczLDEyIEBACiAKICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGhlYWRlci0+cEJ1ZmZlciArIGhlYWRlci0+bk9mZnNldDsKICAgICAgICAgc2l6ZV90IHNpemUgPSBoZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgIGlmIChzaXplIDwgNykgeworICAgICAgICAgICAgQUxPR0UoIlRvbyBzbWFsbCBpbnB1dCBidWZmZXI6ICV6dSBieXRlcyIsIHNpemUpOworICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzgzMzYxNiIpOworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKICAgICAgICAgb2dnX2J1ZmZlciBidWY7CiAgICAgICAgIG9nZ19yZWZlcmVuY2UgcmVmOwpAQCAtMzc4LDkgKzM4NCwxNCBAQAogICAgICAgICAgICAgQUxPR1coInZvcmJpc19kc3Bfc3ludGhlc2lzIHJldHVybmVkICVkIiwgZXJyKTsKICNlbmRpZgogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXNQZXJCdWZmZXIgPSBrTWF4TnVtU2FtcGxlc1BlckJ1ZmZlcjsKKyAgICAgICAgICAgIGlmIChudW1TYW1wbGVzUGVyQnVmZmVyID4gb3V0SGVhZGVyLT5uQWxsb2NMZW4gLyBzaXplb2YoaW50MTZfdCkpIHsKKyAgICAgICAgICAgICAgICBudW1TYW1wbGVzUGVyQnVmZmVyID0gb3V0SGVhZGVyLT5uQWxsb2NMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzgzMzYxNiIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbnVtRnJhbWVzID0gdm9yYmlzX2RzcF9wY21vdXQoCiAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSwgKGludDE2X3QgKilvdXRIZWFkZXItPnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIChrTWF4TnVtU2FtcGxlc1BlckJ1ZmZlciAvIG1WaS0+Y2hhbm5lbHMpKTsKKyAgICAgICAgICAgICAgICAgICAgKG51bVNhbXBsZXNQZXJCdWZmZXIgLyBtVmktPmNoYW5uZWxzKSk7CiAKICAgICAgICAgICAgIGlmIChudW1GcmFtZXMgPCAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoInZvcmJpc19kc3BfcGNtb3V0IHJldHVybmVkICVkIiwgbnVtRnJhbWVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKaW5kZXggNTlhNjRiYS4uNGY3YzQ4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKQEAgLTksNiArOSw5IEBACiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICAkKFRPUCkvaGFyZHdhcmUvbXNtN2sKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKK0xPQ0FMX0NMQU5HIDo9IHRydWUKKwogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbgogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKaW5kZXggMDQ0NjdiOS4uZTkyYzE5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcApAQCAtMzgsNyArMzgsOCBAQAogICAgIHJldHVybiAoeCArIHkgLSAxKSAmIH4oeSAtIDEpOwogfQogCi1Tb2Z0d2FyZVJlbmRlcmVyOjpTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3cpCitTb2Z0d2FyZVJlbmRlcmVyOjpTb2Z0d2FyZVJlbmRlcmVyKAorICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlV2luZG93LCBpbnQzMl90IHJvdGF0aW9uKQogICAgIDogbUNvbG9yRm9ybWF0KE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQpLAogICAgICAgbUNvbnZlcnRlcihOVUxMKSwKICAgICAgIG1ZVVZNb2RlKE5vbmUpLApAQCAtNTAsNyArNTEsOCBAQAogICAgICAgbUNyb3BSaWdodCgwKSwKICAgICAgIG1Dcm9wQm90dG9tKDApLAogICAgICAgbUNyb3BXaWR0aCgwKSwKLSAgICAgIG1Dcm9wSGVpZ2h0KDApIHsKKyAgICAgIG1Dcm9wSGVpZ2h0KDApLAorICAgICAgbVJvdGF0aW9uRGVncmVlcyhyb3RhdGlvbikgewogfQogCiBTb2Z0d2FyZVJlbmRlcmVyOjp+U29mdHdhcmVSZW5kZXJlcigpIHsKQEAgLTk4LDMzICsxMDAsNDkgQEAKICAgICBtQ3JvcFdpZHRoID0gbUNyb3BSaWdodCAtIG1Dcm9wTGVmdCArIDE7CiAgICAgbUNyb3BIZWlnaHQgPSBtQ3JvcEJvdHRvbSAtIG1Dcm9wVG9wICsgMTsKIAotICAgIGludCBoYWxGb3JtYXQ7Ci0gICAgc2l6ZV90IGJ1ZldpZHRoLCBidWZIZWlnaHQ7CisgICAgLy8gYnkgZGVmYXVsdCBjb252ZXJ0IGV2ZXJ5dGhpbmcgdG8gUkdCNTY1CisgICAgaW50IGhhbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTsKKyAgICBzaXplX3QgYnVmV2lkdGggPSBtQ3JvcFdpZHRoOworICAgIHNpemVfdCBidWZIZWlnaHQgPSBtQ3JvcEhlaWdodDsKIAotICAgIHN3aXRjaCAobUNvbG9yRm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKLSAgICAgICAgY2FzZSBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKLSAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFydW5uaW5nSW5FbXVsYXRvcigpKSB7CisgICAgLy8gaGFyZHdhcmUgaGFzIFlVVjEyIGFuZCBSR0JBODg4OCBzdXBwb3J0LCBzbyBjb252ZXJ0IGtub3duIGZvcm1hdHMKKyAgICBpZiAoIXJ1bm5pbmdJbkVtdWxhdG9yKCkpIHsKKyAgICAgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICBjYXNlIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgorICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGhhbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKICAgICAgICAgICAgICAgICBidWZXaWR0aCA9IChtQ3JvcFdpZHRoICsgMSkgJiB+MTsKICAgICAgICAgICAgICAgICBidWZIZWlnaHQgPSAobUNyb3BIZWlnaHQgKyAxKSAmIH4xOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2guCisgICAgICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQyNGJpdFJHQjg4ODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQl84ODg7CisgICAgICAgICAgICAgICAgYnVmV2lkdGggPSAobUNyb3BXaWR0aCArIDEpICYgfjE7CisgICAgICAgICAgICAgICAgYnVmSGVpZ2h0ID0gKG1Dcm9wSGVpZ2h0ICsgMSkgJiB+MTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyYml0QVJHQjg4ODg6CisgICAgICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OworICAgICAgICAgICAgICAgIGJ1ZldpZHRoID0gKG1Dcm9wV2lkdGggKyAxKSAmIH4xOworICAgICAgICAgICAgICAgIGJ1ZkhlaWdodCA9IChtQ3JvcEhlaWdodCArIDEpICYgfjE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU7Ci0gICAgICAgICAgICBidWZXaWR0aCA9IG1Dcm9wV2lkdGg7Ci0gICAgICAgICAgICBidWZIZWlnaHQgPSBtQ3JvcEhlaWdodDsKLQotICAgICAgICAgICAgbUNvbnZlcnRlciA9IG5ldyBDb2xvckNvbnZlcnRlcigKLSAgICAgICAgICAgICAgICAgICAgbUNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUpOwotICAgICAgICAgICAgQ0hFQ0sobUNvbnZlcnRlci0+aXNWYWxpZCgpKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoYWxGb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1KSB7CisgICAgICAgIG1Db252ZXJ0ZXIgPSBuZXcgQ29sb3JDb252ZXJ0ZXIoCisgICAgICAgICAgICAgICAgbUNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUpOworICAgICAgICBDSEVDSyhtQ29udmVydGVyLT5pc1ZhbGlkKCkpOwogICAgIH0KIAogICAgIENIRUNLKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCk7CkBAIC0xNjUsNyArMTgzLDcgQEAKIAogICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOwogICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmcm90YXRpb25EZWdyZWVzKSkgewotICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOworICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSBtUm90YXRpb25EZWdyZWVzOwogICAgIH0KICAgICB1aW50MzJfdCB0cmFuc2Zvcm07CiAgICAgc3dpdGNoIChyb3RhdGlvbkRlZ3JlZXMpIHsKQEAgLTE4MCwxNyArMTk4LDI5IEBACiAgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgdHJhbnNmb3JtKSk7CiB9CiAKLXZvaWQgU29mdHdhcmVSZW5kZXJlcjo6cmVuZGVyKAotICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50NjRfdCB0aW1lc3RhbXBOcywKK3ZvaWQgU29mdHdhcmVSZW5kZXJlcjo6Y2xlYXJUcmFja2VyKCkgeworICAgIG1SZW5kZXJUcmFja2VyLmNsZWFyKC0xIC8qIGxhc3RSZW5kZXJUaW1lTnMgKi8pOworfQorCitzdGQ6Omxpc3Q8RnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvPiBTb2Z0d2FyZVJlbmRlcmVyOjpyZW5kZXIoCisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQ2NF90IG1lZGlhVGltZVVzLCBuc2Vjc190IHJlbmRlclRpbWVOcywKICAgICAgICAgdm9pZCogLypwbGF0Zm9ybVByaXZhdGUqLywgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQpIHsKICAgICByZXNldEZvcm1hdElmQ2hhbmdlZChmb3JtYXQpOworICAgIEZyYW1lUmVuZGVyVHJhY2tlcjo6SW5mbyAqaW5mbyA9IE5VTEw7CiAKICAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWY7Ci0gICAgaW50IGVycjsKLSAgICBpZiAoKGVyciA9IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgICZidWYpKSAhPSAwKSB7CisgICAgaW50IGZlbmNlRmQgPSAtMTsKKyAgICBpbnQgZXJyID0gbU5hdGl2ZVdpbmRvdy0+ZGVxdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCAmYnVmLCAmZmVuY2VGZCk7CisgICAgaWYgKGVyciA9PSAwICYmIGZlbmNlRmQgPj0gMCkgeworICAgICAgICBpbmZvID0gbVJlbmRlclRyYWNrZXIudXBkYXRlSW5mb0ZvckRlcXVldWVkQnVmZmVyKGJ1ZiwgZmVuY2VGZCwgMCk7CisgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZShmZW5jZUZkKTsKKyAgICAgICAgZXJyID0gZmVuY2UtPndhaXRGb3JldmVyKCJTb2Z0d2FyZVJlbmRlcmVyOjpyZW5kZXIiKTsKKyAgICB9CisgICAgaWYgKGVyciAhPSAwKSB7CiAgICAgICAgIEFMT0dXKCJTdXJmYWNlOjpkZXF1ZXVlQnVmZmVyIHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICAvLyBjb21wbGV0ZSAoZHJvcCkgZGVxdWV1ZWQgZnJhbWUgaWYgZmVuY2Ugd2FpdCBmYWlsZWQ7IG90aGVyd2lzZSwKKyAgICAgICAgLy8gdGhpcyByZXR1cm5zIGFuIGVtcHR5IGxpc3QgYXMgbm8gZnJhbWVzIHNob3VsZCBoYXZlIHJlbmRlcmVkIGFuZCBub3QgeWV0IHJldHVybmVkLgorICAgICAgICByZXR1cm4gbVJlbmRlclRyYWNrZXIuY2hlY2tGZW5jZXNBbmRHZXRSZW5kZXJlZEZyYW1lcyhpbmZvLCBmYWxzZSAvKiBkcm9wSW5jb21wbGV0ZSAqLyk7CiAgICAgfQogCiAgICAgR3JhcGhpY0J1ZmZlck1hcHBlciAmbWFwcGVyID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCk7CkBAIC0yMDEsNiArMjMxLDggQEAKICAgICBDSEVDS19FUSgwLCBtYXBwZXIubG9jaygKICAgICAgICAgICAgICAgICBidWYtPmhhbmRsZSwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgYm91bmRzLCAmZHN0KSk7CiAKKyAgICAvLyBUT0RPIG1vdmUgdGhlIG90aGVyIGNvbnZlcnNpb25zIGFsc28gaW50byBDb2xvckNvbnZlcnRlciwgYW5kCisgICAgLy8gZml4IGNyb3BwaW5nIGlzc3VlcyAod2hlbiBtQ3JvcExlZnQvVG9wICE9IDAgb3IgbVdpZHRoICE9IG1Dcm9wV2lkdGgpCiAgICAgaWYgKG1Db252ZXJ0ZXIpIHsKICAgICAgICAgbUNvbnZlcnRlci0+Y29udmVydCgKICAgICAgICAgICAgICAgICBkYXRhLApAQCAtMjE0LDcgKzI0Niw4IEBACiAgICAgICAgICAgICBnb3RvIHNraXBfY29weWluZzsKICAgICAgICAgfQogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPSAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtV2lkdGggKiBtSGVpZ2h0OworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9CisgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbVdpZHRoICogbUhlaWdodDsKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3YgPSBzcmNfdSArIChtV2lkdGggLyAyICogbUhlaWdodCAvIDIpOwogCiAgICAgICAgIHVpbnQ4X3QgKmRzdF95ID0gKHVpbnQ4X3QgKilkc3Q7CkBAIC0yNDUsMTIgKzI3OCw5IEBACiAgICAgICAgIGlmICgoc2l6ZV90KW1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMiA+IHNpemUpIHsKICAgICAgICAgICAgIGdvdG8gc2tpcF9jb3B5aW5nOwogICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPQotICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191diA9Ci0gICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtV2lkdGggKiAobUhlaWdodCAtIG1Dcm9wVG9wIC8gMik7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdXYgPSAoY29uc3QgdWludDhfdCAqKWRhdGEKKyAgICAgICAgICAgICAgICArIG1XaWR0aCAqIChtSGVpZ2h0IC0gbUNyb3BUb3AgLyAyKTsKIAogICAgICAgICB1aW50OF90ICpkc3RfeSA9ICh1aW50OF90ICopZHN0OwogCkBAIC0yNzgsNiArMzA4LDQ3IEBACiAgICAgICAgICAgICBkc3RfdSArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgICAgICBkc3RfdiArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MjRiaXRSR0I4ODgpIHsKKyAgICAgICAgaWYgKChzaXplX3QpbVdpZHRoICogbUhlaWdodCAqIDMgPiBzaXplKSB7CisgICAgICAgICAgICBnb3RvIHNraXBfY29weWluZzsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90KiBzcmNQdHIgPSAodWludDhfdCopZGF0YTsKKyAgICAgICAgdWludDhfdCogZHN0UHRyID0gKHVpbnQ4X3QqKWRzdDsKKworICAgICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChzaXplX3QpbUNyb3BIZWlnaHQ7ICsreSkgeworICAgICAgICAgICAgbWVtY3B5KGRzdFB0ciwgc3JjUHRyLCBtQ3JvcFdpZHRoICogMyk7CisgICAgICAgICAgICBzcmNQdHIgKz0gbVdpZHRoICogMzsKKyAgICAgICAgICAgIGRzdFB0ciArPSBidWYtPnN0cmlkZSAqIDM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4OCkgeworICAgICAgICBpZiAoKHNpemVfdCltV2lkdGggKiBtSGVpZ2h0ICogNCA+IHNpemUpIHsKKyAgICAgICAgICAgIGdvdG8gc2tpcF9jb3B5aW5nOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgKnNyY1B0ciwgKmRzdFB0cjsKKworICAgICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChzaXplX3QpbUNyb3BIZWlnaHQ7ICsreSkgeworICAgICAgICAgICAgc3JjUHRyID0gKHVpbnQ4X3QqKWRhdGEgKyBtV2lkdGggKiA0ICogeTsKKyAgICAgICAgICAgIGRzdFB0ciA9ICh1aW50OF90Kilkc3QgKyBidWYtPnN0cmlkZSAqIDQgKiB5OworICAgICAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCAoc2l6ZV90KW1Dcm9wV2lkdGg7ICsreCkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgYSA9ICpzcmNQdHIrKzsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDM7ICsraSkgeyAgIC8vIGNvcHkgUkdCCisgICAgICAgICAgICAgICAgICAgICpkc3RQdHIrKyA9ICpzcmNQdHIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmRzdFB0cisrID0gYTsgIC8vIGFscGhhIGxhc3QgKEFSR0IgdG8gUkdCQSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4KSB7CisgICAgICAgIGlmICgoc2l6ZV90KW1XaWR0aCAqIG1IZWlnaHQgKiA0ID4gc2l6ZSkgeworICAgICAgICAgICAgZ290byBza2lwX2NvcHlpbmc7CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCogc3JjUHRyID0gKHVpbnQ4X3QqKWRhdGE7CisgICAgICAgIHVpbnQ4X3QqIGRzdFB0ciA9ICh1aW50OF90Kilkc3Q7CisKKyAgICAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoc2l6ZV90KW1Dcm9wSGVpZ2h0OyArK3kpIHsKKyAgICAgICAgICAgIG1lbWNweShkc3RQdHIsIHNyY1B0ciwgbUNyb3BXaWR0aCAqIDQpOworICAgICAgICAgICAgc3JjUHRyICs9IG1XaWR0aCAqIDQ7CisgICAgICAgICAgICBkc3RQdHIgKz0gYnVmLT5zdHJpZGUgKiA0OworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIGNvbG9yIGZvcm1hdCAlI3giLCBtQ29sb3JGb3JtYXQpOwogICAgIH0KQEAgLTI4NSwxNiArMzU2LDIxIEBACiBza2lwX2NvcHlpbmc6CiAgICAgQ0hFQ0tfRVEoMCwgbWFwcGVyLnVubG9jayhidWYtPmhhbmRsZSkpOwogCi0gICAgaWYgKChlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgdGltZXN0YW1wTnMpKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dXKCJTdXJmYWNlOjpzZXRfYnVmZmVyc190aW1lc3RhbXAgcmV0dXJuZWQgZXJyb3IgJWQiLCBlcnIpOworICAgIGlmIChyZW5kZXJUaW1lTnMgPj0gMCkgeworICAgICAgICBpZiAoKGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKG1OYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICAgICAgcmVuZGVyVGltZU5zKSkgIT0gMCkgeworICAgICAgICAgICAgQUxPR1coIlN1cmZhY2U6OnNldF9idWZmZXJzX3RpbWVzdGFtcCByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoKGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXVlQnVmZmVyKG1OYXRpdmVXaW5kb3cuZ2V0KCksIGJ1ZiwKLSAgICAgICAgICAgIC0xKSkgIT0gMCkgeworICAgIGlmICgoZXJyID0gbU5hdGl2ZVdpbmRvdy0+cXVldWVCdWZmZXIobU5hdGl2ZVdpbmRvdy5nZXQoKSwgYnVmLCAtMSkpICE9IDApIHsKICAgICAgICAgQUxPR1coIlN1cmZhY2U6OnF1ZXVlQnVmZmVyIHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtUmVuZGVyVHJhY2tlci5vbkZyYW1lUXVldWVkKG1lZGlhVGltZVVzLCAoR3JhcGhpY0J1ZmZlciAqKWJ1ZiwgRmVuY2U6Ok5PX0ZFTkNFKTsKICAgICB9CisKICAgICBidWYgPSBOVUxMOworICAgIHJldHVybiBtUmVuZGVyVHJhY2tlci5jaGVja0ZlbmNlc0FuZEdldFJlbmRlcmVkRnJhbWVzKGluZm8sIGluZm8gIT0gTlVMTCAvKiBkcm9wSW5jb21wbGV0ZSAqLyk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5ZjA1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI4IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICAgICBDb2xvckNvbnZlcnQuY3BwICAgICAgICAgIFwKKyAgICAgICAgR3JhcGhpY0J1ZmZlckxpc3RlbmVyLmNwcCBcCisgICAgICAgIEludHJpbnNpY0JsdXJGaWx0ZXIuY3BwICAgXAorICAgICAgICBNZWRpYUZpbHRlci5jcHAgICAgICAgICAgIFwKKyAgICAgICAgUlNGaWx0ZXIuY3BwICAgICAgICAgICAgICBcCisgICAgICAgIFNhdHVyYXRpb25GaWx0ZXIuY3BwICAgICAgXAorICAgICAgICBzYXR1cmF0aW9uQVJHQi5ycyAgICAgICAgIFwKKyAgICAgICAgU2ltcGxlRmlsdGVyLmNwcCAgICAgICAgICBcCisgICAgICAgIFplcm9GaWx0ZXIuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvcnMvY3BwIFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvcnMgXAorCitpbnRlcm1lZGlhdGVzIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsU1RBVElDX0xJQlJBUklFUyxsaWJSUyxUQVJHRVQsKQorTE9DQUxfQ19JTkNMVURFUyArPSAkKGludGVybWVkaWF0ZXMpCisKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCisKK0xPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X21lZGlhZmlsdGVyCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQ29sb3JDb252ZXJ0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQ29sb3JDb252ZXJ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGQ1ZGQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9Db2xvckNvbnZlcnQuY3BwCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkNvbG9yQ29udmVydC5oIgorCisjaWZuZGVmIG1heAorI2RlZmluZSBtYXgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisjaWZuZGVmIG1pbgorI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCBZVVZUb1JHQigKKyAgICAgICAgaW50MzJfdCB5LCBpbnQzMl90IHUsIGludDMyX3QgdiwKKyAgICAgICAgaW50MzJfdCogciwgaW50MzJfdCogZywgaW50MzJfdCogYikgeworICAgIHkgLT0gMTY7CisgICAgdSAtPSAxMjg7CisgICAgdiAtPSAxMjg7CisKKyAgICAqYiA9IDExOTIgKiB5ICsgMjA2NiAqIHU7CisgICAgKmcgPSAxMTkyICogeSAtIDgzMyAqIHYgLSA0MDAgKiB1OworICAgICpyID0gMTE5MiAqIHkgKyAxNjM0ICogdjsKKworICAgICpyID0gbWluKDI2MjE0MywgbWF4KDAsICpyKSk7CisgICAgKmcgPSBtaW4oMjYyMTQzLCBtYXgoMCwgKmcpKTsKKyAgICAqYiA9IG1pbigyNjIxNDMsIG1heCgwLCAqYikpOworCisgICAgKnIgPj49IDEwOworICAgICpnID4+PSAxMDsKKyAgICAqYiA+Pj0gMTA7Cit9CisKK3ZvaWQgY29udmVydFlVVjQyMHNwVG9BUkdCKAorICAgICAgICB1aW50OF90ICpwWSwgdWludDhfdCAqcFVWLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgdWludDhfdCAqZGVzdCkgeworICAgIGNvbnN0IGludDMyX3QgYnl0ZXNfcGVyX3BpeGVsID0gMjsKKworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgeSA9ICoocFkgKyBpICogd2lkdGggKyBqKTsKKyAgICAgICAgICAgIGludDMyX3QgdSA9ICoocFVWICsgKGkvMikgKiB3aWR0aCArIGJ5dGVzX3Blcl9waXhlbCAqIChqLzIpKTsKKyAgICAgICAgICAgIGludDMyX3QgdiA9ICoocFVWICsgKGkvMikgKiB3aWR0aCArIGJ5dGVzX3Blcl9waXhlbCAqIChqLzIpICsgMSk7CisKKyAgICAgICAgICAgIGludDMyX3QgciwgZywgYjsKKyAgICAgICAgICAgIFlVVlRvUkdCKHksIHUsIHYsICZyLCAmZywgJmIpOworCisgICAgICAgICAgICAqZGVzdCsrID0gMHhGRjsKKyAgICAgICAgICAgICpkZXN0KysgPSByOworICAgICAgICAgICAgKmRlc3QrKyA9IGc7CisgICAgICAgICAgICAqZGVzdCsrID0gYjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBjb252ZXJ0WVVWNDIwc3BUb1JHQjg4OCgKKyAgICAgICAgdWludDhfdCAqcFksIHVpbnQ4X3QgKnBVViwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIHVpbnQ4X3QgKmRlc3QpIHsKKyAgICBjb25zdCBpbnQzMl90IGJ5dGVzX3Blcl9waXhlbCA9IDI7CisKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgICAgICBpbnQzMl90IHkgPSAqKHBZICsgaSAqIHdpZHRoICsgaik7CisgICAgICAgICAgICBpbnQzMl90IHUgPSAqKHBVViArIChpLzIpICogd2lkdGggKyBieXRlc19wZXJfcGl4ZWwgKiAoai8yKSk7CisgICAgICAgICAgICBpbnQzMl90IHYgPSAqKHBVViArIChpLzIpICogd2lkdGggKyBieXRlc19wZXJfcGl4ZWwgKiAoai8yKSArIDEpOworCisgICAgICAgICAgICBpbnQzMl90IHIsIGcsIGI7CisgICAgICAgICAgICBZVVZUb1JHQih5LCB1LCB2LCAmciwgJmcsICZiKTsKKworICAgICAgICAgICAgKmRlc3QrKyA9IHI7CisgICAgICAgICAgICAqZGVzdCsrID0gZzsKKyAgICAgICAgICAgICpkZXN0KysgPSBiOworICAgICAgICB9CisgICAgfQorfQorCisvLyBIQUNLIC0gbm90IGV2ZW4gc2xpZ2h0bHkgb3B0aW1pemVkCisvLyBUT0RPOiByZW1vdmUgd2hlbiBSR0JBIHN1cHBvcnQgaXMgYWRkZWQgdG8gU29mdHdhcmVSZW5kZXJlcgordm9pZCBjb252ZXJ0UkdCQVRvQVJHQigKKyAgICAgICAgdWludDhfdCAqc3JjLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgdWludDMyX3Qgc3RyaWRlLAorICAgICAgICB1aW50OF90ICpkZXN0KSB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgd2lkdGg7ICsraikgeworICAgICAgICAgICAgdWludDhfdCByID0gKnNyYysrOworICAgICAgICAgICAgdWludDhfdCBnID0gKnNyYysrOworICAgICAgICAgICAgdWludDhfdCBiID0gKnNyYysrOworICAgICAgICAgICAgdWludDhfdCBhID0gKnNyYysrOworICAgICAgICAgICAgKmRlc3QrKyA9IGE7CisgICAgICAgICAgICAqZGVzdCsrID0gcjsKKyAgICAgICAgICAgICpkZXN0KysgPSBnOworICAgICAgICAgICAgKmRlc3QrKyA9IGI7CisgICAgICAgIH0KKyAgICAgICAgc3JjICs9IChzdHJpZGUgLSB3aWR0aCkgKiA0OworICAgIH0KK30KKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0NvbG9yQ29udmVydC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9Db2xvckNvbnZlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2ZhYTAyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9Db2xvckNvbnZlcnQuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0xPUl9DT05WRVJUX0hfCisjZGVmaW5lIENPTE9SX0NPTlZFUlRfSF8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCBZVVZUb1JHQigKKyAgICAgICAgaW50MzJfdCB5LCBpbnQzMl90IHUsIGludDMyX3QgdiwKKyAgICAgICAgaW50MzJfdCogciwgaW50MzJfdCogZywgaW50MzJfdCogYik7CisKK3ZvaWQgY29udmVydFlVVjQyMHNwVG9BUkdCKAorICAgICAgICB1aW50OF90ICpwWSwgdWludDhfdCAqcFVWLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgdWludDhfdCAqZGVzdCk7CisKK3ZvaWQgY29udmVydFlVVjQyMHNwVG9SR0I4ODgoCisgICAgICAgIHVpbnQ4X3QgKnBZLCB1aW50OF90ICpwVVYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICB1aW50OF90ICpkZXN0KTsKKworLy8gVE9ETzogcmVtb3ZlIHdoZW4gUkdCQSBzdXBwb3J0IGlzIGFkZGVkIHRvIFNvZnR3YXJlUmVuZGVyZXIKK3ZvaWQgY29udmVydFJHQkFUb0FSR0IoCisgICAgICAgIHVpbnQ4X3QgKnNyYywgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgdWludDhfdCAqZGVzdCk7CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPTE9SX0NPTlZFUlRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvR3JhcGhpY0J1ZmZlckxpc3RlbmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvR3JhcGhpY0J1ZmZlckxpc3RlbmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjA2MzE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9HcmFwaGljQnVmZmVyTGlzdGVuZXIuY3BwCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJHcmFwaGljQnVmZmVyTGlzdGVuZXIiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorCisjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KKworI2luY2x1ZGUgIkdyYXBoaWNCdWZmZXJMaXN0ZW5lci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IEdyYXBoaWNCdWZmZXJMaXN0ZW5lcjo6aW5pdCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIHNpemVfdCBidWZmZXJXaWR0aCwgc2l6ZV90IGJ1ZmZlckhlaWdodCwgc2l6ZV90IGJ1ZmZlckNvdW50KSB7CisgICAgbU5vdGlmeSA9IG5vdGlmeTsKKworICAgIFN0cmluZzggbmFtZSgiR3JhcGhpY0J1ZmZlckxpc3RlbmVyIik7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZtUHJvZHVjZXIsICZtQ29uc3VtZXIpOworICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJOYW1lKG5hbWUpOworICAgIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CisgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4pOworCisgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KTsKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IEJRIG1heCBhY3F1aXJlZCBidWZmZXIgY291bnQgdG8gJXp1OiAlZCIsCisgICAgICAgICAgICAgICAgYnVmZmVyQ291bnQsIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgd3A8QnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXI+IGxpc3RlbmVyID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8QnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIqPih0aGlzKTsKKyAgICBzcDxCdWZmZXJRdWV1ZTo6UHJveHlDb25zdW1lckxpc3RlbmVyPiBwcm94eSA9CisgICAgICAgIG5ldyBCdWZmZXJRdWV1ZTo6UHJveHlDb25zdW1lckxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIGVyciA9IG1Db25zdW1lci0+Y29uc3VtZXJDb25uZWN0KHByb3h5LCBmYWxzZSk7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiRXJyb3IgY29ubmVjdGluZyB0byBCdWZmZXJRdWV1ZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgQUxPR1YoImluaXQoKSBzdWNjZXNzZnVsLiIpOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEdyYXBoaWNCdWZmZXJMaXN0ZW5lcjo6b25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiAvKiBpdGVtICovKSB7CisgICAgQUxPR1YoIm9uRnJhbWVBdmFpbGFibGUoKSBjYWxsZWQiKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgICAgIG1OdW1GcmFtZXNBdmFpbGFibGUrKzsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbU5vdGlmeS0+c2V0V2hhdChrV2hhdEZyYW1lQXZhaWxhYmxlKTsKKyAgICBtTm90aWZ5LT5wb3N0KCk7Cit9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlckxpc3RlbmVyOjpvbkJ1ZmZlcnNSZWxlYXNlZCgpIHsKKyAgICBBTE9HVigib25CdWZmZXJzUmVsZWFzZWQoKSBjYWxsZWQiKTsKKyAgICAvLyBub3RoaW5nIHRvIGRvCit9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlckxpc3RlbmVyOjpvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpIHsKKyAgICBBTE9HVygiR3JhcGhpY0J1ZmZlckxpc3RlbmVyIGNhbm5vdCBjb25zdW1lIHNpZGViYW5kIHN0cmVhbXMuIik7CisgICAgLy8gbm90aGluZyB0byBkbworfQorCitCdWZmZXJJdGVtIEdyYXBoaWNCdWZmZXJMaXN0ZW5lcjo6Z2V0QnVmZmVySXRlbSgpIHsKKyAgICBCdWZmZXJJdGVtIGl0ZW07CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgICAgICBpZiAobU51bUZyYW1lc0F2YWlsYWJsZSA8PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiZ2V0QnVmZmVyKCkgY2FsbGVkIHdpdGggbm8gZnJhbWVzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgIH0KKyAgICAgICAgbU51bUZyYW1lc0F2YWlsYWJsZS0tOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CisgICAgaWYgKGVyciA9PSBCdWZmZXJRdWV1ZTo6Tk9fQlVGRkVSX0FWQUlMQUJMRSkgeworICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuLCBzaW5jZSB3ZSB0cmFjayBudW0gZnJhbWVzIGF2YWlsYWJsZQorICAgICAgICBBTE9HRSgiZnJhbWUgd2FzIG5vdCBhdmFpbGFibGUiKTsKKyAgICAgICAgaXRlbS5tQnVmID0gLTE7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJhY3F1aXJlQnVmZmVyIHJldHVybmVkIGVycj0lZCIsIGVycik7CisgICAgICAgIGl0ZW0ubUJ1ZiA9IC0xOworICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CisKKyAgICAvLyBXYWl0IGZvciBpdCB0byBiZWNvbWUgYXZhaWxhYmxlLgorICAgIGVyciA9IGl0ZW0ubUZlbmNlLT53YWl0Rm9yZXZlcigiR3JhcGhpY0J1ZmZlckxpc3RlbmVyOjpnZXRCdWZmZXJJdGVtIik7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHdhaXQgZm9yIGJ1ZmZlciBmZW5jZTogJWQiLCBlcnIpOworICAgICAgICAvLyBrZWVwIGdvaW5nCisgICAgfQorCisgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBzZWVpbmcgdGhpcyBidWZmZXIsIGFkZCBpdCB0byBvdXIKKyAgICAvLyBzbG90IHRhYmxlLgorICAgIGlmIChpdGVtLm1HcmFwaGljQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoInNldHRpbmcgbUJ1ZmZlclNsb3QgJWQiLCBpdGVtLm1CdWYpOworICAgICAgICBtQnVmZmVyU2xvdFtpdGVtLm1CdWZdID0gaXRlbS5tR3JhcGhpY0J1ZmZlcjsKKyAgICB9CisKKyAgICByZXR1cm4gaXRlbTsKK30KKworc3A8R3JhcGhpY0J1ZmZlcj4gR3JhcGhpY0J1ZmZlckxpc3RlbmVyOjpnZXRCdWZmZXIoQnVmZmVySXRlbSBpdGVtKSB7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmOworICAgIGlmIChpdGVtLm1CdWYgPCAwIHx8IGl0ZW0ubUJ1ZiA+PSBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUykgeworICAgICAgICBBTE9HRSgiZ2V0QnVmZmVyKCkgcmVjZWl2ZWQgaW52YWxpZCBCdWZmZXJJdGVtOiBtQnVmPT0lZCIsIGl0ZW0ubUJ1Zik7CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorCisgICAgYnVmID0gbUJ1ZmZlclNsb3RbaXRlbS5tQnVmXTsKKyAgICBDSEVDSyhidWYuZ2V0KCkgIT0gTlVMTCk7CisKKyAgICByZXR1cm4gYnVmOworfQorCitzdGF0dXNfdCBHcmFwaGljQnVmZmVyTGlzdGVuZXI6OnJlbGVhc2VCdWZmZXIoQnVmZmVySXRlbSBpdGVtKSB7CisgICAgaWYgKGl0ZW0ubUJ1ZiA8IDAgfHwgaXRlbS5tQnVmID49IEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTKSB7CisgICAgICAgIEFMT0dFKCJnZXRCdWZmZXIoKSByZWNlaXZlZCBpbnZhbGlkIEJ1ZmZlckl0ZW06IG1CdWY9PSVkIiwgaXRlbS5tQnVmKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKKyAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIEZlbmNlOjpOT19GRU5DRSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9HcmFwaGljQnVmZmVyTGlzdGVuZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvR3JhcGhpY0J1ZmZlckxpc3RlbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2YmY2NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvR3JhcGhpY0J1ZmZlckxpc3RlbmVyLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgR1JBUEhJQ19CVUZGRVJfTElTVEVORVJfSF8KKyNkZWZpbmUgR1JBUEhJQ19CVUZGRVJfTElTVEVORVJfSF8KKworI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKKworc3RydWN0IEdyYXBoaWNCdWZmZXJMaXN0ZW5lciA6IHB1YmxpYyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciB7CitwdWJsaWM6CisgICAgR3JhcGhpY0J1ZmZlckxpc3RlbmVyKCkge307CisKKyAgICBzdGF0dXNfdCBpbml0KAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICBzaXplX3QgYnVmZmVyV2lkdGgsIHNpemVfdCBidWZmZXJIZWlnaHQsIHNpemVfdCBidWZmZXJDb3VudCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJzUmVsZWFzZWQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKTsKKworICAgIC8vIFJldHVybnMgdGhlIGhhbmRsZSB0byB0aGUgcHJvZHVjZXIgc2lkZSBvZiB0aGUgQnVmZmVyUXVldWUuICBCdWZmZXJzCisgICAgLy8gcXVldWVkIG9uIHRoaXMgd2lsbCBiZSByZWNlaXZlZCBieSBHcmFwaGljQnVmZmVyTGlzdGVuZXIuCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qcm9kdWNlcjsKKyAgICB9CisKKyAgICBCdWZmZXJJdGVtIGdldEJ1ZmZlckl0ZW0oKTsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBnZXRCdWZmZXIoQnVmZmVySXRlbSBpdGVtKTsKKyAgICBzdGF0dXNfdCByZWxlYXNlQnVmZmVyKEJ1ZmZlckl0ZW0gaXRlbSk7CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRGcmFtZUF2YWlsYWJsZSA9ICdmcmF2JywKKyAgICB9OworCitwcml2YXRlOgorICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworICAgIHNpemVfdCBtTnVtRnJhbWVzQXZhaWxhYmxlOworCisgICAgbXV0YWJsZSBNdXRleCBtTXV0ZXg7CisKKyAgICAvLyBPdXIgQnVmZmVyUXVldWUgaW50ZXJmYWNlcy4gbVByb2R1Y2VyIGlzIHBhc3NlZCB0byB0aGUgcHJvZHVjZXIgdGhyb3VnaAorICAgIC8vIGdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIsIGFuZCBtQ29uc3VtZXIgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIHJldHJpZXZlCisgICAgLy8gdGhlIGJ1ZmZlcnMgcXVldWVkIGJ5IHRoZSBwcm9kdWNlci4KKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gbUNvbnN1bWVyOworCisgICAgLy8gQ2FjaGUgb2YgR3JhcGhpY0J1ZmZlcnMgZnJvbSB0aGUgYnVmZmVyIHF1ZXVlLgorICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1CdWZmZXJTbG90W0J1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTXTsKK307CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEdSQVBISUNfQlVGRkVSX0xJU1RFTkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvSW50cmluc2ljQmx1ckZpbHRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0ludHJpbnNpY0JsdXJGaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiY2Y2OTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0ludHJpbnNpY0JsdXJGaWx0ZXIuY3BwCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkludHJpbnNpY0JsdXJGaWx0ZXIiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSAiSW50cmluc2ljQmx1ckZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IEludHJpbnNpY0JsdXJGaWx0ZXI6OmNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0YXR1c190IGVyciA9IFNpbXBsZUZpbHRlcjo6Y29uZmlndXJlKG1zZyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJjYWNoZURpciIsICZtQ2FjaGVEaXIpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmluZCBjYWNoZSBkaXJlY3RvcnkgaW4gY29uZmlnIG1lc3NhZ2UuIik7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEludHJpbnNpY0JsdXJGaWx0ZXI6OnN0YXJ0KCkgeworICAgIC8vIFRPRE86IHVzZSBhIHNpbmdsZSBSUyBjb250ZXh0IG9iamVjdCBmb3IgZW50aXJlIGFwcGxpY2F0aW9uCisgICAgbVJTID0gbmV3IFJTQzo6UlMoKTsKKworICAgIGlmICghbVJTLT5pbml0KG1DYWNoZURpci5jX3N0cigpKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgUmVuZGVyU2NyaXB0IGNvbnRleHQuIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIC8vIDMyLWJpdCBlbGVtZW50cyBmb3IgQVJHQjg4ODgKKyAgICBSU0M6OnNwPGNvbnN0IFJTQzo6RWxlbWVudD4gZSA9IFJTQzo6RWxlbWVudDo6VThfNChtUlMpOworCisgICAgUlNDOjpUeXBlOjpCdWlsZGVyIHRiKG1SUywgZSk7CisgICAgdGIuc2V0WChtV2lkdGgpOworICAgIHRiLnNldFkobUhlaWdodCk7CisgICAgUlNDOjpzcDxjb25zdCBSU0M6OlR5cGU+IHQgPSB0Yi5jcmVhdGUoKTsKKworICAgIG1BbGxvY0luID0gUlNDOjpBbGxvY2F0aW9uOjpjcmVhdGVUeXBlZChtUlMsIHQpOworICAgIG1BbGxvY091dCA9IFJTQzo6QWxsb2NhdGlvbjo6Y3JlYXRlVHlwZWQobVJTLCB0KTsKKworICAgIG1CbHVyID0gUlNDOjpTY3JpcHRJbnRyaW5zaWNCbHVyOjpjcmVhdGUobVJTLCBlKTsKKyAgICBtQmx1ci0+c2V0UmFkaXVzKG1CbHVyUmFkaXVzKTsKKyAgICBtQmx1ci0+c2V0SW5wdXQobUFsbG9jSW4pOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEludHJpbnNpY0JsdXJGaWx0ZXI6OnJlc2V0KCkgeworICAgIG1CbHVyLmNsZWFyKCk7CisgICAgbUFsbG9jT3V0LmNsZWFyKCk7CisgICAgbUFsbG9jSW4uY2xlYXIoKTsKKyAgICBtUlMuY2xlYXIoKTsKK30KKworc3RhdHVzX3QgSW50cmluc2ljQmx1ckZpbHRlcjo6c2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPEFNZXNzYWdlPiBwYXJhbXM7CisgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicGFyYW1zIiwgJnBhcmFtcykpOworCisgICAgZmxvYXQgYmx1clJhZGl1czsKKyAgICBpZiAocGFyYW1zLT5maW5kRmxvYXQoImJsdXItcmFkaXVzIiwgJmJsdXJSYWRpdXMpKSB7CisgICAgICAgIG1CbHVyUmFkaXVzID0gYmx1clJhZGl1czsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEludHJpbnNpY0JsdXJGaWx0ZXI6OnByb2Nlc3NCdWZmZXJzKAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc3JjQnVmZmVyLCBjb25zdCBzcDxBQnVmZmVyPiAmb3V0QnVmZmVyKSB7CisgICAgbUFsbG9jSW4tPmNvcHkxRFJhbmdlRnJvbSgwLCBtV2lkdGggKiBtSGVpZ2h0LCBzcmNCdWZmZXItPmRhdGEoKSk7CisgICAgbUJsdXItPmZvckVhY2gobUFsbG9jT3V0KTsKKyAgICBtQWxsb2NPdXQtPmNvcHkxRFJhbmdlVG8oMCwgbVdpZHRoICogbUhlaWdodCwgb3V0QnVmZmVyLT5kYXRhKCkpOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvSW50cmluc2ljQmx1ckZpbHRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9JbnRyaW5zaWNCbHVyRmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwN2FiNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvSW50cmluc2ljQmx1ckZpbHRlci5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOVFJJTlNJQ19CTFVSX0ZJTFRFUl9IXworI2RlZmluZSBJTlRSSU5TSUNfQkxVUl9GSUxURVJfSF8KKworI2luY2x1ZGUgIlJlbmRlclNjcmlwdC5oIgorI2luY2x1ZGUgIlNpbXBsZUZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBJbnRyaW5zaWNCbHVyRmlsdGVyIDogcHVibGljIFNpbXBsZUZpbHRlciB7CitwdWJsaWM6CisgICAgSW50cmluc2ljQmx1ckZpbHRlcigpIDogbUJsdXJSYWRpdXMoMS5mKSB7fTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NCdWZmZXJzKAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNyY0J1ZmZlciwgY29uc3Qgc3A8QUJ1ZmZlcj4gJm91dEJ1ZmZlcik7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5JbnRyaW5zaWNCbHVyRmlsdGVyKCkge307CisKK3ByaXZhdGU6CisgICAgQVN0cmluZyBtQ2FjaGVEaXI7CisgICAgUlNDOjpzcDxSU0M6OlJTPiBtUlM7CisgICAgUlNDOjpzcDxSU0M6OkFsbG9jYXRpb24+IG1BbGxvY0luOworICAgIFJTQzo6c3A8UlNDOjpBbGxvY2F0aW9uPiBtQWxsb2NPdXQ7CisgICAgUlNDOjpzcDxSU0M6OlNjcmlwdEludHJpbnNpY0JsdXI+IG1CbHVyOworICAgIGZsb2F0IG1CbHVyUmFkaXVzOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSU5UUklOU0lDX0JMVVJfRklMVEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL01lZGlhRmlsdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvTWVkaWFGaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZjZiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL01lZGlhRmlsdGVyLmNwcApAQCAtMCwwICsxLDgyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFGaWx0ZXIiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFGaWx0ZXIuaD4KKworI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtLmg+CisKKyNpbmNsdWRlICJDb2xvckNvbnZlcnQuaCIKKyNpbmNsdWRlICJHcmFwaGljQnVmZmVyTGlzdGVuZXIuaCIKKyNpbmNsdWRlICJJbnRyaW5zaWNCbHVyRmlsdGVyLmgiCisjaW5jbHVkZSAiUlNGaWx0ZXIuaCIKKyNpbmNsdWRlICJTYXR1cmF0aW9uRmlsdGVyLmgiCisjaW5jbHVkZSAiWmVyb0ZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHBhcmFtZXRlcjogbnVtYmVyIG9mIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycworc3RhdGljIGNvbnN0IHNpemVfdCBrQnVmZmVyQ291bnRBY3R1YWwgPSA0OworCitNZWRpYUZpbHRlcjo6TWVkaWFGaWx0ZXIoKQorICAgIDogbVN0YXRlKFVOSU5JVElBTElaRUQpLAorICAgICAgbUdlbmVyYXRpb24oMCksCisgICAgICBtR3JhcGhpY0J1ZmZlckxpc3RlbmVyKE5VTEwpIHsKK30KKworTWVkaWFGaWx0ZXI6On5NZWRpYUZpbHRlcigpIHsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8gUFVCTElDIEZVTkNUSU9OUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBNZWRpYUZpbHRlcjo6c2V0Tm90aWZpY2F0aW9uTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIG1Ob3RpZnkgPSBtc2c7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OmluaXRpYXRlQWxsb2NhdGVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBtc2ctPnNldFdoYXQoa1doYXRBbGxvY2F0ZUNvbXBvbmVudCk7CisgICAgbXNnLT5zZXRUYXJnZXQodGhpcyk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OmluaXRpYXRlQ29uZmlndXJlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgbXNnLT5zZXRXaGF0KGtXaGF0Q29uZmlndXJlQ29tcG9uZW50KTsKKyAgICBtc2ctPnNldFRhcmdldCh0aGlzKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6aW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdENyZWF0ZUlucHV0U3VyZmFjZSwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OmluaXRpYXRlU2V0SW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJiAvKiBzdXJmYWNlICovKSB7CisgICAgQUxPR1coImluaXRpYXRlU2V0SW5wdXRTdXJmYWNlKCkgdW5zdXBwb3J0ZWQiKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6aW5pdGlhdGVTdGFydCgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjppbml0aWF0ZVNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTaHV0ZG93biwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigia2VlcENvbXBvbmVudEFsbG9jYXRlZCIsIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpzaWduYWxGbHVzaCgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpzaWduYWxSZXN1bWUoKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgdGhpcykpLT5wb3N0KCk7Cit9CisKKy8vIG5vdGhpbmcgdG8gZG8KK3ZvaWQgTWVkaWFGaWx0ZXI6OnNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpIHsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OnNpZ25hbFNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0UGFyYW1ldGVycywgdGhpcyk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJwYXJhbXMiLCBwYXJhbXMpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTaWduYWxFbmRPZklucHV0U3RyZWFtLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRBbGxvY2F0ZUNvbXBvbmVudDoKKyAgICAgICAgeworICAgICAgICAgICAgb25BbGxvY2F0ZUNvbXBvbmVudChtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdENvbmZpZ3VyZUNvbXBvbmVudDoKKyAgICAgICAgeworICAgICAgICAgICAgb25Db25maWd1cmVDb21wb25lbnQobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTdGFydDoKKyAgICAgICAgeworICAgICAgICAgICAgb25TdGFydCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFByb2Nlc3NCdWZmZXJzOgorICAgICAgICB7CisgICAgICAgICAgICBwcm9jZXNzQnVmZmVycygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdElucHV0QnVmZmVyRmlsbGVkOgorICAgICAgICB7CisgICAgICAgICAgICBvbklucHV0QnVmZmVyRmlsbGVkKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0T3V0cHV0QnVmZmVyRHJhaW5lZDoKKyAgICAgICAgeworICAgICAgICAgICAgb25PdXRwdXRCdWZmZXJEcmFpbmVkKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U2h1dGRvd246CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU2h1dGRvd24obXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRGbHVzaDoKKyAgICAgICAgeworICAgICAgICAgICAgb25GbHVzaCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFJlc3VtZToKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFNldFBhcmFtZXRlcnM6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU2V0UGFyYW1ldGVycyhtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdENyZWF0ZUlucHV0U3VyZmFjZToKKyAgICAgICAgeworICAgICAgICAgICAgb25DcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgR3JhcGhpY0J1ZmZlckxpc3RlbmVyOjprV2hhdEZyYW1lQXZhaWxhYmxlOgorICAgICAgICB7CisgICAgICAgICAgICBvbklucHV0RnJhbWVBdmFpbGFibGUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTaWduYWxFbmRPZklucHV0U3RyZWFtOgorICAgICAgICB7CisgICAgICAgICAgICBvblNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXNzYWdlIG5vdCBoYW5kbGVkOlxuJXMiLCBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8gUE9SVCBERVNDUklQVElPTiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTWVkaWFGaWx0ZXI6OlBvcnREZXNjcmlwdGlvbjo6UG9ydERlc2NyaXB0aW9uKCkgeworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpQb3J0RGVzY3JpcHRpb246OmFkZEJ1ZmZlcigKKyAgICAgICAgSU9NWDo6YnVmZmVyX2lkIGlkLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgbUJ1ZmZlcklEcy5wdXNoX2JhY2soaWQpOworICAgIG1CdWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworfQorCitzaXplX3QgTWVkaWFGaWx0ZXI6OlBvcnREZXNjcmlwdGlvbjo6Y291bnRCdWZmZXJzKCkgeworICAgIHJldHVybiBtQnVmZmVySURzLnNpemUoKTsKK30KKworSU9NWDo6YnVmZmVyX2lkIE1lZGlhRmlsdGVyOjpQb3J0RGVzY3JpcHRpb246OmJ1ZmZlcklEQXQoc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1CdWZmZXJJRHMuaXRlbUF0KGluZGV4KTsKK30KKworc3A8QUJ1ZmZlcj4gTWVkaWFGaWx0ZXI6OlBvcnREZXNjcmlwdGlvbjo6YnVmZmVyQXQoc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1CdWZmZXJzLml0ZW1BdChpbmRleCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vIEhFTFBFUiBGVU5DVElPTlMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgTWVkaWFGaWx0ZXI6OnNpZ25hbFByb2Nlc3NCdWZmZXJzKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQcm9jZXNzQnVmZmVycywgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OnNpZ25hbEVycm9yKHN0YXR1c190IGVycm9yKSB7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0RXJyb3IpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycm9yKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKworc3RhdHVzX3QgTWVkaWFGaWx0ZXI6OmFsbG9jYXRlQnVmZmVyc09uUG9ydChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIENIRUNLKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgfHwgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpOworICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQ7CisgICAgY29uc3Qgc2l6ZV90IGJ1ZmZlclNpemUgPSBpc0lucHV0ID8gbU1heElucHV0U2l6ZSA6IG1NYXhPdXRwdXRTaXplOworCisgICAgQ0hFQ0sobURlYWxlcltwb3J0SW5kZXhdID09IE5VTEwpOworICAgIENIRUNLKG1CdWZmZXJzW3BvcnRJbmRleF0uaXNFbXB0eSgpKTsKKworICAgIEFMT0dWKCJBbGxvY2F0aW5nICV6dSBidWZmZXJzIG9mIHNpemUgJXp1IG9uICVzIHBvcnQiLAorICAgICAgICAgICAga0J1ZmZlckNvdW50QWN0dWFsLCBidWZmZXJTaXplLAorICAgICAgICAgICAgaXNJbnB1dCA/ICJpbnB1dCIgOiAib3V0cHV0Iik7CisKKyAgICBzaXplX3QgdG90YWxTaXplID0ga0J1ZmZlckNvdW50QWN0dWFsICogYnVmZmVyU2l6ZTsKKworICAgIG1EZWFsZXJbcG9ydEluZGV4XSA9IG5ldyBNZW1vcnlEZWFsZXIodG90YWxTaXplLCAiTWVkaWFGaWx0ZXIiKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga0J1ZmZlckNvdW50QWN0dWFsOyArK2kpIHsKKyAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0gbURlYWxlcltwb3J0SW5kZXhdLT5hbGxvY2F0ZShidWZmZXJTaXplKTsKKyAgICAgICAgQ0hFQ0sobWVtLmdldCgpICE9IE5VTEwpOworCisgICAgICAgIEJ1ZmZlckluZm8gaW5mbzsKKyAgICAgICAgaW5mby5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CisgICAgICAgIGluZm8ubUJ1ZmZlcklEID0gaTsKKyAgICAgICAgaW5mby5tR2VuZXJhdGlvbiA9IG1HZW5lcmF0aW9uOworICAgICAgICBpbmZvLm1PdXRwdXRGbGFncyA9IDA7CisgICAgICAgIGluZm8ubURhdGEgPSBuZXcgQUJ1ZmZlcihtZW0tPnBvaW50ZXIoKSwgYnVmZmVyU2l6ZSk7CisgICAgICAgIGluZm8ubURhdGEtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworCisgICAgICAgIG1CdWZmZXJzW3BvcnRJbmRleF0ucHVzaF9iYWNrKGluZm8pOworCisgICAgICAgIGlmICghaXNJbnB1dCkgeworICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dEJ1ZmZlcnMucHVzaCgKKyAgICAgICAgICAgICAgICAgICAgJm1CdWZmZXJzW3BvcnRJbmRleF0uZWRpdEl0ZW1BdChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRCdWZmZXJzQWxsb2NhdGVkKTsKKworICAgIG5vdGlmeS0+c2V0SW50MzIoInBvcnRJbmRleCIsIHBvcnRJbmRleCk7CisKKyAgICBzcDxQb3J0RGVzY3JpcHRpb24+IGRlc2MgPSBuZXcgUG9ydERlc2NyaXB0aW9uOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVyc1twb3J0SW5kZXhdLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IEJ1ZmZlckluZm8gJmluZm8gPSBtQnVmZmVyc1twb3J0SW5kZXhdW2ldOworCisgICAgICAgIGRlc2MtPmFkZEJ1ZmZlcihpbmZvLm1CdWZmZXJJRCwgaW5mby5tRGF0YSk7CisgICAgfQorCisgICAgbm90aWZ5LT5zZXRPYmplY3QoInBvcnREZXNjIiwgZGVzYyk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK01lZGlhRmlsdGVyOjpCdWZmZXJJbmZvKiBNZWRpYUZpbHRlcjo6ZmluZEJ1ZmZlckJ5SUQoCisgICAgICAgIHVpbnQzMl90IHBvcnRJbmRleCwgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklELAorICAgICAgICBzc2l6ZV90ICppbmRleCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnNbcG9ydEluZGV4XS5zaXplKCk7ICsraSkgeworICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gJm1CdWZmZXJzW3BvcnRJbmRleF0uZWRpdEl0ZW1BdChpKTsKKworICAgICAgICBpZiAoaW5mby0+bUJ1ZmZlcklEID09IGJ1ZmZlcklEKSB7CisgICAgICAgICAgICBpZiAoaW5kZXggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICppbmRleCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaW5mbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIFRSRVNQQVNTKCk7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6cG9zdEZpbGxUaGlzQnVmZmVyKEJ1ZmZlckluZm8gKmluZm8pIHsKKyAgICBBTE9HVigicG9zdEZpbGxUaGlzQnVmZmVyIG9uIGJ1ZmZlciAlZCIsIGluZm8tPm1CdWZmZXJJRCk7CisgICAgaWYgKG1Qb3J0RU9TW2tQb3J0SW5kZXhJbnB1dF0pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENIRUNLX0VRKChpbnQpaW5mby0+bVN0YXR1cywgKGludClCdWZmZXJJbmZvOjpPV05FRF9CWV9VUyk7CisKKyAgICBpbmZvLT5tR2VuZXJhdGlvbiA9IG1HZW5lcmF0aW9uOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0RmlsbFRoaXNCdWZmZXIpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImJ1ZmZlci1pZCIsIGluZm8tPm1CdWZmZXJJRCk7CisKKyAgICBpbmZvLT5tRGF0YS0+bWV0YSgpLT5jbGVhcigpOworICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBpbmZvLT5tRGF0YSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRJbnB1dEJ1ZmZlckZpbGxlZCwgdGhpcyk7CisgICAgcmVwbHktPnNldEludDMyKCJidWZmZXItaWQiLCBpbmZvLT5tQnVmZmVySUQpOworCisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKKworICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUFNUUkVBTTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6cG9zdERyYWluVGhpc0J1ZmZlcihCdWZmZXJJbmZvICppbmZvKSB7CisgICAgQ0hFQ0tfRVEoKGludClpbmZvLT5tU3RhdHVzLCAoaW50KUJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTKTsKKworICAgIGluZm8tPm1HZW5lcmF0aW9uID0gbUdlbmVyYXRpb247CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXREcmFpblRoaXNCdWZmZXIpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImJ1ZmZlci1pZCIsIGluZm8tPm1CdWZmZXJJRCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiZmxhZ3MiLCBpbmZvLT5tT3V0cHV0RmxhZ3MpOworICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBpbmZvLT5tRGF0YSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPdXRwdXRCdWZmZXJEcmFpbmVkLCB0aGlzKTsKKyAgICByZXBseS0+c2V0SW50MzIoImJ1ZmZlci1pZCIsIGluZm8tPm1CdWZmZXJJRCk7CisKKyAgICBub3RpZnktPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOworCisgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVBTVFJFQU07Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OnBvc3RFT1MoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0RU9TKTsKKyAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICBub3RpZnktPnBvc3QoKTsKKworICAgIEFMT0dWKCJTZW50IGtXaGF0RU9TLiIpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpzZW5kRm9ybWF0Q2hhbmdlKCkgeworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpOworCisgICAgQVN0cmluZyBtaW1lOworICAgIENIRUNLKG1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZS5jX3N0cigpKTsKKworICAgIG5vdGlmeS0+c2V0SW50MzIoInN0cmlkZSIsIG1TdHJpZGUpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInNsaWNlLWhlaWdodCIsIG1TbGljZUhlaWdodCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgbUNvbG9yRm9ybWF0T3V0KTsKKyAgICBub3RpZnktPnNldFJlY3QoImNyb3AiLCAwLCAwLCBtU3RyaWRlIC0gMSwgbVNsaWNlSGVpZ2h0IC0gMSk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2lkdGgiLCBtV2lkdGgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImhlaWdodCIsIG1IZWlnaHQpOworCisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OnJlcXVlc3RGaWxsRW1wdHlJbnB1dCgpIHsKKyAgICBpZiAobVBvcnRFT1Nba1BvcnRJbmRleElucHV0XSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLnNpemUoKTsgKytpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbUJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIGlmIChpbmZvLT5tU3RhdHVzID09IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTKSB7CisgICAgICAgICAgICBwb3N0RmlsbFRoaXNCdWZmZXIoaW5mbyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OnByb2Nlc3NCdWZmZXJzKCkgeworICAgIGlmIChtQXZhaWxhYmxlSW5wdXRCdWZmZXJzLmVtcHR5KCkgfHwgbUF2YWlsYWJsZU91dHB1dEJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigiU2tpcHBpbmcgcHJvY2VzcyAoYnVmZmVycyB1bmF2YWlsYWJsZSkiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtUG9ydEVPU1trUG9ydEluZGV4T3V0cHV0XSkgeworICAgICAgICAvLyBUT0RPIG5vdGlmeSBjYWxsZXIgb2YgcXVldWVJbnB1dCBlcnJvciB3aGVuIGl0IGlzIHN1cHBvcnRlZAorICAgICAgICAvLyBpbiBNZWRpYUNvZGVjCisgICAgICAgIEFMT0dXKCJUcmllZCB0byBwcm9jZXNzIGEgYnVmZmVyIGFmdGVyIEVPUy4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEJ1ZmZlckluZm8gKmlucHV0SW5mbyA9IG1BdmFpbGFibGVJbnB1dEJ1ZmZlcnNbMF07CisgICAgbUF2YWlsYWJsZUlucHV0QnVmZmVycy5yZW1vdmVBdCgwKTsKKyAgICBCdWZmZXJJbmZvICpvdXRwdXRJbmZvID0gbUF2YWlsYWJsZU91dHB1dEJ1ZmZlcnNbMF07CisgICAgbUF2YWlsYWJsZU91dHB1dEJ1ZmZlcnMucmVtb3ZlQXQoMCk7CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgZXJyID0gbUZpbHRlci0+cHJvY2Vzc0J1ZmZlcnMoaW5wdXRJbmZvLT5tRGF0YSwgb3V0cHV0SW5mby0+bURhdGEpOworICAgIGlmIChlcnIgIT0gKHN0YXR1c190KU9LKSB7CisgICAgICAgIG91dHB1dEluZm8tPm1EYXRhLT5tZXRhKCktPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgIH0KKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKGlucHV0SW5mby0+bURhdGEtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisgICAgb3V0cHV0SW5mby0+bURhdGEtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgb3V0cHV0SW5mby0+bU91dHB1dEZsYWdzID0gMDsKKyAgICBpbnQzMl90IGVvcyA9IDA7CisgICAgaWYgKGlucHV0SW5mby0+bURhdGEtPm1ldGEoKS0+ZmluZEludDMyKCJlb3MiLCAmZW9zKSAmJiBlb3MgIT0gMCkgeworICAgICAgICBvdXRwdXRJbmZvLT5tT3V0cHV0RmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICBtUG9ydEVPU1trUG9ydEluZGV4T3V0cHV0XSA9IHRydWU7CisgICAgICAgIG91dHB1dEluZm8tPm1EYXRhLT5tZXRhKCktPnNldEludDMyKCJlb3MiLCBlb3MpOworICAgICAgICBwb3N0RU9TKCk7CisgICAgICAgIEFMT0dWKCJPdXRwdXQgc3RyZWFtIHNhdyBFT1MuIik7CisgICAgfQorCisgICAgQUxPR1YoIlByb2Nlc3NlZCBpbnB1dCBidWZmZXIgJXUgWyV6dV0sIG91dHB1dCBidWZmZXIgJXUgWyV6dV0iLAorICAgICAgICAgICAgICAgIGlucHV0SW5mby0+bUJ1ZmZlcklELCBpbnB1dEluZm8tPm1EYXRhLT5zaXplKCksCisgICAgICAgICAgICAgICAgb3V0cHV0SW5mby0+bUJ1ZmZlcklELCBvdXRwdXRJbmZvLT5tRGF0YS0+c2l6ZSgpKTsKKworICAgIGlmIChtR3JhcGhpY0J1ZmZlckxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIGlucHV0SW5mbzsKKyAgICB9IGVsc2UgeworICAgICAgICBwb3N0RmlsbFRoaXNCdWZmZXIoaW5wdXRJbmZvKTsKKyAgICB9CisgICAgcG9zdERyYWluVGhpc0J1ZmZlcihvdXRwdXRJbmZvKTsKKworICAgIC8vIHByZXZlbnQgYW55IGNvcm5lciBjYXNlIHdoZXJlIGJ1ZmZlcnMgY291bGQgZ2V0IHN0dWNrIGluIHF1ZXVlCisgICAgc2lnbmFsUHJvY2Vzc0J1ZmZlcnMoKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6b25BbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIENIRUNLX0VRKG1TdGF0ZSwgVU5JTklUSUFMSVpFRCk7CisKKyAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCAmbUNvbXBvbmVudE5hbWUpKTsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gbUNvbXBvbmVudE5hbWUuY19zdHIoKTsKKyAgICBpZiAoIXN0cmNhc2VjbXAobmFtZSwgImFuZHJvaWQuZmlsdGVyLnplcm9maWx0ZXIiKSkgeworICAgICAgICBtRmlsdGVyID0gbmV3IFplcm9GaWx0ZXI7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChuYW1lLCAiYW5kcm9pZC5maWx0ZXIuc2F0dXJhdGlvbiIpKSB7CisgICAgICAgIG1GaWx0ZXIgPSBuZXcgU2F0dXJhdGlvbkZpbHRlcjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG5hbWUsICJhbmRyb2lkLmZpbHRlci5pbnRyaW5zaWNibHVyIikpIHsKKyAgICAgICAgbUZpbHRlciA9IG5ldyBJbnRyaW5zaWNCbHVyRmlsdGVyOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobmFtZSwgImFuZHJvaWQuZmlsdGVyLlJlbmRlclNjcmlwdCIpKSB7CisgICAgICAgIG1GaWx0ZXIgPSBuZXcgUlNGaWx0ZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIlVucmVjb2duaXplZCBmaWx0ZXIgbmFtZTogJXMiLCBuYW1lKTsKKyAgICAgICAgc2lnbmFsRXJyb3IoTkFNRV9OT1RfRk9VTkQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdENvbXBvbmVudEFsbG9jYXRlZCk7CisgICAgLy8gSEFDSyAtIG5lZWQgIk9NWC5nb29nbGUiIHRvIHVzZSBNZWRpYUNvZGVjJ3Mgc29mdHdhcmUgcmVuZGVyZXIKKyAgICBub3RpZnktPnNldFN0cmluZygiY29tcG9uZW50TmFtZSIsICJPTVguZ29vZ2xlLk1lZGlhRmlsdGVyIik7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CisgICAgQUxPR1YoIkhhbmRsZWQga1doYXRBbGxvY2F0ZUNvbXBvbmVudC4iKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6b25Db25maWd1cmVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAvLyBUT0RPOiBnZW5lcmFsaXplIHRvIGFsbG93IGF1ZGlvIGZpbHRlcnMgYXMgd2VsbCBhcyB2aWRlbworCisgICAgQ0hFQ0tfRVEobVN0YXRlLCBJTklUSUFMSVpFRCk7CisKKyAgICAvLyBnZXQgcGFyYW1zIC0gYXQgbGVhc3QgbWltZSwgd2lkdGggJiBoZWlnaHQKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKyAgICBpZiAoc3RyY2FzZWNtcChtaW1lLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVykpIHsKKyAgICAgICAgQUxPR0UoIkJhZCBtaW1lOiAlcyIsIG1pbWUuY19zdHIoKSk7CisgICAgICAgIHNpZ25hbEVycm9yKEJBRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmbVdpZHRoKSk7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImhlaWdodCIsICZtSGVpZ2h0KSk7CisgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigic3RyaWRlIiwgJm1TdHJpZGUpKSB7CisgICAgICAgIG1TdHJpZGUgPSBtV2lkdGg7CisgICAgfQorICAgIGlmICghbXNnLT5maW5kSW50MzIoInNsaWNlLWhlaWdodCIsICZtU2xpY2VIZWlnaHQpKSB7CisgICAgICAgIG1TbGljZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgfQorCisgICAgbU1heElucHV0U2l6ZSA9IG1XaWR0aCAqIG1IZWlnaHQgKiA0OyAgIC8vIHJvb20gZm9yIEFSR0I4ODg4CisgICAgaW50MzJfdCBtYXhJbnB1dFNpemU7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsICZtYXhJbnB1dFNpemUpCisgICAgICAgICAgICAmJiAoc2l6ZV90KW1heElucHV0U2l6ZSA+IG1NYXhJbnB1dFNpemUpIHsKKyAgICAgICAgbU1heElucHV0U2l6ZSA9IG1heElucHV0U2l6ZTsKKyAgICB9CisKKyAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmbUNvbG9yRm9ybWF0SW4pKSB7CisgICAgICAgIC8vIGRlZmF1bHQgdG8gT01YX0NPTE9SX0Zvcm1hdDMyYml0QVJHQjg4ODgKKyAgICAgICAgbUNvbG9yRm9ybWF0SW4gPSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4ODsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgbUNvbG9yRm9ybWF0SW4pOworICAgIH0KKyAgICBtQ29sb3JGb3JtYXRPdXQgPSBtQ29sb3JGb3JtYXRJbjsKKworICAgIG1NYXhPdXRwdXRTaXplID0gbVdpZHRoICogbUhlaWdodCAqIDQ7ICAvLyByb29tIGZvciBBUkdCODg4OAorCisgICAgQVN0cmluZyBjYWNoZURpcjsKKyAgICBpZiAoIW1zZy0+ZmluZFN0cmluZygiY2FjaGVEaXIiLCAmY2FjaGVEaXIpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmluZCBjYWNoZSBkaXJlY3RvcnkgaW4gY29uZmlnIG1lc3NhZ2UuIik7CisgICAgICAgIHNpZ25hbEVycm9yKE5BTUVfTk9UX0ZPVU5EKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1c190IGVycjsKKyAgICBlcnIgPSBtRmlsdGVyLT5jb25maWd1cmUobXNnKTsKKyAgICBpZiAoZXJyICE9IChzdGF0dXNfdClPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbmZpZ3VyZSBmaWx0ZXIgY29tcG9uZW50LCBlcnIgJWQiLCBlcnIpOworICAgICAgICBzaWduYWxFcnJvcihlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUlucHV0Rm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgbUlucHV0Rm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lLmNfc3RyKCkpOworICAgIG1JbnB1dEZvcm1hdC0+c2V0SW50MzIoInN0cmlkZSIsIG1TdHJpZGUpOworICAgIG1JbnB1dEZvcm1hdC0+c2V0SW50MzIoInNsaWNlLWhlaWdodCIsIG1TbGljZUhlaWdodCk7CisgICAgbUlucHV0Rm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgbUNvbG9yRm9ybWF0SW4pOworICAgIG1JbnB1dEZvcm1hdC0+c2V0UmVjdCgiY3JvcCIsIDAsIDAsIG1TdHJpZGUsIG1TbGljZUhlaWdodCk7CisgICAgbUlucHV0Rm9ybWF0LT5zZXRJbnQzMigid2lkdGgiLCBtV2lkdGgpOworICAgIG1JbnB1dEZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIG1IZWlnaHQpOworCisgICAgbU91dHB1dEZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIG1PdXRwdXRGb3JtYXQtPnNldFN0cmluZygibWltZSIsIG1pbWUuY19zdHIoKSk7CisgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoInN0cmlkZSIsIG1TdHJpZGUpOworICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJzbGljZS1oZWlnaHQiLCBtU2xpY2VIZWlnaHQpOworICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBtQ29sb3JGb3JtYXRPdXQpOworICAgIG1PdXRwdXRGb3JtYXQtPnNldFJlY3QoImNyb3AiLCAwLCAwLCBtU3RyaWRlLCBtU2xpY2VIZWlnaHQpOworICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIG1XaWR0aCk7CisgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIG1IZWlnaHQpOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdENvbXBvbmVudENvbmZpZ3VyZWQpOworICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJjb21wb25lbnROYW1lIiwgIk1lZGlhRmlsdGVyIik7CisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJpbnB1dC1mb3JtYXQiLCBtSW5wdXRGb3JtYXQpOworICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgib3V0cHV0LWZvcm1hdCIsIG1PdXRwdXRGb3JtYXQpOworICAgIG5vdGlmeS0+cG9zdCgpOworICAgIG1TdGF0ZSA9IENPTkZJR1VSRUQ7CisgICAgQUxPR1YoIkhhbmRsZWQga1doYXRDb25maWd1cmVDb21wb25lbnQuIik7CisKKyAgICBzZW5kRm9ybWF0Q2hhbmdlKCk7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6Om9uU3RhcnQoKSB7CisgICAgQ0hFQ0tfRVEobVN0YXRlLCBDT05GSUdVUkVEKTsKKworICAgIGFsbG9jYXRlQnVmZmVyc09uUG9ydChrUG9ydEluZGV4SW5wdXQpOworCisgICAgYWxsb2NhdGVCdWZmZXJzT25Qb3J0KGtQb3J0SW5kZXhPdXRwdXQpOworCisgICAgc3RhdHVzX3QgZXJyID0gbUZpbHRlci0+c3RhcnQoKTsKKyAgICBpZiAoZXJyICE9IChzdGF0dXNfdClPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHN0YXJ0IGZpbHRlciBjb21wb25lbnQsIGVyciAlZCIsIGVycik7CisgICAgICAgIHNpZ25hbEVycm9yKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtUG9ydEVPU1trUG9ydEluZGV4SW5wdXRdID0gZmFsc2U7CisgICAgbVBvcnRFT1Nba1BvcnRJbmRleE91dHB1dF0gPSBmYWxzZTsKKyAgICBtSW5wdXRFT1NSZXN1bHQgPSBPSzsKKyAgICBtU3RhdGUgPSBTVEFSVEVEOworCisgICAgcmVxdWVzdEZpbGxFbXB0eUlucHV0KCk7CisgICAgQUxPR1YoIkhhbmRsZWQga1doYXRTdGFydC4iKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6b25JbnB1dEJ1ZmZlckZpbGxlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYnVmZmVyLWlkIiwgKGludDMyX3QqKSZidWZmZXJJRCkpOworICAgIEJ1ZmZlckluZm8gKmluZm8gPSBmaW5kQnVmZmVyQnlJRChrUG9ydEluZGV4SW5wdXQsIGJ1ZmZlcklEKTsKKworICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCkgeworICAgICAgICAvLyB3ZSdyZSBub3QgcnVubmluZywgc28gd2UnbGwganVzdCBrZWVwIHRoYXQgYnVmZmVyLi4uCisgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpbmZvLT5tR2VuZXJhdGlvbiAhPSBtR2VuZXJhdGlvbikgeworICAgICAgICBBTE9HVigiQ2F1Z2h0IGEgc3RhbGUgaW5wdXQgYnVmZmVyIFtJRCAlZF0iLCBidWZmZXJJRCk7CisgICAgICAgIC8vIGJ1ZmZlciBpcyBzdGFsZSAodGFrZW4gYmVmb3JlIGEgZmx1c2gvc2h1dGRvd24pIC0gcmVwb3N0IGl0CisgICAgICAgIENIRUNLX0VRKGluZm8tPm1TdGF0dXMsIEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTKTsKKyAgICAgICAgcG9zdEZpbGxUaGlzQnVmZmVyKGluZm8pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ0hFQ0tfRVEoaW5mby0+bVN0YXR1cywgQnVmZmVySW5mbzo6T1dORURfQllfVVBTVFJFQU0pOworICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICBpbnQzMl90IGVyciA9IE9LOworICAgIGJvb2wgZW9zID0gZmFsc2U7CisKKyAgICBpZiAoIW1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcikpIHsKKyAgICAgICAgLy8gdGhlc2UgYXJlIHVuZmlsbGVkIGJ1ZmZlcnMgcmV0dXJuZWQgYnkgY2xpZW50CisgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgLy8gYnVmZmVycyB3aXRoIG5vIGVycm9ycyBhcmUgcmV0dXJuZWQgb24gTWVkaWFDb2RlYy5mbHVzaAorICAgICAgICAgICAgQUxPR1YoInNhdyB1bmZpbGxlZCBidWZmZXIgKE1lZGlhQ29kZWMuZmx1c2gpIik7CisgICAgICAgICAgICBwb3N0RmlsbFRoaXNCdWZmZXIoaW5mbyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigic2F3IGVycm9yICVkIGluc3RlYWQgb2YgYW4gaW5wdXQgYnVmZmVyIiwgZXJyKTsKKyAgICAgICAgICAgIGVvcyA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGlzQ1NEOworICAgIGlmIChidWZmZXIgIT0gTlVMTCAmJiBidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjc2QiLCAmaXNDU0QpCisgICAgICAgICAgICAmJiBpc0NTRCAhPSAwKSB7CisgICAgICAgIC8vIGlnbm9yZSBjb2RlYy1zcGVjaWZpYyBkYXRhIGJ1ZmZlcnMKKyAgICAgICAgQUxPR1coIk1lZGlhRmlsdGVyIHJlY2VpdmVkIGEgY29kZWMtc3BlY2lmaWMgZGF0YSBidWZmZXIiKTsKKyAgICAgICAgcG9zdEZpbGxUaGlzQnVmZmVyKGluZm8pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCB0bXA7CisgICAgaWYgKGJ1ZmZlciAhPSBOVUxMICYmIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImVvcyIsICZ0bXApICYmIHRtcCkgeworICAgICAgICBlb3MgPSB0cnVlOworICAgICAgICBlcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKworICAgIG1BdmFpbGFibGVJbnB1dEJ1ZmZlcnMucHVzaF9iYWNrKGluZm8pOworICAgIHByb2Nlc3NCdWZmZXJzKCk7CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1Qb3J0RU9TW2tQb3J0SW5kZXhJbnB1dF0gPSB0cnVlOworICAgICAgICBtSW5wdXRFT1NSZXN1bHQgPSBlcnI7CisgICAgfQorCisgICAgQUxPR1YoIkhhbmRsZWQga1doYXRJbnB1dEJ1ZmZlckZpbGxlZC4gW0lEICV1XSIsIGJ1ZmZlcklEKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6b25PdXRwdXRCdWZmZXJEcmFpbmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklEOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJidWZmZXItaWQiLCAoaW50MzJfdCopJmJ1ZmZlcklEKSk7CisgICAgQnVmZmVySW5mbyAqaW5mbyA9IGZpbmRCdWZmZXJCeUlEKGtQb3J0SW5kZXhPdXRwdXQsIGJ1ZmZlcklEKTsKKworICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCkgeworICAgICAgICAvLyB3ZSdyZSBub3QgcnVubmluZywgc28gd2UnbGwganVzdCBrZWVwIHRoYXQgYnVmZmVyLi4uCisgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpbmZvLT5tR2VuZXJhdGlvbiAhPSBtR2VuZXJhdGlvbikgeworICAgICAgICBBTE9HVigiQ2F1Z2h0IGEgc3RhbGUgb3V0cHV0IGJ1ZmZlciBbSUQgJWRdIiwgYnVmZmVySUQpOworICAgICAgICAvLyBidWZmZXIgaXMgc3RhbGUgKHRha2VuIGJlZm9yZSBhIGZsdXNoL3NodXRkb3duKSAtIGtlZXAgaXQKKyAgICAgICAgQ0hFQ0tfRVEoaW5mby0+bVN0YXR1cywgQnVmZmVySW5mbzo6T1dORURfQllfVVMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ0hFQ0tfRVEoaW5mby0+bVN0YXR1cywgQnVmZmVySW5mbzo6T1dORURfQllfVVBTVFJFQU0pOworICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKKworICAgIG1BdmFpbGFibGVPdXRwdXRCdWZmZXJzLnB1c2hfYmFjayhpbmZvKTsKKworICAgIHByb2Nlc3NCdWZmZXJzKCk7CisKKyAgICBBTE9HVigiSGFuZGxlZCBrV2hhdE91dHB1dEJ1ZmZlckRyYWluZWQuIFtJRCAldV0iLAorICAgICAgICAgICAgYnVmZmVySUQpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpvblNodXRkb3duKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgbUdlbmVyYXRpb24rKzsKKworICAgIGlmIChtU3RhdGUgIT0gVU5JTklUSUFMSVpFRCkgeworICAgICAgICBtRmlsdGVyLT5yZXNldCgpOworICAgIH0KKworICAgIGludDMyX3Qga2VlcENvbXBvbmVudEFsbG9jYXRlZDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigia2VlcENvbXBvbmVudEFsbG9jYXRlZCIsICZrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSk7CisgICAgaWYgKCFrZWVwQ29tcG9uZW50QWxsb2NhdGVkIHx8IG1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEKSB7CisgICAgICAgIG1TdGF0ZSA9IFVOSU5JVElBTElaRUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpvbkZsdXNoKCkgeworICAgIG1HZW5lcmF0aW9uKys7CisKKyAgICBtQXZhaWxhYmxlSW5wdXRCdWZmZXJzLmNsZWFyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLnNpemUoKTsgKytpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbUJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5lZGl0SXRlbUF0KGkpOworICAgICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CisgICAgfQorICAgIG1BdmFpbGFibGVPdXRwdXRCdWZmZXJzLmNsZWFyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5zaXplKCk7ICsraSkgeworICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gJm1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLmVkaXRJdGVtQXQoaSk7CisgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKKyAgICAgICAgbUF2YWlsYWJsZU91dHB1dEJ1ZmZlcnMucHVzaF9iYWNrKGluZm8pOworICAgIH0KKworICAgIG1Qb3J0RU9TW2tQb3J0SW5kZXhJbnB1dF0gPSBmYWxzZTsKKyAgICBtUG9ydEVPU1trUG9ydEluZGV4T3V0cHV0XSA9IGZhbHNlOworICAgIG1JbnB1dEVPU1Jlc3VsdCA9IE9LOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOworICAgIEFMT0dWKCJQb3N0ZWQga1doYXRGbHVzaENvbXBsZXRlZCIpOworCisgICAgLy8gTWVkaWFDb2RlYyByZXR1cm5zIGFsbCBpbnB1dCBidWZmZXJzIGFmdGVyIGZsdXNoLCBzbyBpbgorICAgIC8vIG9uSW5wdXRCdWZmZXJGaWxsZWQgd2UgY2FsbCBwb3N0RmlsbFRoaXNCdWZmZXIgb24gdGhlbQorfQorCit2b2lkIE1lZGlhRmlsdGVyOjpvblNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBDSEVDSyhtU3RhdGUgIT0gU1RBUlRFRCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtRmlsdGVyLT5zZXRQYXJhbWV0ZXJzKG1zZyk7CisgICAgaWYgKGVyciAhPSAoc3RhdHVzX3QpT0spIHsKKyAgICAgICAgQUxPR0UoInNldFBhcmFtZXRlcnMgcmV0dXJuZWQgZXJyICVkIiwgZXJyKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6Om9uQ3JlYXRlSW5wdXRTdXJmYWNlKCkgeworICAgIENIRUNLKG1TdGF0ZSA9PSBDT05GSUdVUkVEKTsKKworICAgIG1HcmFwaGljQnVmZmVyTGlzdGVuZXIgPSBuZXcgR3JhcGhpY0J1ZmZlckxpc3RlbmVyOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZSgpOworICAgIG5vdGlmeS0+c2V0VGFyZ2V0KHRoaXMpOworICAgIHN0YXR1c190IGVyciA9IG1HcmFwaGljQnVmZmVyTGlzdGVuZXItPmluaXQoCisgICAgICAgICAgICBub3RpZnksIG1TdHJpZGUsIG1TbGljZUhlaWdodCwga0J1ZmZlckNvdW50QWN0dWFsKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IG1HcmFwaGljQnVmZmVyTGlzdGVuZXI6ICVkIiwgZXJyKTsKKyAgICAgICAgc2lnbmFsRXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG1Ob3RpZnktPmR1cCgpOworICAgIHJlcGx5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRJbnB1dFN1cmZhY2VDcmVhdGVkKTsKKyAgICByZXBseS0+c2V0T2JqZWN0KAorICAgICAgICAgICAgImlucHV0LXN1cmZhY2UiLAorICAgICAgICAgICAgbmV3IEJ1ZmZlclByb2R1Y2VyV3JhcHBlcigKKyAgICAgICAgICAgICAgICAgICAgbUdyYXBoaWNCdWZmZXJMaXN0ZW5lci0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKSk7CisgICAgcmVwbHktPnBvc3QoKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6b25JbnB1dEZyYW1lQXZhaWxhYmxlKCkgeworICAgIEJ1ZmZlckl0ZW0gaXRlbSA9IG1HcmFwaGljQnVmZmVyTGlzdGVuZXItPmdldEJ1ZmZlckl0ZW0oKTsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYgPSBtR3JhcGhpY0J1ZmZlckxpc3RlbmVyLT5nZXRCdWZmZXIoaXRlbSk7CisKKyAgICAvLyBnZXQgcG9pbnRlciB0byBncmFwaGljIGJ1ZmZlcgorICAgIHZvaWQqIGJ1ZlB0cjsKKyAgICBidWYtPmxvY2soR3JhcGhpY0J1ZmZlcjo6VVNBR0VfU1dfUkVBRF9PRlRFTiwgJmJ1ZlB0cik7CisKKyAgICAvLyBIQUNLIC0gdGhlcmUgaXMgbm8gT01YX0NPTE9SX0ZPUk1BVFRZUEUgdmFsdWUgZm9yIFJHQkEsIHNvIHRoZSBmb3JtYXQKKyAgICAvLyBjb252ZXJzaW9uIGlzIGhhcmRjb2RlZCB1bnRpbCB3ZSBhZGQgdGhpcy4KKyAgICAvLyBUT0RPOiBjaGVjayBpbnB1dCBmb3JtYXQgYW5kIGNvbnZlcnQgb25seSBpZiBuZWNlc3NhcnkKKyAgICAvLyBjb3B5IFJHQkEgZ3JhcGhpYyBidWZmZXIgaW50byB0ZW1wb3JhcnkgQVJHQiBpbnB1dCBidWZmZXIKKyAgICBCdWZmZXJJbmZvICppbnB1dEluZm8gPSBuZXcgQnVmZmVySW5mbzsKKyAgICBpbnB1dEluZm8tPm1EYXRhID0gbmV3IEFCdWZmZXIoYnVmLT5nZXRXaWR0aCgpICogYnVmLT5nZXRIZWlnaHQoKSAqIDQpOworICAgIEFMT0dWKCJDb3B5aW5nIHN1cmZhY2UgZGF0YSBpbnRvIHRlbXAgYnVmZmVyLiIpOworICAgIGNvbnZlcnRSR0JBVG9BUkdCKAorICAgICAgICAgICAgKHVpbnQ4X3QqKWJ1ZlB0ciwgYnVmLT5nZXRXaWR0aCgpLCBidWYtPmdldEhlaWdodCgpLAorICAgICAgICAgICAgYnVmLT5nZXRTdHJpZGUoKSwgaW5wdXRJbmZvLT5tRGF0YS0+ZGF0YSgpKTsKKyAgICBpbnB1dEluZm8tPm1CdWZmZXJJRCA9IGl0ZW0ubUJ1ZjsKKyAgICBpbnB1dEluZm8tPm1HZW5lcmF0aW9uID0gbUdlbmVyYXRpb247CisgICAgaW5wdXRJbmZvLT5tT3V0cHV0RmxhZ3MgPSAwOworICAgIGlucHV0SW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOworICAgIGlucHV0SW5mby0+bURhdGEtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIGl0ZW0ubVRpbWVzdGFtcCAvIDEwMDApOworCisgICAgbUF2YWlsYWJsZUlucHV0QnVmZmVycy5wdXNoX2JhY2soaW5wdXRJbmZvKTsKKworICAgIG1HcmFwaGljQnVmZmVyTGlzdGVuZXItPnJlbGVhc2VCdWZmZXIoaXRlbSk7CisKKyAgICBzaWduYWxQcm9jZXNzQnVmZmVycygpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpvblNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7CisgICAgLy8gaWYgdXNpbmcgaW5wdXQgc3VyZmFjZSwgbmVlZCB0byBzZW5kIGFuIEVPUyBvdXRwdXQgYnVmZmVyCisgICAgaWYgKG1HcmFwaGljQnVmZmVyTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBWZWN0b3I8QnVmZmVySW5mbz4gKm91dHB1dEJ1ZnMgPSAmbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF07CisgICAgICAgIEJ1ZmZlckluZm8qIGVvc0J1ZjsKKyAgICAgICAgYm9vbCBmb3VuZEJ1ZiA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtCdWZmZXJDb3VudEFjdHVhbDsgaSsrKSB7CisgICAgICAgICAgICBlb3NCdWYgPSAmb3V0cHV0QnVmcy0+ZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgICAgIGlmIChlb3NCdWYtPm1TdGF0dXMgPT0gQnVmZmVySW5mbzo6T1dORURfQllfVVMpIHsKKyAgICAgICAgICAgICAgICBmb3VuZEJ1ZiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZvdW5kQnVmKSB7CisgICAgICAgICAgICBBTE9HRSgib25TaWduYWxFbmRPZklucHV0U3RyZWFtIGZhaWxlZCB0byBmaW5kIGFuIG91dHB1dCBidWZmZXIiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGVvc0J1Zi0+bU91dHB1dEZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICBlb3NCdWYtPm1HZW5lcmF0aW9uID0gbUdlbmVyYXRpb247CisgICAgICAgIGVvc0J1Zi0+bURhdGEtPnNldFJhbmdlKDAsIDApOworICAgICAgICBwb3N0RHJhaW5UaGlzQnVmZmVyKGVvc0J1Zik7CisgICAgICAgIEFMT0dWKCJQb3N0ZWQgRU9TIG9uIG91dHB1dCBidWZmZXIgJXUiLCBlb3NCdWYtPm1CdWZmZXJJRCk7CisgICAgfQorCisgICAgbVBvcnRFT1Nba1BvcnRJbmRleE91dHB1dF0gPSB0cnVlOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdFNpZ25hbGVkSW5wdXRFT1MpOworICAgIG5vdGlmeS0+cG9zdCgpOworCisgICAgQUxPR1YoIk91dHB1dCBzdHJlYW0gc2F3IEVPUy4iKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1JTRmlsdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvUlNGaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Njk5NDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1JTRmlsdGVyLmNwcApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJSU0ZpbHRlciIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlICJSU0ZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1JTRmlsdGVyOjpSU0ZpbHRlcigpIHsKKworfQorCitSU0ZpbHRlcjo6flJTRmlsdGVyKCkgeworCit9CisKK3N0YXR1c190IFJTRmlsdGVyOjpjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBTaW1wbGVGaWx0ZXI6OmNvbmZpZ3VyZShtc2cpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoIW1zZy0+ZmluZFN0cmluZygiY2FjaGVEaXIiLCAmbUNhY2hlRGlyKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZpbmQgY2FjaGUgZGlyZWN0b3J5IGluIGNvbmZpZyBtZXNzYWdlLiIpOworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgc3A8UmVuZGVyU2NyaXB0V3JhcHBlcj4gd3JhcHBlcjsKKyAgICBpZiAoIW1zZy0+ZmluZE9iamVjdCgicnMtd3JhcHBlciIsIChzcDxSZWZCYXNlPiopJndyYXBwZXIpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmluZCBSZW5kZXJTY3JpcHRXcmFwcGVyIGluIGNvbmZpZyBtZXNzYWdlLiIpOworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgbVJTID0gd3JhcHBlci0+bUNvbnRleHQ7CisgICAgbUNhbGxiYWNrID0gd3JhcHBlci0+bUNhbGxiYWNrOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBSU0ZpbHRlcjo6c3RhcnQoKSB7CisgICAgLy8gMzItYml0IGVsZW1lbnRzIGZvciBBUkdCODg4OAorICAgIFJTQzo6c3A8Y29uc3QgUlNDOjpFbGVtZW50PiBlID0gUlNDOjpFbGVtZW50OjpVOF80KG1SUyk7CisKKyAgICBSU0M6OlR5cGU6OkJ1aWxkZXIgdGIobVJTLCBlKTsKKyAgICB0Yi5zZXRYKG1XaWR0aCk7CisgICAgdGIuc2V0WShtSGVpZ2h0KTsKKyAgICBSU0M6OnNwPGNvbnN0IFJTQzo6VHlwZT4gdCA9IHRiLmNyZWF0ZSgpOworCisgICAgbUFsbG9jSW4gPSBSU0M6OkFsbG9jYXRpb246OmNyZWF0ZVR5cGVkKG1SUywgdCk7CisgICAgbUFsbG9jT3V0ID0gUlNDOjpBbGxvY2F0aW9uOjpjcmVhdGVUeXBlZChtUlMsIHQpOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFJTRmlsdGVyOjpyZXNldCgpIHsKKyAgICBtQ2FsbGJhY2suY2xlYXIoKTsKKyAgICBtQWxsb2NPdXQuY2xlYXIoKTsKKyAgICBtQWxsb2NJbi5jbGVhcigpOworICAgIG1SUy5jbGVhcigpOworfQorCitzdGF0dXNfdCBSU0ZpbHRlcjo6c2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHJldHVybiBtQ2FsbGJhY2stPmhhbmRsZVNldFBhcmFtZXRlcnMobXNnKTsKK30KKworc3RhdHVzX3QgUlNGaWx0ZXI6OnByb2Nlc3NCdWZmZXJzKAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc3JjQnVmZmVyLCBjb25zdCBzcDxBQnVmZmVyPiAmb3V0QnVmZmVyKSB7CisgICAgbUFsbG9jSW4tPmNvcHkxRFJhbmdlRnJvbSgwLCBtV2lkdGggKiBtSGVpZ2h0LCBzcmNCdWZmZXItPmRhdGEoKSk7CisgICAgbUNhbGxiYWNrLT5wcm9jZXNzQnVmZmVycyhtQWxsb2NJbi5nZXQoKSwgbUFsbG9jT3V0LmdldCgpKTsKKyAgICBtQWxsb2NPdXQtPmNvcHkxRFJhbmdlVG8oMCwgbVdpZHRoICogbUhlaWdodCwgb3V0QnVmZmVyLT5kYXRhKCkpOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvUlNGaWx0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvUlNGaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWI1MDc0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9SU0ZpbHRlci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJTX0ZJTFRFUl9IXworI2RlZmluZSBSU19GSUxURVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1JlbmRlclNjcmlwdFdyYXBwZXIuaD4KKyNpbmNsdWRlIDxSZW5kZXJTY3JpcHQuaD4KKworI2luY2x1ZGUgIlNpbXBsZUZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBU3RyaW5nOworCitzdHJ1Y3QgUlNGaWx0ZXIgOiBwdWJsaWMgU2ltcGxlRmlsdGVyIHsKK3B1YmxpYzoKKyAgICBSU0ZpbHRlcigpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc0J1ZmZlcnMoCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc3JjQnVmZmVyLCBjb25zdCBzcDxBQnVmZmVyPiAmb3V0QnVmZmVyKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflJTRmlsdGVyKCk7CisKK3ByaXZhdGU6CisgICAgQVN0cmluZyBtQ2FjaGVEaXI7CisgICAgc3A8UmVuZGVyU2NyaXB0V3JhcHBlcjo6UlNGaWx0ZXJDYWxsYmFjaz4gbUNhbGxiYWNrOworICAgIFJTQzo6c3A8UlNDOjpSUz4gbVJTOworICAgIFJTQzo6c3A8UlNDOjpBbGxvY2F0aW9uPiBtQWxsb2NJbjsKKyAgICBSU0M6OnNwPFJTQzo6QWxsb2NhdGlvbj4gbUFsbG9jT3V0OworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gUlNfRklMVEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1NhdHVyYXRpb25GaWx0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9TYXR1cmF0aW9uRmlsdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTVmNzVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9TYXR1cmF0aW9uRmlsdGVyLmNwcApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTYXR1cmF0aW9uRmlsdGVyIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgIlNhdHVyYXRpb25GaWx0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBTYXR1cmF0aW9uRmlsdGVyOjpjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBTaW1wbGVGaWx0ZXI6OmNvbmZpZ3VyZShtc2cpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoIW1zZy0+ZmluZFN0cmluZygiY2FjaGVEaXIiLCAmbUNhY2hlRGlyKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZpbmQgY2FjaGUgZGlyZWN0b3J5IGluIGNvbmZpZyBtZXNzYWdlLiIpOworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTYXR1cmF0aW9uRmlsdGVyOjpzdGFydCgpIHsKKyAgICAvLyBUT0RPOiB1c2UgYSBzaW5nbGUgUlMgY29udGV4dCBvYmplY3QgZm9yIGVudGlyZSBhcHBsaWNhdGlvbgorICAgIG1SUyA9IG5ldyBSU0M6OlJTKCk7CisKKyAgICBpZiAoIW1SUy0+aW5pdChtQ2FjaGVEaXIuY19zdHIoKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIFJlbmRlclNjcmlwdCBjb250ZXh0LiIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICAvLyAzMi1iaXQgZWxlbWVudHMgZm9yIEFSR0I4ODg4CisgICAgUlNDOjpzcDxjb25zdCBSU0M6OkVsZW1lbnQ+IGUgPSBSU0M6OkVsZW1lbnQ6OlU4XzQobVJTKTsKKworICAgIFJTQzo6VHlwZTo6QnVpbGRlciB0YihtUlMsIGUpOworICAgIHRiLnNldFgobVdpZHRoKTsKKyAgICB0Yi5zZXRZKG1IZWlnaHQpOworICAgIFJTQzo6c3A8Y29uc3QgUlNDOjpUeXBlPiB0ID0gdGIuY3JlYXRlKCk7CisKKyAgICBtQWxsb2NJbiA9IFJTQzo6QWxsb2NhdGlvbjo6Y3JlYXRlVHlwZWQobVJTLCB0KTsKKyAgICBtQWxsb2NPdXQgPSBSU0M6OkFsbG9jYXRpb246OmNyZWF0ZVR5cGVkKG1SUywgdCk7CisKKyAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfc2F0dXJhdGlvbkFSR0IobVJTKTsKKworICAgIG1TY3JpcHQtPnNldF9nU2F0dXJhdGlvbihtU2F0dXJhdGlvbik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgU2F0dXJhdGlvbkZpbHRlcjo6cmVzZXQoKSB7CisgICAgbVNjcmlwdC5jbGVhcigpOworICAgIG1BbGxvY091dC5jbGVhcigpOworICAgIG1BbGxvY0luLmNsZWFyKCk7CisgICAgbVJTLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IFNhdHVyYXRpb25GaWx0ZXI6OnNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxBTWVzc2FnZT4gcGFyYW1zOworICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInBhcmFtcyIsICZwYXJhbXMpKTsKKworICAgIGZsb2F0IHNhdHVyYXRpb247CisgICAgaWYgKHBhcmFtcy0+ZmluZEZsb2F0KCJzYXR1cmF0aW9uIiwgJnNhdHVyYXRpb24pKSB7CisgICAgICAgIG1TYXR1cmF0aW9uID0gc2F0dXJhdGlvbjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNhdHVyYXRpb25GaWx0ZXI6OnByb2Nlc3NCdWZmZXJzKAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc3JjQnVmZmVyLCBjb25zdCBzcDxBQnVmZmVyPiAmb3V0QnVmZmVyKSB7CisgICAgbUFsbG9jSW4tPmNvcHkxRFJhbmdlRnJvbSgwLCBtV2lkdGggKiBtSGVpZ2h0LCBzcmNCdWZmZXItPmRhdGEoKSk7CisgICAgbVNjcmlwdC0+Zm9yRWFjaF9yb290KG1BbGxvY0luLCBtQWxsb2NPdXQpOworICAgIG1BbGxvY091dC0+Y29weTFEUmFuZ2VUbygwLCBtV2lkdGggKiBtSGVpZ2h0LCBvdXRCdWZmZXItPmRhdGEoKSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9TYXR1cmF0aW9uRmlsdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1NhdHVyYXRpb25GaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTQ1MDIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9TYXR1cmF0aW9uRmlsdGVyLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0FUVVJBVElPTl9GSUxURVJfSF8KKyNkZWZpbmUgU0FUVVJBVElPTl9GSUxURVJfSF8KKworI2luY2x1ZGUgPFJlbmRlclNjcmlwdC5oPgorCisjaW5jbHVkZSAiU2NyaXB0Q19zYXR1cmF0aW9uQVJHQi5oIgorI2luY2x1ZGUgIlNpbXBsZUZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTYXR1cmF0aW9uRmlsdGVyIDogcHVibGljIFNpbXBsZUZpbHRlciB7CitwdWJsaWM6CisgICAgU2F0dXJhdGlvbkZpbHRlcigpIDogbVNhdHVyYXRpb24oMS5mKSB7fTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NCdWZmZXJzKAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNyY0J1ZmZlciwgY29uc3Qgc3A8QUJ1ZmZlcj4gJm91dEJ1ZmZlcik7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5TYXR1cmF0aW9uRmlsdGVyKCkge307CisKK3ByaXZhdGU6CisgICAgQVN0cmluZyBtQ2FjaGVEaXI7CisgICAgUlNDOjpzcDxSU0M6OlJTPiBtUlM7CisgICAgUlNDOjpzcDxSU0M6OkFsbG9jYXRpb24+IG1BbGxvY0luOworICAgIFJTQzo6c3A8UlNDOjpBbGxvY2F0aW9uPiBtQWxsb2NPdXQ7CisgICAgUlNDOjpzcDxTY3JpcHRDX3NhdHVyYXRpb25BUkdCPiBtU2NyaXB0OworICAgIGZsb2F0IG1TYXR1cmF0aW9uOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU0FUVVJBVElPTl9GSUxURVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvU2ltcGxlRmlsdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvU2ltcGxlRmlsdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzFjYTJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9TaW1wbGVGaWx0ZXIuY3BwCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlICJTaW1wbGVGaWx0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBTaW1wbGVGaWx0ZXI6OmNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZtV2lkdGgpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaGVpZ2h0IiwgJm1IZWlnaHQpKTsKKyAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJzdHJpZGUiLCAmbVN0cmlkZSkpIHsKKyAgICAgICAgbVN0cmlkZSA9IG1XaWR0aDsKKyAgICB9CisgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigic2xpY2UtaGVpZ2h0IiwgJm1TbGljZUhlaWdodCkpIHsKKyAgICAgICAgbVNsaWNlSGVpZ2h0ID0gbUhlaWdodDsKKyAgICB9CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZtQ29sb3JGb3JtYXRJbikpOworICAgIG1Db2xvckZvcm1hdE91dCA9IG1Db2xvckZvcm1hdEluOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvU2ltcGxlRmlsdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1NpbXBsZUZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZDM3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1NpbXBsZUZpbHRlci5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNJTVBMRV9GSUxURVJfSF8KKyNkZWZpbmUgU0lNUExFX0ZJTFRFUl9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCitzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBBTWVzc2FnZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgU2ltcGxlRmlsdGVyIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIFNpbXBsZUZpbHRlcigpIDogbVdpZHRoKDApLCBtSGVpZ2h0KDApLCBtU3RyaWRlKDApLCBtU2xpY2VIZWlnaHQoMCksCisgICAgICAgICAgICBtQ29sb3JGb3JtYXRJbigwKSwgbUNvbG9yRm9ybWF0T3V0KDApIHt9OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZzcmNCdWZmZXIsIGNvbnN0IHNwPEFCdWZmZXI+ICZvdXRCdWZmZXIpID0gMDsKKworcHJvdGVjdGVkOgorICAgIGludDMyX3QgbVdpZHRoLCBtSGVpZ2h0OworICAgIGludDMyX3QgbVN0cmlkZSwgbVNsaWNlSGVpZ2h0OworICAgIGludDMyX3QgbUNvbG9yRm9ybWF0SW4sIG1Db2xvckZvcm1hdE91dDsKKworICAgIHZpcnR1YWwgflNpbXBsZUZpbHRlcigpIHt9OworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU0lNUExFX0ZJTFRFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9aZXJvRmlsdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvWmVyb0ZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YxMjQzYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvWmVyb0ZpbHRlci5jcHAKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiWmVyb0ZpbHRlciIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSAiWmVyb0ZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IFplcm9GaWx0ZXI6OnNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxBTWVzc2FnZT4gcGFyYW1zOworICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInBhcmFtcyIsICZwYXJhbXMpKTsKKworICAgIGludDMyX3QgaW52ZXJ0OworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiaW52ZXJ0IiwgJmludmVydCkpIHsKKyAgICAgICAgbUludmVydERhdGEgPSAoaW52ZXJ0ICE9IDApOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgWmVyb0ZpbHRlcjo6cHJvY2Vzc0J1ZmZlcnMoCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZzcmNCdWZmZXIsIGNvbnN0IHNwPEFCdWZmZXI+ICZvdXRCdWZmZXIpIHsKKyAgICAvLyBhc3N1bWluZyBpZGVudGljYWwgaW5wdXQgJiBvdXRwdXQgYnVmZmVycywgc2luY2Ugd2UncmUgYSBjb3B5IGZpbHRlcgorICAgIGlmIChtSW52ZXJ0RGF0YSkgeworICAgICAgICB1aW50MzJfdCogc3JjID0gKHVpbnQzMl90KilzcmNCdWZmZXItPmRhdGEoKTsKKyAgICAgICAgdWludDMyX3QqIGRlc3QgPSAodWludDMyX3QqKW91dEJ1ZmZlci0+ZGF0YSgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNyY0J1ZmZlci0+c2l6ZSgpIC8gNDsgKytpKSB7CisgICAgICAgICAgICAqKGRlc3QrKykgPSAqKHNyYysrKSBeIDB4RkZGRkZGRkY7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5kYXRhKCksIHNyY0J1ZmZlci0+ZGF0YSgpLCBzcmNCdWZmZXItPnNpemUoKSk7CisgICAgfQorICAgIG91dEJ1ZmZlci0+c2V0UmFuZ2UoMCwgc3JjQnVmZmVyLT5zaXplKCkpOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvWmVyb0ZpbHRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9aZXJvRmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzNGRmYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvWmVyb0ZpbHRlci5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFpFUk9fRklMVEVSX0hfCisjZGVmaW5lIFpFUk9fRklMVEVSX0hfCisKKyNpbmNsdWRlICJTaW1wbGVGaWx0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgWmVyb0ZpbHRlciA6IHB1YmxpYyBTaW1wbGVGaWx0ZXIgeworcHVibGljOgorICAgIFplcm9GaWx0ZXIoKSA6IG1JbnZlcnREYXRhKGZhbHNlKSB7fTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSB7IHJldHVybiBPSzsgfTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSB7fTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc0J1ZmZlcnMoCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc3JjQnVmZmVyLCBjb25zdCBzcDxBQnVmZmVyPiAmb3V0QnVmZmVyKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflplcm9GaWx0ZXIoKSB7fTsKKworcHJpdmF0ZToKKyAgICBib29sIG1JbnZlcnREYXRhOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gWkVST19GSUxURVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvc2F0dXJhdGlvbi5ycyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvc2F0dXJhdGlvbi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzg2N2FjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9zYXR1cmF0aW9uLnJzCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFNhbXBsZSBzY3JpcHQgZm9yIFJHQjg4OCBzdXBwb3J0IChjb21wYXJlIHRvIHNhdHVyYXRpb25BUkdCLnJzKQorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgdmVyc2lvbigxKQorI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5ycy5jcHBiYXNpYykKKyNwcmFnbWEgcnNfZnBfcmVsYXhlZAorCitjb25zdCBzdGF0aWMgZmxvYXQzIGdNb25vTXVsdCA9IHswLjI5OWYsIDAuNTg3ZiwgMC4xMTRmfTsKKworLy8gZ2xvYmFsIHZhcmlhYmxlcyAocGFyYW1ldGVycyBhY2Nlc3NpYmxlIHRvIGFwcGxpY2F0aW9uIGNvZGUpCitmbG9hdCBnU2F0dXJhdGlvbiA9IDEuMGY7CisKK3ZvaWQgcm9vdChjb25zdCB1Y2hhcjMgKnZfaW4sIHVjaGFyMyAqdl9vdXQpIHsKKyAgICAvLyBzY2FsZSAwLTI1NSB1Y2hhciB0byAwLTEuMCBmbG9hdAorICAgIGZsb2F0MyBpbiA9IHt2X2luLT5yICogMC4wMDM5MjE1NjlmLCB2X2luLT5nICogMC4wMDM5MjE1NjlmLAorICAgICAgICAgICAgdl9pbi0+YiAqIDAuMDAzOTIxNTY5Zn07CisKKyAgICAvLyBhcHBseSBzYXR1cmF0aW9uIGZpbHRlcgorICAgIGZsb2F0MyByZXN1bHQgPSBkb3QoaW4sIGdNb25vTXVsdCk7CisgICAgcmVzdWx0ID0gbWl4KHJlc3VsdCwgaW4sIGdTYXR1cmF0aW9uKTsKKworICAgIC8vIGNvbnZlcnQgdG8gdWNoYXIsIGNvcGllZCBmcm9tIHJzUGFja0NvbG9yVG84ODg4CisgICAgdl9vdXQtPnggPSAodWNoYXIpY2xhbXAoKHJlc3VsdC5yICogMjU1LmYgKyAwLjVmKSwgMC5mLCAyNTUuZik7CisgICAgdl9vdXQtPnkgPSAodWNoYXIpY2xhbXAoKHJlc3VsdC5nICogMjU1LmYgKyAwLjVmKSwgMC5mLCAyNTUuZik7CisgICAgdl9vdXQtPnogPSAodWNoYXIpY2xhbXAoKHJlc3VsdC5iICogMjU1LmYgKyAwLjVmKSwgMC5mLCAyNTUuZik7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL3NhdHVyYXRpb25BUkdCLnJzIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9zYXR1cmF0aW9uQVJHQi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGU5ZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9zYXR1cmF0aW9uQVJHQi5ycwpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnJzLmNwcGJhc2ljKQorI3ByYWdtYSByc19mcF9yZWxheGVkCisKK2NvbnN0IHN0YXRpYyBmbG9hdDMgZ01vbm9NdWx0ID0gezAuMjk5ZiwgMC41ODdmLCAwLjExNGZ9OworCisvLyBnbG9iYWwgdmFyaWFibGVzIChwYXJhbWV0ZXJzIGFjY2Vzc2libGUgdG8gYXBwbGljYXRpb24gY29kZSkKK2Zsb2F0IGdTYXR1cmF0aW9uID0gMS4wZjsKKwordm9pZCByb290KGNvbnN0IHVjaGFyNCAqdl9pbiwgdWNoYXI0ICp2X291dCkgeworICAgIHZfb3V0LT54ID0gdl9pbi0+eDsgLy8gZG9uJ3QgbW9kaWZ5IEEKKworICAgIC8vIGdldCBSR0IsIHNjYWxlIDAtMjU1IHVjaGFyIHRvIDAtMS4wIGZsb2F0CisgICAgZmxvYXQzIHJnYiA9IHt2X2luLT55ICogMC4wMDM5MjE1NjlmLCB2X2luLT56ICogMC4wMDM5MjE1NjlmLAorICAgICAgICAgICAgdl9pbi0+dyAqIDAuMDAzOTIxNTY5Zn07CisKKyAgICAvLyBhcHBseSBzYXR1cmF0aW9uIGZpbHRlcgorICAgIGZsb2F0MyByZXN1bHQgPSBkb3QocmdiLCBnTW9ub011bHQpOworICAgIHJlc3VsdCA9IG1peChyZXN1bHQsIHJnYiwgZ1NhdHVyYXRpb24pOworCisgICAgdl9vdXQtPnkgPSAodWNoYXIpY2xhbXAoKHJlc3VsdC5yICogMjU1LmYgKyAwLjVmKSwgMC5mLCAyNTUuZik7CisgICAgdl9vdXQtPnogPSAodWNoYXIpY2xhbXAoKHJlc3VsdC5nICogMjU1LmYgKyAwLjVmKSwgMC5mLCAyNTUuZik7CisgICAgdl9vdXQtPncgPSAodWNoYXIpY2xhbXAoKHJlc3VsdC5iICogMjU1LmYgKyAwLjVmKSwgMC5mLCAyNTUuZik7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmNwcAppbmRleCA0OTEzZmQ0Li5hNWI4MWE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5jcHAKQEAgLTUyLDYgKzUyLDkgQEAKIHNwPEFCdWZmZXI+IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY2FwYWNpdHkpCiB7CiAgICAgc3A8QUJ1ZmZlcj4gcmVzID0gbmV3IEFCdWZmZXIoY2FwYWNpdHkpOworICAgIGlmIChyZXMtPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICBtZW1jcHkocmVzLT5kYXRhKCksIGRhdGEsIGNhcGFjaXR5KTsKICAgICByZXR1cm4gcmVzOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuY3BwCmluZGV4IGVjNGE5NjAuLjJjNWY1NDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxjdHlwZS5oPgogCiAjZGVmaW5lIExPR19UQUcgIkFEZWJ1ZyIKKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCkBAIC0yOCwxNCArMjksMTUgQEAKICNpbmNsdWRlIDxBU3RyaW5nVXRpbHMuaD4KICNpbmNsdWRlIDxBVXRpbHMuaD4KIAorI2RlZmluZSBVTlVTRUQoeCkgKCh2b2lkKSh4KSkKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvL3N0YXRpYwotQURlYnVnOjpMZXZlbCBBRGVidWc6OkdldERlYnVnTGV2ZWxGcm9tU3RyaW5nKAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgQURlYnVnOjpMZXZlbCBkZWYpIHsKK2xvbmcgQURlYnVnOjpHZXRMZXZlbEZyb21TZXR0aW5nc1N0cmluZygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGxvbmcgZGVmKSB7CiAgICAgLy8gc3BsaXQgb24gLAogICAgIGNvbnN0IGNoYXIgKm5leHQgPSB2YWx1ZSwgKmN1cnJlbnQ7Ci0gICAgY29uc3QgdW5zaWduZWQgbG9uZyBtYXhMZXZlbCA9ICh1bnNpZ25lZCBsb25nKWtEZWJ1Z01heDsKICAgICB3aGlsZSAobmV4dCAhPSBOVUxMKSB7CiAgICAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgICAgICBuZXh0ID0gc3RyY2hyKGN1cnJlbnQsICcsJyk7CkBAIC01MSw4ICs1Myw4IEBACiAKICAgICAgICAgLy8gZ2V0IGxldmVsCiAgICAgICAgIGNoYXIgKmVuZDsKLSAgICAgICAgZXJybm8gPSAwOyAgLy8gc3RydG91bCBkb2VzIG5vdCBjbGVhciBlcnJubywgYnV0IGl0IGNhbiBiZSBzZXQgZm9yIGFueSByZXR1cm4gdmFsdWUKLSAgICAgICAgdW5zaWduZWQgbG9uZyBsZXZlbCA9IHN0cnRvdWwoY3VycmVudCwgJmVuZCwgMTApOworICAgICAgICBlcnJubyA9IDA7ICAvLyBzdHJ0b2wgZG9lcyBub3QgY2xlYXIgZXJybm8sIGJ1dCBpdCBjYW4gYmUgc2V0IGZvciBhbnkgcmV0dXJuIHZhbHVlCisgICAgICAgIGxvbmcgbGV2ZWwgPSBzdHJ0b2woY3VycmVudCwgJmVuZCwgMTApOwogICAgICAgICB3aGlsZSAoaXNzcGFjZSgqZW5kKSkgewogICAgICAgICAgICAgKytlbmQ7CiAgICAgICAgIH0KQEAgLTc2LDggKzc4LDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyB1cGRhdGUgZGVidWcgbGV2ZWwKLSAgICAgICAgZGVmID0gKExldmVsKW1pbihsZXZlbCwgbWF4TGV2ZWwpOworICAgICAgICAvLyB1cGRhdGUgdmFsdWUKKyAgICAgICAgZGVmID0gbGV2ZWw7CisgICAgfQorICAgIHJldHVybiBkZWY7Cit9CisKKy8vc3RhdGljCitsb25nIEFEZWJ1Zzo6R2V0TGV2ZWxGcm9tUHJvcGVydHkoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnByb3BlcnR5TmFtZSwgbG9uZyBkZWYpIHsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldChwcm9wZXJ0eU5hbWUsIHZhbHVlLCBOVUxMKSkgeworICAgICAgICBkZWYgPSBHZXRMZXZlbEZyb21TZXR0aW5nc1N0cmluZyhuYW1lLCB2YWx1ZSwgZGVmKTsKICAgICB9CiAgICAgcmV0dXJuIGRlZjsKIH0KQEAgLTg1LDExICs5Nyw4IEBACiAvL3N0YXRpYwogQURlYnVnOjpMZXZlbCBBRGVidWc6OkdldERlYnVnTGV2ZWxGcm9tUHJvcGVydHkoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnByb3BlcnR5TmFtZSwgQURlYnVnOjpMZXZlbCBkZWYpIHsKLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgaWYgKHByb3BlcnR5X2dldChwcm9wZXJ0eU5hbWUsIHZhbHVlLCBOVUxMKSkgewotICAgICAgICByZXR1cm4gR2V0RGVidWdMZXZlbEZyb21TdHJpbmcobmFtZSwgdmFsdWUsIGRlZik7Ci0gICAgfQotICAgIHJldHVybiBkZWY7CisgICAgbG9uZyBsZXZlbCA9IEdldExldmVsRnJvbVByb3BlcnR5KG5hbWUsIHByb3BlcnR5TmFtZSwgKGxvbmcpZGVmKTsKKyAgICByZXR1cm4gKExldmVsKW1pbihtYXgobGV2ZWwsIChsb25nKWtEZWJ1Z05vbmUpLCAobG9uZylrRGVidWdNYXgpOwogfQogCiAvL3N0YXRpYwpAQCAtMTEzLDUgKzEyMiw2OSBAQAogICAgIHJldHVybiBkZWJ1Z05hbWU7CiB9CiAKKy8vc3RhdGljCitib29sIEFEZWJ1Zzo6Z2V0RXhwZXJpbWVudEZsYWcoCisgICAgICAgIGJvb2wgYWxsb3csIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQ2NF90IG1vZHVsbywKKyAgICAgICAgdWludDY0X3QgbGltaXQsIHVpbnQ2NF90IHBsdXMsIHVpbnQ2NF90IHRpbWVEaXZpc29yKSB7CisgICAgLy8gc2VlIGlmIHRoaXMgZXhwZXJpbWVudCBzaG91bGQgYmUgZGlzYWJsZWQvZW5hYmxlZCBiYXNlZCBvbiBwcm9wZXJ0aWVzLgorICAgIC8vIGRlZmF1bHQgdG8gMiB0byBhbGxvdyAwLzEgc3BlY2lmaWNhdGlvbgorICAgIGNvbnN0IGludCB1bmRlZmluZWQgPSAyOworICAgIGxvbmcgbGV2ZWwgPSBHZXRMZXZlbEZyb21Qcm9wZXJ0eShuYW1lLCAiZGVidWcuc3RhZ2VmcmlnaHQuZXhwZXJpbWVudHMiLCB1bmRlZmluZWQpOworICAgIGlmIChsZXZlbCAhPSB1bmRlZmluZWQpIHsKKyAgICAgICAgQUxPR0koImV4cGVyaW1lbnQgJyVzJzogJXMgZnJvbSBwcm9wZXJ0eSIsIG5hbWUsIGxldmVsID8gIkVOQUJMRUQiIDogImRpc2FibGVkIik7CisgICAgICAgIHJldHVybiBhbGxvdyAmJiAobGV2ZWwgIT0gMCk7CisgICAgfQorCisjaWZuZGVmIEVOQUJMRV9TVEFHRUZSSUdIVF9BVVRPX0VYUEVSSU1FTlRTCisgICAgVU5VU0VEKG1vZHVsbyk7CisgICAgVU5VU0VEKGxpbWl0KTsKKyAgICBVTlVTRUQocGx1cyk7CisgICAgVU5VU0VEKHRpbWVEaXZpc29yKTsKKyAgICByZXR1cm4gZmFsc2U7CisjZWxzZQorICAgIC8vIERpc2FibGUgYXV0b21hdGljIGV4cGVyaW1lbnRzIGluICJub24tZXhwZXJpbWVudGFsIiBidWlsZHMgKHRoYXQgaXMsIF9hbGxfIGJ1aWxkcworICAgIC8vIGFzIHRoZXJlIGlzIG5vICJleHBlcmltZW50YWwiIGJ1aWxkKS4KKyAgICAvLyBUT0RPOiBjaGFuZ2UgYnVpbGQgdHlwZSB0byBlbmFibGUgYXV0b21hdGljIGV4cGVyaW1lbnRzIGluIHRoZSBmdXR1cmUgZm9yIHNvbWUgYnVpbGRzCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnR5cGUiLCB2YWx1ZSwgTlVMTCkpIHsKKyAgICAgICAgaWYgKHN0cmNtcCh2YWx1ZSwgImV4cGVyaW1lbnRhbCIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9sYXRpbGUgaW50MzJfdCBoYXZlU2VyaWFsID0gMDsKKyAgICBzdGF0aWMgdWludDY0X3Qgc2VyaWFsTnVtOworICAgIGlmICghYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZoYXZlU2VyaWFsKSkgeworICAgICAgICAvLyBjYWxjdWxhdGUgaW5pdGlhbCBjb3VudGVyIHZhbHVlIGJhc2VkIG9uIHNlcmlhbCBudW1iZXIKKyAgICAgICAgc3RhdGljIGNoYXIgc2VyaWFsW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgIHByb3BlcnR5X2dldCgicm8uc2VyaWFsbm8iLCBzZXJpYWwsICIwIik7CisgICAgICAgIHVpbnQ2NF90IG51bSA9IDA7IC8vIGl0IGlzIG9rYXkgZm9yIHRoaXMgbnVtYmVyIHRvIG92ZXJmbG93CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTkVMRU0oc2VyaWFsKSAmJiBzZXJpYWxbaV0gIT0gJ1wwJzsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICZjID0gc2VyaWFsW2ldOworICAgICAgICAgICAgLy8gdHJ5IHRvIHVzZSBtb3N0IGxldHRlcnMgb2Ygc2VyaWFsbm8KKyAgICAgICAgICAgIGlmIChpc2RpZ2l0KGMpKSB7CisgICAgICAgICAgICAgICAgbnVtID0gbnVtICogMTAgKyAoYyAtICcwJyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzbG93ZXIoYykpIHsKKyAgICAgICAgICAgICAgICBudW0gPSBudW0gKiAyNiArIChjIC0gJ2EnKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXN1cHBlcihjKSkgeworICAgICAgICAgICAgICAgIG51bSA9IG51bSAqIDI2ICsgKGMgLSAnQScpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBudW0gPSBudW0gKiAyNTYgKyBjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNlcmlhbE51bSA9IG51bTsKKyAgICAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZSgxLCAmaGF2ZVNlcmlhbCk7CisgICAgfQorICAgIEFMT0dEKCJzZXJpYWw6ICVsbHUsIHRpbWU6ICVsbGQiLCAobG9uZyBsb25nIHVuc2lnbmVkKXNlcmlhbE51bSwgKGxvbmcgbG9uZyl0aW1lKE5VTEwpKTsKKyAgICAvLyBNSU5PUjogdXNlIG1vZHVsbyBmb3IgY291bnRlciBhbmQgdGltZSwgc28gdGhhdCB0aGVpciBzdW0gZG9lcyBub3QKKyAgICAvLyByb2xsIG92ZXIsIGFuZCBtZXNzIHVwIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHJlbGF0ZWQgZXhwZXJpbWVudHMuCisgICAgLy8gZS5nLiBrZWVwIChhIG1vZCAyTikgPSAwIGltcGwgKGEgbW9kIE4pID0gMAorICAgIHRpbWVfdCBjb3VudGVyID0gKHRpbWUoTlVMTCkgLyB0aW1lRGl2aXNvcikgJSBtb2R1bG8gKyBwbHVzICsgc2VyaWFsTnVtICUgbW9kdWxvOworICAgIGJvb2wgZW5hYmxlID0gYWxsb3cgJiYgKGNvdW50ZXIgJSBtb2R1bG8gPCBsaW1pdCk7CisgICAgQUxPR0koImV4cGVyaW1lbnQgJyVzJzogJXMiLCBuYW1lLCBlbmFibGUgPyAiRU5BQkxFRCIgOiAiZGlzYWJsZWQiKTsKKyAgICByZXR1cm4gZW5hYmxlOworI2VuZGlmCit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5jcHAKaW5kZXggYmQ1ZjdlOS4uN2RiYmU1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5jcHAKQEAgLTE5LDE1ICsxOSwyMyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXNwPEFMb29wZXI+IEFIYW5kbGVyOjpsb29wZXIoKSB7Ci0gICAgZXh0ZXJuIEFMb29wZXJSb3N0ZXIgZ0xvb3BlclJvc3RlcjsKK3ZvaWQgQUhhbmRsZXI6OmRlbGl2ZXJNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgb25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKKyAgICBtTWVzc2FnZUNvdW50ZXIrKzsKIAotICAgIHJldHVybiBnTG9vcGVyUm9zdGVyLmZpbmRMb29wZXIoaWQoKSk7CisgICAgaWYgKG1WZXJib3NlU3RhdHMpIHsKKyAgICAgICAgdWludDMyX3Qgd2hhdCA9IG1zZy0+d2hhdCgpOworICAgICAgICBzc2l6ZV90IGlkeCA9IG1NZXNzYWdlcy5pbmRleE9mS2V5KHdoYXQpOworICAgICAgICBpZiAoaWR4IDwgMCkgeworICAgICAgICAgICAgbU1lc3NhZ2VzLmFkZCh3aGF0LCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NZXNzYWdlcy5lZGl0VmFsdWVBdChpZHgpKys7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcAppbmRleCA1ZjdjNzBkLi5iODM3ZjY2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKQEAgLTEwOSw3ICsxMDksOCBAQAogICAgICAgICBBLmVkaXRJdGVtQXQoaSktPnN0YXRlRXhpdGVkKCk7CiAgICAgfQogCi0gICAgZm9yIChzaXplX3QgaSA9IEIuc2l6ZSgpOyBpLS0gPiAwOykgeworICAgIGZvciAoc2l6ZV90IGkgPSBCLnNpemUoKTsgaSA+IDA7KSB7CisgICAgICAgIGktLTsKICAgICAgICAgQi5lZGl0SXRlbUF0KGkpLT5zdGF0ZUVudGVyZWQoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcAppbmRleCA4OGIxYzkyLi45MGI1ZjY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKQEAgLTE2LDYgKzE2LDkgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJBTG9vcGVyIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KQEAgLTIxMCw3ICsyMTMsNyBAQAogICAgICAgICBtRXZlbnRRdWV1ZS5lcmFzZShtRXZlbnRRdWV1ZS5iZWdpbigpKTsKICAgICB9CiAKLSAgICBnTG9vcGVyUm9zdGVyLmRlbGl2ZXJNZXNzYWdlKGV2ZW50Lm1NZXNzYWdlKTsKKyAgICBldmVudC5tTWVzc2FnZS0+ZGVsaXZlcigpOwogCiAgICAgLy8gTk9URTogSXQncyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgb3VyICJBTG9vcGVyIiBvYmplY3QKICAgICAvLyBtYXkgbm8gbG9uZ2VyIGV4aXN0IChpdHMgZmluYWwgcmVmZXJlbmNlIG1heSBoYXZlIGdvbmUgYXdheSB3aGlsZQpAQCAtMjIwLDQgKzIyMywyOSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCisvLyB0byBiZSBjYWxsZWQgYnkgQU1lc3NhZ2U6OnBvc3RBbmRBd2FpdFJlc3BvbnNlIG9ubHkKK3NwPEFSZXBseVRva2VuPiBBTG9vcGVyOjpjcmVhdGVSZXBseVRva2VuKCkgeworICAgIHJldHVybiBuZXcgQVJlcGx5VG9rZW4odGhpcyk7Cit9CisKKy8vIHRvIGJlIGNhbGxlZCBieSBBTWVzc2FnZTo6cG9zdEFuZEF3YWl0UmVzcG9uc2Ugb25seQorc3RhdHVzX3QgQUxvb3Blcjo6YXdhaXRSZXNwb25zZShjb25zdCBzcDxBUmVwbHlUb2tlbj4gJnJlcGx5VG9rZW4sIHNwPEFNZXNzYWdlPiAqcmVzcG9uc2UpIHsKKyAgICAvLyByZXR1cm4gc3RhdHVzIGluIGNhc2Ugd2Ugd2FudCB0byBoYW5kbGUgYW4gaW50ZXJydXB0ZWQgd2FpdAorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUmVwbGllc0xvY2spOworICAgIENIRUNLKHJlcGx5VG9rZW4gIT0gTlVMTCk7CisgICAgd2hpbGUgKCFyZXBseVRva2VuLT5yZXRyaWV2ZVJlcGx5KHJlc3BvbnNlKSkgeworICAgICAgICBtUmVwbGllc0NvbmRpdGlvbi53YWl0KG1SZXBsaWVzTG9jayk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQUxvb3Blcjo6cG9zdFJlcGx5KGNvbnN0IHNwPEFSZXBseVRva2VuPiAmcmVwbHlUb2tlbiwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUmVwbGllc0xvY2spOworICAgIHN0YXR1c190IGVyciA9IHJlcGx5VG9rZW4tPnNldFJlcGx5KHJlcGx5KTsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIG1SZXBsaWVzQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKaW5kZXggMmQ1N2FlZS4uOWVkNTNlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCkBAIC0zMCw4ICszMCw3IEBACiBzdGF0aWMgYm9vbCB2ZXJib3NlU3RhdHMgPSBmYWxzZTsKIAogQUxvb3BlclJvc3Rlcjo6QUxvb3BlclJvc3RlcigpCi0gICAgOiBtTmV4dEhhbmRsZXJJRCgxKSwKLSAgICAgIG1OZXh0UmVwbHlJRCgxKSB7CisgICAgOiBtTmV4dEhhbmRsZXJJRCgxKSB7CiB9CiAKIEFMb29wZXI6OmhhbmRsZXJfaWQgQUxvb3BlclJvc3Rlcjo6cmVnaXN0ZXJIYW5kbGVyKApAQCAtNDksNyArNDgsNyBAQAogICAgIEFMb29wZXI6OmhhbmRsZXJfaWQgaGFuZGxlcklEID0gbU5leHRIYW5kbGVySUQrKzsKICAgICBtSGFuZGxlcnMuYWRkKGhhbmRsZXJJRCwgaW5mbyk7CiAKLSAgICBoYW5kbGVyLT5zZXRJRChoYW5kbGVySUQpOworICAgIGhhbmRsZXItPnNldElEKGhhbmRsZXJJRCwgbG9vcGVyKTsKIAogICAgIHJldHVybiBoYW5kbGVySUQ7CiB9CkBAIC02OCw3ICs2Nyw3IEBACiAgICAgc3A8QUhhbmRsZXI+IGhhbmRsZXIgPSBpbmZvLm1IYW5kbGVyLnByb21vdGUoKTsKIAogICAgIGlmIChoYW5kbGVyICE9IE5VTEwpIHsKLSAgICAgICAgaGFuZGxlci0+c2V0SUQoMCk7CisgICAgICAgIGhhbmRsZXItPnNldElEKDAsIE5VTEwpOwogICAgIH0KIAogICAgIG1IYW5kbGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKQEAgLTgwLDcgKzc5LDggQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IG1IYW5kbGVycy5zaXplKCk7IGktLSA+IDA7KSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBtSGFuZGxlcnMuc2l6ZSgpOyBpID4gMDspIHsKKyAgICAgICAgICAgIGktLTsKICAgICAgICAgICAgIGNvbnN0IEhhbmRsZXJJbmZvICZpbmZvID0gbUhhbmRsZXJzLnZhbHVlQXQoaSk7CiAKICAgICAgICAgICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGluZm8ubUxvb3Blci5wcm9tb3RlKCk7CkBAIC0xMDAsMTE2ICsxMDAsNiBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQUxvb3BlclJvc3Rlcjo6cG9zdE1lc3NhZ2UoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQ2NF90IGRlbGF5VXMpIHsKLQotICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGZpbmRMb29wZXIobXNnLT50YXJnZXQoKSk7Ci0KLSAgICBpZiAobG9vcGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotICAgIGxvb3Blci0+cG9zdChtc2csIGRlbGF5VXMpOwotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBBTG9vcGVyUm9zdGVyOjpkZWxpdmVyTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIHNwPEFIYW5kbGVyPiBoYW5kbGVyOwotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtSGFuZGxlcnMuaW5kZXhPZktleShtc2ctPnRhcmdldCgpKTsKLQotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGRlbGl2ZXIgbWVzc2FnZS4gVGFyZ2V0IGhhbmRsZXIgbm90IHJlZ2lzdGVyZWQuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBIYW5kbGVySW5mbyAmaW5mbyA9IG1IYW5kbGVycy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgaGFuZGxlciA9IGluZm8ubUhhbmRsZXIucHJvbW90ZSgpOwotCi0gICAgICAgIGlmIChoYW5kbGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gZGVsaXZlciBtZXNzYWdlLiAiCi0gICAgICAgICAgICAgICAgICJUYXJnZXQgaGFuZGxlciAlZCByZWdpc3RlcmVkLCBidXQgb2JqZWN0IGdvbmUuIiwKLSAgICAgICAgICAgICAgICAgbXNnLT50YXJnZXQoKSk7Ci0KLSAgICAgICAgICAgIG1IYW5kbGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGhhbmRsZXItPm9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7Ci0gICAgaGFuZGxlci0+bU1lc3NhZ2VDb3VudGVyKys7Ci0KLSAgICBpZiAodmVyYm9zZVN0YXRzKSB7Ci0gICAgICAgIHVpbnQzMl90IHdoYXQgPSBtc2ctPndoYXQoKTsKLSAgICAgICAgc3NpemVfdCBpZHggPSBoYW5kbGVyLT5tTWVzc2FnZXMuaW5kZXhPZktleSh3aGF0KTsKLSAgICAgICAgaWYgKGlkeCA8IDApIHsKLSAgICAgICAgICAgIGhhbmRsZXItPm1NZXNzYWdlcy5hZGQod2hhdCwgMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoYW5kbGVyLT5tTWVzc2FnZXMuZWRpdFZhbHVlQXQoaWR4KSsrOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zcDxBTG9vcGVyPiBBTG9vcGVyUm9zdGVyOjpmaW5kTG9vcGVyKEFMb29wZXI6OmhhbmRsZXJfaWQgaGFuZGxlcklEKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtSGFuZGxlcnMuaW5kZXhPZktleShoYW5kbGVySUQpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBtSGFuZGxlcnMudmFsdWVBdChpbmRleCkubUxvb3Blci5wcm9tb3RlKCk7Ci0KLSAgICBpZiAobG9vcGVyID09IE5VTEwpIHsKLSAgICAgICAgbUhhbmRsZXJzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbG9vcGVyOwotfQotCi1zdGF0dXNfdCBBTG9vcGVyUm9zdGVyOjpwb3N0QW5kQXdhaXRSZXNwb25zZSgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPEFNZXNzYWdlPiAqcmVzcG9uc2UpIHsKLSAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBmaW5kTG9vcGVyKG1zZy0+dGFyZ2V0KCkpOwotCi0gICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gcG9zdCBtZXNzYWdlLiAiCi0gICAgICAgICAgICAgICAgIlRhcmdldCBoYW5kbGVyICVkIHN0aWxsIHJlZ2lzdGVyZWQsIGJ1dCBvYmplY3QgZ29uZS4iLAotICAgICAgICAgICAgICAgIG1zZy0+dGFyZ2V0KCkpOwotICAgICAgICByZXNwb25zZS0+Y2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHVpbnQzMl90IHJlcGx5SUQgPSBtTmV4dFJlcGx5SUQrKzsKLQotICAgIG1zZy0+c2V0SW50MzIoInJlcGx5SUQiLCByZXBseUlEKTsKLQotICAgIGxvb3Blci0+cG9zdChtc2csIDAgLyogZGVsYXlVcyAqLyk7Ci0KLSAgICBzc2l6ZV90IGluZGV4OwotICAgIHdoaWxlICgoaW5kZXggPSBtUmVwbGllcy5pbmRleE9mS2V5KHJlcGx5SUQpKSA8IDApIHsKLSAgICAgICAgbVJlcGxpZXNDb25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgKnJlc3BvbnNlID0gbVJlcGxpZXMudmFsdWVBdChpbmRleCk7Ci0gICAgbVJlcGxpZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgQUxvb3BlclJvc3Rlcjo6cG9zdFJlcGx5KHVpbnQzMl90IHJlcGx5SUQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgQ0hFQ0sobVJlcGxpZXMuaW5kZXhPZktleShyZXBseUlEKSA8IDApOwotICAgIG1SZXBsaWVzLmFkZChyZXBseUlELCByZXBseSk7Ci0gICAgbVJlcGxpZXNDb25kaXRpb24uYnJvYWRjYXN0KCk7Ci19Ci0KIHN0YXRpYyB2b2lkIG1ha2VGb3VyQ0ModWludDMyX3QgZm91cmNjLCBjaGFyICpzKSB7CiAgICAgc1swXSA9IChmb3VyY2MgPj4gMjQpICYgMHhmZjsKICAgICBpZiAoc1swXSkgewpAQCAtMjI1LDcgKzExNSw3IEBACiB2b2lkIEFMb29wZXJSb3N0ZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CiAgICAgYm9vbCBjbGVhciA9IGZhbHNlOwogICAgIGJvb2wgb2xkVmVyYm9zZSA9IHZlcmJvc2VTdGF0czsKLSAgICBmb3IgKHNpemVfdCBpID0gMDtpIDwgYXJncy5zaXplKCk7IGkrKykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgewogICAgICAgICBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLWMiKSkgewogICAgICAgICAgICAgY2xlYXIgPSB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi12b24iKSkgewpAQCAtMjQxLDIyICsxMzEsMjMgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgc2l6ZV90IG4gPSBtSGFuZGxlcnMuc2l6ZSgpOwotICAgIHMuYXBwZW5kRm9ybWF0KCIgJXpkIHJlZ2lzdGVyZWQgaGFuZGxlcnM6XG4iLCBuKTsKKyAgICBzLmFwcGVuZEZvcm1hdCgiICV6dSByZWdpc3RlcmVkIGhhbmRsZXJzOlxuIiwgbik7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICBzLmFwcGVuZEZvcm1hdCgiICAlemQ6ICIsIGkpOworICAgICAgICBzLmFwcGVuZEZvcm1hdCgiICAlZDogIiwgbUhhbmRsZXJzLmtleUF0KGkpKTsKICAgICAgICAgSGFuZGxlckluZm8gJmluZm8gPSBtSGFuZGxlcnMuZWRpdFZhbHVlQXQoaSk7CiAgICAgICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGluZm8ubUxvb3Blci5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChsb29wZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgcy5hcHBlbmQobG9vcGVyLT5tTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHMuYXBwZW5kKGxvb3Blci0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgIHNwPEFIYW5kbGVyPiBoYW5kbGVyID0gaW5mby5tSGFuZGxlci5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlci0+bVZlcmJvc2VTdGF0cyA9IHZlcmJvc2VTdGF0czsKICAgICAgICAgICAgICAgICBzLmFwcGVuZEZvcm1hdCgiOiAldSBtZXNzYWdlcyBwcm9jZXNzZWQiLCBoYW5kbGVyLT5tTWVzc2FnZUNvdW50ZXIpOwogICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlU3RhdHMpIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBoYW5kbGVyLT5tTWVzc2FnZXMuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZm91cmNjWzE1XTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VGb3VyQ0MoaGFuZGxlci0+bU1lc3NhZ2VzLmtleUF0KGopLCBmb3VyY2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgcy5hcHBlbmRGb3JtYXQoIlxuICAgICVzOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzLmFwcGVuZEZvcm1hdCgiXG4gICAgJXM6ICV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91cmNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLT5tTWVzc2FnZXMudmFsdWVBdChqKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAKaW5kZXggNDk0MmJhNy4uNzI1YTU3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJBQnVmZmVyLmgiCiAjaW5jbHVkZSAiQURlYnVnLmgiCiAjaW5jbHVkZSAiQUxvb3BlclJvc3Rlci5oIgorI2luY2x1ZGUgIkFIYW5kbGVyLmgiCiAjaW5jbHVkZSAiQVN0cmluZy5oIgogCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgpAQCAtMzYsMTIgKzM3LDI5IEBACiAKIGV4dGVybiBBTG9vcGVyUm9zdGVyIGdMb29wZXJSb3N0ZXI7CiAKLUFNZXNzYWdlOjpBTWVzc2FnZSh1aW50MzJfdCB3aGF0LCBBTG9vcGVyOjpoYW5kbGVyX2lkIHRhcmdldCkKLSAgICA6IG1XaGF0KHdoYXQpLAotICAgICAgbVRhcmdldCh0YXJnZXQpLAorc3RhdHVzX3QgQVJlcGx5VG9rZW46OnNldFJlcGx5KGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKKyAgICBpZiAobVJlcGxpZWQpIHsKKyAgICAgICAgQUxPR0UoInRyeWluZyB0byBwb3N0IGEgZHVwbGljYXRlIHJlcGx5Iik7CisgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgfQorICAgIENIRUNLKG1SZXBseSA9PSBOVUxMKTsKKyAgICBtUmVwbHkgPSByZXBseTsKKyAgICBtUmVwbGllZCA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCitBTWVzc2FnZTo6QU1lc3NhZ2Uodm9pZCkKKyAgICA6IG1XaGF0KDApLAorICAgICAgbVRhcmdldCgwKSwKICAgICAgIG1OdW1JdGVtcygwKSB7CiB9CiAKK0FNZXNzYWdlOjpBTWVzc2FnZSh1aW50MzJfdCB3aGF0LCBjb25zdCBzcDxjb25zdCBBSGFuZGxlcj4gJmhhbmRsZXIpCisgICAgOiBtV2hhdCh3aGF0KSwKKyAgICAgIG1OdW1JdGVtcygwKSB7CisgICAgc2V0VGFyZ2V0KGhhbmRsZXIpOworfQorCiBBTWVzc2FnZTo6fkFNZXNzYWdlKCkgewogICAgIGNsZWFyKCk7CiB9CkBAIC01NCwxMiArNzIsMTYgQEAKICAgICByZXR1cm4gbVdoYXQ7CiB9CiAKLXZvaWQgQU1lc3NhZ2U6OnNldFRhcmdldChBTG9vcGVyOjpoYW5kbGVyX2lkIGhhbmRsZXJJRCkgewotICAgIG1UYXJnZXQgPSBoYW5kbGVySUQ7Ci19Ci0KLUFMb29wZXI6OmhhbmRsZXJfaWQgQU1lc3NhZ2U6OnRhcmdldCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVRhcmdldDsKK3ZvaWQgQU1lc3NhZ2U6OnNldFRhcmdldChjb25zdCBzcDxjb25zdCBBSGFuZGxlcj4gJmhhbmRsZXIpIHsKKyAgICBpZiAoaGFuZGxlciA9PSBOVUxMKSB7CisgICAgICAgIG1UYXJnZXQgPSAwOworICAgICAgICBtSGFuZGxlci5jbGVhcigpOworICAgICAgICBtTG9vcGVyLmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVRhcmdldCA9IGhhbmRsZXItPmlkKCk7CisgICAgICAgIG1IYW5kbGVyID0gaGFuZGxlci0+Z2V0SGFuZGxlcigpOworICAgICAgICBtTG9vcGVyID0gaGFuZGxlci0+Z2V0TG9vcGVyKCk7CisgICAgfQogfQogCiB2b2lkIEFNZXNzYWdlOjpjbGVhcigpIHsKQEAgLTMyMiwzMyArMzQ0LDc2IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgQU1lc3NhZ2U6OnBvc3QoaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgZ0xvb3BlclJvc3Rlci5wb3N0TWVzc2FnZSh0aGlzLCBkZWxheVVzKTsKK3ZvaWQgQU1lc3NhZ2U6OmRlbGl2ZXIoKSB7CisgICAgc3A8QUhhbmRsZXI+IGhhbmRsZXIgPSBtSGFuZGxlci5wcm9tb3RlKCk7CisgICAgaWYgKGhhbmRsZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGRlbGl2ZXIgbWVzc2FnZSBhcyB0YXJnZXQgaGFuZGxlciAlZCBpcyBnb25lLiIsIG1UYXJnZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaGFuZGxlci0+ZGVsaXZlck1lc3NhZ2UodGhpcyk7Cit9CisKK3N0YXR1c190IEFNZXNzYWdlOjpwb3N0KGludDY0X3QgZGVsYXlVcykgeworICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG1Mb29wZXIucHJvbW90ZSgpOworICAgIGlmIChsb29wZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHBvc3QgbWVzc2FnZSBhcyB0YXJnZXQgbG9vcGVyIGZvciBoYW5kbGVyICVkIGlzIGdvbmUuIiwgbVRhcmdldCk7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKworICAgIGxvb3Blci0+cG9zdCh0aGlzLCBkZWxheVVzKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IEFNZXNzYWdlOjpwb3N0QW5kQXdhaXRSZXNwb25zZShzcDxBTWVzc2FnZT4gKnJlc3BvbnNlKSB7Ci0gICAgcmV0dXJuIGdMb29wZXJSb3N0ZXIucG9zdEFuZEF3YWl0UmVzcG9uc2UodGhpcywgcmVzcG9uc2UpOworICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG1Mb29wZXIucHJvbW90ZSgpOworICAgIGlmIChsb29wZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHBvc3QgbWVzc2FnZSBhcyB0YXJnZXQgbG9vcGVyIGZvciBoYW5kbGVyICVkIGlzIGdvbmUuIiwgbVRhcmdldCk7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKworICAgIHNwPEFSZXBseVRva2VuPiB0b2tlbiA9IGxvb3Blci0+Y3JlYXRlUmVwbHlUb2tlbigpOworICAgIGlmICh0b2tlbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gY3JlYXRlIHJlcGx5IHRva2VuIik7CisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIH0KKyAgICBzZXRPYmplY3QoInJlcGx5SUQiLCB0b2tlbik7CisKKyAgICBsb29wZXItPnBvc3QodGhpcywgMCAvKiBkZWxheVVzICovKTsKKyAgICByZXR1cm4gbG9vcGVyLT5hd2FpdFJlc3BvbnNlKHRva2VuLCByZXNwb25zZSk7CiB9CiAKLXZvaWQgQU1lc3NhZ2U6OnBvc3RSZXBseSh1aW50MzJfdCByZXBseUlEKSB7Ci0gICAgZ0xvb3BlclJvc3Rlci5wb3N0UmVwbHkocmVwbHlJRCwgdGhpcyk7CitzdGF0dXNfdCBBTWVzc2FnZTo6cG9zdFJlcGx5KGNvbnN0IHNwPEFSZXBseVRva2VuPiAmcmVwbHlUb2tlbikgeworICAgIGlmIChyZXBseVRva2VuID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImZhaWxlZCB0byBwb3N0IHJlcGx5IHRvIGEgTlVMTCB0b2tlbiIpOworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisgICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gcmVwbHlUb2tlbi0+Z2V0TG9vcGVyKCk7CisgICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gcG9zdCByZXBseSBhcyB0YXJnZXQgbG9vcGVyIGlzIGdvbmUuIik7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICByZXR1cm4gbG9vcGVyLT5wb3N0UmVwbHkocmVwbHlUb2tlbiwgdGhpcyk7CiB9CiAKLWJvb2wgQU1lc3NhZ2U6OnNlbmRlckF3YWl0c1Jlc3BvbnNlKHVpbnQzMl90ICpyZXBseUlEKSBjb25zdCB7Ci0gICAgaW50MzJfdCB0bXA7Ci0gICAgYm9vbCBmb3VuZCA9IGZpbmRJbnQzMigicmVwbHlJRCIsICZ0bXApOworYm9vbCBBTWVzc2FnZTo6c2VuZGVyQXdhaXRzUmVzcG9uc2Uoc3A8QVJlcGx5VG9rZW4+ICpyZXBseVRva2VuKSB7CisgICAgc3A8UmVmQmFzZT4gdG1wOworICAgIGJvb2wgZm91bmQgPSBmaW5kT2JqZWN0KCJyZXBseUlEIiwgJnRtcCk7CiAKICAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICAqcmVwbHlJRCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXApOworICAgICpyZXBseVRva2VuID0gc3RhdGljX2Nhc3Q8QVJlcGx5VG9rZW4gKj4odG1wLmdldCgpKTsKKyAgICB0bXAuY2xlYXIoKTsKKyAgICBzZXRPYmplY3QoInJlcGx5SUQiLCB0bXApOworICAgIC8vIFRPRE86IGRlbGV0ZSBPYmplY3QgaW5zdGVhZCBvZiBzZXR0aW5nIGl0IHRvIE5VTEwKIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiAqcmVwbHlUb2tlbiAhPSBOVUxMOwogfQogCiBzcDxBTWVzc2FnZT4gQU1lc3NhZ2U6OmR1cCgpIGNvbnN0IHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKG1XaGF0LCBtVGFyZ2V0KTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKG1XaGF0LCBtSGFuZGxlci5wcm9tb3RlKCkpOwogICAgIG1zZy0+bU51bUl0ZW1zID0gbU51bUl0ZW1zOwogCiAjaWZkZWYgRFVNUF9TVEFUUwpAQCAtNTMyLDcgKzU5Nyw4IEBACiAvLyBzdGF0aWMKIHNwPEFNZXNzYWdlPiBBTWVzc2FnZTo6RnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgewogICAgIGludDMyX3Qgd2hhdCA9IHBhcmNlbC5yZWFkSW50MzIoKTsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKHdoYXQpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBtc2ctPnNldFdoYXQod2hhdCk7CiAKICAgICBtc2ctPm1OdW1JdGVtcyA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKICAgICBpZiAobXNnLT5tTnVtSXRlbXMgPiBrTWF4TnVtSXRlbXMpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5tawppbmRleCAwODM1NWM3Li5jNjgyNjRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLm1rCkBAIC0yOSw3ICsyOSw4IEBACiAgICAgICAgIGxpYmxvZyAgICAgICAgICAgIFwKICAgICAgICAgbGlicG93ZXJtYW5hZ2VyCiAKLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5tawppbmRleCA3ZjMzMDdkLi41ZmI1MWMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLm1rCkBAIC0yMSw3ICsyMSw4IEBACiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCi1MT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKaW5kZXggYmI4OTU2Ny4uODAxZmYyNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcApAQCAtMzAsMTIgKzMwLDExIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIE1lZGlhSFRUUDo6TWVkaWFIVFRQKGNvbnN0IHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubikKLSAgICA6IG1Jbml0Q2hlY2soTk9fSU5JVCksCisgICAgOiBtSW5pdENoZWNrKChjb25uICE9IE5VTEwpID8gT0sgOiBOT19JTklUKSwKICAgICAgIG1IVFRQQ29ubmVjdGlvbihjb25uKSwKICAgICAgIG1DYWNoZWRTaXplVmFsaWQoZmFsc2UpLAogICAgICAgbUNhY2hlZFNpemUoMGxsKSwKICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpIHsKLSAgICBtSW5pdENoZWNrID0gT0s7CiB9CiAKIE1lZGlhSFRUUDo6fk1lZGlhSFRUUCgpIHsKQEAgLTU0LDcgKzUzLDEwIEBACiAgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewogICAgICAgICBleHRIZWFkZXJzID0gKmhlYWRlcnM7CiAgICAgfQotICAgIGV4dEhlYWRlcnMuYWRkKFN0cmluZzgoIlVzZXItQWdlbnQiKSwgU3RyaW5nOChNYWtlVXNlckFnZW50KCkuY19zdHIoKSkpOworCisgICAgaWYgKGV4dEhlYWRlcnMuaW5kZXhPZktleShTdHJpbmc4KCJVc2VyLUFnZW50IikpIDwgMCkgeworICAgICAgICBleHRIZWFkZXJzLmFkZChTdHJpbmc4KCJVc2VyLUFnZW50IiksIFN0cmluZzgoTWFrZVVzZXJBZ2VudCgpLmNfc3RyKCkpKTsKKyAgICB9CiAKICAgICBib29sIHN1Y2Nlc3MgPSBtSFRUUENvbm5lY3Rpb24tPmNvbm5lY3QodXJpLCAmZXh0SGVhZGVycyk7CiAKQEAgLTE3MSw2ICsxNzMsMTAgQEAKIH0KIAogU3RyaW5nOCBNZWRpYUhUVFA6OmdldFVyaSgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsKKyAgICB9CisKICAgICBTdHJpbmc4IHVyaTsKICAgICBpZiAoT0sgPT0gbUhUVFBDb25uZWN0aW9uLT5nZXRVcmkoJnVyaSkpIHsKICAgICAgICAgcmV0dXJuIHVyaTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rCmluZGV4IDkzYjc5MzUuLmZjODU4MzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5tawpAQCAtMyw2ICszLDcgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKKyAgICAgICAgSFRUUERvd25sb2FkZXIuY3BwICAgICAgXAogICAgICAgICBMaXZlRGF0YVNvdXJjZS5jcHAgICAgICBcCiAgICAgICAgIExpdmVTZXNzaW9uLmNwcCAgICAgICAgIFwKICAgICAgICAgTTNVUGFyc2VyLmNwcCAgICAgICAgICAgXApAQCAtMTIsNyArMTMsOCBAQAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGliYmluZGVyIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjQ0YmFlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkhUVFBEb3dubG9hZGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiSFRUUERvd25sb2FkZXIuaCIKKyNpbmNsdWRlICJNM1VQYXJzZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworSFRUUERvd25sb2FkZXI6OkhUVFBEb3dubG9hZGVyKAorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAmaGVhZGVycykgOgorICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgTWVkaWFIVFRQKGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKSkpLAorICAgIG1FeHRyYUhlYWRlcnMoaGVhZGVycyksCisgICAgbURpc2Nvbm5lY3RpbmcoZmFsc2UpIHsKK30KKwordm9pZCBIVFRQRG93bmxvYWRlcjo6cmVjb25uZWN0KCkgeworICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgbURpc2Nvbm5lY3RpbmcgPSBmYWxzZTsKK30KKwordm9pZCBIVFRQRG93bmxvYWRlcjo6ZGlzY29ubmVjdCgpIHsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgICAgIG1EaXNjb25uZWN0aW5nID0gdHJ1ZTsKKyAgICB9CisgICAgbUhUVFBEYXRhU291cmNlLT5kaXNjb25uZWN0KCk7Cit9CisKK2Jvb2wgSFRUUERvd25sb2FkZXI6OmlzRGlzY29ubmVjdGluZygpIHsKKyAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIHJldHVybiBtRGlzY29ubmVjdGluZzsKK30KKworLyoKKyAqIElsbHVzdHJhdGlvbiBvZiBwYXJhbWV0ZXJzOgorICoKKyAqIDAgICAgICBgcmFuZ2Vfb2Zmc2V0YAorICogKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tKy0tKworICogfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5leHQgYmxvY2sgdG8gZmV0Y2ggfCAgfCAgfAorICogfCAgICAgICAgICAgIHwgYHNvdXJjZWAgaGFuZGxlID0+IGBvdXRgIGJ1ZmZlciB8ICAgICAgICAgICAgICAgICAgICAgfCAgfCAgfAorICogfCBgdXJsYCBmaWxlIHw8LS0tLS0tLS0tIGJ1ZmZlciBzaXplIC0tLS0tLS0tLT58PC0tLSBgYmxvY2tfc2l6ZWAgLS0+fCAgfCAgfAorICogfCAgICAgICAgICAgIHw8LS0tLS0tLS0tLS0gYHJhbmdlX2xlbmd0aGAgLyBidWZmZXIgY2FwYWNpdHkgLS0tLS0tLS0tLS0+fCAgfAorICogfDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZmlsZV9zaXplIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fAorICoKKyAqIFNwZWNpYWwgcGFyYW1ldGVyIHZhbHVlczoKKyAqIC0gcmFuZ2VfbGVuZ3RoID09IC0xIG1lYW5zIGVudGlyZSBmaWxlCisgKiAtIGJsb2NrX3NpemUgPT0gMCBtZWFucyBlbnRpcmUgcmFuZ2UKKyAqCisgKi8KK3NzaXplX3QgSFRUUERvd25sb2FkZXI6OmZldGNoQmxvY2soCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgc3A8QUJ1ZmZlcj4gKm91dCwKKyAgICAgICAgaW50NjRfdCByYW5nZV9vZmZzZXQsIGludDY0X3QgcmFuZ2VfbGVuZ3RoLAorICAgICAgICB1aW50MzJfdCBibG9ja19zaXplLCAvKiBkb3dubG9hZCBibG9jayBzaXplICovCisgICAgICAgIFN0cmluZzggKmFjdHVhbFVybCwKKyAgICAgICAgYm9vbCByZWNvbm5lY3QgLyogZm9yY2UgY29ubmVjdCBIVFRQIHdoZW4gcmVzdWluZyBzb3VyY2UgKi8pIHsKKyAgICBpZiAoaXNEaXNjb25uZWN0aW5nKCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9DT05ORUNURUQ7CisgICAgfQorCisgICAgb2ZmNjRfdCBzaXplOworCisgICAgaWYgKHJlY29ubmVjdCkgeworICAgICAgICBpZiAoIXN0cm5jYXNlY21wKHVybCwgImZpbGU6Ly8iLCA3KSkgeworICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSh1cmwgKyA3KTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJuY2FzZWNtcCh1cmwsICJodHRwOi8vIiwgNykKKyAgICAgICAgICAgICAgICAmJiBzdHJuY2FzZWNtcCh1cmwsICJodHRwczovLyIsIDgpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBoZWFkZXJzID0gbUV4dHJhSGVhZGVyczsKKyAgICAgICAgICAgIGlmIChyYW5nZV9vZmZzZXQgPiAwIHx8IHJhbmdlX2xlbmd0aCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaGVhZGVycy5hZGQoCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCJSYW5nZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXM9JWxsZC0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfbGVuZ3RoIDwgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiIiA6IEFTdHJpbmdQcmludGYoIiVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9vZmZzZXQgKyByYW5nZV9sZW5ndGggLSAxKS5jX3N0cigpKS5jX3N0cigpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1IVFRQRGF0YVNvdXJjZS0+Y29ubmVjdCh1cmwsICZoZWFkZXJzKTsKKworICAgICAgICAgICAgaWYgKGlzRGlzY29ubmVjdGluZygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9DT05ORUNURUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IG1IVFRQRGF0YVNvdXJjZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1c190IGdldFNpemVFcnIgPSBtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSk7CisKKyAgICBpZiAoaXNEaXNjb25uZWN0aW5nKCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9DT05ORUNURUQ7CisgICAgfQorCisgICAgaWYgKGdldFNpemVFcnIgIT0gT0spIHsKKyAgICAgICAgc2l6ZSA9IDY1NTM2OworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICpvdXQgIT0gTlVMTCA/ICpvdXQgOiBuZXcgQUJ1ZmZlcihzaXplKTsKKyAgICBpZiAoKm91dCA9PSBOVUxMKSB7CisgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisgICAgfQorCisgICAgc3NpemVfdCBieXRlc1JlYWQgPSAwOworICAgIC8vIGFkanVzdCByYW5nZV9sZW5ndGggaWYgb25seSByZWFkaW5nIHBhcnRpYWwgYmxvY2sKKyAgICBpZiAoYmxvY2tfc2l6ZSA+IDAgJiYgKHJhbmdlX2xlbmd0aCA9PSAtMSB8fCAoaW50NjRfdCkoYnVmZmVyLT5zaXplKCkgKyBibG9ja19zaXplKSA8IHJhbmdlX2xlbmd0aCkpIHsKKyAgICAgICAgcmFuZ2VfbGVuZ3RoID0gYnVmZmVyLT5zaXplKCkgKyBibG9ja19zaXplOworICAgIH0KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8vIE9ubHkgcmVzaXplIHdoZW4gd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZS4KKyAgICAgICAgc2l6ZV90IGJ1ZmZlclJlbWFpbmluZyA9IGJ1ZmZlci0+Y2FwYWNpdHkoKSAtIGJ1ZmZlci0+c2l6ZSgpOworICAgICAgICBpZiAoYnVmZmVyUmVtYWluaW5nID09IDAgJiYgZ2V0U2l6ZUVyciAhPSBPSykgeworICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckluY3JlbWVudCA9IGJ1ZmZlci0+c2l6ZSgpIC8gMjsKKyAgICAgICAgICAgIGlmIChidWZmZXJJbmNyZW1lbnQgPCAzMjc2OCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlckluY3JlbWVudCA9IDMyNzY4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyUmVtYWluaW5nID0gYnVmZmVySW5jcmVtZW50OworCisgICAgICAgICAgICBBTE9HVigiaW5jcmVhc2luZyBkb3dubG9hZCBidWZmZXIgdG8gJXp1IGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgYnVmZmVyLT5zaXplKCkgKyBidWZmZXJSZW1haW5pbmcpOworCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBjb3B5ID0gbmV3IEFCdWZmZXIoYnVmZmVyLT5zaXplKCkgKyBidWZmZXJSZW1haW5pbmcpOworICAgICAgICAgICAgbWVtY3B5KGNvcHktPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgIGNvcHktPnNldFJhbmdlKDAsIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgICAgICAgICAgYnVmZmVyID0gY29weTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBtYXhCeXRlc1RvUmVhZCA9IGJ1ZmZlclJlbWFpbmluZzsKKyAgICAgICAgaWYgKHJhbmdlX2xlbmd0aCA+PSAwKSB7CisgICAgICAgICAgICBpbnQ2NF90IGJ5dGVzTGVmdEluUmFuZ2UgPSByYW5nZV9sZW5ndGggLSBidWZmZXItPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChieXRlc0xlZnRJblJhbmdlIDwgKGludDY0X3QpbWF4Qnl0ZXNUb1JlYWQpIHsKKyAgICAgICAgICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IGJ5dGVzTGVmdEluUmFuZ2U7CisKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXNMZWZ0SW5SYW5nZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBEYXRhU291cmNlIGlzIHJlc3BvbnNpYmxlIGZvciBpbmZvcm1pbmcgdXMgb2YgZXJyb3IgKG4gPCAwKSBvciBlb2YgKG4gPT0gMCkKKyAgICAgICAgLy8gdG8gaGVscCB1cyBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisgICAgICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgYnVmZmVyLT5zaXplKCksIGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCksCisgICAgICAgICAgICAgICAgbWF4Qnl0ZXNUb1JlYWQpOworCisgICAgICAgIGlmIChpc0Rpc2Nvbm5lY3RpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9DT05ORUNURUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIGJ1ZmZlci0+c2l6ZSgpICsgKHNpemVfdCluKTsKKyAgICAgICAgYnl0ZXNSZWFkICs9IG47CisgICAgfQorCisgICAgKm91dCA9IGJ1ZmZlcjsKKyAgICBpZiAoYWN0dWFsVXJsICE9IE5VTEwpIHsKKyAgICAgICAgKmFjdHVhbFVybCA9IG1EYXRhU291cmNlLT5nZXRVcmkoKTsKKyAgICAgICAgaWYgKGFjdHVhbFVybC0+aXNFbXB0eSgpKSB7CisgICAgICAgICAgICAqYWN0dWFsVXJsID0gdXJsOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzUmVhZDsKK30KKworc3NpemVfdCBIVFRQRG93bmxvYWRlcjo6ZmV0Y2hGaWxlKAorICAgICAgICBjb25zdCBjaGFyICp1cmwsIHNwPEFCdWZmZXI+ICpvdXQsIFN0cmluZzggKmFjdHVhbFVybCkgeworICAgIHNzaXplX3QgZXJyID0gZmV0Y2hCbG9jayh1cmwsIG91dCwgMCwgLTEsIDAsIGFjdHVhbFVybCwgdHJ1ZSAvKiByZWNvbm5lY3QgKi8pOworCisgICAgLy8gY2xvc2Ugb2ZmIHRoZSBjb25uZWN0aW9uIGFmdGVyIHVzZQorICAgIG1IVFRQRGF0YVNvdXJjZS0+ZGlzY29ubmVjdCgpOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3A8TTNVUGFyc2VyPiBIVFRQRG93bmxvYWRlcjo6ZmV0Y2hQbGF5bGlzdCgKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLCB1aW50OF90ICpjdXJQbGF5bGlzdEhhc2gsIGJvb2wgKnVuY2hhbmdlZCkgeworICAgIEFMT0dWKCJmZXRjaFBsYXlsaXN0ICclcyciLCB1cmwpOworCisgICAgKnVuY2hhbmdlZCA9IGZhbHNlOworCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgIFN0cmluZzggYWN0dWFsVXJsOworICAgIHNzaXplX3QgZXJyID0gZmV0Y2hGaWxlKHVybCwgJmJ1ZmZlciwgJmFjdHVhbFVybCk7CisKKyAgICAvLyBjbG9zZSBvZmYgdGhlIGNvbm5lY3Rpb24gYWZ0ZXIgdXNlCisgICAgbUhUVFBEYXRhU291cmNlLT5kaXNjb25uZWN0KCk7CisKKyAgICBpZiAoZXJyIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gTUQ1IGZ1bmN0aW9uYWxpdHkgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgc2ltdWxhdG9yLCB0cmVhdCBhbGwKKyAgICAvLyBwbGF5bGlzdHMgYXMgY2hhbmdlZC4KKworI2lmIGRlZmluZWQoSEFWRV9BTkRST0lEX09TKQorICAgIHVpbnQ4X3QgaGFzaFsxNl07CisKKyAgICBNRDVfQ1RYIG07CisgICAgTUQ1X0luaXQoJm0pOworICAgIE1ENV9VcGRhdGUoJm0sIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBNRDVfRmluYWwoaGFzaCwgJm0pOworCisgICAgaWYgKGN1clBsYXlsaXN0SGFzaCAhPSBOVUxMICYmICFtZW1jbXAoaGFzaCwgY3VyUGxheWxpc3RIYXNoLCAxNikpIHsKKyAgICAgICAgLy8gcGxheWxpc3QgdW5jaGFuZ2VkCisgICAgICAgICp1bmNoYW5nZWQgPSB0cnVlOworCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChjdXJQbGF5bGlzdEhhc2ggIT0gTlVMTCkgeworICAgICAgICBtZW1jcHkoY3VyUGxheWxpc3RIYXNoLCBoYXNoLCBzaXplb2YoaGFzaCkpOworICAgIH0KKyNlbmRpZgorCisgICAgc3A8TTNVUGFyc2VyPiBwbGF5bGlzdCA9CisgICAgICAgIG5ldyBNM1VQYXJzZXIoYWN0dWFsVXJsLnN0cmluZygpLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworCisgICAgaWYgKHBsYXlsaXN0LT5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHBhcnNlIC5tM3U4IHBsYXlsaXN0Iik7CisKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHBsYXlsaXN0OworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiNGE0OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBIVFRQX0RPV05MT0FERVJfSF8KKworI2RlZmluZSBIVFRQX0RPV05MT0FERVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKK2NsYXNzIERhdGFTb3VyY2U7CitzdHJ1Y3QgSFRUUEJhc2U7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CitzdHJ1Y3QgTTNVUGFyc2VyOworCitzdHJ1Y3QgSFRUUERvd25sb2FkZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgSFRUUERvd25sb2FkZXIoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gJmhlYWRlcnMpOworCisgICAgdm9pZCByZWNvbm5lY3QoKTsKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKKyAgICBib29sIGlzRGlzY29ubmVjdGluZygpOworICAgIC8vIElmIGdpdmVuIGEgbm9uLXplcm8gYmxvY2tfc2l6ZSAoZGVmYXVsdCAwKSwgaXQgaXMgdXNlZCB0byBjYXAgdGhlIG51bWJlciBvZgorICAgIC8vIGJ5dGVzIHJlYWQgaW4gZnJvbSB0aGUgRGF0YVNvdXJjZS4gSWYgZ2l2ZW4gYSBub24tTlVMTCBidWZmZXIsIG5ldyBjb250ZW50CisgICAgLy8gaXMgcmVhZCBpbnRvIHRoZSBlbmQuCisgICAgLy8KKyAgICAvLyBUaGUgRGF0YVNvdXJjZSB3ZSByZWFkIGZyb20gaXMgcmVzcG9uc2libGUgZm9yIHNpZ25hbGluZyBlcnJvciBvciBFT0YgdG8gaGVscCB1cworICAgIC8vIGJyZWFrIG91dCBvZiB0aGUgcmVhZCBsb29wLiBUaGUgRGF0YVNvdXJjZSBjYW4gYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciwgc28KKyAgICAvLyB0aGF0IHRoZSBjYWxsZXIgY2FuIHJldXNlIGl0IGZvciBzdWJzZXF1ZW50IGZldGNoZXMgKHdpdGhpbiB0aGUgaW5pdGlhbGx5CisgICAgLy8gcmVxdWVzdGVkIHJhbmdlKS4KKyAgICAvLworICAgIC8vIEZvciByZXVzZWQgSFRUUCBzb3VyY2VzLCB0aGUgY2FsbGVyIG11c3QgZG93bmxvYWQgYSBmaWxlIHNlcXVlbnRpYWxseSB3aXRob3V0CisgICAgLy8gYW55IG92ZXJsYXBzIG9yIGdhcHMgdG8gcHJldmVudCByZWNvbm5lY3Rpb24uCisgICAgc3NpemVfdCBmZXRjaEJsb2NrKAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gKm91dCwKKyAgICAgICAgICAgIGludDY0X3QgcmFuZ2Vfb2Zmc2V0LCAvKiBvcGVuIGZpbGUgYXQgcmFuZ2Vfb2Zmc2V0ICovCisgICAgICAgICAgICBpbnQ2NF90IHJhbmdlX2xlbmd0aCwgLyogb3BlbiBmaWxlIGZvciByYW5nZV9sZW5ndGggKC0xOiBlbnRpcmUgZmlsZSkgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGJsb2NrX3NpemUsICAvKiBkb3dubG9hZCBibG9jayBzaXplICgwOiBlbnRpcmUgcmFuZ2UpICovCisgICAgICAgICAgICBTdHJpbmc4ICphY3R1YWxVcmwsICAgLyogcmV0dXJucyBhY3R1YWwgVVJMICovCisgICAgICAgICAgICBib29sIHJlY29ubmVjdCAgICAgICAgLyogZm9yY2UgY29ubmVjdCBodHRwICovCisgICAgICAgICAgICApOworCisgICAgLy8gc2ltcGxpZmllZCB2ZXJzaW9uIHRvIGZldGNoIGEgc2luZ2xlIGZpbGUKKyAgICBzc2l6ZV90IGZldGNoRmlsZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+ICpvdXQsCisgICAgICAgICAgICBTdHJpbmc4ICphY3R1YWxVcmwgPSBOVUxMKTsKKworICAgIC8vIGZldGNoIGEgcGxheWxpc3QgZmlsZQorICAgIHNwPE0zVVBhcnNlcj4gZmV0Y2hQbGF5bGlzdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgdWludDhfdCAqY3VyUGxheWxpc3RIYXNoLCBib29sICp1bmNoYW5nZWQpOworCitwcml2YXRlOgorICAgIHNwPEhUVFBCYXNlPiBtSFRUUERhdGFTb3VyY2U7CisgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUV4dHJhSGVhZGVyczsKKworICAgIE11dGV4IG1Mb2NrOworICAgIGJvb2wgbURpc2Nvbm5lY3Rpbmc7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhIVFRQRG93bmxvYWRlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEhUVFBfRE9XTkxPQURFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCmluZGV4IGQwZjNiYzIuLjE1NTc0MDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKQEAgLTE5LDI0ICsxOSwxOSBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiTGl2ZVNlc3Npb24uaCIKLQorI2luY2x1ZGUgIkhUVFBEb3dubG9hZGVyLmgiCiAjaW5jbHVkZSAiTTNVUGFyc2VyLmgiCiAjaW5jbHVkZSAiUGxheWxpc3RGZXRjaGVyLmgiCiAKLSNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCiAjaW5jbHVkZSAibXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgiCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKQEAgLTQ0LDEzICszOSwyMzkgQEAKIAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy8gTnVtYmVyIG9mIHJlY2VudGx5LXJlYWQgYnl0ZXMgdG8gdXNlIGZvciBiYW5kd2lkdGggZXN0aW1hdGlvbgotY29uc3Qgc2l6ZV90IExpdmVTZXNzaW9uOjprQmFuZHdpZHRoSGlzdG9yeUJ5dGVzID0gMjAwICogMTAyNDsKKy8vIHN0YXRpYworLy8gQmFuZHdpZHRoIFN3aXRjaCBNYXJrIERlZmF1bHRzCitjb25zdCBpbnQ2NF90IExpdmVTZXNzaW9uOjprVXBTd2l0Y2hNYXJrVXMgPSAxNTAwMDAwMGxsOworY29uc3QgaW50NjRfdCBMaXZlU2Vzc2lvbjo6a0Rvd25Td2l0Y2hNYXJrVXMgPSAyMDAwMDAwMGxsOworY29uc3QgaW50NjRfdCBMaXZlU2Vzc2lvbjo6a1VwU3dpdGNoTWFyZ2luVXMgPSA1MDAwMDAwbGw7Citjb25zdCBpbnQ2NF90IExpdmVTZXNzaW9uOjprUmVzdW1lVGhyZXNob2xkVXMgPSAxMDAwMDBsbDsKKworLy8gQnVmZmVyIFByZXBhcmUvUmVhZHkvVW5kZXJmbG93IE1hcmtzCitjb25zdCBpbnQ2NF90IExpdmVTZXNzaW9uOjprUmVhZHlNYXJrVXMgPSA1MDAwMDAwbGw7Citjb25zdCBpbnQ2NF90IExpdmVTZXNzaW9uOjprUHJlcGFyZU1hcmtVcyA9IDE1MDAwMDBsbDsKK2NvbnN0IGludDY0X3QgTGl2ZVNlc3Npb246OmtVbmRlcmZsb3dNYXJrVXMgPSAxMDAwMDAwbGw7CisKK3N0cnVjdCBMaXZlU2Vzc2lvbjo6QmFuZHdpZHRoRXN0aW1hdG9yIDogcHVibGljIFJlZkJhc2UgeworICAgIEJhbmR3aWR0aEVzdGltYXRvcigpOworCisgICAgdm9pZCBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudChzaXplX3QgbnVtQnl0ZXMsIGludDY0X3QgZGVsYXlVcyk7CisgICAgYm9vbCBlc3RpbWF0ZUJhbmR3aWR0aCgKKyAgICAgICAgICAgIGludDMyX3QgKmJhbmR3aWR0aCwKKyAgICAgICAgICAgIGJvb2wgKmlzU3RhYmxlID0gTlVMTCwKKyAgICAgICAgICAgIGludDMyX3QgKnNob3J0VGVybUJwcyA9IE5VTEwpOworCitwcml2YXRlOgorICAgIC8vIEJhbmR3aWR0aCBlc3RpbWF0aW9uIHBhcmFtZXRlcnMKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2hvcnRUZXJtQmFuZHdpZHRoSXRlbXMgPSAzOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtNaW5CYW5kd2lkdGhIaXN0b3J5SXRlbXMgPSAyMDsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluQmFuZHdpZHRoSGlzdG9yeVdpbmRvd1VzID0gNTAwMDAwMGxsOyAvLyA1IHNlYworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhCYW5kd2lkdGhIaXN0b3J5V2luZG93VXMgPSAzMDAwMDAwMGxsOyAvLyAzMCBzZWMKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4QmFuZHdpZHRoSGlzdG9yeUFnZVVzID0gNjAwMDAwMDBsbDsgLy8gNjAgc2VjCisKKyAgICBzdHJ1Y3QgQmFuZHdpZHRoRW50cnkgeworICAgICAgICBpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaW50NjRfdCBtRGVsYXlVczsKKyAgICAgICAgc2l6ZV90IG1OdW1CeXRlczsKKyAgICB9OworCisgICAgTXV0ZXggbUxvY2s7CisgICAgTGlzdDxCYW5kd2lkdGhFbnRyeT4gbUJhbmR3aWR0aEhpc3Rvcnk7CisgICAgTGlzdDxpbnQzMl90PiBtUHJldkVzdGltYXRlczsKKyAgICBpbnQzMl90IG1TaG9ydFRlcm1Fc3RpbWF0ZTsKKyAgICBib29sIG1IYXNOZXdTYW1wbGU7CisgICAgYm9vbCBtSXNTdGFibGU7CisgICAgaW50NjRfdCBtVG90YWxUcmFuc2ZlclRpbWVVczsKKyAgICBzaXplX3QgbVRvdGFsVHJhbnNmZXJCeXRlczsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEJhbmR3aWR0aEVzdGltYXRvcik7Cit9OworCitMaXZlU2Vzc2lvbjo6QmFuZHdpZHRoRXN0aW1hdG9yOjpCYW5kd2lkdGhFc3RpbWF0b3IoKSA6CisgICAgbVNob3J0VGVybUVzdGltYXRlKDApLAorICAgIG1IYXNOZXdTYW1wbGUoZmFsc2UpLAorICAgIG1Jc1N0YWJsZSh0cnVlKSwKKyAgICBtVG90YWxUcmFuc2ZlclRpbWVVcygwKSwKKyAgICBtVG90YWxUcmFuc2ZlckJ5dGVzKDApIHsKK30KKwordm9pZCBMaXZlU2Vzc2lvbjo6QmFuZHdpZHRoRXN0aW1hdG9yOjphZGRCYW5kd2lkdGhNZWFzdXJlbWVudCgKKyAgICAgICAgc2l6ZV90IG51bUJ5dGVzLCBpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBBdXRvTXV0ZXggYXV0b0xvY2sobUxvY2spOworCisgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgQmFuZHdpZHRoRW50cnkgZW50cnk7CisgICAgZW50cnkubVRpbWVzdGFtcFVzID0gbm93VXM7CisgICAgZW50cnkubURlbGF5VXMgPSBkZWxheVVzOworICAgIGVudHJ5Lm1OdW1CeXRlcyA9IG51bUJ5dGVzOworICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzICs9IGRlbGF5VXM7CisgICAgbVRvdGFsVHJhbnNmZXJCeXRlcyArPSBudW1CeXRlczsKKyAgICBtQmFuZHdpZHRoSGlzdG9yeS5wdXNoX2JhY2soZW50cnkpOworICAgIG1IYXNOZXdTYW1wbGUgPSB0cnVlOworCisgICAgLy8gUmVtb3ZlIG5vIG1vcmUgdGhhbiAxMCUgb2YgdG90YWwgdHJhbnNmZXIgdGltZSBhdCBhIHRpbWUKKyAgICAvLyB0byBhdm9pZCBzdWRkZW4ganVtcCBvbiBiYW5kd2lkdGggZXN0aW1hdGlvbi4gVGhlcmUgbWlnaHQKKyAgICAvLyBiZSBsb25nIGJsb2NraW5nIHJlYWRzIHRoYXQgdGFrZXMgdXAgc2lnbmlmaWNhdGlvbiB0aW1lLAorICAgIC8vIHdlIGhhdmUgdG8ga2VlcCBhIGxvbmdlciB3aW5kb3cgaW4gdGhhdCBjYXNlLgorICAgIGludDY0X3QgYmFuZHdpZHRoSGlzdG9yeVdpbmRvd1VzID0gbVRvdGFsVHJhbnNmZXJUaW1lVXMgKiA5IC8gMTA7CisgICAgaWYgKGJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVcyA8IGtNaW5CYW5kd2lkdGhIaXN0b3J5V2luZG93VXMpIHsKKyAgICAgICAgYmFuZHdpZHRoSGlzdG9yeVdpbmRvd1VzID0ga01pbkJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVczsKKyAgICB9IGVsc2UgaWYgKGJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVcyA+IGtNYXhCYW5kd2lkdGhIaXN0b3J5V2luZG93VXMpIHsKKyAgICAgICAgYmFuZHdpZHRoSGlzdG9yeVdpbmRvd1VzID0ga01heEJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVczsKKyAgICB9CisgICAgLy8gdHJpbSBvbGQgc2FtcGxlcywga2VlcGluZyBhdCBsZWFzdCBrTWF4QmFuZHdpZHRoSGlzdG9yeUl0ZW1zIHNhbXBsZXMsCisgICAgLy8gYW5kIHRvdGFsIHRyYW5zZmVyIHRpbWUgYXQgbGVhc3Qga01heEJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVcy4KKyAgICB3aGlsZSAobUJhbmR3aWR0aEhpc3Rvcnkuc2l6ZSgpID4ga01pbkJhbmR3aWR0aEhpc3RvcnlJdGVtcykgeworICAgICAgICBMaXN0PEJhbmR3aWR0aEVudHJ5Pjo6aXRlcmF0b3IgaXQgPSBtQmFuZHdpZHRoSGlzdG9yeS5iZWdpbigpOworICAgICAgICAvLyByZW1vdmUgc2FtcGxlIGlmIGVpdGhlciBhYnNvbHV0ZSBhZ2Ugb3IgdG90YWwgdHJhbnNmZXIgdGltZSBpcworICAgICAgICAvLyBvdmVyIGtNYXhCYW5kd2lkdGhIaXN0b3J5V2luZG93VXMKKyAgICAgICAgaWYgKG5vd1VzIC0gaXQtPm1UaW1lc3RhbXBVcyA8IGtNYXhCYW5kd2lkdGhIaXN0b3J5QWdlVXMgJiYKKyAgICAgICAgICAgICAgICBtVG90YWxUcmFuc2ZlclRpbWVVcyAtIGl0LT5tRGVsYXlVcyA8IGJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVcykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMgLT0gaXQtPm1EZWxheVVzOworICAgICAgICBtVG90YWxUcmFuc2ZlckJ5dGVzIC09IGl0LT5tTnVtQnl0ZXM7CisgICAgICAgIG1CYW5kd2lkdGhIaXN0b3J5LmVyYXNlKG1CYW5kd2lkdGhIaXN0b3J5LmJlZ2luKCkpOworICAgIH0KK30KKworYm9vbCBMaXZlU2Vzc2lvbjo6QmFuZHdpZHRoRXN0aW1hdG9yOjplc3RpbWF0ZUJhbmR3aWR0aCgKKyAgICAgICAgaW50MzJfdCAqYmFuZHdpZHRoQnBzLCBib29sICppc1N0YWJsZSwgaW50MzJfdCAqc2hvcnRUZXJtQnBzKSB7CisgICAgQXV0b011dGV4IGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtQmFuZHdpZHRoSGlzdG9yeS5zaXplKCkgPCAyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIW1IYXNOZXdTYW1wbGUpIHsKKyAgICAgICAgKmJhbmR3aWR0aEJwcyA9ICooLS1tUHJldkVzdGltYXRlcy5lbmQoKSk7CisgICAgICAgIGlmIChpc1N0YWJsZSkgeworICAgICAgICAgICAgKmlzU3RhYmxlID0gbUlzU3RhYmxlOworICAgICAgICB9CisgICAgICAgIGlmIChzaG9ydFRlcm1CcHMpIHsKKyAgICAgICAgICAgICpzaG9ydFRlcm1CcHMgPSBtU2hvcnRUZXJtRXN0aW1hdGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgKmJhbmR3aWR0aEJwcyA9ICgoZG91YmxlKW1Ub3RhbFRyYW5zZmVyQnl0ZXMgKiA4RTYgLyBtVG90YWxUcmFuc2ZlclRpbWVVcyk7CisgICAgbVByZXZFc3RpbWF0ZXMucHVzaF9iYWNrKCpiYW5kd2lkdGhCcHMpOworICAgIHdoaWxlIChtUHJldkVzdGltYXRlcy5zaXplKCkgPiAzKSB7CisgICAgICAgIG1QcmV2RXN0aW1hdGVzLmVyYXNlKG1QcmV2RXN0aW1hdGVzLmJlZ2luKCkpOworICAgIH0KKyAgICBtSGFzTmV3U2FtcGxlID0gZmFsc2U7CisKKyAgICBpbnQ2NF90IHRvdGFsVGltZVVzID0gMDsKKyAgICBzaXplX3QgdG90YWxCeXRlcyA9IDA7CisgICAgaWYgKG1CYW5kd2lkdGhIaXN0b3J5LnNpemUoKSA+PSBrU2hvcnRUZXJtQmFuZHdpZHRoSXRlbXMpIHsKKyAgICAgICAgTGlzdDxCYW5kd2lkdGhFbnRyeT46Oml0ZXJhdG9yIGl0ID0gLS1tQmFuZHdpZHRoSGlzdG9yeS5lbmQoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrU2hvcnRUZXJtQmFuZHdpZHRoSXRlbXM7IGkrKywgaXQtLSkgeworICAgICAgICAgICAgdG90YWxUaW1lVXMgKz0gaXQtPm1EZWxheVVzOworICAgICAgICAgICAgdG90YWxCeXRlcyArPSBpdC0+bU51bUJ5dGVzOworICAgICAgICB9CisgICAgfQorICAgIG1TaG9ydFRlcm1Fc3RpbWF0ZSA9IHRvdGFsVGltZVVzID4gMCA/CisgICAgICAgICAgICAodG90YWxCeXRlcyAqIDhFNiAvIHRvdGFsVGltZVVzKSA6ICpiYW5kd2lkdGhCcHM7CisgICAgaWYgKHNob3J0VGVybUJwcykgeworICAgICAgICAqc2hvcnRUZXJtQnBzID0gbVNob3J0VGVybUVzdGltYXRlOworICAgIH0KKworICAgIGludDMyX3QgbWluRXN0aW1hdGUgPSAtMSwgbWF4RXN0aW1hdGUgPSAtMTsKKyAgICBMaXN0PGludDMyX3Q+OjppdGVyYXRvciBpdDsKKyAgICBmb3IgKGl0ID0gbVByZXZFc3RpbWF0ZXMuYmVnaW4oKTsgaXQgIT0gbVByZXZFc3RpbWF0ZXMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgaW50MzJfdCBlc3RpbWF0ZSA9ICppdDsKKyAgICAgICAgaWYgKG1pbkVzdGltYXRlIDwgMCB8fCBtaW5Fc3RpbWF0ZSA+IGVzdGltYXRlKSB7CisgICAgICAgICAgICBtaW5Fc3RpbWF0ZSA9IGVzdGltYXRlOworICAgICAgICB9CisgICAgICAgIGlmIChtYXhFc3RpbWF0ZSA8IDAgfHwgbWF4RXN0aW1hdGUgPCBlc3RpbWF0ZSkgeworICAgICAgICAgICAgbWF4RXN0aW1hdGUgPSBlc3RpbWF0ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBjb25zaWRlciBpdCBzdGFibGUgaWYgbG9uZy10ZXJtIGF2ZXJhZ2UgaXMgbm90IGp1bXBpbmcgYSBsb3QKKyAgICAvLyBhbmQgc2hvcnQtdGVybSBhdmVyYWdlIGlzIG5vdCBtdWNoIGxvd2VyIHRoYW4gbG9uZy10ZXJtIGF2ZXJhZ2UKKyAgICBtSXNTdGFibGUgPSAobWF4RXN0aW1hdGUgPD0gbWluRXN0aW1hdGUgKiA0IC8gMykKKyAgICAgICAgICAgICYmIG1TaG9ydFRlcm1Fc3RpbWF0ZSA+IG1pbkVzdGltYXRlICogNyAvIDEwOworICAgIGlmIChpc1N0YWJsZSkgeworICAgICAgICAqaXNTdGFibGUgPSBtSXNTdGFibGU7CisgICAgfQorCisjaWYgMAorICAgIHsKKyAgICAgICAgY2hhciBkdW1wU3RyWzEwMjRdID0gezB9OworICAgICAgICBzaXplX3QgaXRlbUlkeCA9IDA7CisgICAgICAgIHNpemVfdCBoaXN0U2l6ZSA9IG1CYW5kd2lkdGhIaXN0b3J5LnNpemUoKTsKKyAgICAgICAgc3ByaW50ZihkdW1wU3RyLCAiZXN0aW1hdGUgYnBzPSVkIHN0YWJsZT0lZCBoaXN0b3J5IChuPSVkKTogeyIsCisgICAgICAgICAgICAqYmFuZHdpZHRoQnBzLCBtSXNTdGFibGUsIGhpc3RTaXplKTsKKyAgICAgICAgTGlzdDxCYW5kd2lkdGhFbnRyeT46Oml0ZXJhdG9yIGl0ID0gbUJhbmR3aWR0aEhpc3RvcnkuYmVnaW4oKTsKKyAgICAgICAgZm9yICg7IGl0ICE9IG1CYW5kd2lkdGhIaXN0b3J5LmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoaXRlbUlkeCA+IDUwKSB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihkdW1wU3RyICsgc3RybGVuKGR1bXBTdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIi4uLiglemQgbW9yZSBpdGVtcykuLi4gfSIsIGhpc3RTaXplIC0gaXRlbUlkeCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcHJpbnRmKGR1bXBTdHIgKyBzdHJsZW4oZHVtcFN0ciksICIlZGsvJS4zZnMlcyIsCisgICAgICAgICAgICAgICAgaXQtPm1OdW1CeXRlcyAvIDEwMjQsCisgICAgICAgICAgICAgICAgKGRvdWJsZSlpdC0+bURlbGF5VXMgKiAxLjBlLTYsCisgICAgICAgICAgICAgICAgKGl0ID09ICgtLW1CYW5kd2lkdGhIaXN0b3J5LmVuZCgpKSkgPyAifSIgOiAiLCAiKTsKKyAgICAgICAgICAgIGl0ZW1JZHgrKzsKKyAgICAgICAgfQorICAgICAgICBBTE9HRShkdW1wU3RyKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy9zdGF0aWMKK2NvbnN0IGNoYXIgKkxpdmVTZXNzaW9uOjpnZXRLZXlGb3JTdHJlYW0oU3RyZWFtVHlwZSB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9WSURFTzoKKyAgICAgICAgICAgIHJldHVybiAidGltZVVzVmlkZW8iOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQVVESU86CisgICAgICAgICAgICByZXR1cm4gInRpbWVVc0F1ZGlvIjsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1NVQlRJVExFUzoKKyAgICAgICAgICAgIHJldHVybiAidGltZVVzU3VidGl0bGUiOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTUVUQURBVEE6CisgICAgICAgICAgICByZXR1cm4gInRpbWVVc01ldGFkYXRhIjsgLy8gdW51c2VkCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLy9zdGF0aWMKK2NvbnN0IGNoYXIgKkxpdmVTZXNzaW9uOjpnZXROYW1lRm9yU3RyZWFtKFN0cmVhbVR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfVklERU86CisgICAgICAgICAgICByZXR1cm4gInZpZGVvIjsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FVRElPOgorICAgICAgICAgICAgcmV0dXJuICJhdWRpbyI7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9TVUJUSVRMRVM6CisgICAgICAgICAgICByZXR1cm4gInN1YnMiOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTUVUQURBVEE6CisgICAgICAgICAgICByZXR1cm4gIm1ldGFkYXRhIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gInVua25vd24iOworfQorCisvL3N0YXRpYworQVRTUGFyc2VyOjpTb3VyY2VUeXBlIExpdmVTZXNzaW9uOjpnZXRTb3VyY2VUeXBlRm9yU3RyZWFtKFN0cmVhbVR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfVklERU86CisgICAgICAgICAgICByZXR1cm4gQVRTUGFyc2VyOjpWSURFTzsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FVRElPOgorICAgICAgICAgICAgcmV0dXJuIEFUU1BhcnNlcjo6QVVESU87CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NRVRBREFUQToKKyAgICAgICAgICAgIHJldHVybiBBVFNQYXJzZXI6Ok1FVEE7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9TVUJUSVRMRVM6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKyAgICByZXR1cm4gQVRTUGFyc2VyOjpOVU1fU09VUkNFX1RZUEVTOyAvLyBzaG91bGQgbm90IHJlYWNoIGhlcmUKK30KIAogTGl2ZVNlc3Npb246OkxpdmVTZXNzaW9uKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgdWludDMyX3QgZmxhZ3MsCkBAIC01OCwxNjkgKzI3OSw5NSBAQAogICAgIDogbU5vdGlmeShub3RpZnkpLAogICAgICAgbUZsYWdzKGZsYWdzKSwKICAgICAgIG1IVFRQU2VydmljZShodHRwU2VydmljZSksCisgICAgICBtQnVmZmVyaW5nKGZhbHNlKSwKICAgICAgIG1JblByZXBhcmF0aW9uUGhhc2UodHJ1ZSksCi0gICAgICBtSFRUUERhdGFTb3VyY2UobmV3IE1lZGlhSFRUUChtSFRUUFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSksCisgICAgICBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24oMCksCisgICAgICBtUHJldkJ1ZmZlclBlcmNlbnRhZ2UoLTEpLAogICAgICAgbUN1ckJhbmR3aWR0aEluZGV4KC0xKSwKKyAgICAgIG1PcmlnQmFuZHdpZHRoSW5kZXgoLTEpLAorICAgICAgbUxhc3RCYW5kd2lkdGhCcHMoLTFsbCksCisgICAgICBtTGFzdEJhbmR3aWR0aFN0YWJsZShmYWxzZSksCisgICAgICBtQmFuZHdpZHRoRXN0aW1hdG9yKG5ldyBCYW5kd2lkdGhFc3RpbWF0b3IoKSksCisgICAgICBtTWF4V2lkdGgoNzIwKSwKKyAgICAgIG1NYXhIZWlnaHQoNDgwKSwKICAgICAgIG1TdHJlYW1NYXNrKDApLAogICAgICAgbU5ld1N0cmVhbU1hc2soMCksCiAgICAgICBtU3dhcE1hc2soMCksCi0gICAgICBtQ2hlY2tCYW5kd2lkdGhHZW5lcmF0aW9uKDApLAogICAgICAgbVN3aXRjaEdlbmVyYXRpb24oMCksCiAgICAgICBtU3VidGl0bGVHZW5lcmF0aW9uKDApLAogICAgICAgbUxhc3REZXF1ZXVlZFRpbWVVcygwbGwpLAogICAgICAgbVJlYWxUaW1lQmFzZVVzKDBsbCksCiAgICAgICBtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcyhmYWxzZSksCiAgICAgICBtU3dpdGNoSW5Qcm9ncmVzcyhmYWxzZSksCi0gICAgICBtRGlzY29ubmVjdFJlcGx5SUQoMCksCi0gICAgICBtU2Vla1JlcGx5SUQoMCksCisgICAgICBtVXBTd2l0Y2hNYXJrKGtVcFN3aXRjaE1hcmtVcyksCisgICAgICBtRG93blN3aXRjaE1hcmsoa0Rvd25Td2l0Y2hNYXJrVXMpLAorICAgICAgbVVwU3dpdGNoTWFyZ2luKGtVcFN3aXRjaE1hcmdpblVzKSwKICAgICAgIG1GaXJzdFRpbWVVc1ZhbGlkKGZhbHNlKSwKICAgICAgIG1GaXJzdFRpbWVVcygwKSwKLSAgICAgIG1MYXN0U2Vla1RpbWVVcygwKSB7Ci0KKyAgICAgIG1MYXN0U2Vla1RpbWVVcygwKSwKKyAgICAgIG1IYXNNZXRhZGF0YShmYWxzZSkgewogICAgIG1TdHJlYW1zW2tBdWRpb0luZGV4XSA9IFN0cmVhbUl0ZW0oImF1ZGlvIik7CiAgICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdID0gU3RyZWFtSXRlbSgidmlkZW8iKTsKICAgICBtU3RyZWFtc1trU3VidGl0bGVJbmRleF0gPSBTdHJlYW1JdGVtKCJzdWJ0aXRsZXMiKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgewotICAgICAgICBtRGlzY29udGludWl0aWVzLmFkZChpbmRleFRvVHlwZShpKSwgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoTlVMTCAvKiBtZXRhICovKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU291cmNlczsgKytpKSB7CiAgICAgICAgIG1QYWNrZXRTb3VyY2VzLmFkZChpbmRleFRvVHlwZShpKSwgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoTlVMTCAvKiBtZXRhICovKSk7CiAgICAgICAgIG1QYWNrZXRTb3VyY2VzMi5hZGQoaW5kZXhUb1R5cGUoaSksIG5ldyBBbm90aGVyUGFja2V0U291cmNlKE5VTEwgLyogbWV0YSAqLykpOwotICAgICAgICBtQnVmZmVyaW5nW2ldID0gZmFsc2U7CiAgICAgfQotCi0gICAgc2l6ZV90IG51bUhpc3RvcnlJdGVtcyA9IGtCYW5kd2lkdGhIaXN0b3J5Qnl0ZXMgLwotICAgICAgICAgICAgUGxheWxpc3RGZXRjaGVyOjprRG93bmxvYWRCbG9ja1NpemUgKyAxOwotICAgIGlmIChudW1IaXN0b3J5SXRlbXMgPCA1KSB7Ci0gICAgICAgIG51bUhpc3RvcnlJdGVtcyA9IDU7Ci0gICAgfQotICAgIG1IVFRQRGF0YVNvdXJjZS0+c2V0QmFuZHdpZHRoSGlzdG9yeVNpemUobnVtSGlzdG9yeUl0ZW1zKTsKIH0KIAogTGl2ZVNlc3Npb246On5MaXZlU2Vzc2lvbigpIHsKKyAgICBpZiAobUZldGNoZXJMb29wZXIgIT0gTlVMTCkgeworICAgICAgICBtRmV0Y2hlckxvb3Blci0+c3RvcCgpOworICAgIH0KIH0KIAotc3A8QUJ1ZmZlcj4gTGl2ZVNlc3Npb246OmNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcihib29sIHN3YXApIHsKLSAgICBBQnVmZmVyICpkaXNjb250aW51aXR5ID0gbmV3IEFCdWZmZXIoMCk7Ci0gICAgZGlzY29udGludWl0eS0+bWV0YSgpLT5zZXRJbnQzMigiZGlzY29udGludWl0eSIsIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UpOwotICAgIGRpc2NvbnRpbnVpdHktPm1ldGEoKS0+c2V0SW50MzIoInN3YXBQYWNrZXRTb3VyY2UiLCBzd2FwKTsKLSAgICBkaXNjb250aW51aXR5LT5tZXRhKCktPnNldEludDMyKCJzd2l0Y2hHZW5lcmF0aW9uIiwgbVN3aXRjaEdlbmVyYXRpb24pOwotICAgIGRpc2NvbnRpbnVpdHktPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIC0xKTsKLSAgICByZXR1cm4gZGlzY29udGludWl0eTsKLX0KLQotdm9pZCBMaXZlU2Vzc2lvbjo6c3dhcFBhY2tldFNvdXJjZShTdHJlYW1UeXBlIHN0cmVhbSkgewotICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZhcHMgPSBtUGFja2V0U291cmNlcy5lZGl0VmFsdWVGb3Ioc3RyZWFtKTsKLSAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmYXBzMiA9IG1QYWNrZXRTb3VyY2VzMi5lZGl0VmFsdWVGb3Ioc3RyZWFtKTsKLSAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiB0bXAgPSBhcHM7Ci0gICAgYXBzID0gYXBzMjsKLSAgICBhcHMyID0gdG1wOwotICAgIGFwczItPmNsZWFyKCk7CitpbnQ2NF90IExpdmVTZXNzaW9uOjpjYWxjdWxhdGVNZWRpYVRpbWVVcygKKyAgICAgICAgaW50NjRfdCBmaXJzdFRpbWVVcywgaW50NjRfdCB0aW1lVXMsIGludDMyX3QgZGlzY29udGludWl0eVNlcSkgeworICAgIGlmICh0aW1lVXMgPj0gZmlyc3RUaW1lVXMpIHsKKyAgICAgICAgdGltZVVzIC09IGZpcnN0VGltZVVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHRpbWVVcyA9IDA7CisgICAgfQorICAgIHRpbWVVcyArPSBtTGFzdFNlZWtUaW1lVXM7CisgICAgaWYgKG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy5pbmRleE9mS2V5KGRpc2NvbnRpbnVpdHlTZXEpID49IDApIHsKKyAgICAgICAgdGltZVVzICs9IG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy52YWx1ZUZvcihkaXNjb250aW51aXR5U2VxKTsKKyAgICB9CisgICAgcmV0dXJuIHRpbWVVczsKIH0KIAogc3RhdHVzX3QgTGl2ZVNlc3Npb246OmRlcXVldWVBY2Nlc3NVbml0KAogICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbSwgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpIHsKLSAgICBpZiAoIShtU3RyZWFtTWFzayAmIHN0cmVhbSkpIHsKLSAgICAgICAgLy8gcmV0dXJuIC1FV09VTERCTE9DSyB0byBhdm9pZCBoYWx0aW5nIHRoZSBkZWNvZGVyCi0gICAgICAgIC8vIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gYXVkaW8vdmlkZW8gYW5kIGF1ZGlvIG9ubHkuCi0gICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7Ci0gICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZGlzY29udGludWl0eVF1ZXVlICA9IG1EaXNjb250aW51aXRpZXMudmFsdWVGb3Ioc3RyZWFtKTsKLSAgICBpZiAoZGlzY29udGludWl0eVF1ZXVlLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgewotICAgICAgICBkaXNjb250aW51aXR5UXVldWUtPmRlcXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwotICAgICAgICAvLyBzZWVraW5nLCB0cmFjayBzd2l0Y2hpbmcKLSAgICAgICAgc3A8QU1lc3NhZ2U+IGV4dHJhOwotICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgaWYgKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZE1lc3NhZ2UoImV4dHJhIiwgJmV4dHJhKQotICAgICAgICAgICAgICAgICYmIGV4dHJhICE9IE5VTEwKLSAgICAgICAgICAgICAgICAmJiBleHRyYS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSkgewotICAgICAgICAgICAgLy8gc2Vla2luZyBvbmx5Ci0gICAgICAgICAgICBtTGFzdFNlZWtUaW1lVXMgPSB0aW1lVXM7Ci0gICAgICAgICAgICBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMuY2xlYXIoKTsKLSAgICAgICAgICAgIG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIElORk9fRElTQ09OVElOVUlUWTsKLSAgICB9Ci0KKyAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdCA9IE9LOwogICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldFNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKHN0cmVhbSk7CiAKLSAgICBzc2l6ZV90IGlkeCA9IHR5cGVUb0luZGV4KHN0cmVhbSk7Ci0gICAgaWYgKCFwYWNrZXRTb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgc3NpemVfdCBzdHJlYW1JZHggPSB0eXBlVG9JbmRleChzdHJlYW0pOworICAgIGlmIChzdHJlYW1JZHggPCAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKnN0cmVhbVN0ciA9IGdldE5hbWVGb3JTdHJlYW0oc3RyZWFtKTsKKyAgICAvLyBEbyBub3QgbGV0IGNsaWVudCBwdWxsIGRhdGEgaWYgd2UgZG9uJ3QgaGF2ZSBkYXRhIHBhY2tldHMgeWV0LgorICAgIC8vIFdlIG1pZ2h0IG9ubHkgaGF2ZSBhIGZvcm1hdCBkaXNjb250aW51aXR5IHF1ZXVlZCB3aXRob3V0IGRhdGEuCisgICAgLy8gV2hlbiBOdVBsYXllckRlY29kZXIgZGVxdWV1ZXMgdGhlIGZvcm1hdCBkaXNjb250aW51aXR5LCBpdCB3aWxsCisgICAgLy8gaW1tZWRpYXRlbHkgdHJ5IHRvIGdldEZvcm1hdC4gSWYgd2UgcmV0dXJuIE5VTEwsIE51UGxheWVyRGVjb2RlcgorICAgIC8vIHRoaW5rcyBpdCBjYW4gZG8gc2VhbWxlc3MgY2hhbmdlLCBzbyB3aWxsIG5vdCBzaHV0ZG93biBkZWNvZGVyLgorICAgIC8vIFdoZW4gdGhlIGFjdHVhbCBmb3JtYXQgYXJyaXZlcywgaXQgY2FuJ3QgaGFuZGxlIGl0IGFuZCBnZXQgc3R1Y2suCisgICAgaWYgKCFwYWNrZXRTb3VyY2UtPmhhc0RhdGFCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgeworICAgICAgICBBTE9HVigiWyVzXSBkZXF1ZXVlQWNjZXNzVW5pdDogbm8gYnVmZmVyIGF2YWlsYWJsZSAoZmluYWxSZXN1bHQ9JWQpIiwKKyAgICAgICAgICAgICAgICBzdHJlYW1TdHIsIGZpbmFsUmVzdWx0KTsKKwogICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gT0spIHsKLSAgICAgICAgICAgIG1CdWZmZXJpbmdbaWR4XSA9IHRydWU7CiAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBmaW5hbFJlc3VsdDsKICAgICAgICAgfQogICAgIH0KIAotICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb24gPSAwOwotICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gcGFja2V0U291cmNlLT5nZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKTsKLSAgICBpZiAobWV0YSAhPSBOVUxMKSB7Ci0gICAgICAgIG1ldGEtPmZpbmRJbnQzMigidGFyZ2V0RHVyYXRpb24iLCAmdGFyZ2V0RHVyYXRpb24pOwotICAgIH0KLQotICAgIGludDY0X3QgdGFyZ2V0RHVyYXRpb25VcyA9IHRhcmdldER1cmF0aW9uICogMTAwMDAwMGxsOwotICAgIGlmICh0YXJnZXREdXJhdGlvblVzID09IDAgfHwKLSAgICAgICAgICAgIHRhcmdldER1cmF0aW9uVXMgPiBQbGF5bGlzdEZldGNoZXI6OmtNaW5CdWZmZXJlZER1cmF0aW9uVXMpIHsKLSAgICAgICAgLy8gRmV0Y2hlcnMgbGltaXQgYnVmZmVyaW5nIHRvCi0gICAgICAgIC8vIG1pbigzICogdGFyZ2V0RHVyYXRpb24sIGtNaW5CdWZmZXJlZER1cmF0aW9uVXMpCi0gICAgICAgIHRhcmdldER1cmF0aW9uVXMgPSBQbGF5bGlzdEZldGNoZXI6OmtNaW5CdWZmZXJlZER1cmF0aW9uVXM7Ci0gICAgfQotCi0gICAgaWYgKG1CdWZmZXJpbmdbaWR4XSkgewotICAgICAgICBpZiAobVN3aXRjaEluUHJvZ3Jlc3MKLSAgICAgICAgICAgICAgICB8fCBwYWNrZXRTb3VyY2UtPmlzRmluaXNoZWQoMCkKLSAgICAgICAgICAgICAgICB8fCBwYWNrZXRTb3VyY2UtPmdldEVzdGltYXRlZER1cmF0aW9uVXMoKSA+IHRhcmdldER1cmF0aW9uVXMpIHsKLSAgICAgICAgICAgIG1CdWZmZXJpbmdbaWR4XSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1CdWZmZXJpbmdbaWR4XSkgewotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0KLSAgICAvLyB3YWl0IGZvciBjb3VudGVycGFydAotICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG90aGVyU291cmNlOwotICAgIHVpbnQzMl90IG1hc2sgPSBtTmV3U3RyZWFtTWFzayAmIG1TdHJlYW1NYXNrOwotICAgIHVpbnQzMl90IGZldGNoZXJzTWFzayAgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICB1aW50MzJfdCBmZXRjaGVyTWFzayA9IG1GZXRjaGVySW5mb3MudmFsdWVBdChpKS5tRmV0Y2hlci0+Z2V0U3RyZWFtVHlwZU1hc2soKTsKLSAgICAgICAgZmV0Y2hlcnNNYXNrIHw9IGZldGNoZXJNYXNrOwotICAgIH0KLSAgICBtYXNrICY9IGZldGNoZXJzTWFzazsKLSAgICBpZiAoc3RyZWFtID09IFNUUkVBTVRZUEVfQVVESU8gJiYgKG1hc2sgJiBTVFJFQU1UWVBFX1ZJREVPKSkgewotICAgICAgICBvdGhlclNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKFNUUkVBTVRZUEVfVklERU8pOwotICAgIH0gZWxzZSBpZiAoc3RyZWFtID09IFNUUkVBTVRZUEVfVklERU8gJiYgKG1hc2sgJiBTVFJFQU1UWVBFX0FVRElPKSkgewotICAgICAgICBvdGhlclNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKFNUUkVBTVRZUEVfQVVESU8pOwotICAgIH0KLSAgICBpZiAob3RoZXJTb3VyY2UgIT0gTlVMTCAmJiAhb3RoZXJTb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7Ci0gICAgICAgIHJldHVybiBmaW5hbFJlc3VsdCA9PSBPSyA/IC1FQUdBSU4gOiBmaW5hbFJlc3VsdDsKLSAgICB9CisgICAgLy8gTGV0IHRoZSBjbGllbnQgZGVxdWV1ZSBhcyBsb25nIGFzIHdlIGhhdmUgYnVmZmVycyBhdmFpbGFibGUKKyAgICAvLyBEbyBub3QgbWFrZSBwYXVzZS9yZXN1bWUgZGVjaXNpb25zIGhlcmUuCiAKICAgICBzdGF0dXNfdCBlcnIgPSBwYWNrZXRTb3VyY2UtPmRlcXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwogCi0gICAgc2l6ZV90IHN0cmVhbUlkeDsKLSAgICBjb25zdCBjaGFyICpzdHJlYW1TdHI7Ci0gICAgc3dpdGNoIChzdHJlYW0pIHsKLSAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FVRElPOgotICAgICAgICAgICAgc3RyZWFtSWR4ID0ga0F1ZGlvSW5kZXg7Ci0gICAgICAgICAgICBzdHJlYW1TdHIgPSAiYXVkaW8iOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNVFlQRV9WSURFTzoKLSAgICAgICAgICAgIHN0cmVhbUlkeCA9IGtWaWRlb0luZGV4OwotICAgICAgICAgICAgc3RyZWFtU3RyID0gInZpZGVvIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUUkVBTVRZUEVfU1VCVElUTEVTOgotICAgICAgICAgICAgc3RyZWFtSWR4ID0ga1N1YnRpdGxlSW5kZXg7Ci0gICAgICAgICAgICBzdHJlYW1TdHIgPSAic3VicyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgfQotCi0gICAgU3RyZWFtSXRlbSYgc3RybSA9IG1TdHJlYW1zW3N0cmVhbUlkeF07CiAgICAgaWYgKGVyciA9PSBJTkZPX0RJU0NPTlRJTlVJVFkpIHsKICAgICAgICAgLy8gYWRhcHRpdmUgc3RyZWFtaW5nLCBkaXNjb250aW51aXRpZXMgaW4gdGhlIHBsYXlsaXN0CiAgICAgICAgIGludDMyX3QgdHlwZTsKQEAgLTIzNSw1MCArMzgyLDM2IEBACiAgICAgICAgICAgICAgIHN0cmVhbVN0ciwKICAgICAgICAgICAgICAgdHlwZSwKICAgICAgICAgICAgICAgZXh0cmEgPT0gTlVMTCA/ICJOVUxMIiA6IGV4dHJhLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotCi0gICAgICAgIGludDMyX3Qgc3dhcDsKLSAgICAgICAgaWYgKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJzd2FwUGFja2V0U291cmNlIiwgJnN3YXApICYmIHN3YXApIHsKLSAgICAgICAgICAgIGludDMyX3Qgc3dpdGNoR2VuZXJhdGlvbjsKLSAgICAgICAgICAgIENIRUNLKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJzd2l0Y2hHZW5lcmF0aW9uIiwgJnN3aXRjaEdlbmVyYXRpb24pKTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3dhcE11dGV4KTsKLSAgICAgICAgICAgICAgICBpZiAoc3dpdGNoR2VuZXJhdGlvbiA9PSBtU3dpdGNoR2VuZXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBzd2FwUGFja2V0U291cmNlKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTd2FwcGVkLCBpZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigic3RyZWFtIiwgc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigic3dpdGNoR2VuZXJhdGlvbiIsIHN3aXRjaEdlbmVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaXplX3Qgc2VxID0gc3RybS5tQ3VyRGlzY29udGludWl0eVNlcTsKLSAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0VGltZVVzOwotICAgICAgICAgICAgaWYgKG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy5pbmRleE9mS2V5KHNlcSkgPj0gMCkgewotICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyA9IG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy52YWx1ZUZvcihzZXEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvZmZzZXRUaW1lVXMgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXEgKz0gMTsKLSAgICAgICAgICAgIGlmIChtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVcy5pbmRleE9mS2V5KHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEpID49IDApIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGZpcnN0VGltZVVzOwotICAgICAgICAgICAgICAgIGZpcnN0VGltZVVzID0gbURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMudmFsdWVGb3Ioc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSk7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzICs9IHN0cm0ubUxhc3REZXF1ZXVlZFRpbWVVcyAtIGZpcnN0VGltZVVzOwotICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyArPSBzdHJtLm1MYXN0U2FtcGxlRHVyYXRpb25VczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzICs9IHN0cm0ubUxhc3RTYW1wbGVEdXJhdGlvblVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMuYWRkKHNlcSwgb2Zmc2V0VGltZVVzKTsKLSAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoZXJyID09IE9LKSB7CiAKICAgICAgICAgaWYgKHN0cmVhbSA9PSBTVFJFQU1UWVBFX0FVRElPIHx8IHN0cmVhbSA9PSBTVFJFQU1UWVBFX1ZJREVPKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBvcmlnaW5hbFRpbWVVczsKICAgICAgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eVNlcSA9IDA7CisgICAgICAgICAgICBTdHJlYW1JdGVtJiBzdHJtID0gbVN0cmVhbXNbc3RyZWFtSWR4XTsKICAgICAgICAgICAgIENIRUNLKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAgJnRpbWVVcykpOworICAgICAgICAgICAgb3JpZ2luYWxUaW1lVXMgPSB0aW1lVXM7CiAgICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZkaXNjb250aW51aXR5U2VxKTsKLSAgICAgICAgICAgIHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEgPSBkaXNjb250aW51aXR5U2VxOworICAgICAgICAgICAgaWYgKGRpc2NvbnRpbnVpdHlTZXEgPiAoaW50MzJfdCkgc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSkgeworICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0VGltZVVzOworICAgICAgICAgICAgICAgIGlmIChtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMuaW5kZXhPZktleShzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyA9IG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy52YWx1ZUZvcihzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvZmZzZXRUaW1lVXMgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVcy5pbmRleE9mS2V5KHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEpID49IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHN0cm0ubUxhc3REZXF1ZXVlZFRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZmlyc3RUaW1lVXM7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0VGltZVVzID0gbURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMudmFsdWVGb3Ioc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyArPSBzdHJtLm1MYXN0RGVxdWV1ZWRUaW1lVXMgLSBmaXJzdFRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzICs9IHN0cm0ubUxhc3RTYW1wbGVEdXJhdGlvblVzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyArPSBzdHJtLm1MYXN0U2FtcGxlRHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMuYWRkKGRpc2NvbnRpbnVpdHlTZXEsIG9mZnNldFRpbWVVcyk7CisgICAgICAgICAgICAgICAgc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSA9IGRpc2NvbnRpbnVpdHlTZXE7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3QgZGlzY2FyZCA9IDA7CiAgICAgICAgICAgICBpbnQ2NF90IGZpcnN0VGltZVVzOwpAQCAtMjk5LDE3ICs0MzIsMTAgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RybS5tTGFzdERlcXVldWVkVGltZVVzID0gdGltZVVzOwotICAgICAgICAgICAgaWYgKHRpbWVVcyA+PSBmaXJzdFRpbWVVcykgewotICAgICAgICAgICAgICAgIHRpbWVVcyAtPSBmaXJzdFRpbWVVczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGltZVVzID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRpbWVVcyArPSBtTGFzdFNlZWtUaW1lVXM7Ci0gICAgICAgICAgICBpZiAobURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLmluZGV4T2ZLZXkoZGlzY29udGludWl0eVNlcSkgPj0gMCkgewotICAgICAgICAgICAgICAgIHRpbWVVcyArPSBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMudmFsdWVGb3IoZGlzY29udGludWl0eVNlcSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB0aW1lVXMgPSBjYWxjdWxhdGVNZWRpYVRpbWVVcyhmaXJzdFRpbWVVcywgdGltZVVzLCBkaXNjb250aW51aXR5U2VxKTsKIAotICAgICAgICAgICAgQUxPR1YoIlslc10gcmVhZCBidWZmZXIgYXQgdGltZSAlIiBQUklkNjQgIiB1cyIsIHN0cmVhbVN0ciwgdGltZVVzKTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGRlcXVldWVBY2Nlc3NVbml0OiB0aW1lICVsbGQgdXMsIG9yaWdpbmFsICVsbGQgdXMiLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1TdHIsIChsb25nIGxvbmcpdGltZVVzLCAobG9uZyBsb25nKW9yaWdpbmFsVGltZVVzKTsKICAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsICB0aW1lVXMpOwogICAgICAgICAgICAgbUxhc3REZXF1ZXVlZFRpbWVVcyA9IHRpbWVVczsKICAgICAgICAgICAgIG1SZWFsVGltZUJhc2VVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSB0aW1lVXM7CkBAIC0zMjIsNiArNDQ4LDE3IEBACiAgICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDMyKAogICAgICAgICAgICAgICAgICAgICAidHJhY2tJbmRleCIsIG1QbGF5bGlzdC0+Z2V0U2VsZWN0ZWRJbmRleCgpKTsKICAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50NjQoImJhc2VVcyIsIG1SZWFsVGltZUJhc2VVcyk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtID09IFNUUkVBTVRZUEVfTUVUQURBVEEpIHsKKyAgICAgICAgICAgIEhMU1RpbWUgbWRUaW1lKCgqYWNjZXNzVW5pdCktPm1ldGEoKSk7CisgICAgICAgICAgICBpZiAobURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMuaW5kZXhPZktleShtZFRpbWUubVNlcSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcGFja2V0U291cmNlLT5yZXF1ZXVlQWNjZXNzVW5pdCgoKmFjY2Vzc1VuaXQpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBmaXJzdFRpbWVVcyA9IG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLnZhbHVlRm9yKG1kVGltZS5tU2VxKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IGNhbGN1bGF0ZU1lZGlhVGltZVVzKGZpcnN0VGltZVVzLCBtZFRpbWUubVRpbWVVcywgbWRUaW1lLm1TZXEpOworICAgICAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsICB0aW1lVXMpOworICAgICAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50NjQoImJhc2VVcyIsIG1SZWFsVGltZUJhc2VVcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBBTE9HSSgiWyVzXSBlbmNvdW50ZXJlZCBlcnJvciAlZCIsIHN0cmVhbVN0ciwgZXJyKTsKQEAgLTMzMSw3ICs0NjgsNiBAQAogfQogCiBzdGF0dXNfdCBMaXZlU2Vzc2lvbjo6Z2V0U3RyZWFtRm9ybWF0KFN0cmVhbVR5cGUgc3RyZWFtLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCkgewotICAgIC8vIE5vIHN3YXBQYWNrZXRTb3VyY2UgcmFjZSBjb25kaXRpb247IGNhbGxlZCBmcm9tIHRoZSBzYW1lIHRocmVhZCBhcyBkZXF1ZXVlQWNjZXNzVW5pdC4KICAgICBpZiAoIShtU3RyZWFtTWFzayAmIHN0cmVhbSkpIHsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQpAQCAtMzQ0LDEyICs0ODAsMjQgQEAKICAgICAgICAgcmV0dXJuIC1FQUdBSU47CiAgICAgfQogCisgICAgaWYgKHN0cmVhbSA9PSBTVFJFQU1UWVBFX0FVRElPKSB7CisgICAgICAgIC8vIHNldCBBQUMgaW5wdXQgYnVmZmVyIHNpemUgdG8gMzJLIGJ5dGVzICgyNTZrYnBzIHggMXNlYykKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgMzIgKiAxMDI0KTsKKyAgICB9IGVsc2UgaWYgKHN0cmVhbSA9PSBTVFJFQU1UWVBFX1ZJREVPKSB7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlNYXhXaWR0aCwgbU1heFdpZHRoKTsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heEhlaWdodCwgbU1heEhlaWdodCk7CisgICAgfQorCiAgICAgcmV0dXJuIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLCBmb3JtYXQpOwogfQogCitzcDxIVFRQRG93bmxvYWRlcj4gTGl2ZVNlc3Npb246OmdldEhUVFBEb3dubG9hZGVyKCkgeworICAgIHJldHVybiBuZXcgSFRUUERvd25sb2FkZXIobUhUVFBTZXJ2aWNlLCBtRXh0cmFIZWFkZXJzKTsKK30KKwogdm9pZCBMaXZlU2Vzc2lvbjo6Y29ubmVjdEFzeW5jKAogICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbm5lY3QsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25uZWN0LCB0aGlzKTsKICAgICBtc2ctPnNldFN0cmluZygidXJsIiwgdXJsKTsKIAogICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKQEAgLTM2Miw3ICs1MTAsNyBAQAogfQogCiBzdGF0dXNfdCBMaXZlU2Vzc2lvbjo6ZGlzY29ubmVjdCgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGlzY29ubmVjdCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERpc2Nvbm5lY3QsIHRoaXMpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKQEAgLTM3MSw3ICs1MTksNyBAQAogfQogCiBzdGF0dXNfdCBMaXZlU2Vzc2lvbjo6c2Vla1RvKGludDY0X3QgdGltZVVzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCB0aGlzKTsKICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwpAQCAtMzgwLDYgKzUyOCw5NSBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK2Jvb2wgTGl2ZVNlc3Npb246OmNoZWNrU3dpdGNoUHJvZ3Jlc3MoCisgICAgICAgIHNwPEFNZXNzYWdlPiAmc3RvcFBhcmFtcywgaW50NjRfdCBkZWxheVVzLCBib29sICpuZWVkUmVzdW1lVW50aWwpIHsKKyAgICBBU3RyaW5nIG5ld1VyaTsKKyAgICBDSEVDSyhzdG9wUGFyYW1zLT5maW5kU3RyaW5nKCJ1cmkiLCAmbmV3VXJpKSk7CisKKyAgICAqbmVlZFJlc3VtZVVudGlsID0gZmFsc2U7CisgICAgc3A8QU1lc3NhZ2U+IGZpcnN0TmV3TWV0YVtrTWF4U3RyZWFtc107CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgIFN0cmVhbVR5cGUgc3RyZWFtID0gaW5kZXhUb1R5cGUoaSk7CisgICAgICAgIGlmICghKG1Td2FwTWFzayAmIG1OZXdTdHJlYW1NYXNrICYgc3RyZWFtKQorICAgICAgICAgICAgfHwgKG1TdHJlYW1zW2ldLm1OZXdVcmkgIT0gbmV3VXJpKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmVhbSA9PSBTVFJFQU1UWVBFX1NVQlRJVExFUykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLmVkaXRWYWx1ZUF0KGkpOworCisgICAgICAgIC8vIEZpcnN0LCBnZXQgbGF0ZXN0IGRlcXVldWVkIG1ldGEsIHdoaWNoIGlzIHdoZXJlIHRoZSBkZWNvZGVyIGlzIGF0LgorICAgICAgICAvLyAod2hlbiB1cHN3aXRjaGluZywgd2UgdGFrZSB0aGUgbWV0YSBhZnRlciBhIGNlcnRhaW4gZGVsYXksIHNvIHRoYXQKKyAgICAgICAgLy8gdGhlIGRlY29kZXIgaXMgbGVmdCB3aXRoIHNvbWUgY3VzaGlvbikKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGxhc3REZXF1ZXVlTWV0YSwgbGFzdEVucXVldWVNZXRhOworICAgICAgICBpZiAoZGVsYXlVcyA+IDApIHsKKyAgICAgICAgICAgIGxhc3REZXF1ZXVlTWV0YSA9IHNvdXJjZS0+Z2V0TWV0YUFmdGVyTGFzdERlcXVldWVkKGRlbGF5VXMpOworICAgICAgICAgICAgaWYgKGxhc3REZXF1ZXVlTWV0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBtZWFucyB3ZSBkb24ndCBoYXZlIGVub3VnaCBjdXNoaW9uLCB0cnkgYWdhaW4gbGF0ZXIKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSB1cCBzd2l0Y2hpbmcgZmFpbGVkIGR1ZSB0byBpbnN1ZmZpY2llbnQgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE5hbWVGb3JTdHJlYW0oc3RyZWFtKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSXQncyBva2F5IGZvciBsYXN0RGVxdWV1ZU1ldGEgdG8gYmUgTlVMTCBoZXJlLCBpdCBtZWFucyB0aGUKKyAgICAgICAgICAgIC8vIGRlY29kZXIgaGFzbid0IGV2ZW4gc3RhcnRlZCBkZXF1ZXVlaW5nCisgICAgICAgICAgICBsYXN0RGVxdWV1ZU1ldGEgPSBzb3VyY2UtPmdldExhdGVzdERlcXVldWVkTWV0YSgpOworICAgICAgICB9CisgICAgICAgIC8vIFRoZW4sIHRyaW0gb2ZmIHBhY2tldHMgYXQgYmVnaW5uaW5nIG9mIG1QYWNrZXRTb3VyY2VzMiB0aGF0J3MgYmVmb3JlCisgICAgICAgIC8vIHRoZSBsYXRlc3QgZGVxdWV1ZWQgdGltZS4gVGhlc2Ugc2FtcGxlcyBhcmUgZGVmaW5pdGVseSB0b28gbGF0ZS4KKyAgICAgICAgZmlyc3ROZXdNZXRhW2ldID0gbVBhY2tldFNvdXJjZXMyLmVkaXRWYWx1ZUF0KGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT50cmltQnVmZmVyc0JlZm9yZU1ldGEobGFzdERlcXVldWVNZXRhKTsKKworICAgICAgICAvLyBOb3cgZmlyc3ROZXdNZXRhW2ldIGlzIHRoZSBmaXJzdCBzYW1wbGUgYWZ0ZXIgdGhlIHRyaW0uCisgICAgICAgIC8vIElmIGl0J3MgTlVMTCwgd2UgZmFpbGVkIGJlY2F1c2UgZGVxdWV1ZSBhbHJlYWR5IHBhc3QgYWxsIHNhbXBsZXMKKyAgICAgICAgLy8gaW4gbVBhY2tldFNvdXJjZTIsIHdlIGhhdmUgdG8gdHJ5IGFnYWluLgorICAgICAgICBpZiAoZmlyc3ROZXdNZXRhW2ldID09IE5VTEwpIHsKKyAgICAgICAgICAgIEhMU1RpbWUgZGVxdWV1ZVRpbWUobGFzdERlcXVldWVNZXRhKTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGRlcXVldWUgdGltZSAoJWQsICVsbGQpIHBhc3Qgc3RhcnQgdGltZSIsCisgICAgICAgICAgICAgICAgICAgIGdldE5hbWVGb3JTdHJlYW0oc3RyZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgZGVxdWV1ZVRpbWUubVNlcSwgKGxvbmcgbG9uZykgZGVxdWV1ZVRpbWUubVRpbWVVcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGNoZWNrIGlmIG1QYWNrZXRTb3VyY2VzMiBvdmVybGFwcyB3aXRoIHdoYXQgb2xkIGZldGNoZXIKKyAgICAgICAgLy8gYWxyZWFkeSBmZXRjaGVkLCBhbmQgc2VlIGlmIHdlIG5lZWQgdG8gcmVzdW1lVW50aWwKKyAgICAgICAgbGFzdEVucXVldWVNZXRhID0gc291cmNlLT5nZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKTsKKyAgICAgICAgLy8gbGFzdEVucXVldWVNZXRhID09IE5VTEwgbWVhbnMgb2xkIGZldGNoZXIgc3RvcHBlZCBhdCBhIGRpc2NvbnRpbnVpdHkKKyAgICAgICAgLy8gYm91bmRhcnksIG5vIG5lZWQgdG8gcmVzdW1lIGFzIHRoZSBjb250ZW50IHdpbGwgbG9vayBkaWZmZXJlbnQgYW55d2F5cworICAgICAgICBpZiAobGFzdEVucXVldWVNZXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEhMU1RpbWUgbGFzdFRpbWUobGFzdEVucXVldWVNZXRhKSwgc3RhcnRUaW1lKGZpcnN0TmV3TWV0YVtpXSk7CisKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gcmVzdW1lIG9sZCBmZXRjaGVyIGlmIG5ldyBmZXRjaGVyIHN0YXJ0ZWQgaW4gZGlmZmVyZW50CisgICAgICAgICAgICAvLyBkaXNjb250aW51aXR5IHNlcXVlbmNlLCBhcyB0aGUgY29udGVudCB3aWxsIGxvb2sgZGlmZmVyZW50LgorICAgICAgICAgICAgKm5lZWRSZXN1bWVVbnRpbCB8PSAoc3RhcnRUaW1lLm1TZXEgPT0gbGFzdFRpbWUubVNlcQorICAgICAgICAgICAgICAgICAgICAmJiBzdGFydFRpbWUubVRpbWVVcyAtIGxhc3RUaW1lLm1UaW1lVXMgPiBrUmVzdW1lVGhyZXNob2xkVXMpOworCisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHN0b3BUaW1lIGZvciByZXN1bWVVbnRpbAorICAgICAgICAgICAgc3RvcFBhcmFtcy0+c2V0SW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCBzdGFydFRpbWUubVNlcSk7CisgICAgICAgICAgICBzdG9wUGFyYW1zLT5zZXRJbnQ2NChnZXRLZXlGb3JTdHJlYW0oc3RyZWFtKSwgc3RhcnRUaW1lLm1UaW1lVXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaWYgd2UncmUgaGVyZSwgaXQgbWVhbnMgZGVxdWV1ZSBwcm9ncmVzcyBoYXNuJ3QgcGFzc2VkIHNvbWUgc2FtcGxlcyBpbgorICAgIC8vIG1QYWNrZXRTb3VyY2UyLCB3ZSBjYW4gdHJpbSBvZmYgdGhlIGV4Y2VzcyBpbiBtUGFja2V0U291cmNlLgorICAgIC8vIChvbGQgZmV0Y2hlciBtaWdodCBzdGlsbCBuZWVkIHRvIHJlc3VtZVVudGlsIHRoZSBzdGFydCB0aW1lIG9mIG5ldyBmZXRjaGVyKQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgeworICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbSA9IGluZGV4VG9UeXBlKGkpOworICAgICAgICBpZiAoIShtU3dhcE1hc2sgJiBtTmV3U3RyZWFtTWFzayAmIHN0cmVhbSkKKyAgICAgICAgICAgIHx8IChuZXdVcmkgIT0gbVN0cmVhbXNbaV0ubU5ld1VyaSkKKyAgICAgICAgICAgIHx8IHN0cmVhbSA9PSBTVFJFQU1UWVBFX1NVQlRJVExFUykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbVBhY2tldFNvdXJjZXMudmFsdWVGb3Ioc3RyZWFtKS0+dHJpbUJ1ZmZlcnNBZnRlck1ldGEoZmlyc3ROZXdNZXRhW2ldKTsKKyAgICB9CisKKyAgICAvLyBubyByZXN1bWVVbnRpbCBpZiBhbHJlYWR5IHVuZGVyZmxvdworICAgICpuZWVkUmVzdW1lVW50aWwgJj0gIW1CdWZmZXJpbmc7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogdm9pZCBMaXZlU2Vzc2lvbjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgIGNhc2Uga1doYXRDb25uZWN0OgpAQCAtNDAyLDE2ICs2MzksMTUgQEAKIAogICAgICAgICBjYXNlIGtXaGF0U2VlazoKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3Qgc2Vla1JlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZzZWVrUmVwbHlJRCkpOwotICAgICAgICAgICAgbVNlZWtSZXBseUlEID0gc2Vla1JlcGx5SUQ7CisgICAgICAgICAgICBpZiAobVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgICAgICBtc2ctPnBvc3QoNTAwMDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZtU2Vla1JlcGx5SUQpKTsKICAgICAgICAgICAgIG1TZWVrUmVwbHkgPSBuZXcgQU1lc3NhZ2U7CiAKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uU2Vlayhtc2cpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgbXNnLT5wb3N0KDUwMDAwKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9uU2Vlayhtc2cpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNDI2LDE2ICs2NjIsMzAgQEAKICAgICAgICAgICAgICAgICBjYXNlIFBsYXlsaXN0RmV0Y2hlcjo6a1doYXRQYXVzZWQ6CiAgICAgICAgICAgICAgICAgY2FzZSBQbGF5bGlzdEZldGNoZXI6OmtXaGF0U3RvcHBlZDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IFBsYXlsaXN0RmV0Y2hlcjo6a1doYXRTdG9wcGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHVyaTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygidXJpIiwgJnVyaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GZXRjaGVySW5mb3MucmVtb3ZlSXRlbSh1cmkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBkdXBsaWNhdGVkIGtXaGF0U3RvcHBlZCBtZXNzYWdlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyB1cmk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygidXJpIiwgJnVyaSkpOworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KHVyaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBtc2dzIGZyb20gZmV0Y2hlcnMgdGhhdCdzIGFscmVhZHkgZ29uZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Td2l0Y2hJblByb2dyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2goKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZldGNoZXItJWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZXRjaGVySW5mb3NbaW5kZXhdLm1GZXRjaGVyLT5nZXRGZXRjaGVySUQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0ID09IFBsYXlsaXN0RmV0Y2hlcjo6a1doYXRQYXVzZWQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdXNlZCIgOiAic3RvcHBlZCIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IFBsYXlsaXN0RmV0Y2hlcjo6a1doYXRTdG9wcGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRmV0Y2hlckxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZXRjaGVySW5mb3NbaW5kZXhdLm1GZXRjaGVyLT5pZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GZXRjaGVySW5mb3MucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBQbGF5bGlzdEZldGNoZXI6OmtXaGF0UGF1c2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlZWtNb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlZWtNb2RlIiwgJnNlZWtNb2RlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0cmVhbXNbaV0ubVVyaSA9PSB1cmkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXNbaV0ubVNlZWtNb2RlID0gKFNlZWtNb2RlKSBzZWVrTW9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtNDQzLDE1ICs2OTMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR1QobUNvbnRpbnVhdGlvbkNvdW50ZXIsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tbUNvbnRpbnVhdGlvbkNvdW50ZXIgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250aW51YXRpb24tPnBvc3QoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2Vla1JlcGx5SUQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtU2Vla1JlcGx5ICE9IE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1JlcGx5LT5zZXRJbnQzMigiZXJyIiwgT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1JlcGx5LT5wb3N0UmVwbHkobVNlZWtSZXBseUlEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtSZXBseUlEID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtSZXBseS5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlenUgZmV0Y2hlcihzKSBsZWZ0IiwgbUNvbnRpbnVhdGlvbkNvdW50ZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTQ2NCw4ICs3MDcsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgRmV0Y2hlckluZm8gKmluZm8gPSAmbUZldGNoZXJJbmZvcy5lZGl0VmFsdWVGb3IodXJpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+bUR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KHVyaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGZXRjaGVySW5mbyAqaW5mbyA9ICZtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUZvcih1cmkpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bUR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgUGxheWxpc3RGZXRjaGVyOjprV2hhdFRhcmdldER1cmF0aW9uVXBkYXRlOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0YXJnZXREdXJhdGlvblVzOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGFyZ2V0RHVyYXRpb25VcyIsICZ0YXJnZXREdXJhdGlvblVzKSk7CisgICAgICAgICAgICAgICAgICAgIG1VcFN3aXRjaE1hcmsgPSBtaW4oa1VwU3dpdGNoTWFya1VzLCB0YXJnZXREdXJhdGlvblVzICogNyAvIDQpOworICAgICAgICAgICAgICAgICAgICBtRG93blN3aXRjaE1hcmsgPSBtaW4oa0Rvd25Td2l0Y2hNYXJrVXMsIHRhcmdldER1cmF0aW9uVXMgKiA5IC8gNCk7CisgICAgICAgICAgICAgICAgICAgIG1VcFN3aXRjaE1hcmdpbiA9IG1pbihrVXBTd2l0Y2hNYXJnaW5VcywgdGFyZ2V0RHVyYXRpb25Vcyk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNDkzLDYgKzc0OSwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhlIGZhaWx1cmUgaW5kZXggKGFzIG1DdXJCYW5kd2lkdGhJbmRleCB3aWxsIGJlIHJlc3RvcmVkCisgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCgpKSwgYW5kIHJlY29yZCBsYXN0IGZhaWwgdGltZQorICAgICAgICAgICAgICAgICAgICBzaXplX3QgZmFpbHVyZUluZGV4ID0gbUN1ckJhbmR3aWR0aEluZGV4OworICAgICAgICAgICAgICAgICAgICBtQmFuZHdpZHRoSXRlbXMuZWRpdEl0ZW1BdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlSW5kZXgpLm1MYXN0RmFpbHVyZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobVN3aXRjaEluUHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGVycm9yIGhhcHBlbmVkIHdoZW4gd2Ugc3dpdGNoIHRvIGEgdmFyaWFudCwgdHJ5IGZhbGxiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBvdGhlciB2YXJpYW50IHRvIHNhdmUgdGhlIHNlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cnlCYW5kd2lkdGhGYWxsYmFjaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBpZiAobUluUHJlcGFyYXRpb25QaGFzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFByZXBhcmVkKGVycik7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTUwNiwzOCArNzc2LDIzIEBACiAgICAgICAgICAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUUkVBTVRZUEVfU1VCVElUTEVTKS0+c2lnbmFsRU9TKGVycik7CiAKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRFcnJvcik7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICBwb3N0RXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBQbGF5bGlzdEZldGNoZXI6OmtXaGF0VGVtcG9yYXJpbHlEb25lRmV0Y2hpbmc6CisgICAgICAgICAgICAgICAgY2FzZSBQbGF5bGlzdEZldGNoZXI6OmtXaGF0U3RvcFJlYWNoZWQ6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHVyaTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJ1cmkiLCAmdXJpKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJrV2hhdFN0b3BSZWFjaGVkIik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GZXRjaGVySW5mb3MuaW5kZXhPZktleSh1cmkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNvdWxkbid0IGZpbmQgdXJpIik7CisgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgb2xkVXJpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoInVyaSIsICZvbGRVcmkpKTsKKworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KG9sZFVyaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZldGNoZXJJbmZvICppbmZvID0gJm1GZXRjaGVySW5mb3MuZWRpdFZhbHVlRm9yKHVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPm1Jc1ByZXBhcmVkID0gdHJ1ZTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAobUluUHJlcGFyYXRpb25QaGFzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxGZXRjaGVyc1ByZXBhcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUZldGNoZXJJbmZvcy52YWx1ZUF0KGkpLm1Jc1ByZXBhcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbEZldGNoZXJzUHJlcGFyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsRmV0Y2hlcnNQcmVwYXJlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RQcmVwYXJlZChPSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2gob2xkVXJpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCkBAIC01NDYsMTkgKzgwMSw5NyBAQAogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN3aXRjaEdlbmVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzd2l0Y2hHZW5lcmF0aW9uIiwgJnN3aXRjaEdlbmVyYXRpb24pKTsKIAorICAgICAgICAgICAgICAgICAgICBBTE9HVigia1doYXRTdGFydGVkQXQ6IHN3aXRjaEdlbj0lZCwgbVN3aXRjaEdlbj0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoR2VuZXJhdGlvbiwgbVN3aXRjaEdlbmVyYXRpb24pOworCiAgICAgICAgICAgICAgICAgICAgIGlmIChzd2l0Y2hHZW5lcmF0aW9uICE9IG1Td2l0Y2hHZW5lcmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIC8vIFJlc3VtZSBmZXRjaGVyIGZvciB0aGUgb3JpZ2luYWwgdmFyaWFudDsgdGhlIHJlc3VtZWQgZmV0Y2hlciBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgdW50aWwgdGhlIHRpbWVzdGFtcHMgZm91bmQgaW4gbXNnLCB3aGljaCBpcyBzdG9yZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIG5ldyBmZXRjaGVyIHRvIGluZGljYXRlIHdoZXJlIHRoZSBuZXcgdmFyaWFudCBoYXMgc3RhcnRlZCBidWZmZXJpbmcuCi0gICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmV0Y2hlckluZm8gaW5mbyA9IG1GZXRjaGVySW5mb3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLm1Ub0JlUmVtb3ZlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubUZldGNoZXItPnJlc3VtZVVudGlsQXN5bmMobXNnKTsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyB1cmk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygidXJpIiwgJnVyaSkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgbmV3IGZldGNoZXIgbVRvQmVSZXN1bWVkCisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtRmV0Y2hlckluZm9zLmluZGV4T2ZLZXkodXJpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GZXRjaGVySW5mb3MuZWRpdFZhbHVlQXQoaW5kZXgpLm1Ub0JlUmVzdW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wb3JhcmlseSBkaXNhYmxlIHBhY2tldCBzb3VyY2VzIHRvIGJlIHN3YXBwZWQgdG8gcHJldmVudAorICAgICAgICAgICAgICAgICAgICAvLyBOdVBsYXllckRlY29kZXIgZnJvbSBkZXF1ZXVpbmcgd2hpbGUgd2UgY2hlY2sgcHJvZ3Jlc3MKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGFja2V0U291cmNlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtU3dhcE1hc2sgJiBtUGFja2V0U291cmNlcy5rZXlBdChpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdXJpID09IG1TdHJlYW1zW2ldLm1OZXdVcmkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlcy5lZGl0VmFsdWVBdChpKS0+ZW5hYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBib29sIHN3aXRjaFVwID0gKG1DdXJCYW5kd2lkdGhJbmRleCA+IG1PcmlnQmFuZHdpZHRoSW5kZXgpOworICAgICAgICAgICAgICAgICAgICAvLyBJZiBzd2l0Y2hpbmcgdXAsIHJlcXVpcmUgYSBjdXNoaW9uIGJpZ2dlciB0aGFuIGtVbmRlcmZsb3dNYXJrCisgICAgICAgICAgICAgICAgICAgIC8vIHRvIGF2b2lkIGJ1ZmZlcmluZyBpbW1lZGlhdGVseSBhZnRlciB0aGUgc3dpdGNoLgorICAgICAgICAgICAgICAgICAgICAvLyAoSWYgd2UgZG9uJ3QgaGF2ZSB0aGF0IGN1c2hpb24gd2UnZCByYXRoZXIgY2FuY2VsIGFuZCB0cnkgYWdhaW4uKQorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBzd2l0Y2hVcCA/IChrVW5kZXJmbG93TWFya1VzICsgMTAwMDAwMGxsKSA6IDA7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZFJlc3VtZVVudGlsID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBzdG9wUGFyYW1zID0gbXNnOworICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tTd2l0Y2hQcm9ncmVzcyhzdG9wUGFyYW1zLCBkZWxheVVzLCAmbmVlZFJlc3VtZVVudGlsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgdGltZSBoYXNuJ3QgcGFzc2VkIHN0YXJ0QXQgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZWVkUmVzdW1lVW50aWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmluaXNoIHN3aXRjaCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1Td2FwTWFzayAmIGluZGV4VG9UeXBlKGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHVyaSA9PSBtU3RyZWFtc1tpXS5tTmV3VXJpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXZlIHRvIG1ha2UgYSBjb3B5IG9mIG1TdHJlYW1zW2ldLm1VcmkgYmVjYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2ggaXMgbW9kaWZ5aW5nIG1TdHJlYW1zW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgb2xkVVJJID0gbVN0cmVhbXNbaV0ubVVyaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeVRvRmluaXNoQmFuZHdpZHRoU3dpdGNoKG9sZFVSSSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRBdCB0aW1lIGlzIGFmdGVyIGxhc3QgZW5xdWV1ZSB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdW1lIGZldGNoZXIgZm9yIHRoZSBvcmlnaW5hbCB2YXJpYW50OyB0aGUgcmVzdW1lZCBmZXRjaGVyIHNob3VsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHVudGlsIHRoZSB0aW1lc3RhbXBzIGZvdW5kIGluIG1zZywgd2hpY2ggaXMgc3RvcmVkIGJ5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBmZXRjaGVyIHRvIGluZGljYXRlIHdoZXJlIHRoZSBuZXcgdmFyaWFudCBoYXMgc3RhcnRlZCBidWZmZXJpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZpbmlzaCBzd2l0Y2ggd2l0aCByZXN1bWVVbnRpbEFzeW5jIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmV0Y2hlckluZm9zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZldGNoZXJJbmZvICZpbmZvID0gbUZldGNoZXJJbmZvcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5tVG9CZVJlbW92ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubUZldGNoZXItPnJlc3VtZVVudGlsQXN5bmMoc3RvcFBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayB0aW1lIHBhc3NlZCBzdGFydEF0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzd2l0Y2hVcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHN3aXRjaGluZyB1cCwgY2FuY2VsIGFuZCByZXRyeSBpZiBjb25kaXRpb24gc2F0aXNmaWVzIGFnYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNhbmNlbCB1cCBzd2l0Y2ggYmVjYXVzZSB3ZSdyZSB0b28gbGF0ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCh0cnVlIC8qIHJlc3VtZSAqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZXRyeSBkb3duIHN3aXRjaCBhdCBuZXh0IHNhbXBsZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZUZldGNoZXIodXJpLCBtU3dhcE1hc2ssIC0xLCB0cnVlIC8qIG5ld1VyaSAqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gcmUtZW5hYmxlIGFsbCBwYWNrZXQgc291cmNlcworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlcy5lZGl0VmFsdWVBdChpKS0+ZW5hYmxlKHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBQbGF5bGlzdEZldGNoZXI6OmtXaGF0UGxheWxpc3RGZXRjaGVkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb25NYXN0ZXJQbGF5bGlzdEZldGNoZWQobXNnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBQbGF5bGlzdEZldGNoZXI6OmtXaGF0TWV0YWRhdGFEZXRlY3RlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbUhhc01ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtSGFzTWV0YWRhdGEgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0TWV0YWRhdGFEZXRlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTU2OSwxOSArOTAyLDYgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBrV2hhdENoZWNrQmFuZHdpZHRoOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1DaGVja0JhbmR3aWR0aEdlbmVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb25DaGVja0JhbmR3aWR0aChtc2cpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQogICAgICAgICBjYXNlIGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjoKICAgICAgICAgewogICAgICAgICAgICAgb25DaGFuZ2VDb25maWd1cmF0aW9uKG1zZyk7CkBAIC02MDAsMjcgKzkyMCwxMyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIGtXaGF0RmluaXNoRGlzY29ubmVjdDI6CisgICAgICAgIGNhc2Uga1doYXRQb2xsQnVmZmVyaW5nOgogICAgICAgICB7Ci0gICAgICAgICAgICBvbkZpbmlzaERpc2Nvbm5lY3QyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRTd2FwcGVkOgotICAgICAgICB7Ci0gICAgICAgICAgICBvblN3YXBwZWQobXNnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdENoZWNrU3dpdGNoRG93bjoKLSAgICAgICAgewotICAgICAgICAgICAgb25DaGVja1N3aXRjaERvd24oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFN3aXRjaERvd246Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG9uU3dpdGNoRG93bigpOworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgb25Qb2xsQnVmZmVyaW5nKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC02MzEsNiArOTM3LDEzIEBACiB9CiAKIC8vIHN0YXRpYworYm9vbCBMaXZlU2Vzc2lvbjo6aXNCYW5kd2lkdGhWYWxpZChjb25zdCBCYW5kd2lkdGhJdGVtICZpdGVtKSB7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga0JsYWNrbGlzdFdpbmRvd1VzID0gMzAwICogMTAwMDAwMGxsOworICAgIHJldHVybiBpdGVtLm1MYXN0RmFpbHVyZVVzIDwgMAorICAgICAgICAgICAgfHwgQUxvb3Blcjo6R2V0Tm93VXMoKSAtIGl0ZW0ubUxhc3RGYWlsdXJlVXMgPiBrQmxhY2tsaXN0V2luZG93VXM7Cit9CisKKy8vIHN0YXRpYwogaW50IExpdmVTZXNzaW9uOjpTb3J0QnlCYW5kd2lkdGgoY29uc3QgQmFuZHdpZHRoSXRlbSAqYSwgY29uc3QgQmFuZHdpZHRoSXRlbSAqYikgewogICAgIGlmIChhLT5tQmFuZHdpZHRoIDwgYi0+bUJhbmR3aWR0aCkgewogICAgICAgICByZXR1cm4gLTE7CkBAIC02NDMsNyArOTU2LDcgQEAKIAogLy8gc3RhdGljCiBMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSBMaXZlU2Vzc2lvbjo6aW5kZXhUb1R5cGUoaW50IGlkeCkgewotICAgIENIRUNLKGlkeCA+PSAwICYmIGlkeCA8IGtNYXhTdHJlYW1zKTsKKyAgICBDSEVDSyhpZHggPj0gMCAmJiBpZHggPCBrTnVtU291cmNlcyk7CiAgICAgcmV0dXJuIChTdHJlYW1UeXBlKSgxIDw8IGlkeCk7CiB9CiAKQEAgLTY1Niw2ICs5NjksOCBAQAogICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9TVUJUSVRMRVM6CiAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01FVEFEQVRBOgorICAgICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfTsKQEAgLTY2Myw4ICs5NzgsMTAgQEAKIH0KIAogdm9pZCBMaXZlU2Vzc2lvbjo6b25Db25uZWN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgQVN0cmluZyB1cmw7Ci0gICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJ1cmwiLCAmdXJsKSk7CisgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJ1cmwiLCAmbU1hc3RlclVSTCkpOworCisgICAgLy8gVE9ETyBjdXJyZW50bHkgd2UgZG9uJ3Qga25vdyBpZiB3ZSBhcmUgY29taW5nIGhlcmUgZnJvbSBpbmNvZ25pdG8gbW9kZQorICAgIEFMT0dJKCJvbkNvbm5lY3QgJXMiLCB1cmlEZWJ1Z1N0cmluZyhtTWFzdGVyVVJMKS5jX3N0cigpKTsKIAogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTDsKICAgICBpZiAoIW1zZy0+ZmluZFBvaW50ZXIoImhlYWRlcnMiLCAodm9pZCAqKikmaGVhZGVycykpIHsKQEAgLTY3NiwyMSArOTkzLDM5IEBACiAgICAgICAgIGhlYWRlcnMgPSBOVUxMOwogICAgIH0KIAotICAgIC8vIFRPRE8gY3VycmVudGx5IHdlIGRvbid0IGtub3cgaWYgd2UgYXJlIGNvbWluZyBoZXJlIGZyb20gaW5jb2duaXRvIG1vZGUKLSAgICBBTE9HSSgib25Db25uZWN0ICVzIiwgdXJpRGVidWdTdHJpbmcodXJsKS5jX3N0cigpKTsKKyAgICAvLyBjcmVhdGUgbG9vcGVyIGZvciBmZXRjaGVycworICAgIGlmIChtRmV0Y2hlckxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIG1GZXRjaGVyTG9vcGVyID0gbmV3IEFMb29wZXIoKTsKIAotICAgIG1NYXN0ZXJVUkwgPSB1cmw7CisgICAgICAgIG1GZXRjaGVyTG9vcGVyLT5zZXROYW1lKCJGZXRjaGVyIik7CisgICAgICAgIG1GZXRjaGVyTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UpOworICAgIH0KIAotICAgIGJvb2wgZHVtbXk7Ci0gICAgbVBsYXlsaXN0ID0gZmV0Y2hQbGF5bGlzdCh1cmwuY19zdHIoKSwgTlVMTCAvKiBjdXJQbGF5bGlzdEhhc2ggKi8sICZkdW1teSk7CisgICAgLy8gY3JlYXRlIGZldGNoZXIgdG8gZmV0Y2ggdGhlIG1hc3RlciBwbGF5bGlzdAorICAgIGFkZEZldGNoZXIobU1hc3RlclVSTC5jX3N0cigpKS0+ZmV0Y2hQbGF5bGlzdEFzeW5jKCk7Cit9CiAKK3ZvaWQgTGl2ZVNlc3Npb246Om9uTWFzdGVyUGxheWxpc3RGZXRjaGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgQVN0cmluZyB1cmk7CisgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJ1cmkiLCAmdXJpKSk7CisgICAgc3NpemVfdCBpbmRleCA9IG1GZXRjaGVySW5mb3MuaW5kZXhPZktleSh1cmkpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coImZldGNoZXIgZm9yIG1hc3RlciBwbGF5bGlzdCBpcyBnb25lLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gbm8gbG9uZ2VyIHVzZWZ1bCwgcmVtb3ZlCisgICAgbUZldGNoZXJMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1GZXRjaGVySW5mb3NbaW5kZXhdLm1GZXRjaGVyLT5pZCgpKTsKKyAgICBtRmV0Y2hlckluZm9zLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworCisgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJwbGF5bGlzdCIsIChzcDxSZWZCYXNlPiAqKSZtUGxheWxpc3QpKTsKICAgICBpZiAobVBsYXlsaXN0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoInVuYWJsZSB0byBmZXRjaCBtYXN0ZXIgcGxheWxpc3QgJXMuIiwgdXJpRGVidWdTdHJpbmcodXJsKS5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoInVuYWJsZSB0byBmZXRjaCBtYXN0ZXIgcGxheWxpc3QgJXMuIiwKKyAgICAgICAgICAgICAgICB1cmlEZWJ1Z1N0cmluZyhtTWFzdGVyVVJMKS5jX3N0cigpKTsKIAogICAgICAgICBwb3N0UHJlcGFyZWQoRVJST1JfSU8pOwogICAgICAgICByZXR1cm47CiAgICAgfQotCiAgICAgLy8gV2UgdHJ1c3QgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gbWFrZSBhIHJlYXNvbmFibGUgY2hvaWNlIG9mIHByZWZlcnJlZAogICAgIC8vIGluaXRpYWwgYmFuZHdpZHRoIGJ5IGxpc3RpbmcgaXQgZmlyc3QgaW4gdGhlIHZhcmlhbnQgcGxheWxpc3QuCiAgICAgLy8gQXQgc3RhcnR1cCB3ZSByZWFsbHkgZG9uJ3QgaGF2ZSBhIGdvb2QgZXN0aW1hdGUgb24gdGhlIGF2YWlsYWJsZQpAQCAtNjk5LDExICsxMDM0LDE2IEBACiAgICAgc2l6ZV90IGluaXRpYWxCYW5kd2lkdGggPSAwOwogICAgIHNpemVfdCBpbml0aWFsQmFuZHdpZHRoSW5kZXggPSAwOwogCisgICAgaW50MzJfdCBtYXhXaWR0aCA9IDA7CisgICAgaW50MzJfdCBtYXhIZWlnaHQgPSAwOworCiAgICAgaWYgKG1QbGF5bGlzdC0+aXNWYXJpYW50UGxheWxpc3QoKSkgeworICAgICAgICBWZWN0b3I8QmFuZHdpZHRoSXRlbT4gaXRlbXNXaXRoVmlkZW87CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXlsaXN0LT5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgQmFuZHdpZHRoSXRlbSBpdGVtOwogCiAgICAgICAgICAgICBpdGVtLm1QbGF5bGlzdEluZGV4ID0gaTsKKyAgICAgICAgICAgIGl0ZW0ubUxhc3RGYWlsdXJlVXMgPSAtMWxsOwogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YTsKICAgICAgICAgICAgIEFTdHJpbmcgdXJpOwpAQCAtNzExLDE0ICsxMDUxLDMwIEBACiAKICAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMigiYmFuZHdpZHRoIiwgKGludDMyX3QgKikmaXRlbS5tQmFuZHdpZHRoKSk7CiAKLSAgICAgICAgICAgIGlmIChpbml0aWFsQmFuZHdpZHRoID09IDApIHsKLSAgICAgICAgICAgICAgICBpbml0aWFsQmFuZHdpZHRoID0gaXRlbS5tQmFuZHdpZHRoOworICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKSB7CisgICAgICAgICAgICAgICAgbWF4V2lkdGggPSBtYXgobWF4V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgbWF4SGVpZ2h0ID0gbWF4KG1heEhlaWdodCwgaGVpZ2h0KTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUJhbmR3aWR0aEl0ZW1zLnB1c2goaXRlbSk7CisgICAgICAgICAgICBpZiAobVBsYXlsaXN0LT5oYXNUeXBlKGksICJ2aWRlbyIpKSB7CisgICAgICAgICAgICAgICAgaXRlbXNXaXRoVmlkZW8ucHVzaChpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyByZW1vdmUgdGhlIGF1ZGlvLW9ubHkgdmFyaWFudHMgaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgd2l0aCB2aWRlbworICAgICAgICBpZiAoIWl0ZW1zV2l0aFZpZGVvLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAmJiBpdGVtc1dpdGhWaWRlby5zaXplKCkgPCBtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpKSB7CisgICAgICAgICAgICBtQmFuZHdpZHRoSXRlbXMuY2xlYXIoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaXRlbXNXaXRoVmlkZW8uc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBtQmFuZHdpZHRoSXRlbXMucHVzaChpdGVtc1dpdGhWaWRlb1tpXSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBDSEVDS19HVChtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpLCAwdSk7CisgICAgICAgIGluaXRpYWxCYW5kd2lkdGggPSBtQmFuZHdpZHRoSXRlbXNbMF0ubUJhbmR3aWR0aDsKIAogICAgICAgICBtQmFuZHdpZHRoSXRlbXMuc29ydChTb3J0QnlCYW5kd2lkdGgpOwogCkBAIC03MzYsMzkgKzEwOTIsNDQgQEAKICAgICAgICAgbUJhbmR3aWR0aEl0ZW1zLnB1c2goaXRlbSk7CiAgICAgfQogCisgICAgbU1heFdpZHRoID0gbWF4V2lkdGggPiAwID8gbWF4V2lkdGggOiBtTWF4V2lkdGg7CisgICAgbU1heEhlaWdodCA9IG1heEhlaWdodCA+IDAgPyBtYXhIZWlnaHQgOiBtTWF4SGVpZ2h0OworCiAgICAgbVBsYXlsaXN0LT5waWNrUmFuZG9tTWVkaWFJdGVtcygpOwogICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oCiAgICAgICAgICAgICAwbGwgLyogdGltZVVzICovLCBpbml0aWFsQmFuZHdpZHRoSW5kZXgsIGZhbHNlIC8qIHBpY2tUcmFjayAqLyk7CiB9CiAKIHZvaWQgTGl2ZVNlc3Npb246OmZpbmlzaERpc2Nvbm5lY3QoKSB7CisgICAgQUxPR1YoImZpbmlzaERpc2Nvbm5lY3QiKTsKKwogICAgIC8vIE5vIHJlY29uZmlndXJhdGlvbiBpcyBjdXJyZW50bHkgcGVuZGluZywgbWFrZSBzdXJlIG5vbmUgd2lsbCB0cmlnZ2VyCiAgICAgLy8gZHVyaW5nIGRpc2Nvbm5lY3Rpb24gZWl0aGVyLgotICAgIGNhbmNlbENoZWNrQmFuZHdpZHRoRXZlbnQoKTsKLQotICAgIC8vIFByb3RlY3QgbVBhY2tldFNvdXJjZXMgZnJvbSBhIHN3YXBQYWNrZXRTb3VyY2UgcmFjZSBjb25kaXRpb24gdGhyb3VnaCBkaXNjb25uZWN0LgotICAgIC8vIChmaW5pc2hEaXNjb25uZWN0LCBvbkZpbmlzaERpc2Nvbm5lY3QyKQogICAgIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCgpOwogCi0gICAgLy8gY2FuY2VsIHN3aXRjaCBkb3duIG1vbml0b3IKLSAgICBtU3dpdGNoRG93bk1vbml0b3IuY2xlYXIoKTsKKyAgICAvLyBjYW5jZWwgYnVmZmVyIHBvbGxpbmcKKyAgICBjYW5jZWxQb2xsQnVmZmVyaW5nKCk7CiAKKyAgICAvLyBUUklDS1k6IGRvbid0IHdhaXQgZm9yIGFsbCBmZXRjaGVyIHRvIGJlIHN0b3BwZWQgd2hlbiBkaXNjb25uZWN0aW5nCisgICAgLy8KKyAgICAvLyBTb21lIGZldGNoZXJzIG1pZ2h0IGJlIHN0dWNrIGluIGNvbm5lY3QvZ2V0U2l6ZSBhdCB0aGlzIHBvaW50LiBUaGVzZQorICAgIC8vIG9wZXJhdGlvbnMgd2lsbCBldmVudHVhbGx5IHRpbWVvdXQgKGFzIHdlIGhhdmUgYSB0aW1lb3V0IHNldCBpbgorICAgIC8vIE1lZGlhSFRUUENvbm5lY3Rpb24pLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBibG9jayB0aGUgbWFpbiBVSSB0aHJlYWQKKyAgICAvLyB1bnRpbCB0aGVuLiBIZXJlIHdlIGp1c3QgbmVlZCB0byBtYWtlIHN1cmUgd2UgY2xlYXIgYWxsIHJlZmVyZW5jZXMKKyAgICAvLyB0byB0aGUgZmV0Y2hlcnMsIHNvIHRoYXQgd2hlbiB0aGV5IGZpbmFsbHkgZXhpdCBmcm9tIHRoZSBibG9ja2luZworICAgIC8vIG9wZXJhdGlvbiwgdGhleSBjYW4gYmUgZGVzdHJ1Y3RlZC4KKyAgICAvLworICAgIC8vIFRoZXJlIGlzIG9uZSB2ZXJ5IHRyaWNreSBwb2ludCB0aG91Z2guIEZvciB0aGlzIHNjaGVtZSB0byB3b3JrLCB0aGUKKyAgICAvLyBmZWN0aGVyIG11c3QgaG9sZCBhIHJlZmVyZW5jZSB0byBMaXZlU2Vzc2lvbiwgc28gdGhhdCBMaXZlU2Vzc2lvbiBpcworICAgIC8vIGRlc3Ryb3llZCBhZnRlciBmZXRjaGVyLiBPdGhlcndpc2UgTGl2ZVNlc3Npb24gd291bGQgZ2V0IHN0dWNrIGluIGl0cworICAgIC8vIG93biBkZXN0cnVjdG9yIHdoZW4gaXQgd2FpdHMgZm9yIG1GZXRjaGVyTG9vcGVyIHRvIHN0b3AsIHdoaWNoIHN0aWxsCisgICAgLy8gYmxvY2tzIG1haW4gVUkgdGhyZWFkLgogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgewogICAgICAgICBtRmV0Y2hlckluZm9zLnZhbHVlQXQoaSkubUZldGNoZXItPnN0b3BBc3luYygpOworICAgICAgICBtRmV0Y2hlckxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoCisgICAgICAgICAgICAgICAgbUZldGNoZXJJbmZvcy52YWx1ZUF0KGkpLm1GZXRjaGVyLT5pZCgpKTsKICAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmluaXNoRGlzY29ubmVjdDIsIGlkKCkpOwotCi0gICAgbUNvbnRpbnVhdGlvbkNvdW50ZXIgPSBtRmV0Y2hlckluZm9zLnNpemUoKTsKLSAgICBtQ29udGludWF0aW9uID0gbXNnOwotCi0gICAgaWYgKG1Db250aW51YXRpb25Db3VudGVyID09IDApIHsKLSAgICAgICAgbXNnLT5wb3N0KCk7Ci0gICAgfQotfQotCi12b2lkIExpdmVTZXNzaW9uOjpvbkZpbmlzaERpc2Nvbm5lY3QyKCkgewotICAgIG1Db250aW51YXRpb24uY2xlYXIoKTsKKyAgICBtRmV0Y2hlckluZm9zLmNsZWFyKCk7CiAKICAgICBtUGFja2V0U291cmNlcy52YWx1ZUZvcihTVFJFQU1UWVBFX0FVRElPKS0+c2lnbmFsRU9TKEVSUk9SX0VORF9PRl9TVFJFQU0pOwogICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKFNUUkVBTVRZUEVfVklERU8pLT5zaWduYWxFT1MoRVJST1JfRU5EX09GX1NUUkVBTSk7CkBAIC03ODAsNyArMTE0MSw3IEBACiAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBPSyk7CiAKICAgICByZXNwb25zZS0+cG9zdFJlcGx5KG1EaXNjb25uZWN0UmVwbHlJRCk7Ci0gICAgbURpc2Nvbm5lY3RSZXBseUlEID0gMDsKKyAgICBtRGlzY29ubmVjdFJlcGx5SUQuY2xlYXIoKTsKIH0KIAogc3A8UGxheWxpc3RGZXRjaGVyPiBMaXZlU2Vzc2lvbjo6YWRkRmV0Y2hlcihjb25zdCBjaGFyICp1cmkpIHsKQEAgLTc5MCwyMTMgKzExNTEsMTg1IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaGVyTm90aWZ5LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hlck5vdGlmeSwgdGhpcyk7CiAgICAgbm90aWZ5LT5zZXRTdHJpbmcoInVyaSIsIHVyaSk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigic3dpdGNoR2VuZXJhdGlvbiIsIG1Td2l0Y2hHZW5lcmF0aW9uKTsKIAogICAgIEZldGNoZXJJbmZvIGluZm87Ci0gICAgaW5mby5tRmV0Y2hlciA9IG5ldyBQbGF5bGlzdEZldGNoZXIobm90aWZ5LCB0aGlzLCB1cmksIG1TdWJ0aXRsZUdlbmVyYXRpb24pOworICAgIGluZm8ubUZldGNoZXIgPSBuZXcgUGxheWxpc3RGZXRjaGVyKAorICAgICAgICAgICAgbm90aWZ5LCB0aGlzLCB1cmksIG1DdXJCYW5kd2lkdGhJbmRleCwgbVN1YnRpdGxlR2VuZXJhdGlvbik7CiAgICAgaW5mby5tRHVyYXRpb25VcyA9IC0xbGw7Ci0gICAgaW5mby5tSXNQcmVwYXJlZCA9IGZhbHNlOwogICAgIGluZm8ubVRvQmVSZW1vdmVkID0gZmFsc2U7Ci0gICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcihpbmZvLm1GZXRjaGVyKTsKKyAgICBpbmZvLm1Ub0JlUmVzdW1lZCA9IGZhbHNlOworICAgIG1GZXRjaGVyTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIoaW5mby5tRmV0Y2hlcik7CiAKICAgICBtRmV0Y2hlckluZm9zLmFkZCh1cmksIGluZm8pOwogCiAgICAgcmV0dXJuIGluZm8ubUZldGNoZXI7CiB9CiAKLS8qCi0gKiBJbGx1c3RyYXRpb24gb2YgcGFyYW1ldGVyczoKLSAqCi0gKiAwICAgICAgYHJhbmdlX29mZnNldGAKLSAqICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLSstLSsKLSAqIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBuZXh0IGJsb2NrIHRvIGZldGNoIHwgIHwgIHwKLSAqIHwgICAgICAgICAgICB8IGBzb3VyY2VgIGhhbmRsZSA9PiBgb3V0YCBidWZmZXIgfCAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHwKLSAqIHwgYHVybGAgZmlsZSB8PC0tLS0tLS0tLSBidWZmZXIgc2l6ZSAtLS0tLS0tLS0+fDwtLS0gYGJsb2NrX3NpemVgIC0tPnwgIHwgIHwKLSAqIHwgICAgICAgICAgICB8PC0tLS0tLS0tLS0tIGByYW5nZV9sZW5ndGhgIC8gYnVmZmVyIGNhcGFjaXR5IC0tLS0tLS0tLS0tPnwgIHwKLSAqIHw8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZpbGVfc2l6ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPnwKLSAqCi0gKiBTcGVjaWFsIHBhcmFtZXRlciB2YWx1ZXM6Ci0gKiAtIHJhbmdlX2xlbmd0aCA9PSAtMSBtZWFucyBlbnRpcmUgZmlsZQotICogLSBibG9ja19zaXplID09IDAgbWVhbnMgZW50aXJlIHJhbmdlCi0gKgotICovCi1zc2l6ZV90IExpdmVTZXNzaW9uOjpmZXRjaEZpbGUoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgc3A8QUJ1ZmZlcj4gKm91dCwKLSAgICAgICAgaW50NjRfdCByYW5nZV9vZmZzZXQsIGludDY0X3QgcmFuZ2VfbGVuZ3RoLAotICAgICAgICB1aW50MzJfdCBibG9ja19zaXplLCAvKiBkb3dubG9hZCBibG9jayBzaXplICovCi0gICAgICAgIHNwPERhdGFTb3VyY2U+ICpzb3VyY2UsIC8qIHRvIHJldHVybiBhbmQgcmV1c2Ugc291cmNlICovCi0gICAgICAgIFN0cmluZzggKmFjdHVhbFVybCkgewotICAgIG9mZjY0X3Qgc2l6ZTsKLSAgICBzcDxEYXRhU291cmNlPiB0ZW1wX3NvdXJjZTsKLSAgICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICAgICAgc291cmNlID0gJnRlbXBfc291cmNlOwotICAgIH0KLQotICAgIGlmICgqc291cmNlID09IE5VTEwpIHsKLSAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCh1cmwsICJmaWxlOi8vIiwgNykpIHsKLSAgICAgICAgICAgICpzb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSh1cmwgKyA3KTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJuY2FzZWNtcCh1cmwsICJodHRwOi8vIiwgNykKLSAgICAgICAgICAgICAgICAmJiBzdHJuY2FzZWNtcCh1cmwsICJodHRwczovLyIsIDgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBoZWFkZXJzID0gbUV4dHJhSGVhZGVyczsKLSAgICAgICAgICAgIGlmIChyYW5nZV9vZmZzZXQgPiAwIHx8IHJhbmdlX2xlbmd0aCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaGVhZGVycy5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCJSYW5nZSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXM9JWxsZC0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfbGVuZ3RoIDwgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiIiA6IEFTdHJpbmdQcmludGYoIiVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9vZmZzZXQgKyByYW5nZV9sZW5ndGggLSAxKS5jX3N0cigpKS5jX3N0cigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtSFRUUERhdGFTb3VyY2UtPmNvbm5lY3QodXJsLCAmaGVhZGVycyk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqc291cmNlID0gbUhUVFBEYXRhU291cmNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZ2V0U2l6ZUVyciA9ICgqc291cmNlKS0+Z2V0U2l6ZSgmc2l6ZSk7Ci0gICAgaWYgKGdldFNpemVFcnIgIT0gT0spIHsKLSAgICAgICAgc2l6ZSA9IDY1NTM2OwotICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICpvdXQgIT0gTlVMTCA/ICpvdXQgOiBuZXcgQUJ1ZmZlcihzaXplKTsKLSAgICBpZiAoKm91dCA9PSBOVUxMKSB7Ci0gICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7Ci0gICAgfQotCi0gICAgc3NpemVfdCBieXRlc1JlYWQgPSAwOwotICAgIC8vIGFkanVzdCByYW5nZV9sZW5ndGggaWYgb25seSByZWFkaW5nIHBhcnRpYWwgYmxvY2sKLSAgICBpZiAoYmxvY2tfc2l6ZSA+IDAgJiYgKHJhbmdlX2xlbmd0aCA9PSAtMSB8fCAoaW50NjRfdCkoYnVmZmVyLT5zaXplKCkgKyBibG9ja19zaXplKSA8IHJhbmdlX2xlbmd0aCkpIHsKLSAgICAgICAgcmFuZ2VfbGVuZ3RoID0gYnVmZmVyLT5zaXplKCkgKyBibG9ja19zaXplOwotICAgIH0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIC8vIE9ubHkgcmVzaXplIHdoZW4gd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZS4KLSAgICAgICAgc2l6ZV90IGJ1ZmZlclJlbWFpbmluZyA9IGJ1ZmZlci0+Y2FwYWNpdHkoKSAtIGJ1ZmZlci0+c2l6ZSgpOwotICAgICAgICBpZiAoYnVmZmVyUmVtYWluaW5nID09IDAgJiYgZ2V0U2l6ZUVyciAhPSBPSykgewotICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckluY3JlbWVudCA9IGJ1ZmZlci0+c2l6ZSgpIC8gMjsKLSAgICAgICAgICAgIGlmIChidWZmZXJJbmNyZW1lbnQgPCAzMjc2OCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlckluY3JlbWVudCA9IDMyNzY4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyUmVtYWluaW5nID0gYnVmZmVySW5jcmVtZW50OwotCi0gICAgICAgICAgICBBTE9HVigiaW5jcmVhc2luZyBkb3dubG9hZCBidWZmZXIgdG8gJXp1IGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgYnVmZmVyLT5zaXplKCkgKyBidWZmZXJSZW1haW5pbmcpOwotCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiBjb3B5ID0gbmV3IEFCdWZmZXIoYnVmZmVyLT5zaXplKCkgKyBidWZmZXJSZW1haW5pbmcpOwotICAgICAgICAgICAgbWVtY3B5KGNvcHktPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgIGNvcHktPnNldFJhbmdlKDAsIGJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgICAgICAgICAgYnVmZmVyID0gY29weTsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBtYXhCeXRlc1RvUmVhZCA9IGJ1ZmZlclJlbWFpbmluZzsKLSAgICAgICAgaWYgKHJhbmdlX2xlbmd0aCA+PSAwKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGJ5dGVzTGVmdEluUmFuZ2UgPSByYW5nZV9sZW5ndGggLSBidWZmZXItPnNpemUoKTsKLSAgICAgICAgICAgIGlmIChieXRlc0xlZnRJblJhbmdlIDwgKGludDY0X3QpbWF4Qnl0ZXNUb1JlYWQpIHsKLSAgICAgICAgICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IGJ5dGVzTGVmdEluUmFuZ2U7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYnl0ZXNMZWZ0SW5SYW5nZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZSBEYXRhU291cmNlIGlzIHJlc3BvbnNpYmxlIGZvciBpbmZvcm1pbmcgdXMgb2YgZXJyb3IgKG4gPCAwKSBvciBlb2YgKG4gPT0gMCkKLSAgICAgICAgLy8gdG8gaGVscCB1cyBicmVhayBvdXQgb2YgdGhlIGxvb3AuCi0gICAgICAgIHNzaXplX3QgbiA9ICgqc291cmNlKS0+cmVhZEF0KAotICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSgpLCBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpLAotICAgICAgICAgICAgICAgIG1heEJ5dGVzVG9SZWFkKTsKLQotICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIGJ1ZmZlci0+c2l6ZSgpICsgKHNpemVfdCluKTsKLSAgICAgICAgYnl0ZXNSZWFkICs9IG47Ci0gICAgfQotCi0gICAgKm91dCA9IGJ1ZmZlcjsKLSAgICBpZiAoYWN0dWFsVXJsICE9IE5VTEwpIHsKLSAgICAgICAgKmFjdHVhbFVybCA9ICgqc291cmNlKS0+Z2V0VXJpKCk7Ci0gICAgICAgIGlmIChhY3R1YWxVcmwtPmlzRW1wdHkoKSkgewotICAgICAgICAgICAgKmFjdHVhbFVybCA9IHVybDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBieXRlc1JlYWQ7Ci19Ci0KLXNwPE0zVVBhcnNlcj4gTGl2ZVNlc3Npb246OmZldGNoUGxheWxpc3QoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgdWludDhfdCAqY3VyUGxheWxpc3RIYXNoLCBib29sICp1bmNoYW5nZWQpIHsKLSAgICBBTE9HVigiZmV0Y2hQbGF5bGlzdCAnJXMnIiwgdXJsKTsKLQotICAgICp1bmNoYW5nZWQgPSBmYWxzZTsKLQotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKLSAgICBTdHJpbmc4IGFjdHVhbFVybDsKLSAgICBzc2l6ZV90ICBlcnIgPSBmZXRjaEZpbGUodXJsLCAmYnVmZmVyLCAwLCAtMSwgMCwgTlVMTCwgJmFjdHVhbFVybCk7Ci0KLSAgICBpZiAoZXJyIDw9IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLy8gTUQ1IGZ1bmN0aW9uYWxpdHkgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgc2ltdWxhdG9yLCB0cmVhdCBhbGwKLSAgICAvLyBwbGF5bGlzdHMgYXMgY2hhbmdlZC4KLQotI2lmIGRlZmluZWQoSEFWRV9BTkRST0lEX09TKQotICAgIHVpbnQ4X3QgaGFzaFsxNl07Ci0KLSAgICBNRDVfQ1RYIG07Ci0gICAgTUQ1X0luaXQoJm0pOwotICAgIE1ENV9VcGRhdGUoJm0sIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7Ci0KLSAgICBNRDVfRmluYWwoaGFzaCwgJm0pOwotCi0gICAgaWYgKGN1clBsYXlsaXN0SGFzaCAhPSBOVUxMICYmICFtZW1jbXAoaGFzaCwgY3VyUGxheWxpc3RIYXNoLCAxNikpIHsKLSAgICAgICAgLy8gcGxheWxpc3QgdW5jaGFuZ2VkCi0gICAgICAgICp1bmNoYW5nZWQgPSB0cnVlOwotCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChjdXJQbGF5bGlzdEhhc2ggIT0gTlVMTCkgewotICAgICAgICBtZW1jcHkoY3VyUGxheWxpc3RIYXNoLCBoYXNoLCBzaXplb2YoaGFzaCkpOwotICAgIH0KLSNlbmRpZgotCi0gICAgc3A8TTNVUGFyc2VyPiBwbGF5bGlzdCA9Ci0gICAgICAgIG5ldyBNM1VQYXJzZXIoYWN0dWFsVXJsLnN0cmluZygpLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwotCi0gICAgaWYgKHBsYXlsaXN0LT5pbml0Q2hlY2soKSAhPSBPSykgewotICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHBhcnNlIC5tM3U4IHBsYXlsaXN0Iik7Ci0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBsYXlsaXN0OwotfQotCiAjaWYgMAogc3RhdGljIGRvdWJsZSB1bmlmb3JtUmFuZCgpIHsKICAgICByZXR1cm4gKGRvdWJsZSlyYW5kKCkgLyBSQU5EX01BWDsKIH0KICNlbmRpZgogCi1zaXplX3QgTGl2ZVNlc3Npb246OmdldEJhbmR3aWR0aEluZGV4KCkgewotICAgIGlmIChtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpID09IDApIHsKK2Jvb2wgTGl2ZVNlc3Npb246OlVyaUlzU2FtZUFzSW5kZXgoY29uc3QgQVN0cmluZyAmdXJpLCBpbnQzMl90IGksIGJvb2wgbmV3VXJpKSB7CisgICAgQUxPR0koIlt0aW1lZF9pZDNdIGkgJWQgVXJpSXNTYW1lQXNJbmRleCBuZXdVcmkgJXMsICVzIiwgaSwKKyAgICAgICAgICAgIG5ld1VyaSA/ICJ0cnVlIiA6ICJmYWxzZSIsCisgICAgICAgICAgICBuZXdVcmkgPyBtU3RyZWFtc1tpXS5tTmV3VXJpLmNfc3RyKCkgOiBtU3RyZWFtc1tpXS5tVXJpLmNfc3RyKCkpOworICAgIHJldHVybiBpID49IDAKKyAgICAgICAgICAgICYmICgoIW5ld1VyaSAmJiB1cmkgPT0gbVN0cmVhbXNbaV0ubVVyaSkKKyAgICAgICAgICAgIHx8IChuZXdVcmkgJiYgdXJpID09IG1TdHJlYW1zW2ldLm1OZXdVcmkpKTsKK30KKworc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gTGl2ZVNlc3Npb246OmdldFBhY2tldFNvdXJjZUZvclN0cmVhbUluZGV4KAorICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBuZXdVcmkpIHsKKyAgICBTdHJlYW1UeXBlIHR5cGUgPSBpbmRleFRvVHlwZSh0cmFja0luZGV4KTsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBOVUxMOworICAgIGlmIChuZXdVcmkpIHsKKyAgICAgICAgc291cmNlID0gbVBhY2tldFNvdXJjZXMyLnZhbHVlRm9yKHR5cGUpOworICAgICAgICBzb3VyY2UtPmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc291cmNlID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IodHlwZSk7CisgICAgfTsKKyAgICByZXR1cm4gc291cmNlOworfQorCitzcDxBbm90aGVyUGFja2V0U291cmNlPiBMaXZlU2Vzc2lvbjo6Z2V0TWV0YWRhdGFTb3VyY2UoCisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZXNba051bVNvdXJjZXNdLCB1aW50MzJfdCBzdHJlYW1NYXNrLCBib29sIG5ld1VyaSkgeworICAgIC8vIHRvZG86IE9uZSBjYXNlIHdoZXJlIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3kgY2FuIGZhaWwgaXMgd2hlbiBhdWRpbyBhbmQgdmlkZW8KKyAgICAvLyBhcmUgaW4gc2VwYXJhdGUgcGxheWxpc3RzLCBib3RoIGFyZSB0cmFuc3BvcnQgc3RyZWFtcywgYW5kIHRoZSBtZXRhZGF0YQorICAgIC8vIGlzIGFjdHVhbGx5IGNvbnRhaW5lZCBpbiB0aGUgYXVkaW8gc3RyZWFtLgorICAgIEFMT0dWKCJbdGltZWRfaWQzXSBnZXRNZXRhZGF0YVNvdXJjZUZvclVyaSBzdHJlYW1NYXNrICV4IG5ld1VyaSAlcyIsCisgICAgICAgICAgICBzdHJlYW1NYXNrLCBuZXdVcmkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKworICAgIGlmICgoc291cmNlc1trVmlkZW9JbmRleF0gIT0gTlVMTCkgLy8gdmlkZW8gZmV0Y2hlcjsgb3IgLi4uCisgICAgICAgICAgICB8fCAoIShzdHJlYW1NYXNrICYgU1RSRUFNVFlQRV9WSURFTykgJiYgc291cmNlc1trQXVkaW9JbmRleF0gIT0gTlVMTCkpIHsKKyAgICAgICAgICAgIC8vIC4uLiBhdWRpbyBmZXRjaGVyIGZvciBhdWRpbyBvbmx5IHZhcmlhbnQKKyAgICAgICAgcmV0dXJuIGdldFBhY2tldFNvdXJjZUZvclN0cmVhbUluZGV4KGtNZXRhRGF0YUluZGV4LCBuZXdVcmkpOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitib29sIExpdmVTZXNzaW9uOjpyZXN1bWVGZXRjaGVyKAorICAgICAgICBjb25zdCBBU3RyaW5nICZ1cmksIHVpbnQzMl90IHN0cmVhbU1hc2ssIGludDY0X3QgdGltZVVzLCBib29sIG5ld1VyaSkgeworICAgIHNzaXplX3QgaW5kZXggPSBtRmV0Y2hlckluZm9zLmluZGV4T2ZLZXkodXJpKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCJkaWQgbm90IGZpbmQgZmV0Y2hlciBmb3IgdXJpOiAlcyIsIHVyaS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgcmVzdW1lID0gZmFsc2U7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlc1trTnVtU291cmNlc107CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgIGlmICgoc3RyZWFtTWFzayAmIGluZGV4VG9UeXBlKGkpKSAmJiBVcmlJc1NhbWVBc0luZGV4KHVyaSwgaSwgbmV3VXJpKSkgeworICAgICAgICAgICAgcmVzdW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIHNvdXJjZXNbaV0gPSBnZXRQYWNrZXRTb3VyY2VGb3JTdHJlYW1JbmRleChpLCBuZXdVcmkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlc3VtZSkgeworICAgICAgICBzcDxQbGF5bGlzdEZldGNoZXI+ICZmZXRjaGVyID0gbUZldGNoZXJJbmZvcy5lZGl0VmFsdWVBdChpbmRleCkubUZldGNoZXI7CisgICAgICAgIFNlZWtNb2RlIHNlZWtNb2RlID0gbmV3VXJpID8ga1NlZWtNb2RlTmV4dFNhbXBsZSA6IGtTZWVrTW9kZUV4YWN0UG9zaXRpb247CisKKyAgICAgICAgQUxPR1YoInJlc3VtaW5nIGZldGNoZXItJWQsIHRpbWVVcz0lbGxkLCBzZWVrTW9kZT0lZCIsCisgICAgICAgICAgICAgICAgZmV0Y2hlci0+Z2V0RmV0Y2hlcklEKCksIChsb25nIGxvbmcpdGltZVVzLCBzZWVrTW9kZSk7CisKKyAgICAgICAgZmV0Y2hlci0+c3RhcnRBc3luYygKKyAgICAgICAgICAgICAgICBzb3VyY2VzW2tBdWRpb0luZGV4XSwKKyAgICAgICAgICAgICAgICBzb3VyY2VzW2tWaWRlb0luZGV4XSwKKyAgICAgICAgICAgICAgICBzb3VyY2VzW2tTdWJ0aXRsZUluZGV4XSwKKyAgICAgICAgICAgICAgICBnZXRNZXRhZGF0YVNvdXJjZShzb3VyY2VzLCBzdHJlYW1NYXNrLCBuZXdVcmkpLAorICAgICAgICAgICAgICAgIHRpbWVVcywgLTEsIC0xLCBzZWVrTW9kZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VtZTsKK30KKworZmxvYXQgTGl2ZVNlc3Npb246OmdldEFib3J0VGhyZXNob2xkKAorICAgICAgICBzc2l6ZV90IGN1cnJlbnRCV0luZGV4LCBzc2l6ZV90IHRhcmdldEJXSW5kZXgpIGNvbnN0IHsKKyAgICBmbG9hdCBhYm9ydFRocmVzaG9sZCA9IC0xLjBmOworICAgIGlmIChjdXJyZW50QldJbmRleCA+IDAgJiYgdGFyZ2V0QldJbmRleCA8IGN1cnJlbnRCV0luZGV4KSB7CisgICAgICAgIC8qCisgICAgICAgICAgIElmIHdlJ3JlIHN3aXRjaGluZyBkb3duLCB3ZSBuZWVkIHRvIGRlY2lkZSB3aGV0aGVyIHRvCisKKyAgICAgICAgICAgMSkgZmluaXNoIGxhc3Qgc2VnbWVudCBvZiBoaWdoLWJhbmR3aWR0aCB2YXJpYW50LCBvcgorICAgICAgICAgICAyKSBhYm9ydCBsYXN0IHNlZ21lbnQgb2YgaGlnaC1iYW5kd2lkdGggdmFyaWFudCwgYW5kIGZldGNoIGFuCisgICAgICAgICAgICAgIG92ZXJsYXBwaW5nIHBvcnRpb24gZnJvbSBsb3ctYmFuZHdpZHRoIHZhcmlhbnQuCisKKyAgICAgICAgICAgSGVyZSB3ZSB0cnkgdG8gbWF4aW1pemUgdGhlIGFtb3VudCBvZiBidWZmZXIgbGVmdCB3aGVuIHRoZQorICAgICAgICAgICBzd2l0Y2ggcG9pbnQgaXMgbWV0LiBHaXZlbiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisKKyAgICAgICAgICAgQjogb3VyIGN1cnJlbnQgYnVmZmVyaW5nIGxldmVsIGluIHNlY29uZHMKKyAgICAgICAgICAgVDogdGFyZ2V0IGR1cmF0aW9uIGluIHNlY29uZHMKKyAgICAgICAgICAgWDogc2FtcGxlIGR1cmF0aW9uIGluIHNlY29uZHMgcmVtYWluIHRvIGZldGNoIGluIGxhc3Qgc2VnbWVudAorICAgICAgICAgICBidzA6IGJhbmR3aWR0aCBvZiBvbGQgdmFyaWFudCAoYXMgc3BlY2lmaWVkIGluIHBsYXlsaXN0KQorICAgICAgICAgICBidzE6IGJhbmR3aWR0aCBvZiBuZXcgdmFyaWFudCAoYXMgc3BlY2lmaWVkIGluIHBsYXlsaXN0KQorICAgICAgICAgICBidzogbWVhc3VyZWQgYmFuZHdpZHRoIGF2YWlsYWJsZQorCisgICAgICAgICAgIElmIHdlIGNob29zZSAxKSwgd2hlbiBzd2l0Y2ggaGFwcGVucyBhdCB0aGUgZW5kIG9mIGN1cnJlbnQKKyAgICAgICAgICAgc2VnbWVudCwgb3VyIGJ1ZmZlcmluZyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICBCICsgWCAtIFggKiBidzAgLyBidworCisgICAgICAgICAgIElmIHdlIGNob29zZSAyKSwgd2hlbiBzd2l0Y2ggaGFwcGVucyB3aGVyZSB3ZSBhYm9ydGVkIGN1cnJlbnQKKyAgICAgICAgICAgc2VnbWVudCwgb3VyIGJ1ZmZlcmluZyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICBCIC0gKFQgLSBYKSAqIGJ3MSAvIGJ3CisKKyAgICAgICAgICAgV2Ugc2hvdWxkIG9ubHkgY2hvb3NlIDEpIGlmCisgICAgICAgICAgICAgICAgICBYL1QgPCBidzEgLyAoYncxICsgYncwIC0gYncpCisgICAgICAgICovCisKKyAgICAgICAgLy8gYWJvcnQgb2xkIGJhbmR3aWR0aCBpbW1lZGlhdGVseSBpZiBiYW5kd2lkdGggaXMgZmx1Y3R1YXRpbmcgYSBsb3QuCisgICAgICAgIC8vIG91ciBlc3RpbWF0ZSBjb3VsZCBiZSBmYXIgb2ZmLCBhbmQgZmV0Y2hpbmcgb2xkIGJhbmR3aWR0aCBjb3VsZAorICAgICAgICAvLyB0YWtlIHRvbyBsb25nLgorICAgICAgICBpZiAoIW1MYXN0QmFuZHdpZHRoU3RhYmxlKSB7CisgICAgICAgICAgICByZXR1cm4gMC4wZjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRha2luZyB0aGUgbWVhc3VyZWQgY3VycmVudCBiYW5kd2lkdGggYXQgNTAlIGZhY2UgdmFsdWUgb25seSwKKyAgICAgICAgLy8gYXMgb3VyIGJhbmR3aWR0aCBlc3RpbWF0aW9uIGlzIGEgbGFnZ2luZyBpbmRpY2F0b3IuIEJlaW5nCisgICAgICAgIC8vIGNvbnNlcnZhdGl2ZSBvbiB0aGlzLCB3ZSBwcmVmZXIgc3dpdGNoaW5nIHRvIGxvd2VyIGJhbmR3aWR0aAorICAgICAgICAvLyB1bmxlc3Mgd2UncmUgcmVhbGx5IGNvbmZpZGVudCBmaW5pc2hpbmcgdXAgdGhlIGxhc3Qgc2VnbWVudAorICAgICAgICAvLyBvZiBoaWdoZXIgYmFuZHdpZHRoIHdpbGwgYmUgZmFzdC4KKyAgICAgICAgQ0hFQ0sobUxhc3RCYW5kd2lkdGhCcHMgPj0gMCk7CisgICAgICAgIGFib3J0VGhyZXNob2xkID0KKyAgICAgICAgICAgICAgICAoZmxvYXQpbUJhbmR3aWR0aEl0ZW1zLml0ZW1BdCh0YXJnZXRCV0luZGV4KS5tQmFuZHdpZHRoCisgICAgICAgICAgICAgLyAoKGZsb2F0KW1CYW5kd2lkdGhJdGVtcy5pdGVtQXQodGFyZ2V0QldJbmRleCkubUJhbmR3aWR0aAorICAgICAgICAgICAgICArIChmbG9hdCltQmFuZHdpZHRoSXRlbXMuaXRlbUF0KGN1cnJlbnRCV0luZGV4KS5tQmFuZHdpZHRoCisgICAgICAgICAgICAgIC0gKGZsb2F0KW1MYXN0QmFuZHdpZHRoQnBzICogMC41Zik7CisgICAgICAgIGlmIChhYm9ydFRocmVzaG9sZCA8IDAuMGYpIHsKKyAgICAgICAgICAgIGFib3J0VGhyZXNob2xkID0gLTEuMGY7IC8vIGRvIG5vdCBhYm9ydAorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJTd2l0Y2hpbmcgRG93bjogYnBzICVsZCA9PiAlbGQsIG1lYXN1cmVkICVkLCBhYm9ydCByYXRpbyAlLjJmIiwKKyAgICAgICAgICAgICAgICBtQmFuZHdpZHRoSXRlbXMuaXRlbUF0KGN1cnJlbnRCV0luZGV4KS5tQmFuZHdpZHRoLAorICAgICAgICAgICAgICAgIG1CYW5kd2lkdGhJdGVtcy5pdGVtQXQodGFyZ2V0QldJbmRleCkubUJhbmR3aWR0aCwKKyAgICAgICAgICAgICAgICBtTGFzdEJhbmR3aWR0aEJwcywKKyAgICAgICAgICAgICAgICBhYm9ydFRocmVzaG9sZCk7CisgICAgfQorICAgIHJldHVybiBhYm9ydFRocmVzaG9sZDsKK30KKwordm9pZCBMaXZlU2Vzc2lvbjo6YWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQoc2l6ZV90IG51bUJ5dGVzLCBpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBtQmFuZHdpZHRoRXN0aW1hdG9yLT5hZGRCYW5kd2lkdGhNZWFzdXJlbWVudChudW1CeXRlcywgZGVsYXlVcyk7Cit9CisKK3NzaXplX3QgTGl2ZVNlc3Npb246OmdldExvd2VzdFZhbGlkQmFuZHdpZHRoSW5kZXgoKSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IG1CYW5kd2lkdGhJdGVtcy5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKGlzQmFuZHdpZHRoVmFsaWQobUJhbmR3aWR0aEl0ZW1zW2luZGV4XSkpIHsKKyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBpZiBwbGF5bGlzdHMgYXJlIGFsbCBibGFja2xpc3RlZCwgcmV0dXJuIDAgYW5kIGhvcGUgaXQncyBhbGl2ZQorICAgIHJldHVybiAwOworfQorCitzaXplX3QgTGl2ZVNlc3Npb246OmdldEJhbmR3aWR0aEluZGV4KGludDMyX3QgYmFuZHdpZHRoQnBzKSB7CisgICAgaWYgKG1CYW5kd2lkdGhJdGVtcy5zaXplKCkgPCAyKSB7CisgICAgICAgIC8vIHNob3VsZG4ndCBiZSBoZXJlIGlmIHdlIG9ubHkgaGF2ZSAxIGJhbmR3aWR0aCwgY2hlY2sKKyAgICAgICAgLy8gbG9naWMgdG8gZ2V0IHJpZCBvZiByZWR1bmRhbnQgYmFuZHdpZHRoIHBvbGxpbmcKKyAgICAgICAgQUxPR1coImdldEJhbmR3aWR0aEluZGV4KCkgY2FsbGVkIGZvciBzaW5nbGUgYmFuZHdpZHRoIHBsYXlsaXN0ISIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTEwMTQsMTUgKzEzNDcsNiBAQAogICAgIH0KIAogICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgaW50MzJfdCBiYW5kd2lkdGhCcHM7Ci0gICAgICAgIGlmIChtSFRUUERhdGFTb3VyY2UgIT0gTlVMTAotICAgICAgICAgICAgICAgICYmIG1IVFRQRGF0YVNvdXJjZS0+ZXN0aW1hdGVCYW5kd2lkdGgoJmJhbmR3aWR0aEJwcykpIHsKLSAgICAgICAgICAgIEFMT0dWKCJiYW5kd2lkdGggZXN0aW1hdGVkIGF0ICUuMmYga2JwcyIsIGJhbmR3aWR0aEJwcyAvIDEwMjQuMGYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoIm5vIGJhbmR3aWR0aCBlc3RpbWF0ZS4iKTsKLSAgICAgICAgICAgIHJldHVybiAwOyAgLy8gUGljayB0aGUgbG93ZXN0IGJhbmR3aWR0aCBzdHJlYW0gYnkgZGVmYXVsdC4KLSAgICAgICAgfQotCiAgICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKICAgICAgICAgaWYgKHByb3BlcnR5X2dldCgibWVkaWEuaHR0cGxpdmUubWF4LWJ3IiwgdmFsdWUsIE5VTEwpKSB7CiAgICAgICAgICAgICBjaGFyICplbmQ7CkBAIC0xMDM1LDIwICsxMzU5LDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBQaWNrIHRoZSBoaWdoZXN0IGJhbmR3aWR0aCBzdHJlYW0gYmVsb3cgb3IgZXF1YWwgdG8gZXN0aW1hdGVkIGJhbmR3aWR0aC4KKyAgICAgICAgLy8gUGljayB0aGUgaGlnaGVzdCBiYW5kd2lkdGggc3RyZWFtIHRoYXQncyBub3QgY3VycmVudGx5IGJsYWNrbGlzdGVkCisgICAgICAgIC8vIGJlbG93IG9yIGVxdWFsIHRvIGVzdGltYXRlZCBiYW5kd2lkdGguCiAKICAgICAgICAgaW5kZXggPSBtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpIC0gMTsKLSAgICAgICAgd2hpbGUgKGluZGV4ID4gMCkgewotICAgICAgICAgICAgLy8gY29uc2lkZXIgb25seSA4MCUgb2YgdGhlIGF2YWlsYWJsZSBiYW5kd2lkdGgsIGJ1dCBpZiB3ZSBhcmUgc3dpdGNoaW5nIHVwLAotICAgICAgICAgICAgLy8gYmUgZXZlbiBtb3JlIGNvbnNlcnZhdGl2ZSAoNzAlKSB0byBhdm9pZCBvdmVyZXN0aW1hdGluZyBhbmQgaW1tZWRpYXRlbHkKLSAgICAgICAgICAgIC8vIHN3aXRjaGluZyBiYWNrLgotICAgICAgICAgICAgc2l6ZV90IGFkanVzdGVkQmFuZHdpZHRoQnBzID0gYmFuZHdpZHRoQnBzOwotICAgICAgICAgICAgaWYgKGluZGV4ID4gbUN1ckJhbmR3aWR0aEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgYWRqdXN0ZWRCYW5kd2lkdGhCcHMgPSBhZGp1c3RlZEJhbmR3aWR0aEJwcyAqIDcgLyAxMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRqdXN0ZWRCYW5kd2lkdGhCcHMgPSBhZGp1c3RlZEJhbmR3aWR0aEJwcyAqIDggLyAxMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQmFuZHdpZHRoSXRlbXMuaXRlbUF0KGluZGV4KS5tQmFuZHdpZHRoIDw9IGFkanVzdGVkQmFuZHdpZHRoQnBzKSB7CisgICAgICAgIHNzaXplX3QgbG93ZXN0QmFuZHdpZHRoID0gZ2V0TG93ZXN0VmFsaWRCYW5kd2lkdGhJbmRleCgpOworICAgICAgICB3aGlsZSAoaW5kZXggPiBsb3dlc3RCYW5kd2lkdGgpIHsKKyAgICAgICAgICAgIC8vIGJlIGNvbnNlcnZhdGl2ZSAoNzAlKSB0byBhdm9pZCBvdmVyZXN0aW1hdGluZyBhbmQgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIC8vIHN3aXRjaGluZyBkb3duIGFnYWluLgorICAgICAgICAgICAgc2l6ZV90IGFkanVzdGVkQmFuZHdpZHRoQnBzID0gYmFuZHdpZHRoQnBzICogNyAvIDEwOworICAgICAgICAgICAgY29uc3QgQmFuZHdpZHRoSXRlbSAmaXRlbSA9IG1CYW5kd2lkdGhJdGVtc1tpbmRleF07CisgICAgICAgICAgICBpZiAoaXRlbS5tQmFuZHdpZHRoIDw9IGFkanVzdGVkQmFuZHdpZHRoQnBzCisgICAgICAgICAgICAgICAgICAgICYmIGlzQmFuZHdpZHRoVmFsaWQoaXRlbSkpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC0taW5kZXg7CkBAIC0xMTA3LDM0ICsxNDI5LDIwIEBACiAgICAgcmV0dXJuIGluZGV4OwogfQogCi1pbnQ2NF90IExpdmVTZXNzaW9uOjpsYXRlc3RNZWRpYVNlZ21lbnRTdGFydFRpbWVVcygpIHsKLSAgICBzcDxBTWVzc2FnZT4gYXVkaW9NZXRhID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoU1RSRUFNVFlQRV9BVURJTyktPmdldExhdGVzdERlcXVldWVkTWV0YSgpOwotICAgIGludDY0X3QgbWluU2VnbWVudFN0YXJ0VGltZVVzID0gLTEsIHZpZGVvU2VnbWVudFN0YXJ0VGltZVVzID0gLTE7Ci0gICAgaWYgKGF1ZGlvTWV0YSAhPSBOVUxMKSB7Ci0gICAgICAgIGF1ZGlvTWV0YS0+ZmluZEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCAmbWluU2VnbWVudFN0YXJ0VGltZVVzKTsKLSAgICB9CitITFNUaW1lIExpdmVTZXNzaW9uOjpsYXRlc3RNZWRpYVNlZ21lbnRTdGFydFRpbWUoKSBjb25zdCB7CisgICAgSExTVGltZSBhdWRpb1RpbWUobVBhY2tldFNvdXJjZXMudmFsdWVGb3IoCisgICAgICAgICAgICAgICAgICAgIFNUUkVBTVRZUEVfQVVESU8pLT5nZXRMYXRlc3REZXF1ZXVlZE1ldGEoKSk7CiAKLSAgICBzcDxBTWVzc2FnZT4gdmlkZW9NZXRhID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoU1RSRUFNVFlQRV9WSURFTyktPmdldExhdGVzdERlcXVldWVkTWV0YSgpOwotICAgIGlmICh2aWRlb01ldGEgIT0gTlVMTAotICAgICAgICAgICAgJiYgdmlkZW9NZXRhLT5maW5kSW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsICZ2aWRlb1NlZ21lbnRTdGFydFRpbWVVcykpIHsKLSAgICAgICAgaWYgKG1pblNlZ21lbnRTdGFydFRpbWVVcyA8IDAgfHwgdmlkZW9TZWdtZW50U3RhcnRUaW1lVXMgPCBtaW5TZWdtZW50U3RhcnRUaW1lVXMpIHsKLSAgICAgICAgICAgIG1pblNlZ21lbnRTdGFydFRpbWVVcyA9IHZpZGVvU2VnbWVudFN0YXJ0VGltZVVzOwotICAgICAgICB9CisgICAgSExTVGltZSB2aWRlb1RpbWUobVBhY2tldFNvdXJjZXMudmFsdWVGb3IoCisgICAgICAgICAgICAgICAgICAgIFNUUkVBTVRZUEVfVklERU8pLT5nZXRMYXRlc3REZXF1ZXVlZE1ldGEoKSk7CiAKLSAgICB9Ci0gICAgcmV0dXJuIG1pblNlZ21lbnRTdGFydFRpbWVVczsKKyAgICByZXR1cm4gYXVkaW9UaW1lIDwgdmlkZW9UaW1lID8gdmlkZW9UaW1lIDogYXVkaW9UaW1lOwogfQogCi1zdGF0dXNfdCBMaXZlU2Vzc2lvbjo6b25TZWVrKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Cit2b2lkIExpdmVTZXNzaW9uOjpvblNlZWsoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBpbnQ2NF90IHRpbWVVczsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotCi0gICAgaWYgKCFtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcykgewotICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKHRpbWVVcywgbUN1ckJhbmR3aWR0aEluZGV4KTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7Ci0gICAgfQorICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24odGltZVVzKTsKIH0KIAogc3RhdHVzX3QgTGl2ZVNlc3Npb246OmdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIGNvbnN0IHsKQEAgLTExNjUsNyArMTQ3Myw3IEBACiAgICAgaWYgKG1QbGF5bGlzdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtUGxheWxpc3QtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgcmV0dXJuIG1QbGF5bGlzdC0+Z2V0VHJhY2tDb3VudCgpICsgKG1IYXNNZXRhZGF0YSA/IDEgOiAwKTsKICAgICB9CiB9CiAKQEAgLTExNzMsNiArMTQ4MSwxMyBAQAogICAgIGlmIChtUGxheWxpc3QgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UgeworICAgICAgICBpZiAodHJhY2tJbmRleCA9PSBtUGxheWxpc3QtPmdldFRyYWNrQ291bnQoKSAmJiBtSGFzTWV0YWRhdGEpIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInR5cGUiLCBNRURJQV9UUkFDS19UWVBFX01FVEFEQVRBKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJsYW5ndWFnZSIsICJ1bmQiKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfREFUQV9USU1FRF9JRDMpOworICAgICAgICAgICAgcmV0dXJuIGZvcm1hdDsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gbVBsYXlsaXN0LT5nZXRUcmFja0luZm8odHJhY2tJbmRleCk7CiAgICAgfQogfQpAQCAtMTE4MiwxMSArMTQ5NywxMyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCisgICAgQUxPR1YoInNlbGVjdFRyYWNrOiBpbmRleD0lenUsIHNlbGVjdD0lZCwgbVN1YnRpdGxlR2VuPSVkKysiLAorICAgICAgICAgICAgaW5kZXgsIHNlbGVjdCwgbVN1YnRpdGxlR2VuZXJhdGlvbik7CisKICAgICArK21TdWJ0aXRsZUdlbmVyYXRpb247CiAgICAgc3RhdHVzX3QgZXJyID0gbVBsYXlsaXN0LT5zZWxlY3RUcmFjayhpbmRleCwgc2VsZWN0KTsKICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VDb25maWd1cmF0aW9uLCBpZCgpKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigiYmFuZHdpZHRoSW5kZXgiLCBtQ3VyQmFuZHdpZHRoSW5kZXgpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbiwgdGhpcyk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoInBpY2tUcmFjayIsIHNlbGVjdCk7CiAgICAgICAgIG1zZy0+cG9zdCgpOwogICAgIH0KQEAgLTEyMDEsMzUgKzE1MTgsMjUgQEAKICAgICB9CiB9CiAKLWJvb2wgTGl2ZVNlc3Npb246OmNhblN3aXRjaFVwKCkgewotICAgIC8vIEFsbG93IHVwd2FyZHMgYmFuZHdpZHRoIHN3aXRjaCB3aGVuIGEgc3RyZWFtIGhhcyBidWZmZXJlZCBhdCBsZWFzdCAxMCBzZWNvbmRzLgotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gbVBhY2tldFNvdXJjZXMudmFsdWVBdChpKTsKLSAgICAgICAgaW50NjRfdCBkdXIgPSBzb3VyY2UtPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZXJyKTsKLSAgICAgICAgaWYgKGVyciA9PSBPSyAmJiBkdXIgPiAxMDAwMDAwMCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCiB2b2lkIExpdmVTZXNzaW9uOjpjaGFuZ2VDb25maWd1cmF0aW9uKAotICAgICAgICBpbnQ2NF90IHRpbWVVcywgc2l6ZV90IGJhbmR3aWR0aEluZGV4LCBib29sIHBpY2tUcmFjaykgewotICAgIC8vIFByb3RlY3QgbVBhY2tldFNvdXJjZXMgZnJvbSBhIHN3YXBQYWNrZXRTb3VyY2UgcmFjZSBjb25kaXRpb24gdGhyb3VnaCByZWNvbmZpZ3VyYXRpb24uCi0gICAgLy8gKGNoYW5nZUNvbmZpZ3VyYXRpb24sIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjIsIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjMpLgorICAgICAgICBpbnQ2NF90IHRpbWVVcywgc3NpemVfdCBiYW5kd2lkdGhJbmRleCwgYm9vbCBwaWNrVHJhY2spIHsKKyAgICBBTE9HVigiY2hhbmdlQ29uZmlndXJhdGlvbjogdGltZVVzPSVsbGQgdXMsIGJ3SW5kZXg9JXpkLCBwaWNrVHJhY2s9JWQiLAorICAgICAgICAgIChsb25nIGxvbmcpdGltZVVzLCBiYW5kd2lkdGhJbmRleCwgcGlja1RyYWNrKTsKKwogICAgIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCgpOwogCiAgICAgQ0hFQ0soIW1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKTsKICAgICBtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcyA9IHRydWU7Ci0KLSAgICBtQ3VyQmFuZHdpZHRoSW5kZXggPSBiYW5kd2lkdGhJbmRleDsKLQotICAgIEFMT0dWKCJjaGFuZ2VDb25maWd1cmF0aW9uID0+IHRpbWVVczolIiBQUklkNjQgIiB1cywgYndJbmRleDolenUsIHBpY2tUcmFjazolZCIsCi0gICAgICAgICAgdGltZVVzLCBiYW5kd2lkdGhJbmRleCwgcGlja1RyYWNrKTsKLQotICAgIENIRUNLX0xUKGJhbmR3aWR0aEluZGV4LCBtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpKTsKLSAgICBjb25zdCBCYW5kd2lkdGhJdGVtICZpdGVtID0gbUJhbmR3aWR0aEl0ZW1zLml0ZW1BdChiYW5kd2lkdGhJbmRleCk7CisgICAgaWYgKGJhbmR3aWR0aEluZGV4ID49IDApIHsKKyAgICAgICAgbU9yaWdCYW5kd2lkdGhJbmRleCA9IG1DdXJCYW5kd2lkdGhJbmRleDsKKyAgICAgICAgbUN1ckJhbmR3aWR0aEluZGV4ID0gYmFuZHdpZHRoSW5kZXg7CisgICAgICAgIGlmIChtT3JpZ0JhbmR3aWR0aEluZGV4ICE9IG1DdXJCYW5kd2lkdGhJbmRleCkgeworICAgICAgICAgICAgQUxPR0koIiMjIyMgU3RhcnRpbmcgQmFuZHdpZHRoIFN3aXRjaDogJXpkID0+ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgIG1PcmlnQmFuZHdpZHRoSW5kZXgsIG1DdXJCYW5kd2lkdGhJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQ0hFQ0tfTFQobUN1ckJhbmR3aWR0aEluZGV4LCBtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpKTsKKyAgICBjb25zdCBCYW5kd2lkdGhJdGVtICZpdGVtID0gbUJhbmR3aWR0aEl0ZW1zLml0ZW1BdChtQ3VyQmFuZHdpZHRoSW5kZXgpOwogCiAgICAgdWludDMyX3Qgc3RyZWFtTWFzayA9IDA7IC8vIHN0cmVhbXMgdGhhdCBzaG91bGQgYmUgZmV0Y2hlZCBieSB0aGUgbmV3IGZldGNoZXIKICAgICB1aW50MzJfdCByZXN1bWVNYXNrID0gMDsgLy8gc3RyZWFtcyB0aGF0IHNob3VsZCBiZSBmZXRjaGVkIGJ5IHRoZSBvcmlnaW5hbCBmZXRjaGVyCkBAIC0xMjQ0LDM4ICsxNTUxLDYwIEBACiAgICAgLy8gU3RlcCAxLCBzdG9wIGFuZCBkaXNjYXJkIGZldGNoZXJzIHRoYXQgYXJlIG5vIGxvbmdlciBuZWVkZWQuCiAgICAgLy8gUGF1c2UgdGhvc2UgdGhhdCB3ZSdsbCByZXVzZS4KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GZXRjaGVySW5mb3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgLy8gc2tpcCBmZXRjaGVycyB0aGF0IGFyZSBtYXJrZWQgbVRvQmVSZW1vdmVkLAorICAgICAgICAvLyB0aGVzZSBhcmUgZG9uZSBhbmQgY2FuJ3QgYmUgcmV1c2VkCisgICAgICAgIGlmIChtRmV0Y2hlckluZm9zW2ldLm1Ub0JlUmVtb3ZlZCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKwogICAgICAgICBjb25zdCBBU3RyaW5nICZ1cmkgPSBtRmV0Y2hlckluZm9zLmtleUF0KGkpOworICAgICAgICBzcDxQbGF5bGlzdEZldGNoZXI+ICZmZXRjaGVyID0gbUZldGNoZXJJbmZvcy5lZGl0VmFsdWVBdChpKS5tRmV0Y2hlcjsKIAotICAgICAgICBib29sIGRpc2NhcmRGZXRjaGVyID0gdHJ1ZTsKLQotICAgICAgICAvLyBJZiB3ZSdyZSBzZWVraW5nIGFsbCBjdXJyZW50IGZldGNoZXJzIGFyZSBkaXNjYXJkZWQuCi0gICAgICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKLSAgICAgICAgICAgIC8vIGRlbGF5IGZldGNoZXIgcmVtb3ZhbCBpZiBub3QgcGlja2luZyB0cmFja3MKLSAgICAgICAgICAgIGRpc2NhcmRGZXRjaGVyID0gcGlja1RyYWNrOwotCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGtNYXhTdHJlYW1zOyArK2opIHsKLSAgICAgICAgICAgICAgICBTdHJlYW1UeXBlIHR5cGUgPSBpbmRleFRvVHlwZShqKTsKLSAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbU1hc2sgJiB0eXBlKSAmJiB1cmkgPT0gVVJJc1tqXSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bWVNYXNrIHw9IHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbU1hc2sgJj0gfnR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIGRpc2NhcmRGZXRjaGVyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBib29sIGRpc2NhcmRGZXRjaGVyID0gdHJ1ZSwgZGVsYXlSZW1vdmFsID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwga01heFN0cmVhbXM7ICsraikgeworICAgICAgICAgICAgU3RyZWFtVHlwZSB0eXBlID0gaW5kZXhUb1R5cGUoaik7CisgICAgICAgICAgICBpZiAoKHN0cmVhbU1hc2sgJiB0eXBlKSAmJiB1cmkgPT0gVVJJc1tqXSkgeworICAgICAgICAgICAgICAgIHJlc3VtZU1hc2sgfD0gdHlwZTsKKyAgICAgICAgICAgICAgICBzdHJlYW1NYXNrICY9IH50eXBlOworICAgICAgICAgICAgICAgIGRpc2NhcmRGZXRjaGVyID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgLy8gRGVsYXkgZmV0Y2hlciByZW1vdmFsIGlmIG5vdCBwaWNraW5nIHRyYWNrcywgQU5EIG9sZCBmZXRjaGVyCisgICAgICAgIC8vIGhhcyBzdHJlYW0gbWFzayB0aGF0IG92ZXJsYXBzIG5ldyB2YXJpYW50LiAoT2theSB0byBkaXNjYXJkCisgICAgICAgIC8vIG9sZCBmZXRjaGVyIG5vdywgaWYgY29tcGxldGVseSBubyBvdmVybGFwLikKKyAgICAgICAgaWYgKGRpc2NhcmRGZXRjaGVyICYmIHRpbWVVcyA8IDBsbCAmJiAhcGlja1RyYWNrCisgICAgICAgICAgICAgICAgJiYgKGZldGNoZXItPmdldFN0cmVhbVR5cGVNYXNrKCkgJiBzdHJlYW1NYXNrKSkgeworICAgICAgICAgICAgZGlzY2FyZEZldGNoZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIGRlbGF5UmVtb3ZhbCA9IHRydWU7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoZGlzY2FyZEZldGNoZXIpIHsKLSAgICAgICAgICAgIG1GZXRjaGVySW5mb3MudmFsdWVBdChpKS5tRmV0Y2hlci0+c3RvcEFzeW5jKCk7CisgICAgICAgICAgICBBTE9HVigiZGlzY2FyZGluZyBmZXRjaGVyLSVkIiwgZmV0Y2hlci0+Z2V0RmV0Y2hlcklEKCkpOworICAgICAgICAgICAgZmV0Y2hlci0+c3RvcEFzeW5jKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRmV0Y2hlckluZm9zLnZhbHVlQXQoaSkubUZldGNoZXItPnBhdXNlQXN5bmMoKTsKKyAgICAgICAgICAgIGZsb2F0IHRocmVzaG9sZCA9IDAuMGY7IC8vIGRlZmF1bHQgdG8gcGF1c2UgYWZ0ZXIgY3VycmVudCBibG9jayAoNDdLYnl0ZXMpCisgICAgICAgICAgICBib29sIGRpc2Nvbm5lY3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICh0aW1lVXMgPj0gMGxsKSB7CisgICAgICAgICAgICAgICAgLy8gc2Vla2luZywgbm8gbmVlZCB0byBmaW5pc2ggZmV0Y2hpbmcKKyAgICAgICAgICAgICAgICBkaXNjb25uZWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVsYXlSZW1vdmFsKSB7CisgICAgICAgICAgICAgICAgLy8gYWRhcHRpbmcsIGFib3J0IGlmIHJlbWFpbmluZyBvZiBjdXJyZW50IHNlZ21lbnQgaXMgb3ZlciB0aHJlc2hvbGQKKyAgICAgICAgICAgICAgICB0aHJlc2hvbGQgPSBnZXRBYm9ydFRocmVzaG9sZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PcmlnQmFuZHdpZHRoSW5kZXgsIG1DdXJCYW5kd2lkdGhJbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJwYXVzaW5nIGZldGNoZXItJWQsIHRocmVzaG9sZD0lLjJmIiwKKyAgICAgICAgICAgICAgICAgICAgZmV0Y2hlci0+Z2V0RmV0Y2hlcklEKCksIHRocmVzaG9sZCk7CisgICAgICAgICAgICBmZXRjaGVyLT5wYXVzZUFzeW5jKHRocmVzaG9sZCwgZGlzY29ubmVjdCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBzcDxBTWVzc2FnZT4gbXNnOwogICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKICAgICAgICAgLy8gc2tpcCBvbkNoYW5nZUNvbmZpZ3VyYXRpb24yIChkZWNvZGVyIGRlc3RydWN0aW9uKSBpZiBub3Qgc2Vla2luZy4KLSAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjMsIGlkKCkpOworICAgICAgICBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VDb25maWd1cmF0aW9uMywgdGhpcyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjIsIGlkKCkpOworICAgICAgICBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VDb25maWd1cmF0aW9uMiwgdGhpcyk7CiAgICAgfQogICAgIG1zZy0+c2V0SW50MzIoInN0cmVhbU1hc2siLCBzdHJlYW1NYXNrKTsKICAgICBtc2ctPnNldEludDMyKCJyZXN1bWVNYXNrIiwgcmVzdW1lTWFzayk7CkBAIC0xMjk2LDQwICsxNjI1LDc0IEBACiAKICAgICBpZiAobUNvbnRpbnVhdGlvbkNvdW50ZXIgPT0gMCkgewogICAgICAgICBtc2ctPnBvc3QoKTsKLQotICAgICAgICBpZiAobVNlZWtSZXBseUlEICE9IDApIHsKLSAgICAgICAgICAgIENIRUNLKG1TZWVrUmVwbHkgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtU2Vla1JlcGx5LT5zZXRJbnQzMigiZXJyIiwgT0spOwotICAgICAgICAgICAgbVNlZWtSZXBseS0+cG9zdFJlcGx5KG1TZWVrUmVwbHlJRCk7Ci0gICAgICAgICAgICBtU2Vla1JlcGx5SUQgPSAwOwotICAgICAgICAgICAgbVNlZWtSZXBseS5jbGVhcigpOwotICAgICAgICB9CiAgICAgfQogfQogCiB2b2lkIExpdmVTZXNzaW9uOjpvbkNoYW5nZUNvbmZpZ3VyYXRpb24oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBBTE9HVigib25DaGFuZ2VDb25maWd1cmF0aW9uIik7CisKICAgICBpZiAoIW1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKSB7Ci0gICAgICAgIGludDMyX3QgcGlja1RyYWNrID0gMCwgYmFuZHdpZHRoSW5kZXggPSBtQ3VyQmFuZHdpZHRoSW5kZXg7CisgICAgICAgIGludDMyX3QgcGlja1RyYWNrID0gMDsKICAgICAgICAgbXNnLT5maW5kSW50MzIoInBpY2tUcmFjayIsICZwaWNrVHJhY2spOwotICAgICAgICBtc2ctPmZpbmRJbnQzMigiYmFuZHdpZHRoSW5kZXgiLCAmYmFuZHdpZHRoSW5kZXgpOwotICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKC0xbGwgLyogdGltZVVzICovLCBiYW5kd2lkdGhJbmRleCwgcGlja1RyYWNrKTsKKyAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMWxsIC8qIHRpbWVVcyAqLywgLTEsIHBpY2tUcmFjayk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7IC8vIHJldHJ5IGluIDEgc2VjCiAgICAgfQogfQogCiB2b2lkIExpdmVTZXNzaW9uOjpvbkNoYW5nZUNvbmZpZ3VyYXRpb24yKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgQUxPR1YoIm9uQ2hhbmdlQ29uZmlndXJhdGlvbjIiKTsKKwogICAgIG1Db250aW51YXRpb24uY2xlYXIoKTsKIAogICAgIC8vIEFsbCBmZXRjaGVycyBhcmUgZWl0aGVyIHN1c3BlbmRlZCBvciBoYXZlIGJlZW4gcmVtb3ZlZCBub3cuCiAKKyAgICAvLyBJZiB3ZSdyZSBzZWVraW5nLCBjbGVhciBhbGwgcGFja2V0IHNvdXJjZXMgYmVmb3JlIHdlIHJlcG9ydAorICAgIC8vIHNlZWsgY29tcGxldGUsIHRvIHByZXZlbnQgZGVjb2RlciBmcm9tIHB1bGxpbmcgc3RhbGUgZGF0YS4KKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgaWYgKHRpbWVVcyA+PSAwKSB7CisgICAgICAgIG1MYXN0U2Vla1RpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgbUxhc3REZXF1ZXVlZFRpbWVVcyA9IHRpbWVVczsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRTb3VyY2UgPSBtUGFja2V0U291cmNlcy5lZGl0VmFsdWVBdChpKTsKKyAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBwYWNrZXRTb3VyY2UtPmdldEZvcm1hdCgpOworICAgICAgICAgICAgcGFja2V0U291cmNlLT5jbGVhcigpOworICAgICAgICAgICAgLy8gU2V0IGEgdGVudGF0aXZlIGZvcm1hdCBoZXJlIHN1Y2ggdGhhdCBIVFRQTGl2ZVNvdXJjZSB3aWxsIGFsd2F5cyBoYXZlCisgICAgICAgICAgICAvLyBhIGZvcm1hdCBhdmFpbGFibGUgd2hlbiBOdVBsYXllciBxdWVyaWVzLiBXaXRob3V0IGFuIGF2YWlsYWJsZSB2aWRlbworICAgICAgICAgICAgLy8gZm9ybWF0IHdoZW4gc2V0dGluZyBhIHN1cmZhY2UgTnVQbGF5ZXIgbWlnaHQgZGlzYWJsZSB2aWRlbyBkZWNvZGluZworICAgICAgICAgICAgLy8gYWx0b2dldGhlci4gVGhlIHRlbnRhdGl2ZSBmb3JtYXQgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUKKyAgICAgICAgICAgIC8vIGF1dGhvcml0YXRpdmUgKGFuZCBwb3NzaWJseSBzYW1lKSBmb3JtYXQgb25jZSBjb250ZW50IGZyb20gdGhlIG5ldworICAgICAgICAgICAgLy8gcG9zaXRpb24gaXMgZGVxdWV1ZWQuCisgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPnNldEZvcm1hdChmb3JtYXQpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgICAgICBtU3RyZWFtc1tpXS5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgbURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLmNsZWFyKCk7CisgICAgICAgIG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLmNsZWFyKCk7CisKKyAgICAgICAgaWYgKG1TZWVrUmVwbHlJRCAhPSBOVUxMKSB7CisgICAgICAgICAgICBDSEVDSyhtU2Vla1JlcGx5ICE9IE5VTEwpOworICAgICAgICAgICAgbVNlZWtSZXBseS0+c2V0SW50MzIoImVyciIsIE9LKTsKKyAgICAgICAgICAgIG1TZWVrUmVwbHktPnBvc3RSZXBseShtU2Vla1JlcGx5SUQpOworICAgICAgICAgICAgbVNlZWtSZXBseUlELmNsZWFyKCk7CisgICAgICAgICAgICBtU2Vla1JlcGx5LmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXN0YXJ0IGJ1ZmZlciBwb2xsaW5nIGFmdGVyIHNlZWsgYmVjYXVlc2UgcHJldmlvdXMKKyAgICAgICAgLy8gYnVmZmVyaW5nIHBvc2l0aW9uIGlzIG5vIGxvbmdlciB2YWxpZC4KKyAgICAgICAgcmVzdGFydFBvbGxCdWZmZXJpbmcoKTsKKyAgICB9CisKICAgICB1aW50MzJfdCBzdHJlYW1NYXNrLCByZXN1bWVNYXNrOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdHJlYW1NYXNrIiwgKGludDMyX3QgKikmc3RyZWFtTWFzaykpOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bWVNYXNrIiwgKGludDMyX3QgKikmcmVzdW1lTWFzaykpOwogCi0gICAgLy8gY3VycmVudGx5IG9uQ2hhbmdlQ29uZmlndXJhdGlvbjIgaXMgb25seSBjYWxsZWQgZm9yIHNlZWtpbmc7Ci0gICAgLy8gcmVtb3ZlIHRoZSBmb2xsb3dpbmcgQ0hFQ0sgaWYgdXNpbmcgaXQgZWxzZSB3aGVyZS4KLSAgICBDSEVDS19FUShyZXN1bWVNYXNrLCAwKTsKICAgICBzdHJlYW1NYXNrIHw9IHJlc3VtZU1hc2s7CiAKICAgICBBU3RyaW5nIFVSSXNba01heFN0cmVhbXNdOwpAQCAtMTM0MSwxNyArMTcwNCwyNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGRlY29kZXJzIHRvIHNodXRkb3duIG9uIHRoZSBwbGF5ZXIgc2lkZSwKLSAgICAvLyBhIGRlY29kZXIgaGFzIHRvIGJlIHNodXRkb3duIGlmIGVpdGhlcgotICAgIC8vIDEpIGl0cyBzdHJlYW10eXBlIHdhcyBhY3RpdmUgYmVmb3JlIGJ1dCBub3cgbG9uZ2VyIGlzbid0LgotICAgIC8vIG9yCi0gICAgLy8gMikgaXRzIHN0cmVhbXR5cGUgd2FzIGFscmVhZHkgYWN0aXZlIGFuZCBzdGlsbCBpcyBidXQgdGhlIFVSSQotICAgIC8vICAgIGhhcyBjaGFuZ2VkLgogICAgIHVpbnQzMl90IGNoYW5nZWRNYXNrID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zICYmIGkgIT0ga1N1YnRpdGxlSW5kZXg7ICsraSkgewotICAgICAgICBpZiAoKChtU3RyZWFtTWFzayAmIHN0cmVhbU1hc2sgJiBpbmRleFRvVHlwZShpKSkKLSAgICAgICAgICAgICAgICAmJiAhKFVSSXNbaV0gPT0gbVN0cmVhbXNbaV0ubVVyaSkpCi0gICAgICAgICAgICAgICAgfHwgKG1TdHJlYW1NYXNrICYgfnN0cmVhbU1hc2sgJiBpbmRleFRvVHlwZShpKSkpIHsKKyAgICAgICAgLy8gc3RyZWFtIFVSSSBjb3VsZCBjaGFuZ2UgZXZlbiBpZiBvbkNoYW5nZUNvbmZpZ3VyYXRpb24yIGlzIG9ubHkKKyAgICAgICAgLy8gdXNlZCBmb3Igc2Vlay4gU2VlayBjb3VsZCBoYXBwZW4gZHVyaW5nIGEgYncgc3dpdGNoLCBpbiB0aGlzCisgICAgICAgIC8vIGNhc2UgYncgc3dpdGNoIHdpbGwgYmUgY2FuY2VsbGVkLCBidXQgdGhlIHNlZWtUbyBwb3NpdGlvbiB3aWxsCisgICAgICAgIC8vIGZldGNoIGZyb20gdGhlIG5ldyBVUkkuCisgICAgICAgIGlmICgobVN0cmVhbU1hc2sgJiBzdHJlYW1NYXNrICYgaW5kZXhUb1R5cGUoaSkpCisgICAgICAgICAgICAgICAgJiYgIW1TdHJlYW1zW2ldLm1VcmkuZW1wdHkoKQorICAgICAgICAgICAgICAgICYmICEoVVJJc1tpXSA9PSBtU3RyZWFtc1tpXS5tVXJpKSkgeworICAgICAgICAgICAgQUxPR1YoInN0cmVhbSAlenUgY2hhbmdlZDogb2xkVVJJICVzLCBuZXdVUkkgJXMiLCBpLAorICAgICAgICAgICAgICAgICAgICBtU3RyZWFtc1tpXS5tVXJpLmNfc3RyKCksIFVSSXNbaV0uY19zdHIoKSk7CisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihpbmRleFRvVHlwZShpKSk7CisgICAgICAgICAgICBpZiAoc291cmNlLT5nZXRMYXRlc3REZXF1ZXVlZE1ldGEoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc291cmNlLT5xdWV1ZURpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFLCBOVUxMLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZGVjb2RlcnMgdG8gc2h1dGRvd24gb24gdGhlIHBsYXllciBzaWRlLAorICAgICAgICAvLyBhIGRlY29kZXIgaGFzIHRvIGJlIHNodXRkb3duIGlmIGl0cyBzdHJlYW10eXBlIHdhcyBhY3RpdmUKKyAgICAgICAgLy8gYmVmb3JlIGJ1dCBub3cgbG9uZ2VyIGlzbid0LgorICAgICAgICBpZiAoKG1TdHJlYW1NYXNrICYgfnN0cmVhbU1hc2sgJiBpbmRleFRvVHlwZShpKSkpIHsKICAgICAgICAgICAgIGNoYW5nZWRNYXNrIHw9IGluZGV4VG9UeXBlKGkpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTM3Miw3ICsxNzQ1LDcgQEAKICAgICBub3RpZnktPnNldEludDMyKCJjaGFuZ2VkTWFzayIsIGNoYW5nZWRNYXNrKTsKIAogICAgIG1zZy0+c2V0V2hhdChrV2hhdENoYW5nZUNvbmZpZ3VyYXRpb24zKTsKLSAgICBtc2ctPnNldFRhcmdldChpZCgpKTsKKyAgICBtc2ctPnNldFRhcmdldCh0aGlzKTsKIAogICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCBtc2cpOwogICAgIG5vdGlmeS0+cG9zdCgpOwpAQCAtMTM4Nyw2ICsxNzYwLDggQEAKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic3RyZWFtTWFzayIsIChpbnQzMl90ICopJnN0cmVhbU1hc2spKTsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdW1lTWFzayIsIChpbnQzMl90ICopJnJlc3VtZU1hc2spKTsKIAorICAgIG1OZXdTdHJlYW1NYXNrID0gc3RyZWFtTWFzayB8IHJlc3VtZU1hc2s7CisKICAgICBpbnQ2NF90IHRpbWVVczsKICAgICBpbnQzMl90IHBpY2tUcmFjazsKICAgICBib29sIHN3aXRjaGluZyA9IGZhbHNlOwpAQCAtMTM5NSwxMyArMTc3MCwyNiBAQAogCiAgICAgaWYgKHRpbWVVcyA8IDBsbCkgewogICAgICAgICBpZiAoIXBpY2tUcmFjaykgewotICAgICAgICAgICAgc3dpdGNoaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIG1Td2FwTWFzayBjb250YWlucyBzdHJlYW1zIHRoYXQgYXJlIGluIGJvdGggb2xkIGFuZCBuZXcgdmFyaWFudCwKKyAgICAgICAgICAgIC8vIChpbiBtTmV3U3RyZWFtTWFzayAmIG1TdHJlYW1NYXNrKSBidXQgd2l0aCBkaWZmZXJlbnQgVVJJcworICAgICAgICAgICAgLy8gKG5vdCBpbiByZXN1bWVNYXNrKS4KKyAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCBvbGQgdmFyaWFudCBoYXMgdmlkZW8gYW5kIGF1ZGlvIGluIHR3byBzZXBhcmF0ZQorICAgICAgICAgICAgLy8gVVJJcywgYW5kIG5ldyB2YXJpYW50IGhhcyBvbmx5IGF1ZGlvIHdpdGggdW5jaGFuZ2VkIFVSSS4gbVN3YXBNYXNrCisgICAgICAgICAgICAvLyBzaG91bGQgYmUgMCBhcyB0aGVyZSBpcyBub3RoaW5nIHRvIHN3YXAuIFdlIG9ubHkgbmVlZCB0byBzdG9wIHZpZGVvLAorICAgICAgICAgICAgLy8gYW5kIHJlc3VtZSBhdWRpby4KKyAgICAgICAgICAgIG1Td2FwTWFzayA9ICBtTmV3U3RyZWFtTWFzayAmIG1TdHJlYW1NYXNrICYgfnJlc3VtZU1hc2s7CisgICAgICAgICAgICBzd2l0Y2hpbmcgPSAobVN3YXBNYXNrICE9IDApOwogICAgICAgICB9CiAgICAgICAgIG1SZWFsVGltZUJhc2VVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBtTGFzdERlcXVldWVkVGltZVVzOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1SZWFsVGltZUJhc2VVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSB0aW1lVXM7CiAgICAgfQogCisgICAgQUxPR1YoIm9uQ2hhbmdlQ29uZmlndXJhdGlvbjM6IHRpbWVVcz0lbGxkLCBzd2l0Y2hpbmc9JWQsIHBpY2tUcmFjaz0lZCwgIgorICAgICAgICAgICAgIm1TdHJlYW1NYXNrPTB4JXgsIG1OZXdTdHJlYW1NYXNrPTB4JXgsIG1Td2FwTWFzaz0weCV4IiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpdGltZVVzLCBzd2l0Y2hpbmcsIHBpY2tUcmFjaywKKyAgICAgICAgICAgIG1TdHJlYW1NYXNrLCBtTmV3U3RyZWFtTWFzaywgbVN3YXBNYXNrKTsKKwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgewogICAgICAgICBpZiAoc3RyZWFtTWFzayAmIGluZGV4VG9UeXBlKGkpKSB7CiAgICAgICAgICAgICBpZiAoc3dpdGNoaW5nKSB7CkBAIC0xNDEyLDQ3ICsxODAwLDIxIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtTmV3U3RyZWFtTWFzayA9IHN0cmVhbU1hc2sgfCByZXN1bWVNYXNrOwotICAgIGlmIChzd2l0Y2hpbmcpIHsKLSAgICAgICAgbVN3YXBNYXNrID0gbVN0cmVhbU1hc2sgJiB+cmVzdW1lTWFzazsKLSAgICB9Ci0KICAgICAvLyBPZiBhbGwgZXhpc3RpbmcgZmV0Y2hlcnM6CiAgICAgLy8gKiBSZXN1bWUgZmV0Y2hlcnMgdGhhdCBhcmUgc3RpbGwgbmVlZGVkIGFuZCBhc3NpZ24gdGhlbSBvcmlnaW5hbCBwYWNrZXQgc291cmNlcy4KICAgICAvLyAqIE1hcmsgb3RoZXJ3aXNlIHVubmVlZGVkIGZldGNoZXJzIGZvciByZW1vdmFsLgogICAgIEFMT0dWKCJyZXN1bWluZyBmZXRjaGVycyBmb3IgbWFzayAweCUwOHgiLCByZXN1bWVNYXNrKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GZXRjaGVySW5mb3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgY29uc3QgQVN0cmluZyAmdXJpID0gbUZldGNoZXJJbmZvcy5rZXlBdChpKTsKKyAgICAgICAgaWYgKCFyZXN1bWVGZXRjaGVyKHVyaSwgcmVzdW1lTWFzaywgdGltZVVzKSkgeworICAgICAgICAgICAgQUxPR1YoIm1hcmtpbmcgZmV0Y2hlci0lZCB0byBiZSByZW1vdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUZldGNoZXJJbmZvc1tpXS5tRmV0Y2hlci0+Z2V0RmV0Y2hlcklEKCkpOwogCi0gICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZXNba01heFN0cmVhbXNdOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGtNYXhTdHJlYW1zOyArK2opIHsKLSAgICAgICAgICAgIGlmICgocmVzdW1lTWFzayAmIGluZGV4VG9UeXBlKGopKSAmJiB1cmkgPT0gbVN0cmVhbXNbal0ubVVyaSkgewotICAgICAgICAgICAgICAgIHNvdXJjZXNbal0gPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihpbmRleFRvVHlwZShqKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaiAhPSBrU3VidGl0bGVJbmRleCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigicXVldWVpbmcgZHVtbXkgZGlzY29udGludWl0eSBmb3Igc3RyZWFtIHR5cGUgJWQiLCBpbmRleFRvVHlwZShqKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGRpc2NvbnRpbnVpdHlRdWV1ZTsKLSAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVF1ZXVlID0gbURpc2NvbnRpbnVpdGllcy52YWx1ZUZvcihpbmRleFRvVHlwZShqKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZS0+cXVldWVEaXNjb250aW51aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgRmV0Y2hlckluZm8gJmluZm8gPSBtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUF0KGkpOwotICAgICAgICBpZiAoc291cmNlc1trQXVkaW9JbmRleF0gIT0gTlVMTCB8fCBzb3VyY2VzW2tWaWRlb0luZGV4XSAhPSBOVUxMCi0gICAgICAgICAgICAgICAgfHwgc291cmNlc1trU3VidGl0bGVJbmRleF0gIT0gTlVMTCkgewotICAgICAgICAgICAgaW5mby5tRmV0Y2hlci0+c3RhcnRBc3luYygKLSAgICAgICAgICAgICAgICAgICAgc291cmNlc1trQXVkaW9JbmRleF0sIHNvdXJjZXNba1ZpZGVvSW5kZXhdLCBzb3VyY2VzW2tTdWJ0aXRsZUluZGV4XSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbmZvLm1Ub0JlUmVtb3ZlZCA9IHRydWU7CisgICAgICAgICAgICBtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUF0KGkpLm1Ub0JlUmVtb3ZlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBzdHJlYW1NYXNrIG5vdyBvbmx5IGNvbnRhaW5zIHRoZSB0eXBlcyB0aGF0IG5lZWQgYSBuZXcgZmV0Y2hlciBjcmVhdGVkLgotCiAgICAgaWYgKHN0cmVhbU1hc2sgIT0gMCkgewogICAgICAgICBBTE9HVigiY3JlYXRpbmcgbmV3IGZldGNoZXJzIGZvciBtYXNrIDB4JTA4eCIsIHN0cmVhbU1hc2spOwogICAgIH0KQEAgLTE0NzAsMTMgKzE4MzIsMTIgQEAKICAgICAgICAgc3A8UGxheWxpc3RGZXRjaGVyPiBmZXRjaGVyID0gYWRkRmV0Y2hlcih1cmkuY19zdHIoKSk7CiAgICAgICAgIENIRUNLKGZldGNoZXIgIT0gTlVMTCk7CiAKLSAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IC0xOwotICAgICAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFRpbWVVcyA9IC0xbGw7Ci0gICAgICAgIGludDMyX3QgZGlzY29udGludWl0eVNlcSA9IC0xOwotICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2VzW2tNYXhTdHJlYW1zXTsKKyAgICAgICAgSExTVGltZSBzdGFydFRpbWU7CisgICAgICAgIFNlZWtNb2RlIHNlZWtNb2RlID0ga1NlZWtNb2RlRXhhY3RQb3NpdGlvbjsKKyAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlc1trTnVtU291cmNlc107CiAKLSAgICAgICAgaWYgKGkgPT0ga1N1YnRpdGxlSW5kZXgpIHsKLSAgICAgICAgICAgIHNlZ21lbnRTdGFydFRpbWVVcyA9IGxhdGVzdE1lZGlhU2VnbWVudFN0YXJ0VGltZVVzKCk7CisgICAgICAgIGlmIChpID09IGtTdWJ0aXRsZUluZGV4IHx8ICghcGlja1RyYWNrICYmICFzd2l0Y2hpbmcpKSB7CisgICAgICAgICAgICBzdGFydFRpbWUgPSBsYXRlc3RNZWRpYVNlZ21lbnRTdGFydFRpbWUoKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIFRSSUNLWTogbG9vcGluZyBmcm9tIGkgYXMgZWFybGllciBzdHJlYW1zIGFyZSBhbHJlYWR5IHJlbW92ZWQgZnJvbSBzdHJlYW1NYXNrCkBAIC0xNDg2LDYzICsxODQ3LDUwIEBACiAgICAgICAgICAgICAgICAgc291cmNlc1tqXSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKIAogICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdLT5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWVVcyA9IHRpbWVVczsKLQotICAgICAgICAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBkaXNjb250aW51aXR5UXVldWU7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBleHRyYSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICAgICAgZXh0cmEtPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5UXVldWUgPSBtRGlzY29udGludWl0aWVzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKLSAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVF1ZXVlLT5xdWV1ZURpc2NvbnRpbnVpdHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1RJTUUsIGV4dHJhLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLm1UaW1lVXMgPSB0aW1lVXM7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlOwogICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBpY2tUcmFjaykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0aW5nCisgICAgICAgICAgICAgICAgICAgIGlmICghc3dpdGNoaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3RpbmcsIG9yIGFkYXB0aW5nIGJ1dCBubyBzd2FwIHJlcXVpcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhID0gc291cmNlc1tqXS0+Z2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGFwdGluZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRhcHRpbmcgYW5kIHN3YXAgcmVxdWlyZWQKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEgPSBzb3VyY2VzW2pdLT5nZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtZXRhICE9IE5VTEwgJiYgIW1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZ0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0bXBVczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdG1wU2VnbWVudFVzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZ0bXBVcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCAmdG1wU2VnbWVudFVzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRUaW1lVXMgPCAwIHx8IHRtcFNlZ21lbnRVcyA8IHNlZ21lbnRTdGFydFRpbWVVcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZVVzID0gdG1wVXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudFN0YXJ0VGltZVVzID0gdG1wU2VnbWVudFVzOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0bXBTZWdtZW50VXMgPT0gc2VnbWVudFN0YXJ0VGltZVVzICYmIHRtcFVzIDwgc3RhcnRUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWVVcyA9IHRtcFVzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZzZXEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNjb250aW51aXR5U2VxIDwgMCB8fCBzZXEgPCBkaXNjb250aW51aXR5U2VxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVNlcSA9IHNlcTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhICE9IE5VTEwgJiYgbUN1ckJhbmR3aWR0aEluZGV4ID4gbU9yaWdCYW5kd2lkdGhJbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaGluZyB1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEgPSBzb3VyY2VzW2pdLT5nZXRNZXRhQWZ0ZXJMYXN0RGVxdWV1ZWQobVVwU3dpdGNoTWFyZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChwaWNrVHJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbGVjdGluZyB0cmFjaywgcXVldWUgZGlzY29udGludWl0aWVzIGJlZm9yZSBjb250ZW50CisgICAgICAgICAgICAgICAgICAgIGlmICgoaiA9PSBrQXVkaW9JbmRleCB8fCBqID09IGtWaWRlb0luZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1ldGEgIT0gTlVMTCAmJiAhbWV0YS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJnR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBITFNUaW1lIHRtcFRpbWUobWV0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRUaW1lIDwgdG1wVGltZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IHRtcFRpbWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIXN3aXRjaGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0aW5nLCBvciBhZGFwdGluZyBidXQgbm8gc3dhcCByZXF1aXJlZAogICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXS0+Y2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09IGtTdWJ0aXRsZUluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBkaXNjb250aW51aXR5UXVldWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5UXVldWUgPSBtRGlzY29udGludWl0aWVzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZS0+cXVldWVEaXNjb250aW51aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFLCBOVUxMLCB0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInN0cmVhbVslenVdOiBxdWV1ZSBmb3JtYXQgY2hhbmdlIiwgaik7CisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdLT5xdWV1ZURpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRfT05MWSwgTlVMTCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGFwdGluZywgcXVldWUgZGlzY29udGludWl0aWVzIGFmdGVyIHJlc3VtZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dpdGNoaW5nLCBxdWV1ZSBkaXNjb250aW51aXRpZXMgYWZ0ZXIgcmVzdW1lCiAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdID0gbVBhY2tldFNvdXJjZXMyLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0tPmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBleHRyYVN0cmVhbXMgPSBtTmV3U3RyZWFtTWFzayAmICh+bVN0cmVhbU1hc2spOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhU3RyZWFtcyAmIGluZGV4VG9UeXBlKGopKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXS0+cXVldWVBY2Nlc3NVbml0KGNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcigvKnN3YXAqLyBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5ldyBmZXRjaGVyIG1pZ2h0IGJlIHByb3ZpZGluZyBzdHJlYW1zIHRoYXQgdXNlZCB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZWQgYnkgdHdvIGRpZmZlcmVudCBmZXRjaGVycywgIGlmIG9uZSBvZiB0aGUgZmV0Y2hlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF1c2VkIGluIHRoZSBtaWRkbGUgd2hpbGUgdGhlIG90aGVyIHNvbWVob3cgcGF1c2VkIGluIG5leHQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZywgd2UgaGF2ZSB0byBzdGFydCBmcm9tIG5leHQgc2VnLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZWtNb2RlIDwgbVN0cmVhbXNbal0ubVNlZWtNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vla01vZGUgPSBtU3RyZWFtc1tqXS5tU2Vla01vZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0xNTUxLDU0ICsxODk5LDEwNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgQUxPR1YoIltmZXRjaGVyLSVkXSBzdGFydEFzeW5jOiBzdGFydFRpbWVVcyAlbGxkIG1MYXN0U2Vla1RpbWVVcyAlbGxkICIKKyAgICAgICAgICAgICAgICAic2VnbWVudFN0YXJ0VGltZVVzICVsbGQgc2Vla01vZGUgJWQiLAorICAgICAgICAgICAgICAgIGZldGNoZXItPmdldEZldGNoZXJJRCgpLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc3RhcnRUaW1lLm1UaW1lVXMsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltTGFzdFNlZWtUaW1lVXMsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzdGFydFRpbWUuZ2V0U2VnbWVudFRpbWVVcygpLAorICAgICAgICAgICAgICAgIHNlZWtNb2RlKTsKKworICAgICAgICAvLyBTZXQgdGhlIHRhcmdldCBzZWdtZW50IHN0YXJ0IHRpbWUgdG8gdGhlIG1pZGRsZSBwb2ludCBvZiB0aGUKKyAgICAgICAgLy8gc2VnbWVudCB3aGVyZSB0aGUgbGFzdCBzYW1wbGUgd2FzLgorICAgICAgICAvLyBUaGlzIGdpdmVzIGEgYmV0dGVyIGd1ZXNzIGlmIHNlZ21lbnRzIG9mIHRoZSB0d28gdmFyaWFudHMgYXJlIG5vdAorICAgICAgICAvLyBwZXJmZWN0bHkgYWxpZ25lZC4gKElmIHRoZSBjb3JyZXNwb25kaW5nIHNlZ21lbnQgaW4gbmV3IHZhcmlhbnQKKyAgICAgICAgLy8gc3RhcnRzIHNsaWdodGx5IGxhdGVyIHRoYW4gdGhhdCBpbiB0aGUgb2xkIHZhcmlhbnQsIHdlIHN0aWxsIHdhbnQKKyAgICAgICAgLy8gdG8gcGljayB0aGF0IHNlZ21lbnQsIG5vdCB0aGUgb25lIGJlZm9yZSkKICAgICAgICAgZmV0Y2hlci0+c3RhcnRBc3luYygKICAgICAgICAgICAgICAgICBzb3VyY2VzW2tBdWRpb0luZGV4XSwKICAgICAgICAgICAgICAgICBzb3VyY2VzW2tWaWRlb0luZGV4XSwKICAgICAgICAgICAgICAgICBzb3VyY2VzW2tTdWJ0aXRsZUluZGV4XSwKLSAgICAgICAgICAgICAgICBzdGFydFRpbWVVcyA8IDAgPyBtTGFzdFNlZWtUaW1lVXMgOiBzdGFydFRpbWVVcywKLSAgICAgICAgICAgICAgICBzZWdtZW50U3RhcnRUaW1lVXMsCi0gICAgICAgICAgICAgICAgZGlzY29udGludWl0eVNlcSwKLSAgICAgICAgICAgICAgICBzd2l0Y2hpbmcpOworICAgICAgICAgICAgICAgIGdldE1ldGFkYXRhU291cmNlKHNvdXJjZXMsIG1OZXdTdHJlYW1NYXNrLCBzd2l0Y2hpbmcpLAorICAgICAgICAgICAgICAgIHN0YXJ0VGltZS5tVGltZVVzIDwgMCA/IG1MYXN0U2Vla1RpbWVVcyA6IHN0YXJ0VGltZS5tVGltZVVzLAorICAgICAgICAgICAgICAgIHN0YXJ0VGltZS5nZXRTZWdtZW50VGltZVVzKCksCisgICAgICAgICAgICAgICAgc3RhcnRUaW1lLm1TZXEsCisgICAgICAgICAgICAgICAgc2Vla01vZGUpOwogICAgIH0KIAogICAgIC8vIEFsbCBmZXRjaGVycyBoYXZlIG5vdyBiZWVuIHN0YXJ0ZWQsIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZQogICAgIC8vIGhhcyBjb21wbGV0ZWQuCiAKLSAgICBjYW5jZWxDaGVja0JhbmR3aWR0aEV2ZW50KCk7Ci0gICAgc2NoZWR1bGVDaGVja0JhbmR3aWR0aEV2ZW50KCk7Ci0KLSAgICBBTE9HVigiWFhYIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGNvbXBsZXRlZC4iKTsKICAgICBtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcyA9IGZhbHNlOwogICAgIGlmIChzd2l0Y2hpbmcpIHsKICAgICAgICAgbVN3aXRjaEluUHJvZ3Jlc3MgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdHJlYW1NYXNrID0gbU5ld1N0cmVhbU1hc2s7CisgICAgICAgIGlmIChtT3JpZ0JhbmR3aWR0aEluZGV4ICE9IG1DdXJCYW5kd2lkdGhJbmRleCkgeworICAgICAgICAgICAgQUxPR1YoIiMjIyMgRmluaXNoZWQgQmFuZHdpZHRoIFN3aXRjaCBFYXJseTogJXpkID0+ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgIG1PcmlnQmFuZHdpZHRoSW5kZXgsIG1DdXJCYW5kd2lkdGhJbmRleCk7CisgICAgICAgICAgICBtT3JpZ0JhbmR3aWR0aEluZGV4ID0gbUN1ckJhbmR3aWR0aEluZGV4OworICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG1EaXNjb25uZWN0UmVwbHlJRCAhPSAwKSB7CisgICAgQUxPR1YoIm9uQ2hhbmdlQ29uZmlndXJhdGlvbjM6IG1Td2l0Y2hJblByb2dyZXNzICVkLCBtU3RyZWFtTWFzayAweCV4IiwKKyAgICAgICAgICAgIG1Td2l0Y2hJblByb2dyZXNzLCBtU3RyZWFtTWFzayk7CisKKyAgICBpZiAobURpc2Nvbm5lY3RSZXBseUlEICE9IE5VTEwpIHsKICAgICAgICAgZmluaXNoRGlzY29ubmVjdCgpOwogICAgIH0KIH0KIAotdm9pZCBMaXZlU2Vzc2lvbjo6b25Td2FwcGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50MzJfdCBzd2l0Y2hHZW5lcmF0aW9uOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzd2l0Y2hHZW5lcmF0aW9uIiwgJnN3aXRjaEdlbmVyYXRpb24pKTsKLSAgICBpZiAoc3dpdGNoR2VuZXJhdGlvbiAhPSBtU3dpdGNoR2VuZXJhdGlvbikgewordm9pZCBMaXZlU2Vzc2lvbjo6c3dhcFBhY2tldFNvdXJjZShTdHJlYW1UeXBlIHN0cmVhbSkgeworICAgIEFMT0dWKCJbJXNdIHN3YXBQYWNrZXRTb3VyY2UiLCBnZXROYW1lRm9yU3RyZWFtKHN0cmVhbSkpOworCisgICAgLy8gdHJhbnNmZXIgcGFja2V0cyBmcm9tIHNvdXJjZTIgdG8gc291cmNlCisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmFwcyA9IG1QYWNrZXRTb3VyY2VzLmVkaXRWYWx1ZUZvcihzdHJlYW0pOworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZhcHMyID0gbVBhY2tldFNvdXJjZXMyLmVkaXRWYWx1ZUZvcihzdHJlYW0pOworCisgICAgLy8gcXVldWUgZGlzY29udGludWl0eSBpbiBtUGFja2V0U291cmNlCisgICAgYXBzLT5xdWV1ZURpc2NvbnRpbnVpdHkoQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVF9PTkxZLCBOVUxMLCBmYWxzZSk7CisKKyAgICAvLyBxdWV1ZSBwYWNrZXRzIGluIG1QYWNrZXRTb3VyY2UyIHRvIG1QYWNrZXRTb3VyY2UKKyAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdCA9IE9LOworICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7CisgICAgd2hpbGUgKGFwczItPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpICYmIGZpbmFsUmVzdWx0ID09IE9LICYmCisgICAgICAgICAgT0sgPT0gYXBzMi0+ZGVxdWV1ZUFjY2Vzc1VuaXQoJmFjY2Vzc1VuaXQpKSB7CisgICAgICAgIGFwcy0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgIH0KKyAgICBhcHMyLT5jbGVhcigpOworfQorCit2b2lkIExpdmVTZXNzaW9uOjp0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaChjb25zdCBBU3RyaW5nICZvbGRVcmkpIHsKKyAgICBpZiAoIW1Td2l0Y2hJblByb2dyZXNzKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpbnQzMl90IHN0cmVhbTsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic3RyZWFtIiwgJnN0cmVhbSkpOwotCi0gICAgc3NpemVfdCBpZHggPSB0eXBlVG9JbmRleChzdHJlYW0pOwotICAgIENIRUNLKGlkeCA+PSAwKTsKLSAgICBpZiAoKG1OZXdTdHJlYW1NYXNrICYgc3RyZWFtKSAmJiBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuZW1wdHkoKSkgewotICAgICAgICBBTE9HVygic3dhcHBpbmcgc3RyZWFtIHR5cGUgJWQgJXMgdG8gZW1wdHkgc3RyZWFtIiwgc3RyZWFtLCBtU3RyZWFtc1tpZHhdLm1VcmkuY19zdHIoKSk7CisgICAgc3NpemVfdCBpbmRleCA9IG1GZXRjaGVySW5mb3MuaW5kZXhPZktleShvbGRVcmkpOworICAgIGlmIChpbmRleCA8IDAgfHwgIW1GZXRjaGVySW5mb3NbaW5kZXhdLm1Ub0JlUmVtb3ZlZCkgeworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1TdHJlYW1zW2lkeF0ubVVyaSA9IG1TdHJlYW1zW2lkeF0ubU5ld1VyaTsKLSAgICBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuY2xlYXIoKTsKIAotICAgIG1Td2FwTWFzayAmPSB+c3RyZWFtOworICAgIC8vIFN3YXAgcGFja2V0IHNvdXJjZSBvZiBzdHJlYW1zIHByb3ZpZGVkIGJ5IG9sZCB2YXJpYW50CisgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwga01heFN0cmVhbXM7IGlkeCsrKSB7CisgICAgICAgIFN0cmVhbVR5cGUgc3RyZWFtID0gaW5kZXhUb1R5cGUoaWR4KTsKKyAgICAgICAgaWYgKChtU3dhcE1hc2sgJiBzdHJlYW0pICYmIChvbGRVcmkgPT0gbVN0cmVhbXNbaWR4XS5tVXJpKSkgeworICAgICAgICAgICAgc3dhcFBhY2tldFNvdXJjZShzdHJlYW0pOworCisgICAgICAgICAgICBpZiAoKG1OZXdTdHJlYW1NYXNrICYgc3RyZWFtKSAmJiBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzd2FwcGluZyBzdHJlYW0gdHlwZSAlZCAlcyB0byBlbXB0eSBzdHJlYW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBtU3RyZWFtc1tpZHhdLm1VcmkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1VcmkgPSBtU3RyZWFtc1tpZHhdLm1OZXdVcmk7CisgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuY2xlYXIoKTsKKworICAgICAgICAgICAgbVN3YXBNYXNrICY9IH5zdHJlYW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUF0KGluZGV4KS5tRmV0Y2hlci0+c3RvcEFzeW5jKGZhbHNlIC8qIGNsZWFyICovKTsKKworICAgIEFMT0dWKCJ0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaDogbVN3YXBNYXNrPTB4JXgiLCBtU3dhcE1hc2spOwogICAgIGlmIChtU3dhcE1hc2sgIT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTYwNiwxNTcgKzIwMDQsMzcyIEBACiAgICAgLy8gQ2hlY2sgaWYgbmV3IHZhcmlhbnQgY29udGFpbnMgZXh0cmEgc3RyZWFtcy4KICAgICB1aW50MzJfdCBleHRyYVN0cmVhbXMgPSBtTmV3U3RyZWFtTWFzayAmICh+bVN0cmVhbU1hc2spOwogICAgIHdoaWxlIChleHRyYVN0cmVhbXMpIHsKLSAgICAgICAgU3RyZWFtVHlwZSBleHRyYVN0cmVhbSA9IChTdHJlYW1UeXBlKSAoZXh0cmFTdHJlYW1zICYgfihleHRyYVN0cmVhbXMgLSAxKSk7Ci0gICAgICAgIHN3YXBQYWNrZXRTb3VyY2UoZXh0cmFTdHJlYW0pOwotICAgICAgICBleHRyYVN0cmVhbXMgJj0gfmV4dHJhU3RyZWFtOworICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbSA9IChTdHJlYW1UeXBlKSAoZXh0cmFTdHJlYW1zICYgfihleHRyYVN0cmVhbXMgLSAxKSk7CisgICAgICAgIGV4dHJhU3RyZWFtcyAmPSB+c3RyZWFtOwogCi0gICAgICAgIGlkeCA9IHR5cGVUb0luZGV4KGV4dHJhU3RyZWFtKTsKKyAgICAgICAgc3dhcFBhY2tldFNvdXJjZShzdHJlYW0pOworCisgICAgICAgIHNzaXplX3QgaWR4ID0gdHlwZVRvSW5kZXgoc3RyZWFtKTsKICAgICAgICAgQ0hFQ0soaWR4ID49IDApOwogICAgICAgICBpZiAobVN0cmVhbXNbaWR4XS5tTmV3VXJpLmVtcHR5KCkpIHsKICAgICAgICAgICAgIEFMT0dXKCJzd2FwcGluZyBleHRyYSBzdHJlYW0gdHlwZSAlZCAlcyB0byBlbXB0eSBzdHJlYW0iLAotICAgICAgICAgICAgICAgICAgICBleHRyYVN0cmVhbSwgbVN0cmVhbXNbaWR4XS5tVXJpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIG1TdHJlYW1zW2lkeF0ubVVyaS5jX3N0cigpKTsKICAgICAgICAgfQogICAgICAgICBtU3RyZWFtc1tpZHhdLm1VcmkgPSBtU3RyZWFtc1tpZHhdLm1OZXdVcmk7CiAgICAgICAgIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5jbGVhcigpOwogICAgIH0KIAotICAgIHRyeVRvRmluaXNoQmFuZHdpZHRoU3dpdGNoKCk7Ci19Ci0KLXZvaWQgTGl2ZVNlc3Npb246Om9uQ2hlY2tTd2l0Y2hEb3duKCkgewotICAgIGlmIChtU3dpdGNoRG93bk1vbml0b3IgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1Td2l0Y2hJblByb2dyZXNzIHx8IG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKSB7Ci0gICAgICAgIEFMT0dWKCJTd2l0Y2gvUmVjb25maWcgaW4gcHJvZ3Jlc3MsIGRlZmVyIHN3aXRjaCBkb3duIik7Ci0gICAgICAgIG1Td2l0Y2hEb3duTW9uaXRvci0+cG9zdCgxMDAwMDAwbGwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7Ci0gICAgICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb247Ci0gICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldFNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGkpKTsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBwYWNrZXRTb3VyY2UtPmdldExhdGVzdERlcXVldWVkTWV0YSgpOwotCi0gICAgICAgIGlmIChtZXRhICE9IE5VTEwgJiYgbWV0YS0+ZmluZEludDMyKCJ0YXJnZXREdXJhdGlvbiIsICZ0YXJnZXREdXJhdGlvbikgKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGJ1ZmZlcmVkRHVyYXRpb25VcyA9IHBhY2tldFNvdXJjZS0+Z2V0RXN0aW1hdGVkRHVyYXRpb25VcygpOwotICAgICAgICAgICAgaW50NjRfdCB0YXJnZXREdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb24gKiAxMDAwMDAwbGw7Ci0KLSAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPCB0YXJnZXREdXJhdGlvblVzIC8gMykgewotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTd2l0Y2hEb3duLCBpZCgpKSktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICAvLyBSZXN0YXJ0IG5ldyBmZXRjaGVyIChpdCB3YXMgcGF1c2VkIGFmdGVyIHRoZSBmaXJzdCA0N2sgYmxvY2spCisgICAgLy8gYW5kIGxldCBpdCBmZXRjaCBpbnRvIG1QYWNrZXRTb3VyY2VzIChub3QgbVBhY2tldFNvdXJjZXMyKQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgeworICAgICAgICBGZXRjaGVySW5mbyAmaW5mbyA9IG1GZXRjaGVySW5mb3MuZWRpdFZhbHVlQXQoaSk7CisgICAgICAgIGlmIChpbmZvLm1Ub0JlUmVzdW1lZCkgeworICAgICAgICAgICAgcmVzdW1lRmV0Y2hlcihtRmV0Y2hlckluZm9zLmtleUF0KGkpLCBtTmV3U3RyZWFtTWFzayk7CisgICAgICAgICAgICBpbmZvLm1Ub0JlUmVzdW1lZCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgbVN3aXRjaERvd25Nb25pdG9yLT5wb3N0KDEwMDAwMDBsbCk7CisgICAgQUxPR0koIiMjIyMgRmluaXNoZWQgQmFuZHdpZHRoIFN3aXRjaDogJXpkID0+ICV6ZCIsCisgICAgICAgICAgICBtT3JpZ0JhbmR3aWR0aEluZGV4LCBtQ3VyQmFuZHdpZHRoSW5kZXgpOworCisgICAgbVN0cmVhbU1hc2sgPSBtTmV3U3RyZWFtTWFzazsKKyAgICBtU3dpdGNoSW5Qcm9ncmVzcyA9IGZhbHNlOworICAgIG1PcmlnQmFuZHdpZHRoSW5kZXggPSBtQ3VyQmFuZHdpZHRoSW5kZXg7CisKKyAgICByZXN0YXJ0UG9sbEJ1ZmZlcmluZygpOwogfQogCi12b2lkIExpdmVTZXNzaW9uOjpvblN3aXRjaERvd24oKSB7Ci0gICAgaWYgKG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzIHx8IG1Td2l0Y2hJblByb2dyZXNzIHx8IG1DdXJCYW5kd2lkdGhJbmRleCA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IGJhbmR3aWR0aEluZGV4ID0gZ2V0QmFuZHdpZHRoSW5kZXgoKTsKLSAgICBpZiAoYmFuZHdpZHRoSW5kZXggPCBtQ3VyQmFuZHdpZHRoSW5kZXgpIHsKLSAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMSwgYmFuZHdpZHRoSW5kZXgsIGZhbHNlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQordm9pZCBMaXZlU2Vzc2lvbjo6c2NoZWR1bGVQb2xsQnVmZmVyaW5nKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQb2xsQnVmZmVyaW5nLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKTsKKyAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsKIH0KIAotLy8gTWFyayBzd2l0Y2ggZG9uZSB3aGVuOgotLy8gICAxLiBhbGwgb2xkIGJ1ZmZlcnMgYXJlIHN3YXBwZWQgb3V0Ci12b2lkIExpdmVTZXNzaW9uOjp0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaCgpIHsKK3ZvaWQgTGl2ZVNlc3Npb246OmNhbmNlbFBvbGxCdWZmZXJpbmcoKSB7CisgICAgKyttUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247CisgICAgbVByZXZCdWZmZXJQZXJjZW50YWdlID0gLTE7Cit9CisKK3ZvaWQgTGl2ZVNlc3Npb246OnJlc3RhcnRQb2xsQnVmZmVyaW5nKCkgeworICAgIGNhbmNlbFBvbGxCdWZmZXJpbmcoKTsKKyAgICBvblBvbGxCdWZmZXJpbmcoKTsKK30KKwordm9pZCBMaXZlU2Vzc2lvbjo6b25Qb2xsQnVmZmVyaW5nKCkgeworICAgIEFMT0dWKCJvblBvbGxCdWZmZXJpbmc6IG1Td2l0Y2hJblByb2dyZXNzICVkLCBtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcyAlZCwgIgorICAgICAgICAgICAgIm1JblByZXBhcmF0aW9uUGhhc2UgJWQsIG1DdXJCYW5kd2lkdGhJbmRleCAlemQsIG1TdHJlYW1NYXNrIDB4JXgiLAorICAgICAgICBtU3dpdGNoSW5Qcm9ncmVzcywgbVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MsCisgICAgICAgIG1JblByZXBhcmF0aW9uUGhhc2UsIG1DdXJCYW5kd2lkdGhJbmRleCwgbVN0cmVhbU1hc2spOworCisgICAgYm9vbCB1bmRlcmZsb3csIHJlYWR5LCBkb3duLCB1cDsKKyAgICBpZiAoY2hlY2tCdWZmZXJpbmcodW5kZXJmbG93LCByZWFkeSwgZG93biwgdXApKSB7CisgICAgICAgIGlmIChtSW5QcmVwYXJhdGlvblBoYXNlKSB7CisgICAgICAgICAgICAvLyBBbGxvdyBkb3duIHN3aXRjaCBldmVuIGlmIHdlJ3JlIHN0aWxsIHByZXBhcmluZy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBTb21lIHN0cmVhbXMgaGF2ZSBhIGhpZ2ggYmFuZHdpZHRoIGluZGV4IGFzIGRlZmF1bHQsCisgICAgICAgICAgICAvLyB3aGVuIGJhbmR3aWR0aCBpcyBsb3csIGl0IHRha2VzIGEgbG9uZyB0aW1lIHRvIGJ1ZmZlcgorICAgICAgICAgICAgLy8gdG8gcmVhZHkgbWFyaywgdGhlbiBpdCBpbW1lZGlhdGVseSBwYXVzZXMgYWZ0ZXIgc3RhcnQKKyAgICAgICAgICAgIC8vIGFzIHdlIGhhdmUgdG8gZG8gYSBkb3duIHN3aXRjaC4gSXQncyBiZXR0ZXIgZXhwZXJpZW5jZQorICAgICAgICAgICAgLy8gdG8gcmVzdGFydCBmcm9tIGEgbG93ZXIgaW5kZXgsIGlmIHdlIGRldGVjdCBsb3cgYncuCisgICAgICAgICAgICBpZiAoIXN3aXRjaEJhbmR3aWR0aElmTmVlZGVkKGZhbHNlIC8qIHVwICovLCBkb3duKSAmJiByZWFkeSkgeworICAgICAgICAgICAgICAgIHBvc3RQcmVwYXJlZChPSyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1JblByZXBhcmF0aW9uUGhhc2UpIHsKKyAgICAgICAgICAgIGlmIChyZWFkeSkgeworICAgICAgICAgICAgICAgIHN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh1bmRlcmZsb3cpIHsKKyAgICAgICAgICAgICAgICBzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2hCYW5kd2lkdGhJZk5lZWRlZCh1cCwgZG93bik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKK30KKwordm9pZCBMaXZlU2Vzc2lvbjo6Y2FuY2VsQmFuZHdpZHRoU3dpdGNoKGJvb2wgcmVzdW1lKSB7CisgICAgQUxPR1YoImNhbmNlbEJhbmR3aWR0aFN3aXRjaDogbVN3aXRjaEdlbiglZCkrKywgb3JpZyAlemQsIGN1ciAlemQiLAorICAgICAgICAgICAgbVN3aXRjaEdlbmVyYXRpb24sIG1PcmlnQmFuZHdpZHRoSW5kZXgsIG1DdXJCYW5kd2lkdGhJbmRleCk7CiAgICAgaWYgKCFtU3dpdGNoSW5Qcm9ncmVzcykgewogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgYm9vbCBuZWVkVG9SZW1vdmVGZXRjaGVycyA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAobUZldGNoZXJJbmZvcy52YWx1ZUF0KGkpLm1Ub0JlUmVtb3ZlZCkgewotICAgICAgICAgICAgbmVlZFRvUmVtb3ZlRmV0Y2hlcnMgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIW5lZWRUb1JlbW92ZUZldGNoZXJzICYmIG1Td2FwTWFzayA9PSAwKSB7Ci0gICAgICAgIEFMT0dJKCJtU3dpdGNoSW5Qcm9ncmVzcyA9IGZhbHNlIik7Ci0gICAgICAgIG1TdHJlYW1NYXNrID0gbU5ld1N0cmVhbU1hc2s7Ci0gICAgICAgIG1Td2l0Y2hJblByb2dyZXNzID0gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkIExpdmVTZXNzaW9uOjpzY2hlZHVsZUNoZWNrQmFuZHdpZHRoRXZlbnQoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENoZWNrQmFuZHdpZHRoLCBpZCgpKTsKLSAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNoZWNrQmFuZHdpZHRoR2VuZXJhdGlvbik7Ci0gICAgbXNnLT5wb3N0KDEwMDAwMDAwbGwpOwotfQotCi12b2lkIExpdmVTZXNzaW9uOjpjYW5jZWxDaGVja0JhbmR3aWR0aEV2ZW50KCkgewotICAgICsrbUNoZWNrQmFuZHdpZHRoR2VuZXJhdGlvbjsKLX0KLQotdm9pZCBMaXZlU2Vzc2lvbjo6Y2FuY2VsQmFuZHdpZHRoU3dpdGNoKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Td2FwTXV0ZXgpOwotICAgIG1Td2l0Y2hHZW5lcmF0aW9uKys7Ci0gICAgbVN3aXRjaEluUHJvZ3Jlc3MgPSBmYWxzZTsKLSAgICBtU3dhcE1hc2sgPSAwOwotCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmV0Y2hlckluZm9zLnNpemUoKTsgKytpKSB7CiAgICAgICAgIEZldGNoZXJJbmZvJiBpbmZvID0gbUZldGNoZXJJbmZvcy5lZGl0VmFsdWVBdChpKTsKICAgICAgICAgaWYgKGluZm8ubVRvQmVSZW1vdmVkKSB7CiAgICAgICAgICAgICBpbmZvLm1Ub0JlUmVtb3ZlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHJlc3VtZSkgeworICAgICAgICAgICAgICAgIHJlc3VtZUZldGNoZXIobUZldGNoZXJJbmZvcy5rZXlBdChpKSwgbVN3YXBNYXNrKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgewotICAgICAgICBpZiAoIW1TdHJlYW1zW2ldLm1OZXdVcmkuZW1wdHkoKSkgewotICAgICAgICAgICAgc3NpemVfdCBqID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KG1TdHJlYW1zW2ldLm1OZXdVcmkpOwotICAgICAgICAgICAgaWYgKGogPCAwKSB7Ci0gICAgICAgICAgICAgICAgbVN0cmVhbXNbaV0ubU5ld1VyaS5jbGVhcigpOworICAgICAgICBBU3RyaW5nIG5ld1VyaSA9IG1TdHJlYW1zW2ldLm1OZXdVcmk7CisgICAgICAgIGlmICghbmV3VXJpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIGNsZWFyIGFsbCBtTmV3VXJpIG1hdGNoaW5nIHRoaXMgbmV3VXJpCisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gaTsgaiA8IGtNYXhTdHJlYW1zOyArK2opIHsKKyAgICAgICAgICAgICAgICBpZiAobVN0cmVhbXNbal0ubU5ld1VyaSA9PSBuZXdVcmkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXNbal0ubU5ld1VyaS5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJzdG9wcGluZyBuZXdVcmkgPSAlcyIsIG5ld1VyaS5jX3N0cigpKTsKKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtRmV0Y2hlckluZm9zLmluZGV4T2ZLZXkobmV3VXJpKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCBmaW5kIGZldGNoZXIgZm9yIG5ld1VyaTogJXMiLCBuZXdVcmkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvbnN0IEZldGNoZXJJbmZvICZpbmZvID0gbUZldGNoZXJJbmZvcy52YWx1ZUF0KGopOworICAgICAgICAgICAgRmV0Y2hlckluZm8gJmluZm8gPSBtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgIGluZm8ubVRvQmVSZW1vdmVkID0gdHJ1ZTsKICAgICAgICAgICAgIGluZm8ubUZldGNoZXItPnN0b3BBc3luYygpOwotICAgICAgICAgICAgbUZldGNoZXJJbmZvcy5yZW1vdmVJdGVtc0F0KGopOwotICAgICAgICAgICAgbVN0cmVhbXNbaV0ubU5ld1VyaS5jbGVhcigpOwogICAgICAgICB9CiAgICAgfQorCisgICAgQUxPR0koIiMjIyMgQ2FuY2VsZWQgQmFuZHdpZHRoIFN3aXRjaDogJXpkID0+ICV6ZCIsCisgICAgICAgICAgICBtT3JpZ0JhbmR3aWR0aEluZGV4LCBtQ3VyQmFuZHdpZHRoSW5kZXgpOworCisgICAgbVN3aXRjaEdlbmVyYXRpb24rKzsKKyAgICBtU3dpdGNoSW5Qcm9ncmVzcyA9IGZhbHNlOworICAgIG1DdXJCYW5kd2lkdGhJbmRleCA9IG1PcmlnQmFuZHdpZHRoSW5kZXg7CisgICAgbVN3YXBNYXNrID0gMDsKIH0KIAotYm9vbCBMaXZlU2Vzc2lvbjo6Y2FuU3dpdGNoQmFuZHdpZHRoVG8oc2l6ZV90IGJhbmR3aWR0aEluZGV4KSB7Ci0gICAgaWYgKG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzIHx8IG1Td2l0Y2hJblByb2dyZXNzKSB7Citib29sIExpdmVTZXNzaW9uOjpjaGVja0J1ZmZlcmluZygKKyAgICAgICAgYm9vbCAmdW5kZXJmbG93LCBib29sICZyZWFkeSwgYm9vbCAmZG93biwgYm9vbCAmdXApIHsKKyAgICB1bmRlcmZsb3cgPSByZWFkeSA9IGRvd24gPSB1cCA9IGZhbHNlOworCisgICAgaWYgKG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKSB7CisgICAgICAgIEFMT0dWKCJTd2l0Y2gvUmVjb25maWcgaW4gcHJvZ3Jlc3MsIGRlZmVyIGJ1ZmZlciBwb2xsaW5nIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAobUN1ckJhbmR3aWR0aEluZGV4IDwgMCkgeworICAgIHNpemVfdCBhY3RpdmVDb3VudCwgdW5kZXJmbG93Q291bnQsIHJlYWR5Q291bnQsIGRvd25Db3VudCwgdXBDb3VudDsKKyAgICBhY3RpdmVDb3VudCA9IHVuZGVyZmxvd0NvdW50ID0gcmVhZHlDb3VudCA9IGRvd25Db3VudCA9IHVwQ291bnQgPTA7CisgICAgaW50MzJfdCBtaW5CdWZmZXJQZXJjZW50ID0gLTE7CisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIGlmIChnZXREdXJhdGlvbigmZHVyYXRpb25VcykgIT0gT0spIHsKKyAgICAgICAgZHVyYXRpb25VcyA9IC0xOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgIC8vIHdlIGRvbid0IGNoZWNrIHN1YnRpdGxlcyBmb3IgYnVmZmVyaW5nIGxldmVsCisgICAgICAgIGlmICghKG1TdHJlYW1NYXNrICYgbVBhY2tldFNvdXJjZXMua2V5QXQoaSkKKyAgICAgICAgICAgICAgICAmIChTVFJFQU1UWVBFX0FVRElPIHwgU1RSRUFNVFlQRV9WSURFTykpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBpZ25vcmUgc3RyZWFtcyB0aGF0IG5ldmVyIGhhZCBhbnkgcGFja2V0IHF1ZXVlZC4KKyAgICAgICAgLy8gKGl0J3MgcG9zc2libGUgdGhhdCB0aGUgdmFyaWFudCBvbmx5IGhhcyBhdWRpbyBvciB2aWRlbykKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBtUGFja2V0U291cmNlc1tpXS0+Z2V0TGF0ZXN0RW5xdWV1ZWRNZXRhKCk7CisgICAgICAgIGlmIChtZXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CisgICAgICAgIGludDY0X3QgYnVmZmVyZWREdXJhdGlvblVzID0KKyAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlc1tpXS0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZmaW5hbFJlc3VsdCk7CisgICAgICAgIEFMT0dWKCJbJXNdIGJ1ZmZlcmVkICVsbGQgdXMiLAorICAgICAgICAgICAgICAgIGdldE5hbWVGb3JTdHJlYW0obVBhY2tldFNvdXJjZXMua2V5QXQoaSkpLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpYnVmZmVyZWREdXJhdGlvblVzKTsKKyAgICAgICAgaWYgKGR1cmF0aW9uVXMgPj0gMCkgeworICAgICAgICAgICAgaW50MzJfdCBwZXJjZW50OworICAgICAgICAgICAgaWYgKG1QYWNrZXRTb3VyY2VzW2ldLT5pc0ZpbmlzaGVkKDAgLyogZHVyYXRpb24gKi8pKSB7CisgICAgICAgICAgICAgICAgcGVyY2VudCA9IDEwMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGVyY2VudCA9IChpbnQzMl90KSgxMDAuMCAqCisgICAgICAgICAgICAgICAgICAgICAgICAobUxhc3REZXF1ZXVlZFRpbWVVcyArIGJ1ZmZlcmVkRHVyYXRpb25VcykgLyBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtaW5CdWZmZXJQZXJjZW50IDwgMCB8fCBwZXJjZW50IDwgbWluQnVmZmVyUGVyY2VudCkgeworICAgICAgICAgICAgICAgIG1pbkJ1ZmZlclBlcmNlbnQgPSBwZXJjZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKythY3RpdmVDb3VudDsKKyAgICAgICAgaW50NjRfdCByZWFkeU1hcmsgPSBtSW5QcmVwYXJhdGlvblBoYXNlID8ga1ByZXBhcmVNYXJrVXMgOiBrUmVhZHlNYXJrVXM7CisgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPiByZWFkeU1hcmsKKyAgICAgICAgICAgICAgICB8fCBtUGFja2V0U291cmNlc1tpXS0+aXNGaW5pc2hlZCgwKSkgeworICAgICAgICAgICAgKytyZWFkeUNvdW50OworICAgICAgICB9CisgICAgICAgIGlmICghbVBhY2tldFNvdXJjZXNbaV0tPmlzRmluaXNoZWQoMCkpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPCBrVW5kZXJmbG93TWFya1VzKSB7CisgICAgICAgICAgICAgICAgKyt1bmRlcmZsb3dDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPiBtVXBTd2l0Y2hNYXJrKSB7CisgICAgICAgICAgICAgICAgKyt1cENvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA8IG1Eb3duU3dpdGNoTWFyaykgeworICAgICAgICAgICAgICAgICsrZG93bkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1pbkJ1ZmZlclBlcmNlbnQgPj0gMCkgeworICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUobWluQnVmZmVyUGVyY2VudCk7CisgICAgfQorCisgICAgaWYgKGFjdGl2ZUNvdW50ID4gMCkgeworICAgICAgICB1cCAgICAgICAgPSAodXBDb3VudCA9PSBhY3RpdmVDb3VudCk7CisgICAgICAgIGRvd24gICAgICA9IChkb3duQ291bnQgPiAwKTsKKyAgICAgICAgcmVhZHkgICAgID0gKHJlYWR5Q291bnQgPT0gYWN0aXZlQ291bnQpOworICAgICAgICB1bmRlcmZsb3cgPSAodW5kZXJmbG93Q291bnQgPiAwKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgaWYgKGJhbmR3aWR0aEluZGV4ID09IChzaXplX3QpbUN1ckJhbmR3aWR0aEluZGV4KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGJhbmR3aWR0aEluZGV4ID4gKHNpemVfdCltQ3VyQmFuZHdpZHRoSW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGNhblN3aXRjaFVwKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIExpdmVTZXNzaW9uOjpzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCkgeworICAgIEFMT0dWKCJzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5OiBtSW5QcmVwYXJhdGlvblBoYXNlPSVkLCBtQnVmZmVyaW5nPSVkIiwKKyAgICAgICAgICAgIG1JblByZXBhcmF0aW9uUGhhc2UsIG1CdWZmZXJpbmcpOworICAgIGlmICghbUJ1ZmZlcmluZykgeworICAgICAgICBtQnVmZmVyaW5nID0gdHJ1ZTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEJ1ZmZlcmluZ1N0YXJ0KTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAgICAgfQogfQogCi12b2lkIExpdmVTZXNzaW9uOjpvbkNoZWNrQmFuZHdpZHRoKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgc2l6ZV90IGJhbmR3aWR0aEluZGV4ID0gZ2V0QmFuZHdpZHRoSW5kZXgoKTsKLSAgICBpZiAoY2FuU3dpdGNoQmFuZHdpZHRoVG8oYmFuZHdpZHRoSW5kZXgpKSB7Ci0gICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oLTFsbCAvKiB0aW1lVXMgKi8sIGJhbmR3aWR0aEluZGV4KTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBDb21lIGJhY2sgYW5kIGNoZWNrIGFnYWluIDEwIHNlY29uZHMgbGF0ZXIgaW4gY2FzZSB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIG5vdy4KLSAgICAgICAgLy8gSWYgd2UgRE8gY2hhbmdlIGNvbmZpZ3VyYXRpb24sIG9uY2UgdGhhdCBjb21wbGV0ZXMgaXQnbGwgc2NoZWR1bGUgYSBuZXcKLSAgICAgICAgLy8gY2hlY2sgYmFuZHdpZHRoIGV2ZW50IHdpdGggYW4gaW5jcmVtZW50ZWQgbUNoZWNrQmFuZHdpZHRoR2VuZXJhdGlvbi4KLSAgICAgICAgbXNnLT5wb3N0KDEwMDAwMDAwbGwpOwordm9pZCBMaXZlU2Vzc2lvbjo6c3RvcEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCkgeworICAgIEFMT0dWKCJzdG9wQnVmZmVyaW5nSWZOZWNlc3Nhcnk6IG1JblByZXBhcmF0aW9uUGhhc2U9JWQsIG1CdWZmZXJpbmc9JWQiLAorICAgICAgICAgICAgbUluUHJlcGFyYXRpb25QaGFzZSwgbUJ1ZmZlcmluZyk7CisKKyAgICBpZiAobUJ1ZmZlcmluZykgeworICAgICAgICBtQnVmZmVyaW5nID0gZmFsc2U7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRCdWZmZXJpbmdFbmQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKICAgICB9CiB9CiAKK3ZvaWQgTGl2ZVNlc3Npb246Om5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShpbnQzMl90IHBlcmNlbnRhZ2UpIHsKKyAgICBpZiAocGVyY2VudGFnZSA8IG1QcmV2QnVmZmVyUGVyY2VudGFnZSkgeworICAgICAgICBwZXJjZW50YWdlID0gbVByZXZCdWZmZXJQZXJjZW50YWdlOworICAgIH0gZWxzZSBpZiAocGVyY2VudGFnZSA+IDEwMCkgeworICAgICAgICBwZXJjZW50YWdlID0gMTAwOworICAgIH0KKworICAgIG1QcmV2QnVmZmVyUGVyY2VudGFnZSA9IHBlcmNlbnRhZ2U7CisKKyAgICBBTE9HVigibm90aWZ5QnVmZmVyaW5nVXBkYXRlOiBwZXJjZW50YWdlPSVkJSUiLCBwZXJjZW50YWdlKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRCdWZmZXJpbmdVcGRhdGUpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInBlcmNlbnRhZ2UiLCBwZXJjZW50YWdlKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKworYm9vbCBMaXZlU2Vzc2lvbjo6dHJ5QmFuZHdpZHRoRmFsbGJhY2soKSB7CisgICAgaWYgKG1JblByZXBhcmF0aW9uUGhhc2UgfHwgbVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MpIHsKKyAgICAgICAgLy8gRG9uJ3QgdHJ5IGZhbGxiYWNrIGR1cmluZyBwcmVwYXJlIG9yIHJlY29uZmlnLgorICAgICAgICAvLyBJZiBlcnJvciBoYXBwZW5zIHRoZXJlLCBpdCdzIGxpa2VseSB1bnJlY292ZXJhYmxlLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtQ3VyQmFuZHdpZHRoSW5kZXggPiBtT3JpZ0JhbmR3aWR0aEluZGV4KSB7CisgICAgICAgIC8vIGlmIHdlJ3JlIHN3aXRjaGluZyB1cCwgc2ltcGx5IGNhbmNlbCBhbmQgcmVzdW1lIG9sZCB2YXJpYW50CisgICAgICAgIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCh0cnVlIC8qIHJlc3VtZSAqLyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGlmIHdlJ3JlIHN3aXRjaGluZyBkb3duLCB3ZSdyZSBsaWtlbHkgYWJvdXQgdG8gdW5kZXJmbG93IChpZgorICAgICAgICAvLyBub3QgYWxyZWFkeSB1bmRlcmZsb3dpbmcpLiB0cnkgdGhlIGxvd2VzdCB2aWFibGUgYmFuZHdpZHRoIGlmCisgICAgICAgIC8vIG5vdCBvbiB0aGF0IHZhcmlhbnQgYWxyZWFkeS4KKyAgICAgICAgc3NpemVfdCBsb3dlc3RWYWxpZCA9IGdldExvd2VzdFZhbGlkQmFuZHdpZHRoSW5kZXgoKTsKKyAgICAgICAgaWYgKG1DdXJCYW5kd2lkdGhJbmRleCA+IGxvd2VzdFZhbGlkKSB7CisgICAgICAgICAgICBjYW5jZWxCYW5kd2lkdGhTd2l0Y2goKTsKKyAgICAgICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oLTFsbCwgbG93ZXN0VmFsaWQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gcmV0dXJuIGZhbHNlIGlmIHdlIGNvdWxkbid0IGZpbmQgYW55IGZhbGxiYWNrCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKgorICogcmV0dXJucyB0cnVlIGlmIGEgYmFuZHdpZHRoIHN3aXRjaCBpcyBhY3R1YWxseSBuZWVkZWQgKGFuZCBzdGFydGVkKSwKKyAqIHJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK2Jvb2wgTGl2ZVNlc3Npb246OnN3aXRjaEJhbmR3aWR0aElmTmVlZGVkKGJvb2wgYnVmZmVySGlnaCwgYm9vbCBidWZmZXJMb3cpIHsKKyAgICAvLyBubyBuZWVkIHRvIGNoZWNrIGJhbmR3aWR0aCBpZiB3ZSBvbmx5IGhhdmUgMSBiYW5kd2lkdGggc2V0dGluZ3MKKyAgICBpZiAobUJhbmR3aWR0aEl0ZW1zLnNpemUoKSA8IDIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtU3dpdGNoSW5Qcm9ncmVzcykgeworICAgICAgICBpZiAobUJ1ZmZlcmluZykgeworICAgICAgICAgICAgdHJ5QmFuZHdpZHRoRmFsbGJhY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCBiYW5kd2lkdGhCcHMsIHNob3J0VGVybUJwczsKKyAgICBib29sIGlzU3RhYmxlOworICAgIGlmIChtQmFuZHdpZHRoRXN0aW1hdG9yLT5lc3RpbWF0ZUJhbmR3aWR0aCgKKyAgICAgICAgICAgICZiYW5kd2lkdGhCcHMsICZpc1N0YWJsZSwgJnNob3J0VGVybUJwcykpIHsKKyAgICAgICAgQUxPR1YoImJhbmR3aWR0aCBlc3RpbWF0ZWQgYXQgJS4yZiBrYnBzLCAiCisgICAgICAgICAgICAgICAgInN0YWJsZSAlZCwgc2hvcnRUZXJtQnBzICUuMmYga2JwcyIsCisgICAgICAgICAgICAgICAgYmFuZHdpZHRoQnBzIC8gMTAyNC4wZiwgaXNTdGFibGUsIHNob3J0VGVybUJwcyAvIDEwMjQuMGYpOworICAgICAgICBtTGFzdEJhbmR3aWR0aEJwcyA9IGJhbmR3aWR0aEJwczsKKyAgICAgICAgbUxhc3RCYW5kd2lkdGhTdGFibGUgPSBpc1N0YWJsZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigibm8gYmFuZHdpZHRoIGVzdGltYXRlLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCBjdXJCYW5kd2lkdGggPSBtQmFuZHdpZHRoSXRlbXMuaXRlbUF0KG1DdXJCYW5kd2lkdGhJbmRleCkubUJhbmR3aWR0aDsKKyAgICAvLyBjYW5Td2l0aERvd24gYW5kIGNhblN3aXRjaFVwIGNhbid0IGJvdGggYmUgdHJ1ZS4KKyAgICAvLyB3ZSBvbmx5IHdhbnQgdG8gc3dpdGNoIHVwIHdoZW4gbWVhc3VyZWQgYncgaXMgMTIwJSBoaWdoZXIgdGhhbiBjdXJyZW50IHZhcmlhbnQsCisgICAgLy8gYW5kIHdlIG9ubHkgd2FudCB0byBzd2l0Y2ggZG93biB3aGVuIG1lYXN1cmVkIGJ3IGlzIGJlbG93IGN1cnJlbnQgdmFyaWFudC4KKyAgICBib29sIGNhblN3aXRjaERvd24gPSBidWZmZXJMb3cKKyAgICAgICAgICAgICYmIChiYW5kd2lkdGhCcHMgPCAoaW50MzJfdCljdXJCYW5kd2lkdGgpOworICAgIGJvb2wgY2FuU3dpdGNoVXAgPSBidWZmZXJIaWdoCisgICAgICAgICAgICAmJiAoYmFuZHdpZHRoQnBzID4gKGludDMyX3QpY3VyQmFuZHdpZHRoICogMTIgLyAxMCk7CisKKyAgICBpZiAoY2FuU3dpdGNoRG93biB8fCBjYW5Td2l0Y2hVcCkgeworICAgICAgICAvLyBiYW5kd2lkdGggZXN0aW1hdGluZyBoYXMgc29tZSBkZWxheSwgaWYgd2UgaGF2ZSB0byBkb3duc3dpdGNoIHdoZW4KKyAgICAgICAgLy8gaXQgaGFzbid0IHN0YWJpbGl6ZWQsIHVzZSB0aGUgc2hvcnQgdGVybSB0byBndWVzcyByZWFsIGJhbmR3aWR0aCwKKyAgICAgICAgLy8gc2luY2UgaXQgbWF5IGJlIGRyb3BwaW5nIHRvbyBmYXN0LgorICAgICAgICAvLyAobm90ZSB0aGlzIGRvZXNuJ3QgYXBwbHkgdG8gdXBzd2l0Y2gsIGFsd2F5cyB1c2UgbG9uZ2VyIGF2ZXJhZ2UgdGhlcmUpCisgICAgICAgIGlmICghaXNTdGFibGUgJiYgY2FuU3dpdGNoRG93bikgeworICAgICAgICAgICAgaWYgKHNob3J0VGVybUJwcyA8IGJhbmR3aWR0aEJwcykgeworICAgICAgICAgICAgICAgIGJhbmR3aWR0aEJwcyA9IHNob3J0VGVybUJwczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgYmFuZHdpZHRoSW5kZXggPSBnZXRCYW5kd2lkdGhJbmRleChiYW5kd2lkdGhCcHMpOworCisgICAgICAgIC8vIGl0J3MgcG9zc2libGUgdGhhdCB3ZSdyZSBjaGVja2luZyBmb3IgY2FuU3dpdGNoVXAgY2FzZSwgYnV0IHRoZSByZXR1cm5lZAorICAgICAgICAvLyBiYW5kd2lkdGhJbmRleCBpcyA8IG1DdXJCYW5kd2lkdGhJbmRleCwgYXMgZ2V0QmFuZHdpZHRoSW5kZXgoKSBvbmx5IHVzZXMgNzAlCisgICAgICAgIC8vIG9mIG1lYXN1cmVkIGJ3LiBJbiB0aGF0IGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZywgc2luY2Ugd2UgaGF2ZQorICAgICAgICAvLyBib3RoIGVub3VnaCBidWZmZXIgYW5kIGVub3VnaCBidy4KKyAgICAgICAgaWYgKChjYW5Td2l0Y2hVcCAmJiBiYW5kd2lkdGhJbmRleCA+IG1DdXJCYW5kd2lkdGhJbmRleCkKKyAgICAgICAgIHx8IChjYW5Td2l0Y2hEb3duICYmIGJhbmR3aWR0aEluZGV4IDwgbUN1ckJhbmR3aWR0aEluZGV4KSkgeworICAgICAgICAgICAgLy8gaWYgbm90IHlldCBwcmVwYXJlZCwganVzdCByZXN0YXJ0IGFnYWluIHdpdGggbmV3IGJ3IGluZGV4LgorICAgICAgICAgICAgLy8gdGhpcyBpcyBmYXN0ZXIgYW5kIHBsYXliYWNrIGV4cGVyaWVuY2UgaXMgY2xlYW5lci4KKyAgICAgICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICAgICAgICAgIG1JblByZXBhcmF0aW9uUGhhc2UgPyAwIDogLTFsbCwgYmFuZHdpZHRoSW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIExpdmVTZXNzaW9uOjpwb3N0RXJyb3Ioc3RhdHVzX3QgZXJyKSB7CisgICAgLy8gaWYgd2UgcmVhY2hlZCBFT1MsIG5vdGlmeSBidWZmZXJpbmcgb2YgMTAwJQorICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUoMTAwKTsKKyAgICB9CisgICAgLy8gd2UnbGwgc3RvcCBidWZmZXIgcG9sbGluZyBub3csIGJlZm9yZSB0aGF0IG5vdGlmeQorICAgIC8vIHN0b3AgYnVmZmVyaW5nIHRvIHN0b3AgdGhlIHNwaW5uaW5nIGljb24KKyAgICBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKKyAgICBjYW5jZWxQb2xsQnVmZmVyaW5nKCk7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RXJyb3IpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKIHZvaWQgTGl2ZVNlc3Npb246OnBvc3RQcmVwYXJlZChzdGF0dXNfdCBlcnIpIHsKICAgICBDSEVDSyhtSW5QcmVwYXJhdGlvblBoYXNlKTsKIApAQCAtMTc2NCw2ICsyMzc3LDggQEAKICAgICBpZiAoZXJyID09IE9LIHx8IGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CiAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFByZXBhcmVkKTsKICAgICB9IGVsc2UgeworICAgICAgICBjYW5jZWxQb2xsQnVmZmVyaW5nKCk7CisKICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UHJlcGFyYXRpb25GYWlsZWQpOwogICAgICAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBlcnIpOwogICAgIH0KQEAgLTE3NzEsMTAgKzIzODYsOCBAQAogICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgbUluUHJlcGFyYXRpb25QaGFzZSA9IGZhbHNlOwotCi0gICAgbVN3aXRjaERvd25Nb25pdG9yID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hlY2tTd2l0Y2hEb3duLCBpZCgpKTsKLSAgICBtU3dpdGNoRG93bk1vbml0b3ItPnBvc3QoKTsKIH0KIAorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaAppbmRleCAyZDNhMjVhLi45MGQ1NmQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKQEAgLTIzLDQzICsyMyw2MiBAQAogCiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCisjaW5jbHVkZSAibXBlZzJ0cy9BVFNQYXJzZXIuaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBBUmVwbHlUb2tlbjsKIHN0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOwotc3RydWN0IERhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291cmNlOwogc3RydWN0IEhUVFBCYXNlOwogc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogc3RydWN0IExpdmVEYXRhU291cmNlOwogc3RydWN0IE0zVVBhcnNlcjsKIHN0cnVjdCBQbGF5bGlzdEZldGNoZXI7CitzdHJ1Y3QgSExTVGltZTsKK3N0cnVjdCBIVFRQRG93bmxvYWRlcjsKIAogc3RydWN0IExpdmVTZXNzaW9uIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBlbnVtIEZsYWdzIHsKICAgICAgICAgLy8gRG9uJ3QgbG9nIGFueSBVUkxzLgogICAgICAgICBrRmxhZ0luY29nbml0byA9IDEsCiAgICAgfTsKLSAgICBMaXZlU2Vzc2lvbigKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKIAogICAgIGVudW0gU3RyZWFtSW5kZXggewogICAgICAgICBrQXVkaW9JbmRleCAgICA9IDAsCiAgICAgICAgIGtWaWRlb0luZGV4ICAgID0gMSwKICAgICAgICAga1N1YnRpdGxlSW5kZXggPSAyLAogICAgICAgICBrTWF4U3RyZWFtcyAgICA9IDMsCisgICAgICAgIGtNZXRhRGF0YUluZGV4ID0gMywKKyAgICAgICAga051bVNvdXJjZXMgICAgPSA0LAogICAgIH07CiAKICAgICBlbnVtIFN0cmVhbVR5cGUgewogICAgICAgICBTVFJFQU1UWVBFX0FVRElPICAgICAgICA9IDEgPDwga0F1ZGlvSW5kZXgsCiAgICAgICAgIFNUUkVBTVRZUEVfVklERU8gICAgICAgID0gMSA8PCBrVmlkZW9JbmRleCwKICAgICAgICAgU1RSRUFNVFlQRV9TVUJUSVRMRVMgICAgPSAxIDw8IGtTdWJ0aXRsZUluZGV4LAorICAgICAgICBTVFJFQU1UWVBFX01FVEFEQVRBICAgICA9IDEgPDwga01ldGFEYXRhSW5kZXgsCiAgICAgfTsKKworICAgIGVudW0gU2Vla01vZGUgeworICAgICAgICBrU2Vla01vZGVFeGFjdFBvc2l0aW9uID0gMCwgLy8gdXNlZCBmb3Igc2Vla2luZworICAgICAgICBrU2Vla01vZGVOZXh0U2FtcGxlICAgID0gMSwgLy8gdXNlZCBmb3Igc2VhbWxlc3Mgc3dpdGNoaW5nCisgICAgICAgIGtTZWVrTW9kZU5leHRTZWdtZW50ICAgPSAyLCAvLyB1c2VkIGZvciBzZWFtbGVzcyBzd2l0Y2hpbmcKKyAgICB9OworCisgICAgTGl2ZVNlc3Npb24oCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSk7CisKKyAgICBpbnQ2NF90IGNhbGN1bGF0ZU1lZGlhVGltZVVzKGludDY0X3QgZmlyc3RUaW1lVXMsIGludDY0X3QgdGltZVVzLCBpbnQzMl90IGRpc2NvbnRpbnVpdHlTZXEpOwogICAgIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KFN0cmVhbVR5cGUgc3RyZWFtLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7CiAKICAgICBzdGF0dXNfdCBnZXRTdHJlYW1Gb3JtYXQoU3RyZWFtVHlwZSBzdHJlYW0sIHNwPEFNZXNzYWdlPiAqZm9ybWF0KTsKIAorICAgIHNwPEhUVFBEb3dubG9hZGVyPiBnZXRIVFRQRG93bmxvYWRlcigpOworCiAgICAgdm9pZCBjb25uZWN0QXN5bmMoCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOwpAQCAtNzgsMTggKzk3LDIxIEBACiAgICAgYm9vbCBpc1NlZWthYmxlKCkgY29uc3Q7CiAgICAgYm9vbCBoYXNEeW5hbWljRHVyYXRpb24oKSBjb25zdDsKIAorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRLZXlGb3JTdHJlYW0oU3RyZWFtVHlwZSB0eXBlKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZUZvclN0cmVhbShTdHJlYW1UeXBlIHR5cGUpOworICAgIHN0YXRpYyBBVFNQYXJzZXI6OlNvdXJjZVR5cGUgZ2V0U291cmNlVHlwZUZvclN0cmVhbShTdHJlYW1UeXBlIHR5cGUpOworCiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0U3RyZWFtc0NoYW5nZWQsCiAgICAgICAgIGtXaGF0RXJyb3IsCiAgICAgICAgIGtXaGF0UHJlcGFyZWQsCiAgICAgICAgIGtXaGF0UHJlcGFyYXRpb25GYWlsZWQsCisgICAgICAgIGtXaGF0QnVmZmVyaW5nU3RhcnQsCisgICAgICAgIGtXaGF0QnVmZmVyaW5nRW5kLAorICAgICAgICBrV2hhdEJ1ZmZlcmluZ1VwZGF0ZSwKKyAgICAgICAga1doYXRNZXRhZGF0YURldGVjdGVkLAogICAgIH07CiAKLSAgICAvLyBjcmVhdGUgYSBmb3JtYXQtY2hhbmdlIGRpc2NvbnRpbnVpdHkKLSAgICAvLwotICAgIC8vIHN3YXA6Ci0gICAgLy8gICB3aGV0aGVyIGlzIGZvcm1hdC1jaGFuZ2UgZGlzY29udGludWl0eSBzaG91bGQgdHJpZ2dlciBhIGJ1ZmZlciBzd2FwCi0gICAgc3A8QUJ1ZmZlcj4gY3JlYXRlRm9ybWF0Q2hhbmdlQnVmZmVyKGJvb2wgc3dhcCA9IHRydWUpOwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkxpdmVTZXNzaW9uKCk7CiAKQEAgLTEwMyw0NiArMTI1LDU2IEBACiAgICAgICAgIGtXaGF0RGlzY29ubmVjdCAgICAgICAgICAgICAgICAgPSAnZGlzYycsCiAgICAgICAgIGtXaGF0U2VlayAgICAgICAgICAgICAgICAgICAgICAgPSAnc2VlaycsCiAgICAgICAgIGtXaGF0RmV0Y2hlck5vdGlmeSAgICAgICAgICAgICAgPSAnbm90ZicsCi0gICAgICAgIGtXaGF0Q2hlY2tCYW5kd2lkdGggICAgICAgICAgICAgPSAnYm5kdycsCiAgICAgICAgIGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbiAgICAgICAgPSAnY2hDMCcsCiAgICAgICAgIGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjIgICAgICAgPSAnY2hDMicsCiAgICAgICAgIGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjMgICAgICAgPSAnY2hDMycsCi0gICAgICAgIGtXaGF0RmluaXNoRGlzY29ubmVjdDIgICAgICAgICAgPSAnZmluMicsCi0gICAgICAgIGtXaGF0U3dhcHBlZCAgICAgICAgICAgICAgICAgICAgPSAnc3dhcCcsCi0gICAgICAgIGtXaGF0Q2hlY2tTd2l0Y2hEb3duICAgICAgICAgICAgPSAnY2tTRCcsCi0gICAgICAgIGtXaGF0U3dpdGNoRG93biAgICAgICAgICAgICAgICAgPSAnc0R3bicsCisgICAgICAgIGtXaGF0UG9sbEJ1ZmZlcmluZyAgICAgICAgICAgICAgPSAncG9sbCcsCiAgICAgfTsKIAotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0JhbmR3aWR0aEhpc3RvcnlCeXRlczsKKyAgICAvLyBCYW5kd2lkdGggU3dpdGNoIE1hcmsgRGVmYXVsdHMKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrVXBTd2l0Y2hNYXJrVXM7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga0Rvd25Td2l0Y2hNYXJrVXM7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1VwU3dpdGNoTWFyZ2luVXM7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1Jlc3VtZVRocmVzaG9sZFVzOwogCisgICAgLy8gQnVmZmVyIFByZXBhcmUvUmVhZHkvVW5kZXJmbG93IE1hcmtzCisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1JlYWR5TWFya1VzOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtQcmVwYXJlTWFya1VzOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtVbmRlcmZsb3dNYXJrVXM7CisKKyAgICBzdHJ1Y3QgQmFuZHdpZHRoRXN0aW1hdG9yOwogICAgIHN0cnVjdCBCYW5kd2lkdGhJdGVtIHsKICAgICAgICAgc2l6ZV90IG1QbGF5bGlzdEluZGV4OwogICAgICAgICB1bnNpZ25lZCBsb25nIG1CYW5kd2lkdGg7CisgICAgICAgIGludDY0X3QgbUxhc3RGYWlsdXJlVXM7CiAgICAgfTsKIAogICAgIHN0cnVjdCBGZXRjaGVySW5mbyB7CiAgICAgICAgIHNwPFBsYXlsaXN0RmV0Y2hlcj4gbUZldGNoZXI7CiAgICAgICAgIGludDY0X3QgbUR1cmF0aW9uVXM7Ci0gICAgICAgIGJvb2wgbUlzUHJlcGFyZWQ7CiAgICAgICAgIGJvb2wgbVRvQmVSZW1vdmVkOworICAgICAgICBib29sIG1Ub0JlUmVzdW1lZDsKICAgICB9OwogCiAgICAgc3RydWN0IFN0cmVhbUl0ZW0gewogICAgICAgICBjb25zdCBjaGFyICptVHlwZTsKICAgICAgICAgQVN0cmluZyBtVXJpLCBtTmV3VXJpOworICAgICAgICBTZWVrTW9kZSBtU2Vla01vZGU7CiAgICAgICAgIHNpemVfdCBtQ3VyRGlzY29udGludWl0eVNlcTsKICAgICAgICAgaW50NjRfdCBtTGFzdERlcXVldWVkVGltZVVzOwogICAgICAgICBpbnQ2NF90IG1MYXN0U2FtcGxlRHVyYXRpb25VczsKICAgICAgICAgU3RyZWFtSXRlbSgpCi0gICAgICAgICAgICA6IG1UeXBlKCIiKSwKLSAgICAgICAgICAgICAgbUN1ckRpc2NvbnRpbnVpdHlTZXEoMCksCi0gICAgICAgICAgICAgIG1MYXN0RGVxdWV1ZWRUaW1lVXMoMCksCi0gICAgICAgICAgICAgIG1MYXN0U2FtcGxlRHVyYXRpb25VcygwKSB7fQorICAgICAgICAgICAgOiBTdHJlYW1JdGVtKCIiKSB7fQogICAgICAgICBTdHJlYW1JdGVtKGNvbnN0IGNoYXIgKnR5cGUpCiAgICAgICAgICAgICA6IG1UeXBlKHR5cGUpLAotICAgICAgICAgICAgICBtQ3VyRGlzY29udGludWl0eVNlcSgwKSwKLSAgICAgICAgICAgICAgbUxhc3REZXF1ZXVlZFRpbWVVcygwKSwKLSAgICAgICAgICAgICAgbUxhc3RTYW1wbGVEdXJhdGlvblVzKDApIHt9CisgICAgICAgICAgICAgIG1TZWVrTW9kZShrU2Vla01vZGVFeGFjdFBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICByZXNldCgpOworICAgICAgICAgICAgICB9CisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBtQ3VyRGlzY29udGludWl0eVNlcSA9IDA7CisgICAgICAgICAgICBtTGFzdERlcXVldWVkVGltZVVzID0gLTFsbDsKKyAgICAgICAgICAgIG1MYXN0U2FtcGxlRHVyYXRpb25VcyA9IDBsbDsKKyAgICAgICAgfQogICAgICAgICBBU3RyaW5nIHVyaUtleSgpIHsKICAgICAgICAgICAgIEFTdHJpbmcga2V5KG1UeXBlKTsKICAgICAgICAgICAgIGtleS5hcHBlbmQoIlVSSSIpOwpAQCAtMTU1LDE5ICsxODcsMjcgQEAKICAgICB1aW50MzJfdCBtRmxhZ3M7CiAgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKIAorICAgIGJvb2wgbUJ1ZmZlcmluZzsKICAgICBib29sIG1JblByZXBhcmF0aW9uUGhhc2U7Ci0gICAgYm9vbCBtQnVmZmVyaW5nW2tNYXhTdHJlYW1zXTsKKyAgICBpbnQzMl90IG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1QcmV2QnVmZmVyUGVyY2VudGFnZTsKIAotICAgIHNwPEhUVFBCYXNlPiBtSFRUUERhdGFTb3VyY2U7CiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUV4dHJhSGVhZGVyczsKIAogICAgIEFTdHJpbmcgbU1hc3RlclVSTDsKIAogICAgIFZlY3RvcjxCYW5kd2lkdGhJdGVtPiBtQmFuZHdpZHRoSXRlbXM7CiAgICAgc3NpemVfdCBtQ3VyQmFuZHdpZHRoSW5kZXg7CisgICAgc3NpemVfdCBtT3JpZ0JhbmR3aWR0aEluZGV4OworICAgIGludDMyX3QgbUxhc3RCYW5kd2lkdGhCcHM7CisgICAgYm9vbCBtTGFzdEJhbmR3aWR0aFN0YWJsZTsKKyAgICBzcDxCYW5kd2lkdGhFc3RpbWF0b3I+IG1CYW5kd2lkdGhFc3RpbWF0b3I7CiAKICAgICBzcDxNM1VQYXJzZXI+IG1QbGF5bGlzdDsKKyAgICBpbnQzMl90IG1NYXhXaWR0aDsKKyAgICBpbnQzMl90IG1NYXhIZWlnaHQ7CiAKKyAgICBzcDxBTG9vcGVyPiBtRmV0Y2hlckxvb3BlcjsKICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBGZXRjaGVySW5mbz4gbUZldGNoZXJJbmZvczsKICAgICB1aW50MzJfdCBtU3RyZWFtTWFzazsKIApAQCAtMTgwLDE3ICsyMjAsMTAgQEAKICAgICAvLyB3ZSB1c2UgdGhpcyB0byB0cmFjayByZWNvbmZpZ3VyYXRpb24gcHJvZ3Jlc3MuCiAgICAgdWludDMyX3QgbVN3YXBNYXNrOwogCi0gICAgS2V5ZWRWZWN0b3I8U3RyZWFtVHlwZSwgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gPiBtRGlzY29udGludWl0aWVzOwogICAgIEtleWVkVmVjdG9yPFN0cmVhbVR5cGUsIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ID4gbVBhY2tldFNvdXJjZXM7CiAgICAgLy8gQSBzZWNvbmQgc2V0IG9mIHBhY2tldCBzb3VyY2VzIHRoYXQgYnVmZmVyIGNvbnRlbnQgZm9yIHRoZSB2YXJpYW50IHdlJ3JlIHN3aXRjaGluZyB0by4KICAgICBLZXllZFZlY3RvcjxTdHJlYW1UeXBlLCBzcDxBbm90aGVyUGFja2V0U291cmNlPiA+IG1QYWNrZXRTb3VyY2VzMjsKIAotICAgIC8vIEEgbXV0ZXggdXNlZCB0byBzZXJpYWxpemUgdHdvIHNldHMgb2YgZXZlbnRzOgotICAgIC8vICogdGhlIHN3YXBwaW5nIG9mIHBhY2tldCBzb3VyY2VzIGluIGRlcXVldWVBY2Nlc3NVbml0IG9uIHRoZSBwbGF5ZXIgdGhyZWFkLCBBTkQKLSAgICAvLyAqIGEgZm9yY2VkIGJhbmR3aWR0aCBzd2l0Y2ggdGVybWluYXRpb24gaW4gY2FuY2VsU3dpdGNoIG9uIHRoZSBsaXZlIGxvb3Blci4KLSAgICBNdXRleCBtU3dhcE11dGV4OwotCi0gICAgaW50MzJfdCBtQ2hlY2tCYW5kd2lkdGhHZW5lcmF0aW9uOwogICAgIGludDMyX3QgbVN3aXRjaEdlbmVyYXRpb247CiAgICAgaW50MzJfdCBtU3VidGl0bGVHZW5lcmF0aW9uOwogCkBAIC0yMDMsODAgKzIzNiw3NiBAQAogCiAgICAgYm9vbCBtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzczsKICAgICBib29sIG1Td2l0Y2hJblByb2dyZXNzOwotICAgIHVpbnQzMl90IG1EaXNjb25uZWN0UmVwbHlJRDsKLSAgICB1aW50MzJfdCBtU2Vla1JlcGx5SUQ7CisgICAgaW50NjRfdCBtVXBTd2l0Y2hNYXJrOworICAgIGludDY0X3QgbURvd25Td2l0Y2hNYXJrOworICAgIGludDY0X3QgbVVwU3dpdGNoTWFyZ2luOworCisgICAgc3A8QVJlcGx5VG9rZW4+IG1EaXNjb25uZWN0UmVwbHlJRDsKKyAgICBzcDxBUmVwbHlUb2tlbj4gbVNlZWtSZXBseUlEOwogCiAgICAgYm9vbCBtRmlyc3RUaW1lVXNWYWxpZDsKICAgICBpbnQ2NF90IG1GaXJzdFRpbWVVczsKICAgICBpbnQ2NF90IG1MYXN0U2Vla1RpbWVVczsKLSAgICBzcDxBTWVzc2FnZT4gbVN3aXRjaERvd25Nb25pdG9yOworICAgIGJvb2wgbUhhc01ldGFkYXRhOworCiAgICAgS2V5ZWRWZWN0b3I8c2l6ZV90LCBpbnQ2NF90PiBtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVczsKICAgICBLZXllZFZlY3RvcjxzaXplX3QsIGludDY0X3Q+IG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVczsKIAogICAgIHNwPFBsYXlsaXN0RmV0Y2hlcj4gYWRkRmV0Y2hlcihjb25zdCBjaGFyICp1cmkpOwogCiAgICAgdm9pZCBvbkNvbm5lY3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHN0YXR1c190IG9uU2Vlayhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdm9pZCBvbkZpbmlzaERpc2Nvbm5lY3QyKCk7CisgICAgdm9pZCBvbk1hc3RlclBsYXlsaXN0RmV0Y2hlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvblNlZWsoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCi0gICAgLy8gSWYgZ2l2ZW4gYSBub24temVybyBibG9ja19zaXplIChkZWZhdWx0IDApLCBpdCBpcyB1c2VkIHRvIGNhcCB0aGUgbnVtYmVyIG9mCi0gICAgLy8gYnl0ZXMgcmVhZCBpbiBmcm9tIHRoZSBEYXRhU291cmNlLiBJZiBnaXZlbiBhIG5vbi1OVUxMIGJ1ZmZlciwgbmV3IGNvbnRlbnQKLSAgICAvLyBpcyByZWFkIGludG8gdGhlIGVuZC4KLSAgICAvLwotICAgIC8vIFRoZSBEYXRhU291cmNlIHdlIHJlYWQgZnJvbSBpcyByZXNwb25zaWJsZSBmb3Igc2lnbmFsaW5nIGVycm9yIG9yIEVPRiB0byBoZWxwIHVzCi0gICAgLy8gYnJlYWsgb3V0IG9mIHRoZSByZWFkIGxvb3AuIFRoZSBEYXRhU291cmNlIGNhbiBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyLCBzbwotICAgIC8vIHRoYXQgdGhlIGNhbGxlciBjYW4gcmV1c2UgaXQgZm9yIHN1YnNlcXVlbnQgZmV0Y2hlcyAod2l0aGluIHRoZSBpbml0aWFsbHkKLSAgICAvLyByZXF1ZXN0ZWQgcmFuZ2UpLgotICAgIC8vCi0gICAgLy8gRm9yIHJldXNlZCBIVFRQIHNvdXJjZXMsIHRoZSBjYWxsZXIgbXVzdCBkb3dubG9hZCBhIGZpbGUgc2VxdWVudGlhbGx5IHdpdGhvdXQKLSAgICAvLyBhbnkgb3ZlcmxhcHMgb3IgZ2FwcyB0byBwcmV2ZW50IHJlY29ubmVjdGlvbi4KLSAgICBzc2l6ZV90IGZldGNoRmlsZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgc3A8QUJ1ZmZlcj4gKm91dCwKLSAgICAgICAgICAgIC8qIHJlcXVlc3Qvb3BlbiBhIGZpbGUgc3RhcnRpbmcgYXQgcmFuZ2Vfb2Zmc2V0IGZvciByYW5nZV9sZW5ndGggYnl0ZXMgKi8KLSAgICAgICAgICAgIGludDY0X3QgcmFuZ2Vfb2Zmc2V0ID0gMCwgaW50NjRfdCByYW5nZV9sZW5ndGggPSAtMSwKLSAgICAgICAgICAgIC8qIGRvd25sb2FkIGJsb2NrIHNpemUgKi8KLSAgICAgICAgICAgIHVpbnQzMl90IGJsb2NrX3NpemUgPSAwLAotICAgICAgICAgICAgLyogcmV1c2UgRGF0YVNvdXJjZSBpZiBkb2luZyBwYXJ0aWFsIGZldGNoICovCi0gICAgICAgICAgICBzcDxEYXRhU291cmNlPiAqc291cmNlID0gTlVMTCwKLSAgICAgICAgICAgIFN0cmluZzggKmFjdHVhbFVybCA9IE5VTEwpOworICAgIGJvb2wgVXJpSXNTYW1lQXNJbmRleCggY29uc3QgQVN0cmluZyAmdXJpLCBpbnQzMl90IGluZGV4LCBib29sIG5ld1VyaSk7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZ2V0UGFja2V0U291cmNlRm9yU3RyZWFtSW5kZXgoc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgbmV3VXJpKTsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBnZXRNZXRhZGF0YVNvdXJjZSgKKyAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZXNba051bVNvdXJjZXNdLCB1aW50MzJfdCBzdHJlYW1NYXNrLCBib29sIG5ld1VyaSk7CiAKLSAgICBzcDxNM1VQYXJzZXI+IGZldGNoUGxheWxpc3QoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIHVpbnQ4X3QgKmN1clBsYXlsaXN0SGFzaCwgYm9vbCAqdW5jaGFuZ2VkKTsKKyAgICBib29sIHJlc3VtZUZldGNoZXIoCisgICAgICAgICAgICBjb25zdCBBU3RyaW5nICZ1cmksIHVpbnQzMl90IHN0cmVhbU1hc2ssCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IC0xbGwsIGJvb2wgbmV3VXJpID0gZmFsc2UpOwogCi0gICAgc2l6ZV90IGdldEJhbmR3aWR0aEluZGV4KCk7Ci0gICAgaW50NjRfdCBsYXRlc3RNZWRpYVNlZ21lbnRTdGFydFRpbWVVcygpOworICAgIGZsb2F0IGdldEFib3J0VGhyZXNob2xkKAorICAgICAgICAgICAgc3NpemVfdCBjdXJyZW50QldJbmRleCwgc3NpemVfdCB0YXJnZXRCV0luZGV4KSBjb25zdDsKKyAgICB2b2lkIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KHNpemVfdCBudW1CeXRlcywgaW50NjRfdCBkZWxheVVzKTsKKyAgICBzaXplX3QgZ2V0QmFuZHdpZHRoSW5kZXgoaW50MzJfdCBiYW5kd2lkdGhCcHMpOworICAgIHNzaXplX3QgZ2V0TG93ZXN0VmFsaWRCYW5kd2lkdGhJbmRleCgpIGNvbnN0OworICAgIEhMU1RpbWUgbGF0ZXN0TWVkaWFTZWdtZW50U3RhcnRUaW1lKCkgY29uc3Q7CiAKKyAgICBzdGF0aWMgYm9vbCBpc0JhbmR3aWR0aFZhbGlkKGNvbnN0IEJhbmR3aWR0aEl0ZW0gJml0ZW0pOwogICAgIHN0YXRpYyBpbnQgU29ydEJ5QmFuZHdpZHRoKGNvbnN0IEJhbmR3aWR0aEl0ZW0gKiwgY29uc3QgQmFuZHdpZHRoSXRlbSAqKTsKICAgICBzdGF0aWMgU3RyZWFtVHlwZSBpbmRleFRvVHlwZShpbnQgaWR4KTsKICAgICBzdGF0aWMgc3NpemVfdCB0eXBlVG9JbmRleChpbnQzMl90IHR5cGUpOwogCiAgICAgdm9pZCBjaGFuZ2VDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIHNpemVfdCBiYW5kd2lkdGhJbmRleCwgYm9vbCBwaWNrVHJhY2sgPSBmYWxzZSk7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgc3NpemVfdCBid0luZGV4ID0gLTEsIGJvb2wgcGlja1RyYWNrID0gZmFsc2UpOwogICAgIHZvaWQgb25DaGFuZ2VDb25maWd1cmF0aW9uKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25DaGFuZ2VDb25maWd1cmF0aW9uMyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdm9pZCBvblN3YXBwZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgb25DaGVja1N3aXRjaERvd24oKTsKLSAgICB2b2lkIG9uU3dpdGNoRG93bigpOwotICAgIHZvaWQgdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2goKTsKIAotICAgIHZvaWQgc2NoZWR1bGVDaGVja0JhbmR3aWR0aEV2ZW50KCk7Ci0gICAgdm9pZCBjYW5jZWxDaGVja0JhbmR3aWR0aEV2ZW50KCk7CisgICAgdm9pZCBzd2FwUGFja2V0U291cmNlKFN0cmVhbVR5cGUgc3RyZWFtKTsKKyAgICB2b2lkIHRyeVRvRmluaXNoQmFuZHdpZHRoU3dpdGNoKGNvbnN0IEFTdHJpbmcgJm9sZFVyaSk7CisgICAgdm9pZCBjYW5jZWxCYW5kd2lkdGhTd2l0Y2goYm9vbCByZXN1bWUgPSBmYWxzZSk7CisgICAgYm9vbCBjaGVja1N3aXRjaFByb2dyZXNzKAorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+ICZtc2csIGludDY0X3QgZGVsYXlVcywgYm9vbCAqbmVlZFJlc3VtZVVudGlsKTsKIAotICAgIC8vIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCBpcyBhdG9taWMgd3J0IHN3YXBQYWNrZXRTb3VyY2U7IGNhbGwgaXQgdG8gcHJldmVudCBwYWNrZXQgc291cmNlcwotICAgIC8vIGZyb20gYmVpbmcgc3dhcHBlZCBvdXQgb24gc3RhbGUgZGlzY29udGludWl0aWVzIHdoaWxlIG1hbmlwdWxhdGluZwotICAgIC8vIG1QYWNrZXRTb3VyY2VzL21QYWNrZXRTb3VyY2VzMi4KLSAgICB2b2lkIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCgpOworICAgIGJvb2wgc3dpdGNoQmFuZHdpZHRoSWZOZWVkZWQoYm9vbCBidWZmZXJIaWdoLCBib29sIGJ1ZmZlckxvdyk7CisgICAgYm9vbCB0cnlCYW5kd2lkdGhGYWxsYmFjaygpOwogCi0gICAgYm9vbCBjYW5Td2l0Y2hCYW5kd2lkdGhUbyhzaXplX3QgYmFuZHdpZHRoSW5kZXgpOwotICAgIHZvaWQgb25DaGVja0JhbmR3aWR0aChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKKyAgICB2b2lkIGNhbmNlbFBvbGxCdWZmZXJpbmcoKTsKKyAgICB2b2lkIHJlc3RhcnRQb2xsQnVmZmVyaW5nKCk7CisgICAgdm9pZCBvblBvbGxCdWZmZXJpbmcoKTsKKyAgICBib29sIGNoZWNrQnVmZmVyaW5nKGJvb2wgJnVuZGVyZmxvdywgYm9vbCAmcmVhZHksIGJvb2wgJmRvd24sIGJvb2wgJnVwKTsKKyAgICB2b2lkIHN0YXJ0QnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKKyAgICB2b2lkIHN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOworICAgIHZvaWQgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKGludDMyX3QgcGVyY2VudGFnZSk7CiAKICAgICB2b2lkIGZpbmlzaERpc2Nvbm5lY3QoKTsKIAogICAgIHZvaWQgcG9zdFByZXBhcmVkKHN0YXR1c190IGVycik7Ci0KLSAgICB2b2lkIHN3YXBQYWNrZXRTb3VyY2UoU3RyZWFtVHlwZSBzdHJlYW0pOwotICAgIGJvb2wgY2FuU3dpdGNoVXAoKTsKKyAgICB2b2lkIHBvc3RFcnJvcihzdGF0dXNfdCBlcnIpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTGl2ZVNlc3Npb24pOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCmluZGV4IDk5N2I2OTQuLmZmMmJiMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcApAQCAtMjUwLDcgKzI1MCwxMSBAQAogICAgICAgbUlzVmFyaWFudFBsYXlsaXN0KGZhbHNlKSwKICAgICAgIG1Jc0NvbXBsZXRlKGZhbHNlKSwKICAgICAgIG1Jc0V2ZW50KGZhbHNlKSwKKyAgICAgIG1GaXJzdFNlcU51bWJlcigtMSksCisgICAgICBtTGFzdFNlcU51bWJlcigtMSksCisgICAgICBtVGFyZ2V0RHVyYXRpb25VcygtMWxsKSwKICAgICAgIG1EaXNjb250aW51aXR5U2VxKDApLAorICAgICAgbURpc2NvbnRpbnVpdHlDb3VudCgwKSwKICAgICAgIG1TZWxlY3RlZEluZGV4KC0xKSB7CiAgICAgbUluaXRDaGVjayA9IHBhcnNlKGRhdGEsIHNpemUpOwogfQpAQCAtMjgyLDYgKzI4NiwxOSBAQAogICAgIHJldHVybiBtRGlzY29udGludWl0eVNlcTsKIH0KIAoraW50NjRfdCBNM1VQYXJzZXI6OmdldFRhcmdldER1cmF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBtVGFyZ2V0RHVyYXRpb25VczsKK30KKworaW50MzJfdCBNM1VQYXJzZXI6OmdldEZpcnN0U2VxTnVtYmVyKCkgY29uc3QgeworICAgIHJldHVybiBtRmlyc3RTZXFOdW1iZXI7Cit9CisKK3ZvaWQgTTNVUGFyc2VyOjpnZXRTZXFOdW1iZXJSYW5nZShpbnQzMl90ICpmaXJzdFNlcSwgaW50MzJfdCAqbGFzdFNlcSkgY29uc3QgeworICAgICpmaXJzdFNlcSA9IG1GaXJzdFNlcU51bWJlcjsKKyAgICAqbGFzdFNlcSA9IG1MYXN0U2VxTnVtYmVyOworfQorCiBzcDxBTWVzc2FnZT4gTTNVUGFyc2VyOjptZXRhKCkgewogICAgIHJldHVybiBtTWV0YTsKIH0KQEAgLTM5NCw3ICs0MTEsOSBAQAogCiBib29sIE0zVVBhcnNlcjo6Z2V0VHlwZVVSSShzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKmtleSwgQVN0cmluZyAqdXJpKSBjb25zdCB7CiAgICAgaWYgKCFtSXNWYXJpYW50UGxheWxpc3QpIHsKLSAgICAgICAgKnVyaSA9IG1CYXNlVVJJOworICAgICAgICBpZiAodXJpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICp1cmkgPSBtQmFzZVVSSTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIEFzc3VtZSBtZWRpYSB3aXRob3V0IGFueSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZSBjb250YWlucwogICAgICAgICAvLyBhdWRpbyBhbmQgdmlkZW8sIGJ1dCBubyBzdWJ0aXRsZXMuCkBAIC00MDcsNyArNDI2LDkgQEAKIAogICAgIEFTdHJpbmcgZ3JvdXBJRDsKICAgICBpZiAoIW1ldGEtPmZpbmRTdHJpbmcoa2V5LCAmZ3JvdXBJRCkpIHsKLSAgICAgICAgKnVyaSA9IG1JdGVtcy5pdGVtQXQoaW5kZXgpLm1VUkk7CisgICAgICAgIGlmICh1cmkgIT0gTlVMTCkgeworICAgICAgICAgICAgKnVyaSA9IG1JdGVtcy5pdGVtQXQoaW5kZXgpLm1VUkk7CisgICAgICAgIH0KIAogICAgICAgICBBU3RyaW5nIGNvZGVjczsKICAgICAgICAgaWYgKCFtZXRhLT5maW5kU3RyaW5nKCJjb2RlY3MiLCAmY29kZWNzKSkgewpAQCAtNDMzLDE4ICs0NTQsMjYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHNwPE1lZGlhR3JvdXA+IGdyb3VwID0gbU1lZGlhR3JvdXBzLnZhbHVlRm9yKGdyb3VwSUQpOwotICAgIGlmICghZ3JvdXAtPmdldEFjdGl2ZVVSSSh1cmkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisgICAgLy8gaWYgdXJpID09IE5VTEwsIHdlJ3JlIG9ubHkgY2hlY2tpbmcgaWYgdGhlIHR5cGUgaXMgcHJlc2VudCwKKyAgICAvLyBkb24ndCBjYXJlIGFib3V0IHRoZSBhY3RpdmUgVVJJIChvciBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgb25lKQorICAgIGlmICh1cmkgIT0gTlVMTCkgeworICAgICAgICBzcDxNZWRpYUdyb3VwPiBncm91cCA9IG1NZWRpYUdyb3Vwcy52YWx1ZUZvcihncm91cElEKTsKKyAgICAgICAgaWYgKCFncm91cC0+Z2V0QWN0aXZlVVJJKHVyaSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogCi0gICAgaWYgKCgqdXJpKS5lbXB0eSgpKSB7Ci0gICAgICAgICp1cmkgPSBtSXRlbXMuaXRlbUF0KGluZGV4KS5tVVJJOworICAgICAgICBpZiAoKCp1cmkpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICp1cmkgPSBtSXRlbXMuaXRlbUF0KGluZGV4KS5tVVJJOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgTTNVUGFyc2VyOjpoYXNUeXBlKHNpemVfdCBpbmRleCwgY29uc3QgY2hhciAqa2V5KSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGVVUkkoaW5kZXgsIGtleSwgTlVMTCAvKiB1cmkgKi8pOworfQorCiBzdGF0aWMgYm9vbCBNYWtlVVJMKGNvbnN0IGNoYXIgKmJhc2VVUkwsIGNvbnN0IGNoYXIgKnVybCwgQVN0cmluZyAqb3V0KSB7CiAgICAgb3V0LT5jbGVhcigpOwogCkBAIC01ODIsNiArNjExLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaXRlbU1ldGEgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGl0ZW1NZXRhLT5zZXRJbnQzMigiZGlzY29udGludWl0eSIsIHRydWUpOworICAgICAgICAgICAgICAgICsrbURpc2NvbnRpbnVpdHlDb3VudDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjRVhULVgtU1RSRUFNLUlORiIpKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1NZXRhICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKQEAgLTYwOSw2ICs2MzksOSBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiNFWFQtWC1NRURJQSIpKSB7CiAgICAgICAgICAgICAgICAgZXJyID0gcGFyc2VNZWRpYShsaW5lKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjRVhULVgtRElTQ09OVElOVUlUWS1TRVFVRU5DRSIpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Jc1ZhcmlhbnRQbGF5bGlzdCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzaXplX3Qgc2VxOwogICAgICAgICAgICAgICAgIGVyciA9IHBhcnNlRGlzY29udGludWl0eVNlcXVlbmNlKGxpbmUsICZzZXEpOwogICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKQEAgLTYyOCw2ICs2NjEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWl0ZW1NZXRhLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXRlbU1ldGEtPnNldEludDMyKCJkaXNjb250aW51aXR5LXNlcXVlbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EaXNjb250aW51aXR5U2VxICsgbURpc2NvbnRpbnVpdHlDb3VudCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1JdGVtcy5wdXNoKCk7CkBAIC02NDQsNiArNjc5LDI1IEBACiAgICAgICAgICsrbGluZU5vOwogICAgIH0KIAorICAgIC8vIGVycm9yIGNoZWNraW5nIG9mIGFsbCBmaWVsZHMgdGhhdCdzIHJlcXVpcmVkIHRvIGFwcGVhciBvbmNlCisgICAgLy8gKGN1cnJlbnRseSBvbmx5IGNoZWNraW5nICJ0YXJnZXQtZHVyYXRpb24iKSwgYW5kCisgICAgLy8gaW5pdGlhbGl6YXRpb24gb2YgcGxheWxpc3QgcHJvcGVydGllcyAoZWcuIG1UYXJnZXREdXJhdGlvblVzKQorICAgIGlmICghbUlzVmFyaWFudFBsYXlsaXN0KSB7CisgICAgICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb25TZWNzOworICAgICAgICBpZiAobU1ldGEgPT0gTlVMTCB8fCAhbU1ldGEtPmZpbmRJbnQzMigKKyAgICAgICAgICAgICAgICAidGFyZ2V0LWR1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uU2VjcykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZWRpYSBwbGF5bGlzdCBtaXNzaW5nICNFWFQtWC1UQVJHRVREVVJBVElPTiIpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBtVGFyZ2V0RHVyYXRpb25VcyA9IHRhcmdldER1cmF0aW9uU2VjcyAqIDEwMDAwMDBsbDsKKworICAgICAgICBtRmlyc3RTZXFOdW1iZXIgPSAwOworICAgICAgICBpZiAobU1ldGEgIT0gTlVMTCkgeworICAgICAgICAgICAgbU1ldGEtPmZpbmRJbnQzMigibWVkaWEtc2VxdWVuY2UiLCAmbUZpcnN0U2VxTnVtYmVyKTsKKyAgICAgICAgfQorICAgICAgICBtTGFzdFNlcU51bWJlciA9IG1GaXJzdFNlcU51bWJlciArIG1JdGVtcy5zaXplKCkgLSAxOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNzgxLDYgKzgzNSwyOSBAQAogICAgICAgICAgICAgICAgICptZXRhID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKCptZXRhKS0+c2V0U3RyaW5nKGtleS5jX3N0cigpLCBjb2RlY3MuY19zdHIoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoInJlc29sdXRpb24iLCBrZXkuY19zdHIoKSkpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMgPSB2YWwuY19zdHIoKTsKKyAgICAgICAgICAgIGNoYXIgKmVuZDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgd2lkdGggPSBzdHJ0b3VsKHMsICZlbmQsIDEwKTsKKworICAgICAgICAgICAgaWYgKGVuZCA9PSBzIHx8ICplbmQgIT0gJ3gnKSB7CisgICAgICAgICAgICAgICAgLy8gbWFsZm9ybWVkCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHMgPSBlbmQgKyAxOworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBoZWlnaHQgPSBzdHJ0b3VsKHMsICZlbmQsIDEwKTsKKworICAgICAgICAgICAgaWYgKGVuZCA9PSBzIHx8ICplbmQgIT0gJ1wwJykgeworICAgICAgICAgICAgICAgIC8vIG1hbGZvcm1lZAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWV0YS0+Z2V0KCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICptZXRhID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCptZXRhKS0+c2V0SW50MzIoIndpZHRoIiwgd2lkdGgpOworICAgICAgICAgICAgKCptZXRhKS0+c2V0SW50MzIoImhlaWdodCIsIGhlaWdodCk7CiAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoImF1ZGlvIiwga2V5LmNfc3RyKCkpCiAgICAgICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoInZpZGVvIiwga2V5LmNfc3RyKCkpCiAgICAgICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoInN1YnRpdGxlcyIsIGtleS5jX3N0cigpKSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuaAppbmRleCAxY2FkMDYwLi5mYTY0OGVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuaApAQCAtMzYsNiArMzYsOSBAQAogICAgIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0OwogICAgIGJvb2wgaXNFdmVudCgpIGNvbnN0OwogICAgIHNpemVfdCBnZXREaXNjb250aW51aXR5U2VxKCkgY29uc3Q7CisgICAgaW50NjRfdCBnZXRUYXJnZXREdXJhdGlvbigpIGNvbnN0OworICAgIGludDMyX3QgZ2V0Rmlyc3RTZXFOdW1iZXIoKSBjb25zdDsKKyAgICB2b2lkIGdldFNlcU51bWJlclJhbmdlKGludDMyX3QgKmZpcnN0U2VxLCBpbnQzMl90ICpsYXN0U2VxKSBjb25zdDsKIAogICAgIHNwPEFNZXNzYWdlPiBtZXRhKCk7CiAKQEAgLTUwLDYgKzUzLDcgQEAKICAgICBzc2l6ZV90IGdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSAvKiB0eXBlICovKSBjb25zdDsKIAogICAgIGJvb2wgZ2V0VHlwZVVSSShzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKmtleSwgQVN0cmluZyAqdXJpKSBjb25zdDsKKyAgICBib29sIGhhc1R5cGUoc2l6ZV90IGluZGV4LCBjb25zdCBjaGFyICprZXkpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TTNVUGFyc2VyKCk7CkBAIC02OSw3ICs3MywxMSBAQAogICAgIGJvb2wgbUlzVmFyaWFudFBsYXlsaXN0OwogICAgIGJvb2wgbUlzQ29tcGxldGU7CiAgICAgYm9vbCBtSXNFdmVudDsKKyAgICBpbnQzMl90IG1GaXJzdFNlcU51bWJlcjsKKyAgICBpbnQzMl90IG1MYXN0U2VxTnVtYmVyOworICAgIGludDY0X3QgbVRhcmdldER1cmF0aW9uVXM7CiAgICAgc2l6ZV90IG1EaXNjb250aW51aXR5U2VxOworICAgIGludDMyX3QgbURpc2NvbnRpbnVpdHlDb3VudDsKIAogICAgIHNwPEFNZXNzYWdlPiBtTWV0YTsKICAgICBWZWN0b3I8SXRlbT4gbUl0ZW1zOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKaW5kZXggMTIyNzYwMC4uNzJkODMyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCkBAIC0xNywyNCArMTcsMTkgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiUGxheWxpc3RGZXRjaGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KIAogI2luY2x1ZGUgIlBsYXlsaXN0RmV0Y2hlci5oIgotCi0jaW5jbHVkZSAiTGl2ZURhdGFTb3VyY2UuaCIKKyNpbmNsdWRlICJIVFRQRG93bmxvYWRlci5oIgogI2luY2x1ZGUgIkxpdmVTZXNzaW9uLmgiCiAjaW5jbHVkZSAiTTNVUGFyc2VyLmgiCi0KICNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgotI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKICNpbmNsdWRlICJpbmNsdWRlL0lEMy5oIgogI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgogCi0jaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTQyLDYzICszNywxNTYgQEAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorCisjZGVmaW5lIEZMT0dWKGZtdCwgLi4uKSBBTE9HVigiW2ZldGNoZXItJWRdICIgZm10LCBtRmV0Y2hlcklELCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBGU0xPR1Yoc3RyZWFtLCBmbXQsIC4uLikgQUxPR1YoIltmZXRjaGVyLSVkXSBbJXNdICIgZm10LCBtRmV0Y2hlcklELCBcCisgICAgICAgICBMaXZlU2Vzc2lvbjo6Z2V0TmFtZUZvclN0cmVhbShzdHJlYW0pLCAjI19fVkFfQVJHU19fKQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIHN0YXRpYwotY29uc3QgaW50NjRfdCBQbGF5bGlzdEZldGNoZXI6OmtNaW5CdWZmZXJlZER1cmF0aW9uVXMgPSAxMDAwMDAwMGxsOworY29uc3QgaW50NjRfdCBQbGF5bGlzdEZldGNoZXI6OmtNaW5CdWZmZXJlZER1cmF0aW9uVXMgPSAzMDAwMDAwMGxsOwogY29uc3QgaW50NjRfdCBQbGF5bGlzdEZldGNoZXI6OmtNYXhNb25pdG9yRGVsYXlVcyA9IDMwMDAwMDBsbDsKIC8vIExDTSBvZiAxODggKHNpemUgb2YgYSBUUyBwYWNrZXQpICYgMWsgd29ya3Mgd2VsbAogY29uc3QgaW50MzJfdCBQbGF5bGlzdEZldGNoZXI6OmtEb3dubG9hZEJsb2NrU2l6ZSA9IDQ3ICogMTAyNDsKLWNvbnN0IGludDMyX3QgUGxheWxpc3RGZXRjaGVyOjprTnVtU2tpcEZyYW1lcyA9IDU7CisKK3N0cnVjdCBQbGF5bGlzdEZldGNoZXI6OkRvd25sb2FkU3RhdGUgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgRG93bmxvYWRTdGF0ZSgpOworICAgIHZvaWQgcmVzZXRTdGF0ZSgpOworICAgIGJvb2wgaGFzU2F2ZWRTdGF0ZSgpIGNvbnN0OworICAgIHZvaWQgcmVzdG9yZVN0YXRlKAorICAgICAgICAgICAgQVN0cmluZyAmdXJpLAorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+ICZpdGVtTWV0YSwKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzcDxBQnVmZmVyPiAmdHNCdWZmZXIsCisgICAgICAgICAgICBpbnQzMl90ICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCisgICAgICAgICAgICBpbnQzMl90ICZsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CisgICAgdm9pZCBzYXZlU3RhdGUoCisgICAgICAgICAgICBBU3RyaW5nICZ1cmksCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gJml0ZW1NZXRhLAorICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+ICZ0c0J1ZmZlciwKKyAgICAgICAgICAgIGludDMyX3QgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKKyAgICAgICAgICAgIGludDMyX3QgJmxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKKworcHJpdmF0ZToKKyAgICBib29sIG1IYXNTYXZlZFN0YXRlOworICAgIEFTdHJpbmcgbVVyaTsKKyAgICBzcDxBTWVzc2FnZT4gbUl0ZW1NZXRhOworICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7CisgICAgc3A8QUJ1ZmZlcj4gbVRzQnVmZmVyOworICAgIGludDMyX3QgbUZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICBpbnQzMl90IG1MYXN0U2VxTnVtYmVySW5QbGF5bGlzdDsKK307CisKK1BsYXlsaXN0RmV0Y2hlcjo6RG93bmxvYWRTdGF0ZTo6RG93bmxvYWRTdGF0ZSgpIHsKKyAgICByZXNldFN0YXRlKCk7Cit9CisKK2Jvb2wgUGxheWxpc3RGZXRjaGVyOjpEb3dubG9hZFN0YXRlOjpoYXNTYXZlZFN0YXRlKCkgY29uc3QgeworICAgIHJldHVybiBtSGFzU2F2ZWRTdGF0ZTsKK30KKwordm9pZCBQbGF5bGlzdEZldGNoZXI6OkRvd25sb2FkU3RhdGU6OnJlc2V0U3RhdGUoKSB7CisgICAgbUhhc1NhdmVkU3RhdGUgPSBmYWxzZTsKKworICAgIG1VcmkuY2xlYXIoKTsKKyAgICBtSXRlbU1ldGEgPSBOVUxMOworICAgIG1CdWZmZXIgPSBOVUxMOworICAgIG1Uc0J1ZmZlciA9IE5VTEw7CisgICAgbUZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7CisgICAgbUxhc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gMDsKK30KKwordm9pZCBQbGF5bGlzdEZldGNoZXI6OkRvd25sb2FkU3RhdGU6OnJlc3RvcmVTdGF0ZSgKKyAgICAgICAgQVN0cmluZyAmdXJpLAorICAgICAgICBzcDxBTWVzc2FnZT4gJml0ZW1NZXRhLAorICAgICAgICBzcDxBQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBzcDxBQnVmZmVyPiAmdHNCdWZmZXIsCisgICAgICAgIGludDMyX3QgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKKyAgICAgICAgaW50MzJfdCAmbGFzdFNlcU51bWJlckluUGxheWxpc3QpIHsKKyAgICBpZiAoIW1IYXNTYXZlZFN0YXRlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1cmkgPSBtVXJpOworICAgIGl0ZW1NZXRhID0gbUl0ZW1NZXRhOworICAgIGJ1ZmZlciA9IG1CdWZmZXI7CisgICAgdHNCdWZmZXIgPSBtVHNCdWZmZXI7CisgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gbUZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IG1MYXN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKworICAgIHJlc2V0U3RhdGUoKTsKK30KKwordm9pZCBQbGF5bGlzdEZldGNoZXI6OkRvd25sb2FkU3RhdGU6OnNhdmVTdGF0ZSgKKyAgICAgICAgQVN0cmluZyAmdXJpLAorICAgICAgICBzcDxBTWVzc2FnZT4gJml0ZW1NZXRhLAorICAgICAgICBzcDxBQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBzcDxBQnVmZmVyPiAmdHNCdWZmZXIsCisgICAgICAgIGludDMyX3QgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKKyAgICAgICAgaW50MzJfdCAmbGFzdFNlcU51bWJlckluUGxheWxpc3QpIHsKKyAgICBtSGFzU2F2ZWRTdGF0ZSA9IHRydWU7CisKKyAgICBtVXJpID0gdXJpOworICAgIG1JdGVtTWV0YSA9IGl0ZW1NZXRhOworICAgIG1CdWZmZXIgPSBidWZmZXI7CisgICAgbVRzQnVmZmVyID0gdHNCdWZmZXI7CisgICAgbUZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICBtTGFzdFNlcU51bWJlckluUGxheWxpc3QgPSBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdDsKK30KIAogUGxheWxpc3RGZXRjaGVyOjpQbGF5bGlzdEZldGNoZXIoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICBjb25zdCBzcDxMaXZlU2Vzc2lvbj4gJnNlc3Npb24sCiAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgaW50MzJfdCBpZCwKICAgICAgICAgaW50MzJfdCBzdWJ0aXRsZUdlbmVyYXRpb24pCiAgICAgOiBtTm90aWZ5KG5vdGlmeSksCi0gICAgICBtU3RhcnRUaW1lVXNOb3RpZnkobm90aWZ5LT5kdXAoKSksCiAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwKICAgICAgIG1VUkkodXJpKSwKKyAgICAgIG1GZXRjaGVySUQoaWQpLAogICAgICAgbVN0cmVhbVR5cGVNYXNrKDApLAogICAgICAgbVN0YXJ0VGltZVVzKC0xbGwpLAogICAgICAgbVNlZ21lbnRTdGFydFRpbWVVcygtMWxsKSwKICAgICAgIG1EaXNjb250aW51aXR5U2VxKC0xbGwpLAogICAgICAgbVN0YXJ0VGltZVVzUmVsYXRpdmUoZmFsc2UpLAogICAgICAgbUxhc3RQbGF5bGlzdEZldGNoVGltZVVzKC0xbGwpLAorICAgICAgbVBsYXlsaXN0VGltZVVzKC0xbGwpLAogICAgICAgbVNlcU51bWJlcigtMSksCiAgICAgICBtTnVtUmV0cmllcygwKSwKICAgICAgIG1TdGFydHVwKHRydWUpLAotICAgICAgbUFkYXB0aXZlKGZhbHNlKSwKLSAgICAgIG1QcmVwYXJlZChmYWxzZSksCisgICAgICBtSURSRm91bmQoZmFsc2UpLAorICAgICAgbVNlZWtNb2RlKExpdmVTZXNzaW9uOjprU2Vla01vZGVFeGFjdFBvc2l0aW9uKSwKKyAgICAgIG1UaW1lQ2hhbmdlU2lnbmFsZWQoZmFsc2UpLAogICAgICAgbU5leHRQVFNUaW1lVXMoLTFsbCksCiAgICAgICBtTW9uaXRvclF1ZXVlR2VuZXJhdGlvbigwKSwKICAgICAgIG1TdWJ0aXRsZUdlbmVyYXRpb24oc3VidGl0bGVHZW5lcmF0aW9uKSwKKyAgICAgIG1MYXN0RGlzY29udGludWl0eVNlcSgtMWxsKSwKICAgICAgIG1SZWZyZXNoU3RhdGUoSU5JVElBTF9NSU5JTVVNX1JFTE9BRF9ERUxBWSksCiAgICAgICBtRmlyc3RQVFNWYWxpZChmYWxzZSksCi0gICAgICBtQWJzb2x1dGVUaW1lQW5jaG9yVXMoMGxsKSwKLSAgICAgIG1WaWRlb0J1ZmZlcihuZXcgQW5vdGhlclBhY2tldFNvdXJjZShOVUxMKSkgeworICAgICAgbUZpcnN0VGltZVVzKC0xbGwpLAorICAgICAgbVZpZGVvQnVmZmVyKG5ldyBBbm90aGVyUGFja2V0U291cmNlKE5VTEwpKSwKKyAgICAgIG1UaHJlc2hvbGRSYXRpbygtMS4wZiksCisgICAgICBtRG93bmxvYWRTdGF0ZShuZXcgRG93bmxvYWRTdGF0ZSgpKSwKKyAgICAgIG1IYXNNZXRhZGF0YShmYWxzZSkgewogICAgIG1lbXNldChtUGxheWxpc3RIYXNoLCAwLCBzaXplb2YobVBsYXlsaXN0SGFzaCkpOwotICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFN0YXJ0ZWRBdCk7Ci0gICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigic3RyZWFtTWFzayIsIDApOworICAgIG1IVFRQRG93bmxvYWRlciA9IG1TZXNzaW9uLT5nZXRIVFRQRG93bmxvYWRlcigpOwogfQogCiBQbGF5bGlzdEZldGNoZXI6On5QbGF5bGlzdEZldGNoZXIoKSB7CiB9CiAKK2ludDMyX3QgUGxheWxpc3RGZXRjaGVyOjpnZXRGZXRjaGVySUQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1GZXRjaGVySUQ7Cit9CisKIGludDY0X3QgUGxheWxpc3RGZXRjaGVyOjpnZXRTZWdtZW50U3RhcnRUaW1lVXMoaW50MzJfdCBzZXFOdW1iZXIpIGNvbnN0IHsKICAgICBDSEVDSyhtUGxheWxpc3QgIT0gTlVMTCk7CiAKLSAgICBpbnQzMl90IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKLSAgICBpZiAobVBsYXlsaXN0LT5tZXRhKCkgPT0gTlVMTCB8fCAhbVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAibWVkaWEtc2VxdWVuY2UiLCAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0KSkgewotICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOwotICAgIH0KLQotICAgIGludDMyX3QgbGFzdFNlcU51bWJlckluUGxheWxpc3QgPQotICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyAoaW50MzJfdCltUGxheWxpc3QtPnNpemUoKSAtIDE7CisgICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgIG1QbGF5bGlzdC0+Z2V0U2VxTnVtYmVyUmFuZ2UoCisgICAgICAgICAgICAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LCAmbGFzdFNlcU51bWJlckluUGxheWxpc3QpOwogCiAgICAgQ0hFQ0tfR0Uoc2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QpOwogICAgIENIRUNLX0xFKHNlcU51bWJlciwgbGFzdFNlcU51bWJlckluUGxheWxpc3QpOwpAQCAtMTE5LDYgKzIwNywyNyBAQAogICAgIHJldHVybiBzZWdtZW50U3RhcnRVczsKIH0KIAoraW50NjRfdCBQbGF5bGlzdEZldGNoZXI6OmdldFNlZ21lbnREdXJhdGlvblVzKGludDMyX3Qgc2VxTnVtYmVyKSBjb25zdCB7CisgICAgQ0hFQ0sobVBsYXlsaXN0ICE9IE5VTEwpOworCisgICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgIG1QbGF5bGlzdC0+Z2V0U2VxTnVtYmVyUmFuZ2UoCisgICAgICAgICAgICAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LCAmbGFzdFNlcU51bWJlckluUGxheWxpc3QpOworCisgICAgQ0hFQ0tfR0Uoc2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QpOworICAgIENIRUNLX0xFKHNlcU51bWJlciwgbGFzdFNlcU51bWJlckluUGxheWxpc3QpOworCisgICAgaW50MzJfdCBpbmRleCA9IHNlcU51bWJlciAtIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICBzcDxBTWVzc2FnZT4gaXRlbU1ldGE7CisgICAgQ0hFQ0sobVBsYXlsaXN0LT5pdGVtQXQoCisgICAgICAgICAgICAgICAgaW5kZXgsIE5VTEwgLyogdXJpICovLCAmaXRlbU1ldGEpKTsKKworICAgIGludDY0X3QgaXRlbUR1cmF0aW9uVXM7CisgICAgQ0hFQ0soaXRlbU1ldGEtPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZpdGVtRHVyYXRpb25VcykpOworCisgICAgcmV0dXJuIGl0ZW1EdXJhdGlvblVzOworfQorCiBpbnQ2NF90IFBsYXlsaXN0RmV0Y2hlcjo6ZGVsYXlVc1RvUmVmcmVzaFBsYXlsaXN0KCkgY29uc3QgewogICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwogCkBAIC0xMzEsMTAgKzI0MCw3IEBACiAgICAgICAgIHJldHVybiAofjBsbHUgPj4gMSk7CiAgICAgfQogCi0gICAgaW50MzJfdCB0YXJnZXREdXJhdGlvblNlY3M7Ci0gICAgQ0hFQ0sobVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigidGFyZ2V0LWR1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uU2VjcykpOwotCi0gICAgaW50NjRfdCB0YXJnZXREdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb25TZWNzICogMTAwMDAwMGxsOworICAgIGludDY0X3QgdGFyZ2V0RHVyYXRpb25VcyA9IG1QbGF5bGlzdC0+Z2V0VGFyZ2V0RHVyYXRpb24oKTsKIAogICAgIGludDY0X3QgbWluUGxheWxpc3RBZ2VVczsKIApAQCAtMjI0LDkgKzMzMCwxMSBAQAogICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgIGtleSA9IG1BRVNLZXlGb3JVUkkudmFsdWVBdChpbmRleCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3NpemVfdCBlcnIgPSBtU2Vzc2lvbi0+ZmV0Y2hGaWxlKGtleVVSSS5jX3N0cigpLCAma2V5KTsKKyAgICAgICAgc3NpemVfdCBlcnIgPSBtSFRUUERvd25sb2FkZXItPmZldGNoRmlsZShrZXlVUkkuY19zdHIoKSwgJmtleSk7CiAKLSAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9OT1RfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTk9UX0NPTk5FQ1RFRDsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPCAwKSB7CiAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZldGNoIGNpcGhlciBrZXkgZnJvbSAnJXMnLiIsIGtleVVSSS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgfSBlbHNlIGlmIChrZXktPnNpemUoKSAhPSAxNikgewpAQCAtMzIyLDEwICs0MzAsMTAgQEAKICAgICAgICAgbWF4RGVsYXlVcyA9IG1pbkRlbGF5VXM7CiAgICAgfQogICAgIGlmIChkZWxheVVzID4gbWF4RGVsYXlVcykgewotICAgICAgICBBTE9HVigiTmVlZCB0byByZWZyZXNoIHBsYXlsaXN0IGluICUiIFBSSWQ2NCAsIG1heERlbGF5VXMpOworICAgICAgICBGTE9HVigiTmVlZCB0byByZWZyZXNoIHBsYXlsaXN0IGluICVsbGQiLCAobG9uZyBsb25nKW1heERlbGF5VXMpOwogICAgICAgICBkZWxheVVzID0gbWF4RGVsYXlVczsKICAgICB9Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE1vbml0b3JRdWV1ZSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE1vbml0b3JRdWV1ZSwgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Nb25pdG9yUXVldWVHZW5lcmF0aW9uKTsKICAgICBtc2ctPnBvc3QoZGVsYXlVcyk7CiB9CkBAIC0zMzQsMTUgKzQ0Miw0NCBAQAogICAgICsrbU1vbml0b3JRdWV1ZUdlbmVyYXRpb247CiB9CiAKK3ZvaWQgUGxheWxpc3RGZXRjaGVyOjpzZXRTdG9wcGluZ1RocmVzaG9sZChmbG9hdCB0aHJlc2hvbGRSYXRpbywgYm9vbCBkaXNjb25uZWN0KSB7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggX2wobVRocmVzaG9sZExvY2spOworICAgICAgICBtVGhyZXNob2xkUmF0aW8gPSB0aHJlc2hvbGRSYXRpbzsKKyAgICB9CisgICAgaWYgKGRpc2Nvbm5lY3QpIHsKKyAgICAgICAgbUhUVFBEb3dubG9hZGVyLT5kaXNjb25uZWN0KCk7CisgICAgfQorfQorCit2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6cmVzZXRTdG9wcGluZ1RocmVzaG9sZChib29sIGRpc2Nvbm5lY3QpIHsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtVGhyZXNob2xkTG9jayk7CisgICAgICAgIG1UaHJlc2hvbGRSYXRpbyA9IC0xLjBmOworICAgIH0KKyAgICBpZiAoZGlzY29ubmVjdCkgeworICAgICAgICBtSFRUUERvd25sb2FkZXItPmRpc2Nvbm5lY3QoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBhbGxvdyByZWNvbm5lY3QKKyAgICAgICAgbUhUVFBEb3dubG9hZGVyLT5yZWNvbm5lY3QoKTsKKyAgICB9Cit9CisKK2Zsb2F0IFBsYXlsaXN0RmV0Y2hlcjo6Z2V0U3RvcHBpbmdUaHJlc2hvbGQoKSB7CisgICAgQXV0b011dGV4IF9sKG1UaHJlc2hvbGRMb2NrKTsKKyAgICByZXR1cm4gbVRocmVzaG9sZFJhdGlvOworfQorCiB2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6c3RhcnRBc3luYygKICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmF1ZGlvU291cmNlLAogICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmdmlkZW9Tb3VyY2UsCiAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZzdWJ0aXRsZVNvdXJjZSwKKyAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJm1ldGFkYXRhU291cmNlLAogICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzLAogICAgICAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFRpbWVVcywKICAgICAgICAgaW50MzJfdCBzdGFydERpc2NvbnRpbnVpdHlTZXEsCi0gICAgICAgIGJvb2wgYWRhcHRpdmUpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIGlkKCkpOworICAgICAgICBMaXZlU2Vzc2lvbjo6U2Vla01vZGUgc2Vla01vZGUpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIHRoaXMpOwogCiAgICAgdWludDMyX3Qgc3RyZWFtVHlwZU1hc2sgPSAwdWw7CiAKQEAgLTM2MSwzMCArNDk4LDUzIEBACiAgICAgICAgIHN0cmVhbVR5cGVNYXNrIHw9IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUzsKICAgICB9CiAKKyAgICBpZiAobWV0YWRhdGFTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtc2ctPnNldFBvaW50ZXIoIm1ldGFkYXRhU291cmNlIiwgbWV0YWRhdGFTb3VyY2UuZ2V0KCkpOworICAgICAgICAvLyBtZXRhZGF0YVNvdXJjZSBkb2VzIG5vdCBhZmZlY3Qgc3RyZWFtVHlwZU1hc2suCisgICAgfQorCiAgICAgbXNnLT5zZXRJbnQzMigic3RyZWFtVHlwZU1hc2siLCBzdHJlYW1UeXBlTWFzayk7CiAgICAgbXNnLT5zZXRJbnQ2NCgic3RhcnRUaW1lVXMiLCBzdGFydFRpbWVVcyk7CiAgICAgbXNnLT5zZXRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgc2VnbWVudFN0YXJ0VGltZVVzKTsKICAgICBtc2ctPnNldEludDMyKCJzdGFydERpc2NvbnRpbnVpdHlTZXEiLCBzdGFydERpc2NvbnRpbnVpdHlTZXEpOwotICAgIG1zZy0+c2V0SW50MzIoImFkYXB0aXZlIiwgYWRhcHRpdmUpOworICAgIG1zZy0+c2V0SW50MzIoInNlZWtNb2RlIiwgc2Vla01vZGUpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCi12b2lkIFBsYXlsaXN0RmV0Y2hlcjo6cGF1c2VBc3luYygpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIGlkKCkpKS0+cG9zdCgpOworLyoKKyAqIHBhdXNlQXN5bmMKKyAqCisgKiB0aHJlc2hvbGQ6IDAuMGYgLSBwYXVzZSBhZnRlciBjdXJyZW50IGZldGNoIGJsb2NrIChkZWZhdWx0IDQ3S2J5dGVzKQorICogICAgICAgICAgIC0xLjBmIC0gcGF1c2UgYWZ0ZXIgZmluaXNoaW5nIGN1cnJlbnQgc2VnbWVudAorICogICAgICAgIDAuMH4xLjBmIC0gcGF1c2UgaWYgcmVtYWluaW5nIG9mIGN1cnJlbnQgc2VnbWVudCBleGNlZWRzIHRocmVzaG9sZAorICovCit2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6cGF1c2VBc3luYygKKyAgICAgICAgZmxvYXQgdGhyZXNob2xkUmF0aW8sIGJvb2wgZGlzY29ubmVjdCkgeworICAgIHNldFN0b3BwaW5nVGhyZXNob2xkKHRocmVzaG9sZFJhdGlvLCBkaXNjb25uZWN0KTsKKworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgUGxheWxpc3RGZXRjaGVyOjpzdG9wQXN5bmMoYm9vbCBjbGVhcikgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKTsKKyAgICBzZXRTdG9wcGluZ1RocmVzaG9sZCgwLjBmLCB0cnVlIC8qIGRpc2Nvbm5jZWN0ICovKTsKKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJjbGVhciIsIGNsZWFyKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIAogdm9pZCBQbGF5bGlzdEZldGNoZXI6OnJlc3VtZVVudGlsQXN5bmMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpIHsKLSAgICBBTWVzc2FnZSogbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lVW50aWwsIGlkKCkpOworICAgIEZMT0dWKCJyZXN1bWVVbnRpbEFzeW5jOiBwYXJhbXM9JXMiLCBwYXJhbXMtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICBBTWVzc2FnZSogbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lVW50aWwsIHRoaXMpOwogICAgIG1zZy0+c2V0TWVzc2FnZSgicGFyYW1zIiwgcGFyYW1zKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIAordm9pZCBQbGF5bGlzdEZldGNoZXI6OmZldGNoUGxheWxpc3RBc3luYygpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hQbGF5bGlzdCwgdGhpcykpLT5wb3N0KCk7Cit9CisKIHZvaWQgUGxheWxpc3RGZXRjaGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OgpAQCAtNDA0LDYgKzU2NCwxMCBAQAogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CiAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRQYXVzZWQpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vla01vZGUiLAorICAgICAgICAgICAgICAgICAgICBtRG93bmxvYWRTdGF0ZS0+aGFzU2F2ZWRTdGF0ZSgpCisgICAgICAgICAgICAgICAgICAgID8gTGl2ZVNlc3Npb246OmtTZWVrTW9kZU5leHRTYW1wbGUKKyAgICAgICAgICAgICAgICAgICAgOiBMaXZlU2Vzc2lvbjo6a1NlZWtNb2RlTmV4dFNlZ21lbnQpOwogICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNDE4LDYgKzU4MiwxOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0RmV0Y2hQbGF5bGlzdDoKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCB1bmNoYW5nZWQ7CisgICAgICAgICAgICBzcDxNM1VQYXJzZXI+IHBsYXlsaXN0ID0gbUhUVFBEb3dubG9hZGVyLT5mZXRjaFBsYXlsaXN0KAorICAgICAgICAgICAgICAgICAgICBtVVJJLmNfc3RyKCksIE5VTEwgLyogY3VyUGxheWxpc3RIYXNoICovLCAmdW5jaGFuZ2VkKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UGxheWxpc3RGZXRjaGVkKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0T2JqZWN0KCJwbGF5bGlzdCIsIHBsYXlsaXN0KTsKKyAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0TW9uaXRvclF1ZXVlOgogICAgICAgICBjYXNlIGtXaGF0RG93bmxvYWROZXh0OgogICAgICAgICB7CkBAIC00NTAsNiArNjI3LDEwIEBACiAKIHN0YXR1c190IFBsYXlsaXN0RmV0Y2hlcjo6b25TdGFydChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIG1QYWNrZXRTb3VyY2VzLmNsZWFyKCk7CisgICAgbVN0b3BQYXJhbXMuY2xlYXIoKTsKKyAgICBtU3RhcnRUaW1lVXNOb3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTdGFydGVkQXQpOworICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0U3RyaW5nKCJ1cmkiLCBtVVJJKTsKIAogICAgIHVpbnQzMl90IHN0cmVhbVR5cGVNYXNrOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdHJlYW1UeXBlTWFzayIsIChpbnQzMl90ICopJnN0cmVhbVR5cGVNYXNrKSk7CkBAIC00NTcsMTEgKzYzOCwxMSBAQAogICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7CiAgICAgaW50NjRfdCBzZWdtZW50U3RhcnRUaW1lVXM7CiAgICAgaW50MzJfdCBzdGFydERpc2NvbnRpbnVpdHlTZXE7Ci0gICAgaW50MzJfdCBhZGFwdGl2ZTsKKyAgICBpbnQzMl90IHNlZWtNb2RlOwogICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzdGFydFRpbWVVcyIsICZzdGFydFRpbWVVcykpOwogICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCAmc2VnbWVudFN0YXJ0VGltZVVzKSk7CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInN0YXJ0RGlzY29udGludWl0eVNlcSIsICZzdGFydERpc2NvbnRpbnVpdHlTZXEpKTsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYWRhcHRpdmUiLCAmYWRhcHRpdmUpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2Vla01vZGUiLCAmc2Vla01vZGUpKTsKIAogICAgIGlmIChzdHJlYW1UeXBlTWFzayAmIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPKSB7CiAgICAgICAgIHZvaWQgKnB0cjsKQEAgLTQ5MCwxNyArNjcxLDM4IEBACiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QW5vdGhlclBhY2tldFNvdXJjZSAqPihwdHIpKTsKICAgICB9CiAKKyAgICB2b2lkICpwdHI7CisgICAgLy8gbWV0YWRhdGFTb3VyY2UgaXMgbm90IHBhcnQgb2Ygc3RyZWFtVHlwZU1hc2sKKyAgICBpZiAoKHN0cmVhbVR5cGVNYXNrICYgKExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPIHwgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfVklERU8pKQorICAgICAgICAgICAgJiYgbXNnLT5maW5kUG9pbnRlcigibWV0YWRhdGFTb3VyY2UiLCAmcHRyKSkgeworICAgICAgICBtUGFja2V0U291cmNlcy5hZGQoCisgICAgICAgICAgICAgICAgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfTUVUQURBVEEsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QW5vdGhlclBhY2tldFNvdXJjZSAqPihwdHIpKTsKKyAgICB9CisKICAgICBtU3RyZWFtVHlwZU1hc2sgPSBzdHJlYW1UeXBlTWFzazsKIAogICAgIG1TZWdtZW50U3RhcnRUaW1lVXMgPSBzZWdtZW50U3RhcnRUaW1lVXM7Ci0gICAgbURpc2NvbnRpbnVpdHlTZXEgPSBzdGFydERpc2NvbnRpbnVpdHlTZXE7CisKKyAgICBpZiAoc3RhcnREaXNjb250aW51aXR5U2VxID49IDApIHsKKyAgICAgICAgbURpc2NvbnRpbnVpdHlTZXEgPSBzdGFydERpc2NvbnRpbnVpdHlTZXE7CisgICAgfQorCisgICAgbVJlZnJlc2hTdGF0ZSA9IElOSVRJQUxfTUlOSU1VTV9SRUxPQURfREVMQVk7CisgICAgbVNlZWtNb2RlID0gKExpdmVTZXNzaW9uOjpTZWVrTW9kZSkgc2Vla01vZGU7CisKKyAgICBpZiAoc3RhcnRUaW1lVXMgPj0gMCB8fCBtU2Vla01vZGUgPT0gTGl2ZVNlc3Npb246OmtTZWVrTW9kZU5leHRTYW1wbGUpIHsKKyAgICAgICAgbVN0YXJ0dXAgPSB0cnVlOworICAgICAgICBtSURSRm91bmQgPSBmYWxzZTsKKyAgICAgICAgbVZpZGVvQnVmZmVyLT5jbGVhcigpOworICAgIH0KIAogICAgIGlmIChzdGFydFRpbWVVcyA+PSAwKSB7CiAgICAgICAgIG1TdGFydFRpbWVVcyA9IHN0YXJ0VGltZVVzOworICAgICAgICBtRmlyc3RQVFNWYWxpZCA9IGZhbHNlOwogICAgICAgICBtU2VxTnVtYmVyID0gLTE7Ci0gICAgICAgIG1TdGFydHVwID0gdHJ1ZTsKLSAgICAgICAgbVByZXBhcmVkID0gZmFsc2U7Ci0gICAgICAgIG1BZGFwdGl2ZSA9IGFkYXB0aXZlOworICAgICAgICBtVGltZUNoYW5nZVNpZ25hbGVkID0gZmFsc2U7CisgICAgICAgIG1Eb3dubG9hZFN0YXRlLT5yZXNldFN0YXRlKCk7CiAgICAgfQogCiAgICAgcG9zdE1vbml0b3JRdWV1ZSgpOwpAQCAtNTEwLDYgKzcxMiw5IEBACiAKIHZvaWQgUGxheWxpc3RGZXRjaGVyOjpvblBhdXNlKCkgewogICAgIGNhbmNlbE1vbml0b3JRdWV1ZSgpOworICAgIG1MYXN0RGlzY29udGludWl0eVNlcSA9IG1EaXNjb250aW51aXR5U2VxOworCisgICAgcmVzZXRTdG9wcGluZ1RocmVzaG9sZChmYWxzZSAvKiBkaXNjb25uZWN0ICovKTsKIH0KIAogdm9pZCBQbGF5bGlzdEZldGNoZXI6Om9uU3RvcChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpAQCAtNTI0LDggKzcyOSwxMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgbURvd25sb2FkU3RhdGUtPnJlc2V0U3RhdGUoKTsKICAgICBtUGFja2V0U291cmNlcy5jbGVhcigpOwogICAgIG1TdHJlYW1UeXBlTWFzayA9IDA7CisKKyAgICByZXNldFN0b3BwaW5nVGhyZXNob2xkKHRydWUgLyogZGlzY29ubmVjdCAqLyk7CiB9CiAKIC8vIFJlc3VtZSB1bnRpbCB3ZSBoYXZlIHJlYWNoZWQgdGhlIGJvdW5kYXJ5IHRpbWVzdGFtcHMgbGlzdGVkIGluIGBtc2dgOyB3aGVuCkBAIC01MzUsNTcgKzc0MywxOCBAQAogICAgIHNwPEFNZXNzYWdlPiBwYXJhbXM7CiAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicGFyYW1zIiwgJnBhcmFtcykpOwogCi0gICAgYm9vbCBzdG9wID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGFja2V0U291cmNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRTb3VyY2UgPSBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpOwotCi0gICAgICAgIGNvbnN0IGNoYXIgKnN0b3BLZXk7Ci0gICAgICAgIGludCBzdHJlYW1UeXBlID0gbVBhY2tldFNvdXJjZXMua2V5QXQoaSk7Ci0gICAgICAgIHN3aXRjaCAoc3RyZWFtVHlwZSkgewotICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1ZJREVPOgotICAgICAgICAgICAgc3RvcEtleSA9ICJ0aW1lVXNWaWRlbyI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPOgotICAgICAgICAgICAgc3RvcEtleSA9ICJ0aW1lVXNBdWRpbyI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUzoKLSAgICAgICAgICAgIHN0b3BLZXkgPSAidGltZVVzU3VidGl0bGUiOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEb24ndCByZXN1bWUgaWYgd2Ugd291bGQgc3RvcCB3aXRoaW4gYSByZXN1bWUgdGhyZXNob2xkLgotICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHlTZXE7Ci0gICAgICAgIGludDY0X3QgbGF0ZXN0VGltZVVzID0gMCwgc3RvcFRpbWVVcyA9IDA7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBsYXRlc3RNZXRhID0gcGFja2V0U291cmNlLT5nZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKTsKLSAgICAgICAgaWYgKGxhdGVzdE1ldGEgIT0gTlVMTAotICAgICAgICAgICAgICAgICYmIGxhdGVzdE1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZkaXNjb250aW51aXR5U2VxKQotICAgICAgICAgICAgICAgICYmIGRpc2NvbnRpbnVpdHlTZXEgPT0gbURpc2NvbnRpbnVpdHlTZXEKLSAgICAgICAgICAgICAgICAmJiBsYXRlc3RNZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZsYXRlc3RUaW1lVXMpCi0gICAgICAgICAgICAgICAgJiYgcGFyYW1zLT5maW5kSW50NjQoc3RvcEtleSwgJnN0b3BUaW1lVXMpCi0gICAgICAgICAgICAgICAgJiYgc3RvcFRpbWVVcyAtIGxhdGVzdFRpbWVVcyA8IHJlc3VtZVRocmVzaG9sZChsYXRlc3RNZXRhKSkgewotICAgICAgICAgICAgc3RvcCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3RvcCkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpLT5xdWV1ZUFjY2Vzc1VuaXQobVNlc3Npb24tPmNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcigpKTsKLSAgICAgICAgfQotICAgICAgICBzdG9wQXN5bmMoLyogY2xlYXIgPSAqLyBmYWxzZSk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KICAgICBtU3RvcFBhcmFtcyA9IHBhcmFtczsKLSAgICBwb3N0TW9uaXRvclF1ZXVlKCk7CisgICAgb25Eb3dubG9hZE5leHQoKTsKIAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBQbGF5bGlzdEZldGNoZXI6Om5vdGlmeVN0b3BSZWFjaGVkKCkgeworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTdG9wUmVhY2hlZCk7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKIHZvaWQgUGxheWxpc3RGZXRjaGVyOjpub3RpZnlFcnJvcihzdGF0dXNfdCBlcnIpIHsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RXJyb3IpOwpAQCAtNjA0LDk2ICs3NzMsODQgQEAKIH0KIAogdm9pZCBQbGF5bGlzdEZldGNoZXI6Om9uTW9uaXRvclF1ZXVlKCkgewotICAgIGJvb2wgZG93bmxvYWRNb3JlID0gZmFsc2U7Ci0gICAgcmVmcmVzaFBsYXlsaXN0KCk7Ci0KLSAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uU2VjczsKLSAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSBrTWluQnVmZmVyZWREdXJhdGlvblVzOwotICAgIGlmIChtUGxheWxpc3QgIT0gTlVMTCkgewotICAgICAgICBpZiAobVBsYXlsaXN0LT5tZXRhKCkgPT0gTlVMTCB8fCAhbVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAidGFyZ2V0LWR1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uU2VjcykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJQbGF5bGlzdCBpcyBtaXNzaW5nIHJlcXVpcmVkIEVYVC1YLVRBUkdFVERVUkFUSU9OIHRhZyIpOwotICAgICAgICAgICAgbm90aWZ5RXJyb3IoRVJST1JfTUFMRk9STUVEKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0YXJnZXREdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb25TZWNzICogMTAwMDAwMGxsOworICAgIC8vIGluIHRoZSBtaWRkbGUgb2YgYW4gdW5maW5pc2hlZCBkb3dubG9hZCwgZGVsYXkKKyAgICAvLyBwbGF5bGlzdCByZWZyZXNoIGFzIGl0J2xsIGNoYW5nZSBzZXEgbnVtYmVycworICAgIGlmICghbURvd25sb2FkU3RhdGUtPmhhc1NhdmVkU3RhdGUoKSkgeworICAgICAgICByZWZyZXNoUGxheWxpc3QoKTsKICAgICB9CiAKLSAgICAvLyBidWZmZXIgYXQgbGVhc3QgMyB0aW1lcyB0aGUgdGFyZ2V0IGR1cmF0aW9uLCBvciB1cCB0byAxMCBzZWNvbmRzCi0gICAgaW50NjRfdCBkdXJhdGlvblRvQnVmZmVyVXMgPSB0YXJnZXREdXJhdGlvblVzICogMzsKLSAgICBpZiAoZHVyYXRpb25Ub0J1ZmZlclVzID4ga01pbkJ1ZmZlcmVkRHVyYXRpb25VcykgIHsKLSAgICAgICAgZHVyYXRpb25Ub0J1ZmZlclVzID0ga01pbkJ1ZmZlcmVkRHVyYXRpb25VczsKKyAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSBrTWluQnVmZmVyZWREdXJhdGlvblVzOworICAgIGlmIChtUGxheWxpc3QgIT0gTlVMTCkgeworICAgICAgICB0YXJnZXREdXJhdGlvblVzID0gbVBsYXlsaXN0LT5nZXRUYXJnZXREdXJhdGlvbigpOwogICAgIH0KIAogICAgIGludDY0X3QgYnVmZmVyZWREdXJhdGlvblVzID0gMGxsOwotICAgIHN0YXR1c190IGZpbmFsUmVzdWx0ID0gTk9UX0VOT1VHSF9EQVRBOworICAgIHN0YXR1c190IGZpbmFsUmVzdWx0ID0gT0s7CiAgICAgaWYgKG1TdHJlYW1UeXBlTWFzayA9PSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9TVUJUSVRMRVMpIHsKICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0U291cmNlID0KICAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUyk7CiAKICAgICAgICAgYnVmZmVyZWREdXJhdGlvblVzID0KICAgICAgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZmluYWxSZXN1bHQpOwotICAgICAgICBmaW5hbFJlc3VsdCA9IE9LOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFVzZSBtYXggc3RyZWFtIGR1cmF0aW9uIHRvIHByZXZlbnQgdXMgZnJvbSB3YWl0aW5nIG9uIGEgbm9uLWV4aXN0ZW50IHN0cmVhbTsKLSAgICAgICAgLy8gd2hlbiB3ZSBjYW5ub3QgbWFrZSBvdXQgZnJvbSB0aGUgbWFuaWZlc3Qgd2hhdCBzdHJlYW1zIGFyZSBpbmNsdWRlZCBpbiBhIHBsYXlsaXN0Ci0gICAgICAgIC8vIHdlIG1pZ2h0IGFzc3VtZSBleHRyYSBzdHJlYW1zLgorICAgICAgICAvLyBVc2UgbWluIHN0cmVhbSBkdXJhdGlvbiwgYnV0IGlnbm9yZSBzdHJlYW1zIHRoYXQgbmV2ZXIgaGF2ZSBhbnkgcGFja2V0CisgICAgICAgIC8vIGVucXVldWVkIHRvIHByZXZlbnQgdXMgZnJvbSB3YWl0aW5nIG9uIGEgbm9uLWV4aXN0ZW50IHN0cmVhbTsKKyAgICAgICAgLy8gd2hlbiB3ZSBjYW5ub3QgbWFrZSBvdXQgZnJvbSB0aGUgbWFuaWZlc3Qgd2hhdCBzdHJlYW1zIGFyZSBpbmNsdWRlZCBpbgorICAgICAgICAvLyBhIHBsYXlsaXN0IHdlIG1pZ2h0IGFzc3VtZSBleHRyYSBzdHJlYW1zLgorICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMgPSAtMWxsOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoKG1TdHJlYW1UeXBlTWFzayAmIG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoKG1TdHJlYW1UeXBlTWFzayAmIG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpKSA9PSAwCisgICAgICAgICAgICAgICAgICAgIHx8IG1QYWNrZXRTb3VyY2VzW2ldLT5nZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDY0X3QgYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzID0KICAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmZpbmFsUmVzdWx0KTsKLSAgICAgICAgICAgIEFMT0dWKCJidWZmZXJlZCAlIiBQUklkNjQgIiBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzLCBtUGFja2V0U291cmNlcy5rZXlBdChpKSk7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzID4gYnVmZmVyZWREdXJhdGlvblVzKSB7CisKKyAgICAgICAgICAgIEZTTE9HVihtUGFja2V0U291cmNlcy5rZXlBdChpKSwgImJ1ZmZlcmVkICVsbGQiLCAobG9uZyBsb25nKWJ1ZmZlcmVkU3RyZWFtRHVyYXRpb25Vcyk7CisKKyAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPT0gLTFsbAorICAgICAgICAgICAgICAgICB8fCBidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXMgPCBidWZmZXJlZER1cmF0aW9uVXMpIHsKICAgICAgICAgICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMgPSBidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXM7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZG93bmxvYWRNb3JlID0gKGJ1ZmZlcmVkRHVyYXRpb25VcyA8IGR1cmF0aW9uVG9CdWZmZXJVcyk7Ci0KLSAgICAvLyBzaWduYWwgc3RhcnQgaWYgYnVmZmVyZWQgdXAgYXQgbGVhc3QgdGhlIHRhcmdldCBzaXplCi0gICAgaWYgKCFtUHJlcGFyZWQgJiYgYnVmZmVyZWREdXJhdGlvblVzID4gdGFyZ2V0RHVyYXRpb25VcyAmJiBkb3dubG9hZE1vcmUpIHsKLSAgICAgICAgbVByZXBhcmVkID0gdHJ1ZTsKLQotICAgICAgICBBTE9HVigicHJlcGFyZWQsIGJ1ZmZlcmVkPSUiIFBSSWQ2NCAiID4gJSIgUFJJZDY0ICIiLAotICAgICAgICAgICAgICAgIGJ1ZmZlcmVkRHVyYXRpb25VcywgdGFyZ2V0RHVyYXRpb25Vcyk7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VGVtcG9yYXJpbHlEb25lRmV0Y2hpbmcpOwotICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA9PSAtMWxsKSB7CisgICAgICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMgPSAwbGw7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoZmluYWxSZXN1bHQgPT0gT0sgJiYgZG93bmxvYWRNb3JlKSB7Ci0gICAgICAgIEFMT0dWKCJtb25pdG9yaW5nLCBidWZmZXJlZD0lIiBQUklkNjQgIiA8ICUiIFBSSWQ2NCAiIiwKLSAgICAgICAgICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMsIGR1cmF0aW9uVG9CdWZmZXJVcyk7CisgICAgaWYgKGZpbmFsUmVzdWx0ID09IE9LICYmIGJ1ZmZlcmVkRHVyYXRpb25VcyA8IGtNaW5CdWZmZXJlZER1cmF0aW9uVXMpIHsKKyAgICAgICAgRkxPR1YoIm1vbml0b3JpbmcsIGJ1ZmZlcmVkPSVsbGQgPCAlbGxkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKWJ1ZmZlcmVkRHVyYXRpb25VcywgKGxvbmcgbG9uZylrTWluQnVmZmVyZWREdXJhdGlvblVzKTsKKwogICAgICAgICAvLyBkZWxheSB0aGUgbmV4dCBkb3dubG9hZCBzbGlnaHRseTsgaG9wZWZ1bGx5IHRoaXMgZ2l2ZXMgb3RoZXIgY29uY3VycmVudCBmZXRjaGVycwogICAgICAgICAvLyBhIGJldHRlciBjaGFuY2UgdG8gcnVuLgogICAgICAgICAvLyBvbkRvd25sb2FkTmV4dCgpOwotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RG93bmxvYWROZXh0LCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERvd25sb2FkTmV4dCwgdGhpcyk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtTW9uaXRvclF1ZXVlR2VuZXJhdGlvbik7CiAgICAgICAgIG1zZy0+cG9zdCgxMDAwbCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBkbyB5ZXQsIHRyeSBhZ2FpbiBpbiBhIHNlY29uZC4KKyAgICAgICAgLy8gV2UnZCBsaWtlIHRvIG1haW50YWluIGJ1ZmZlcmluZyBhYm92ZSBkdXJhdGlvblRvQnVmZmVyVXMsIHNvIHRyeQorICAgICAgICAvLyBhZ2FpbiB3aGVuIGJ1ZmZlciBqdXN0IGFib3V0IHRvIGdvIGJlbG93IGR1cmF0aW9uVG9CdWZmZXJVcworICAgICAgICAvLyAob3IgYWZ0ZXIgdGFyZ2V0RHVyYXRpb25VcyAvIDIsIHdoaWNoZXZlciBpcyBzbWFsbGVyKS4KKyAgICAgICAgaW50NjRfdCBkZWxheVVzID0gYnVmZmVyZWREdXJhdGlvblVzIC0ga01pbkJ1ZmZlcmVkRHVyYXRpb25VcyArIDEwMDAwMDBsbDsKKyAgICAgICAgaWYgKGRlbGF5VXMgPiB0YXJnZXREdXJhdGlvblVzIC8gMikgeworICAgICAgICAgICAgZGVsYXlVcyA9IHRhcmdldER1cmF0aW9uVXMgLyAyOworICAgICAgICB9CiAKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRUZW1wb3JhcmlseURvbmVGZXRjaGluZyk7Ci0gICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICBGTE9HVigicGF1c2luZyBmb3IgJWxsZCwgYnVmZmVyZWQ9JWxsZCA+ICVsbGQiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGVsYXlVcywKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKWJ1ZmZlcmVkRHVyYXRpb25VcywKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKWtNaW5CdWZmZXJlZER1cmF0aW9uVXMpOwogCi0gICAgICAgIGludDY0X3QgZGVsYXlVcyA9IG1QcmVwYXJlZCA/IGtNYXhNb25pdG9yRGVsYXlVcyA6IHRhcmdldER1cmF0aW9uVXMgLyAyOwotICAgICAgICBBTE9HVigicGF1c2luZyBmb3IgJSIgUFJJZDY0ICIsIGJ1ZmZlcmVkPSUiIFBSSWQ2NCAiID4gJSIgUFJJZDY0ICIiLAotICAgICAgICAgICAgICAgIGRlbGF5VXMsIGJ1ZmZlcmVkRHVyYXRpb25VcywgZHVyYXRpb25Ub0J1ZmZlclVzKTsKLSAgICAgICAgLy8gOlRSSUNLWTogbmVlZCB0byBlbmZvcmNlIG1pbmltdW0gZGVsYXkgYmVjYXVzZSB0aGUgZGVsYXkgdG8KLSAgICAgICAgLy8gcmVmcmVzaCB0aGUgcGxheWxpc3Qgd2lsbCBiZWNvbWUgMAotICAgICAgICBwb3N0TW9uaXRvclF1ZXVlKGRlbGF5VXMsIG1QcmVwYXJlZCA/IHRhcmdldER1cmF0aW9uVXMgKiAyIDogMCk7CisgICAgICAgIHBvc3RNb25pdG9yUXVldWUoZGVsYXlVcyk7CiAgICAgfQogfQogCiBzdGF0dXNfdCBQbGF5bGlzdEZldGNoZXI6OnJlZnJlc2hQbGF5bGlzdCgpIHsKICAgICBpZiAoZGVsYXlVc1RvUmVmcmVzaFBsYXlsaXN0KCkgPD0gMCkgewogICAgICAgICBib29sIHVuY2hhbmdlZDsKLSAgICAgICAgc3A8TTNVUGFyc2VyPiBwbGF5bGlzdCA9IG1TZXNzaW9uLT5mZXRjaFBsYXlsaXN0KAorICAgICAgICBzcDxNM1VQYXJzZXI+IHBsYXlsaXN0ID0gbUhUVFBEb3dubG9hZGVyLT5mZXRjaFBsYXlsaXN0KAogICAgICAgICAgICAgICAgIG1VUkkuY19zdHIoKSwgbVBsYXlsaXN0SGFzaCwgJnVuY2hhbmdlZCk7CiAKICAgICAgICAgaWYgKHBsYXlsaXN0ID09IE5VTEwpIHsKQEAgLTcxNSw2ICs4NzIsMTQgQEAKICAgICAgICAgICAgIGlmIChtUGxheWxpc3QtPmlzQ29tcGxldGUoKSB8fCBtUGxheWxpc3QtPmlzRXZlbnQoKSkgewogICAgICAgICAgICAgICAgIHVwZGF0ZUR1cmF0aW9uKCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOb3RpZnkgTGl2ZVNlc3Npb24gdG8gdXNlIHRhcmdldC1kdXJhdGlvbiBiYXNlZCBidWZmZXJpbmcgbGV2ZWwKKyAgICAgICAgICAgIC8vIGZvciB1cC9kb3duIHN3aXRjaC4gRGVmYXVsdCBMaXZlU2Vzc2lvbjo6a1VwU3dpdGNoTWFyayBtYXkgbm90CisgICAgICAgICAgICAvLyBiZSByZWFjaGFibGUgZm9yIGxpdmUgc3RyZWFtcywgYXMgb3VyIG1heCBidWZmZXJpbmcgYW1vdW50IGlzCisgICAgICAgICAgICAvLyBsaW1pdGVkIHRvIDMgc2VnbWVudHMuCisgICAgICAgICAgICBpZiAoIW1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlVGFyZ2V0RHVyYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QbGF5bGlzdFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CiAgICAgICAgIH0KIAogICAgICAgICBtTGFzdFBsYXlsaXN0RmV0Y2hUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwpAQCAtNzI3LDI1ICs4OTIsODMgQEAKICAgICByZXR1cm4gYnVmZmVyLT5zaXplKCkgPiAwICYmIGJ1ZmZlci0+ZGF0YSgpWzBdID09IDB4NDc7CiB9CiAKLXZvaWQgUGxheWxpc3RGZXRjaGVyOjpvbkRvd25sb2FkTmV4dCgpIHsKK2Jvb2wgUGxheWxpc3RGZXRjaGVyOjpzaG91bGRQYXVzZURvd25sb2FkKCkgeworICAgIGlmIChtU3RyZWFtVHlwZU1hc2sgPT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTKSB7CisgICAgICAgIC8vIGRvZXNuJ3QgYXBwbHkgdG8gc3VidGl0bGVzCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgdGhyZXNob2xkIHRvIGFib3J0IGN1cnJlbnQgZG93bmxvYWQKKyAgICBmbG9hdCB0aHJlc2hvbGRSYXRpbyA9IGdldFN0b3BwaW5nVGhyZXNob2xkKCk7CisKKyAgICBpZiAodGhyZXNob2xkUmF0aW8gPCAwLjBmKSB7CisgICAgICAgIC8vIG5ldmVyIGFib3J0CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHRocmVzaG9sZFJhdGlvID09IDAuMGYpIHsKKyAgICAgICAgLy8gaW1tZWRpYXRlbHkgYWJvcnQKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gbm93IHdlIGhhdmUgYSBwb3NpdGl2ZSB0aHJlc2hvbGRVcywgYWJvcnQgaWYgcmVtYWluaW5nCisgICAgLy8gcG9ydGlvbiB0byBkb3dubG9hZCBpcyBvdmVyIHRoYXQgdGhyZXNob2xkLgorICAgIGlmIChtU2VnbWVudEZpcnN0UFRTIDwgMCkgeworICAgICAgICAvLyB0aGlzIG1lYW5zIHdlIGhhdmVuJ3QgZXZlbiBmaW5kIHRoZSBmaXJzdCBhY2Nlc3MgdW5pdCwKKyAgICAgICAgLy8gYWJvcnQgbm93IGFzIHdlIG11c3QgYmUgdmVyeSBmYXIgYXdheSBmcm9tIHRoZSBlbmQuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpbnQ2NF90IGxhc3RFbnF1ZXVlVXMgPSBtU2VnbWVudEZpcnN0UFRTOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKChtU3RyZWFtVHlwZU1hc2sgJiBtUGFja2V0U291cmNlcy5rZXlBdChpKSkgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBtUGFja2V0U291cmNlc1tpXS0+Z2V0TGF0ZXN0RW5xdWV1ZWRNZXRhKCk7CisgICAgICAgIGludDMyX3QgdHlwZTsKKyAgICAgICAgaWYgKG1ldGEgPT0gTlVMTCB8fCBtZXRhLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmdHlwZSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGludDY0X3QgdG1wVXM7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRtcFVzKSk7CisgICAgICAgIGlmICh0bXBVcyA+IGxhc3RFbnF1ZXVlVXMpIHsKKyAgICAgICAgICAgIGxhc3RFbnF1ZXVlVXMgPSB0bXBVczsKKyAgICAgICAgfQorICAgIH0KKyAgICBsYXN0RW5xdWV1ZVVzIC09IG1TZWdtZW50Rmlyc3RQVFM7CisKKyAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSBtUGxheWxpc3QtPmdldFRhcmdldER1cmF0aW9uKCk7CisgICAgaW50NjRfdCB0aHJlc2hvbGRVcyA9IHRocmVzaG9sZFJhdGlvICogdGFyZ2V0RHVyYXRpb25VczsKKworICAgIEZMT0dWKCIlc3BhdXNpbmcgbm93LCB0aHJlc2hvbGRVcyAlbGxkLCByZW1haW5pbmcgJWxsZCIsCisgICAgICAgICAgICB0YXJnZXREdXJhdGlvblVzIC0gbGFzdEVucXVldWVVcyA+IHRocmVzaG9sZFVzID8gIiIgOiAibm90ICIsCisgICAgICAgICAgICAobG9uZyBsb25nKXRocmVzaG9sZFVzLAorICAgICAgICAgICAgKGxvbmcgbG9uZykodGFyZ2V0RHVyYXRpb25VcyAtIGxhc3RFbnF1ZXVlVXMpKTsKKworICAgIGlmICh0YXJnZXREdXJhdGlvblVzIC0gbGFzdEVucXVldWVVcyA+IHRocmVzaG9sZFVzKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUGxheWxpc3RGZXRjaGVyOjppbml0RG93bmxvYWRTdGF0ZSgKKyAgICAgICAgQVN0cmluZyAmdXJpLAorICAgICAgICBzcDxBTWVzc2FnZT4gJml0ZW1NZXRhLAorICAgICAgICBpbnQzMl90ICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCisgICAgICAgIGludDMyX3QgJmxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KSB7CiAgICAgc3RhdHVzX3QgZXJyID0gcmVmcmVzaFBsYXlsaXN0KCk7Ci0gICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOwotICAgIGludDMyX3QgbGFzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOworICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7CisgICAgbGFzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOwogICAgIGJvb2wgZGlzY29udGludWl0eSA9IGZhbHNlOwogCiAgICAgaWYgKG1QbGF5bGlzdCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChtUGxheWxpc3QtPm1ldGEoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJtZWRpYS1zZXF1ZW5jZSIsICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgbGFzdFNlcU51bWJlckluUGxheWxpc3QgPQotICAgICAgICAgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIChpbnQzMl90KW1QbGF5bGlzdC0+c2l6ZSgpIC0gMTsKKyAgICAgICAgbVBsYXlsaXN0LT5nZXRTZXFOdW1iZXJSYW5nZSgKKyAgICAgICAgICAgICAgICAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LCAmbGFzdFNlcU51bWJlckluUGxheWxpc3QpOwogCiAgICAgICAgIGlmIChtRGlzY29udGludWl0eVNlcSA8IDApIHsKICAgICAgICAgICAgIG1EaXNjb250aW51aXR5U2VxID0gbVBsYXlsaXN0LT5nZXREaXNjb250aW51aXR5U2VxKCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBtU2VnbWVudEZpcnN0UFRTID0gLTFsbDsKKwogICAgIGlmIChtUGxheWxpc3QgIT0gTlVMTCAmJiBtU2VxTnVtYmVyIDwgMCkgewogICAgICAgICBDSEVDS19HRShtU3RhcnRUaW1lVXMsIDBsbCk7CiAKQEAgLTc2NCwxOCArOTg3LDI2IEBACiAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzIC09IGdldFNlZ21lbnRTdGFydFRpbWVVcyhtU2VxTnVtYmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1TdGFydFRpbWVVc1JlbGF0aXZlID0gdHJ1ZTsKLSAgICAgICAgICAgIEFMT0dWKCJJbml0aWFsIHNlcXVlbmNlIG51bWJlciBmb3IgdGltZSAlIiBQUklkNjQgIiBpcyAlZCBmcm9tICglZCAuLiAlZCkiLAotICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXMsIG1TZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKKyAgICAgICAgICAgIEZMT0dWKCJJbml0aWFsIHNlcXVlbmNlIG51bWJlciBmb3IgdGltZSAlbGxkIGlzICVkIGZyb20gKCVkIC4uICVkKSIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVN0YXJ0VGltZVVzLCBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCiAgICAgICAgICAgICAgICAgICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFdoZW4gYWRhcHRpbmcgb3IgdHJhY2sgc3dpdGNoaW5nLCBtU2VnbWVudFN0YXJ0VGltZVVzIChyZWxhdGl2ZQogICAgICAgICAgICAgLy8gdG8gbWVkaWEgdGltZSAwKSBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgc3RhcnQgc2VnbWVudDsgbVN0YXJ0VGltZVVzIChhYnNvbHV0ZQogICAgICAgICAgICAgLy8gdGltZXN0YW1wcyBjb21pbmcgZnJvbSB0aGUgbWVkaWEgY29udGFpbmVyKSBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgcG9zaXRpb24KICAgICAgICAgICAgIC8vIGluc2lkZSBhIHNlZ21lbnRzLgotICAgICAgICAgICAgbVNlcU51bWJlciA9IGdldFNlcU51bWJlckZvclRpbWUobVNlZ21lbnRTdGFydFRpbWVVcyk7Ci0gICAgICAgICAgICBpZiAobUFkYXB0aXZlKSB7CisgICAgICAgICAgICBpZiAobVN0cmVhbVR5cGVNYXNrICE9IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUworICAgICAgICAgICAgICAgICAgICAmJiBtU2Vla01vZGUgIT0gTGl2ZVNlc3Npb246OmtTZWVrTW9kZU5leHRTYW1wbGUpIHsKICAgICAgICAgICAgICAgICAvLyBhdm9pZCBkb3VibGUgZmV0Y2gvZGVjb2RlCi0gICAgICAgICAgICAgICAgbVNlcU51bWJlciArPSAxOworICAgICAgICAgICAgICAgIC8vIFVzZSAobVNlZ21lbnRTdGFydFRpbWVVcyArIDEvMiAqIHRhcmdldER1cmF0aW9uVXMpIHRvIHNlYXJjaAorICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgc3RhcnRpbmcgc2VnbWVudCBpbiBuZXcgdmFyaWFudC4KKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdHdvIHZhcmlhbnRzJyBzZWdtZW50cyBhcmUgYWxpZ25lZCwgdGhpcyBnaXZlcyB0aGUKKyAgICAgICAgICAgICAgICAvLyBuZXh0IHNlZ21lbnQuIElmIHRoZXkncmUgbm90IGFsaWduZWQsIHRoaXMgZ2l2ZXMgdGhlIHNlZ21lbnQKKyAgICAgICAgICAgICAgICAvLyB0aGF0IG92ZXJsYXBzIG5vIG1vcmUgdGhhbiAxLzIgKiB0YXJnZXREdXJhdGlvblVzLgorICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBnZXRTZXFOdW1iZXJGb3JUaW1lKG1TZWdtZW50U3RhcnRUaW1lVXMKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbVBsYXlsaXN0LT5nZXRUYXJnZXREdXJhdGlvbigpIC8gMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBnZXRTZXFOdW1iZXJGb3JUaW1lKG1TZWdtZW50U3RhcnRUaW1lVXMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3NpemVfdCBtaW5TZXEgPSBnZXRTZXFOdW1iZXJGb3JEaXNjb250aW51aXR5KG1EaXNjb250aW51aXR5U2VxKTsKICAgICAgICAgICAgIGlmIChtU2VxTnVtYmVyIDwgbWluU2VxKSB7CkBAIC03ODksNyArMTAyMCw3IEBACiAgICAgICAgICAgICBpZiAobVNlcU51bWJlciA+IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KSB7CiAgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoIkluaXRpYWwgc2VxdWVuY2UgbnVtYmVyIGZvciBsaXZlIGV2ZW50ICVkIGZyb20gKCVkIC4uICVkKSIsCisgICAgICAgICAgICBGTE9HVigiSW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgaXMgJWQgZnJvbSAoJWQgLi4gJWQpIiwKICAgICAgICAgICAgICAgICAgICAgbVNlcU51bWJlciwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAogICAgICAgICAgICAgICAgICAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CiAgICAgICAgIH0KQEAgLTgwOSwyNiArMTA0MCwyNCBAQAogICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggaW4gaW5jcmVhc2luZyBmcmFjdGlvbiAoMS8yLCAxLzMsIC4uLikgb2YgdGhlCiAgICAgICAgICAgICAgICAgLy8gcGxheWxpc3QncyB0YXJnZXQgZHVyYXRpb24gb3IgMyBzZWNvbmRzLCB3aGljaGV2ZXIgaXMgbGVzcwogICAgICAgICAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IGtNYXhNb25pdG9yRGVsYXlVczsKLSAgICAgICAgICAgICAgICBpZiAobVBsYXlsaXN0ICE9IE5VTEwgJiYgbVBsYXlsaXN0LT5tZXRhKCkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uU2VjczsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigidGFyZ2V0LWR1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uU2VjcykpOwotICAgICAgICAgICAgICAgICAgICBkZWxheVVzID0gbVBsYXlsaXN0LT5zaXplKCkgKiB0YXJnZXREdXJhdGlvblNlY3MgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBsbCAvICgxICsgbU51bVJldHJpZXMpOworICAgICAgICAgICAgICAgIGlmIChtUGxheWxpc3QgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBkZWxheVVzID0gbVBsYXlsaXN0LT5zaXplKCkgKiBtUGxheWxpc3QtPmdldFRhcmdldER1cmF0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICgxICsgbU51bVJldHJpZXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoZGVsYXlVcyA+IGtNYXhNb25pdG9yRGVsYXlVcykgewogICAgICAgICAgICAgICAgICAgICBkZWxheVVzID0ga01heE1vbml0b3JEZWxheVVzOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigic2VxdWVuY2UgbnVtYmVyIGhpZ2g6ICVkIGZyb20gKCVkIC4uICVkKSwgIgotICAgICAgICAgICAgICAgICAgICAgICJtb25pdG9yIGluICUiIFBSSWQ2NCAiIChyZXRyeT0lZCkiLAorICAgICAgICAgICAgICAgIEZMT0dWKCJzZXF1ZW5jZSBudW1iZXIgaGlnaDogJWQgZnJvbSAoJWQgLi4gJWQpLCAiCisgICAgICAgICAgICAgICAgICAgICAgIm1vbml0b3IgaW4gJWxsZCAocmV0cnk9JWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0LCBkZWxheVVzLCBtTnVtUmV0cmllcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCwgKGxvbmcgbG9uZylkZWxheVVzLCBtTnVtUmV0cmllcyk7CiAgICAgICAgICAgICAgICAgcG9zdE1vbml0b3JRdWV1ZShkZWxheVVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyB3ZSd2ZSBtaXNzZWQgdGhlIGJvYXQsIGxldCdzIHN0YXJ0IDMgc2VnbWVudHMgcHJpb3IgdG8gdGhlIGxhdGVzdCBzZXF1ZW5jZQpAQCAtODQzLDEyICsxMDcyLDggQEAKICAgICAgICAgICAgICAgICAvLyBidXQgc2luY2UgdGhlIHNlZ21lbnRzIHdlIGFyZSBzdXBwb3NlZCB0byBmZXRjaCBoYXZlIGFscmVhZHkgcm9sbGVkIG9mZgogICAgICAgICAgICAgICAgIC8vIHRoZSBwbGF5bGlzdCwgaS5lLiB3ZSBoYXZlIGFscmVhZHkgbWlzc2VkIHRoZSBib2F0LCB3ZSBpbmV2aXRhYmx5IGhhdmUgdG8KICAgICAgICAgICAgICAgICAvLyBza2lwLgotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gZm9ybWF0Q2hhbmdlID0gbVNlc3Npb24tPmNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcigpOwotICAgICAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpLT5xdWV1ZUFjY2Vzc1VuaXQoZm9ybWF0Q2hhbmdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RvcEFzeW5jKC8qIGNsZWFyID0gKi8gZmFsc2UpOwotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBub3RpZnlTdG9wUmVhY2hlZCgpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCAtIDM7CiAgICAgICAgICAgICBpZiAobVNlcU51bWJlciA8IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCkgewpAQCAtODU4LDI5ICsxMDgzLDE1NiBAQAogCiAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgZmluZCBzZXF1ZW5jZSBudW1iZXIgJWQgaW4gcGxheWxpc3QgIgotICAgICAgICAgICAgICAgICAiKGNvbnRhaW5zICVkIC0gJWQpIiwKLSAgICAgICAgICAgICAgICAgbVNlcU51bWJlciwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAotICAgICAgICAgICAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgKGludDMyX3QpbVBsYXlsaXN0LT5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgIGlmIChtUGxheWxpc3QgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgZmluZCBzZXF1ZW5jZSBudW1iZXIgJWQgaW4gcGxheWxpc3QgIgorICAgICAgICAgICAgICAgICAgICAgIihjb250YWlucyAlZCAtICVkKSIsCisgICAgICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgKGludDMyX3QpbVBsYXlsaXN0LT5zaXplKCkgLSAxKTsKIAotICAgICAgICAgICAgbm90aWZ5RXJyb3IoRVJST1JfRU5EX09GX1NUUkVBTSk7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgaWYgKG1UU1BhcnNlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG1UU1BhcnNlci0+c2lnbmFsRU9TKEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICAgICAgICAgICAgICAvLyBVc2UgYW4gZW1wdHkgYnVmZmVyOyB3ZSBkb24ndCBoYXZlIGFueSBuZXcgZGF0YSwganVzdCB3YW50IHRvIGV4dHJhY3QKKyAgICAgICAgICAgICAgICAgICAgLy8gcG90ZW50aWFsIG5ldyBhY2Nlc3MgdW5pdHMgYWZ0ZXIgZmx1c2guICBSZXNldCBtU2VxTnVtYmVyIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0IHN1Y2ggdGhhdCB3ZSBzZXQgdGhlIGNvcnJlY3QgYWNjZXNzIHVuaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBpbiBleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0c0Zyb21Ucy4KKyAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoMCk7CisgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEFuZFF1ZXVlQWNjZXNzVW5pdHNGcm9tVHMoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3ZSB3ZXJlIG5ldmVyIGFibGUgdG8gZG93bmxvYWQgdGhlIHBsYXlsaXN0LgorICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBzaG91bGQgbm90aWZ5IGVycm9yLCBpbnN0ZWFkIG9mIEVPUywgYXMgRU9TIGR1cmluZworICAgICAgICAgICAgICAgIC8vIHByZXBhcmUgbWVhbnMgd2Ugc3VjY2VlZGVkIGluIGRvd25sb2FkaW5nIGV2ZXJ5dGhpbmcuCisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkb3dubG9hZCBwbGF5bGlzdCEiKTsKKyAgICAgICAgICAgICAgICBub3RpZnlFcnJvcihFUlJPUl9JTyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIAogICAgIG1OdW1SZXRyaWVzID0gMDsKIAotICAgIEFTdHJpbmcgdXJpOwotICAgIHNwPEFNZXNzYWdlPiBpdGVtTWV0YTsKICAgICBDSEVDSyhtUGxheWxpc3QtPml0ZW1BdCgKICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyIC0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAogICAgICAgICAgICAgICAgICZ1cmksCiAgICAgICAgICAgICAgICAgJml0ZW1NZXRhKSk7CiAKKyAgICBDSEVDSyhpdGVtTWV0YS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5LXNlcXVlbmNlIiwgJm1EaXNjb250aW51aXR5U2VxKSk7CisKICAgICBpbnQzMl90IHZhbDsKICAgICBpZiAoaXRlbU1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZ2YWwpICYmIHZhbCAhPSAwKSB7Ci0gICAgICAgIG1EaXNjb250aW51aXR5U2VxKys7CiAgICAgICAgIGRpc2NvbnRpbnVpdHkgPSB0cnVlOworICAgIH0gZWxzZSBpZiAobUxhc3REaXNjb250aW51aXR5U2VxID49IDAKKyAgICAgICAgICAgICYmIG1EaXNjb250aW51aXR5U2VxICE9IG1MYXN0RGlzY29udGludWl0eVNlcSkgeworICAgICAgICAvLyBTZWVrIGp1bXBlZCB0byBhIG5ldyBkaXNjb250aW51aXR5IHNlcXVlbmNlLiBXZSBuZWVkIHRvIHNpZ25hbAorICAgICAgICAvLyBhIGZvcm1hdCBjaGFuZ2UgdG8gZGVjb2Rlci4gRGVjb2RlciBuZWVkcyB0byBzaHV0ZG93biBhbmQgYmUKKyAgICAgICAgLy8gY3JlYXRlZCBhZ2FpbiBpZiBzZWFtbGVzcyBmb3JtYXQgY2hhbmdlIGlzIHVuc3VwcG9ydGVkLgorICAgICAgICBGTE9HVigic2F3IGRpc2NvbnRpbnVpdHk6IG1TdGFydHVwICVkLCBtTGFzdERpc2NvbnRpbnVpdHlTZXEgJWQsICIKKyAgICAgICAgICAgICAgICAibURpc2NvbnRpbnVpdHlTZXEgJWQsIG1TdGFydFRpbWVVcyAlbGxkIiwKKyAgICAgICAgICAgICAgICBtU3RhcnR1cCwgbUxhc3REaXNjb250aW51aXR5U2VxLCBtRGlzY29udGludWl0eVNlcSwgKGxvbmcgbG9uZyltU3RhcnRUaW1lVXMpOworICAgICAgICBkaXNjb250aW51aXR5ID0gdHJ1ZTsKKyAgICB9CisgICAgbUxhc3REaXNjb250aW51aXR5U2VxID0gLTE7CisKKyAgICAvLyBkZWNyeXB0IGEganVuayBidWZmZXIgdG8gcHJlZmV0Y2gga2V5OyBzaW5jZSBhIHNlc3Npb24gdXNlcyBvbmx5IG9uZSBodHRwIGNvbm5lY3Rpb24sCisgICAgLy8gdGhpcyBhdm9pZHMgaW50ZXJsZWF2ZWQgY29ubmVjdGlvbnMgdG8gdGhlIGtleSBhbmQgc2VnbWVudCBmaWxlLgorICAgIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4ganVuayA9IG5ldyBBQnVmZmVyKDE2KTsKKyAgICAgICAganVuay0+c2V0UmFuZ2UoMCwgMTYpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBkZWNyeXB0QnVmZmVyKG1TZXFOdW1iZXIgLSBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsIGp1bmssCisgICAgICAgICAgICAgICAgdHJ1ZSAvKiBmaXJzdCAqLyk7CisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfTk9UX0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgbm90aWZ5RXJyb3IoZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgobVN0YXJ0dXAgJiYgIW1UaW1lQ2hhbmdlU2lnbmFsZWQpIHx8IGRpc2NvbnRpbnVpdHkpIHsKKyAgICAgICAgLy8gV2UgbmVlZCB0byBzaWduYWwgYSB0aW1lIGRpc2NvbnRpbnVpdHkgdG8gQVRTUGFyc2VyIG9uIHRoZQorICAgICAgICAvLyBmaXJzdCBzZWdtZW50IGFmdGVyIHN0YXJ0LCBvciBvbiBhIGRpc2NvbnRpbnVpdHkgc2VnbWVudC4KKyAgICAgICAgLy8gU2V0dGluZyBtTmV4dFBUU1RpbWVVcyBpbmZvcm1zIGV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzWFgoKQorICAgICAgICAvLyB0byBzZW5kIHRoZSB0aW1lIGRpc2NvbnRpbnVpdHkuCisgICAgICAgIGlmIChtUGxheWxpc3QtPmlzQ29tcGxldGUoKSB8fCBtUGxheWxpc3QtPmlzRXZlbnQoKSkgeworICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgYSBsaXZlIGV2ZW50IHRoaXMgbWFkZSBubyBzZW5zZSBzaW5jZQorICAgICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gYWxsIHRoZSBzZWdtZW50IGJlZm9yZSB0aGUgY3VycmVudAorICAgICAgICAgICAgLy8gb25lLgorICAgICAgICAgICAgbU5leHRQVFNUaW1lVXMgPSBnZXRTZWdtZW50U3RhcnRUaW1lVXMobVNlcU51bWJlcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXR0aW5nIG1UaW1lQ2hhbmdlU2lnbmFsZWQgdG8gdHJ1ZSwgc28gdGhhdCBpZiBzdGFydCB0aW1lCisgICAgICAgIC8vIHNlYXJjaGluZyBnb2VzIGludG8gMm5kIHNlZ21lbnQgKHdpdGhvdXQgYSBkaXNjb250aW51aXR5KSwKKyAgICAgICAgLy8gd2UgZG9uJ3QgcmVzZXQgdGltZSBhZ2Fpbi4gSXQgY2F1c2VzIGNvcnJ1cHRpb24gd2hlbiBwZW5kaW5nCisgICAgICAgIC8vIGRhdGEgaW4gQVRTUGFyc2VyIGlzIGNsZWFyZWQuCisgICAgICAgIG1UaW1lQ2hhbmdlU2lnbmFsZWQgPSB0cnVlOworICAgIH0KKworICAgIGlmIChkaXNjb250aW51aXR5KSB7CisgICAgICAgIEFMT0dJKCJxdWV1ZWluZyBkaXNjb250aW51aXR5IChleHBsaWNpdD0lZCkiLCBkaXNjb250aW51aXR5KTsKKworICAgICAgICAvLyBTaWduYWwgYSBmb3JtYXQgZGlzY29udGludWl0eSB0byBBVFNQYXJzZXIgdG8gY2xlYXIgcGFydGlhbCBkYXRhCisgICAgICAgIC8vIGZyb20gcHJldmlvdXMgc3RyZWFtcy4gTm90IGRvaW5nIHRoaXMgY2F1c2VzIGJpdHN0cmVhbSBjb3JydXB0aW9uLgorICAgICAgICBpZiAobVRTUGFyc2VyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1UU1BhcnNlci0+c2lnbmFsRGlzY29udGludWl0eSgKKyAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRSwgTlVMTCAvKiBleHRyYSAqLyk7CisgICAgICAgIH0KKworICAgICAgICBxdWV1ZURpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVF9PTkxZLAorICAgICAgICAgICAgICAgIE5VTEwgLyogZXh0cmEgKi8pOworCisgICAgICAgIGlmIChtU3RhcnR1cCAmJiBtU3RhcnRUaW1lVXNSZWxhdGl2ZSAmJiBtRmlyc3RQVFNWYWxpZCkgeworICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB3ZSBndWVzc2VkIG1TdGFydFRpbWVVcyB0byBiZSBpbiB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgIC8vIHNlZ21lbnQgKGxpa2VseSB2ZXJ5IGNsb3NlIHRvIHRoZSBlbmQpLCBidXQgZWl0aGVyIHZpZGVvIG9yCisgICAgICAgICAgICAvLyBhdWRpbyBoYXMgbm90IGZvdW5kIHN0YXJ0IGJ5IHRoZSBlbmQgb2YgdGhhdCBzZWdtZW50LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIHRoaXMgbmV3IHNlZ21lbnQgaXMgbm90IGEgZGlzY29udGludWl0eSwga2VlcCBzZWFyY2hpbmcuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgdGhpcyBuZXcgc2VnbWVudCBldmVuIGdvdCBhIGRpc2NvbnRpbnVpdHkgbWFya2VyLCBqdXN0CisgICAgICAgICAgICAvLyBzZXQgbVN0YXJ0VGltZVVzPTAsIGFuZCB0YWtlIGFsbCBzYW1wbGVzIGZyb20gbm93IG9uLgorICAgICAgICAgICAgbVN0YXJ0VGltZVVzID0gMDsKKyAgICAgICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICBtSURSRm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+Y2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEZMT0dWKCJmZXRjaGluZyBzZWdtZW50ICVkIGZyb20gKCVkIC4uICVkKSIsCisgICAgICAgICAgICBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBQbGF5bGlzdEZldGNoZXI6Om9uRG93bmxvYWROZXh0KCkgeworICAgIEFTdHJpbmcgdXJpOworICAgIHNwPEFNZXNzYWdlPiBpdGVtTWV0YTsKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgc3A8QUJ1ZmZlcj4gdHNCdWZmZXI7CisgICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOworICAgIGludDMyX3QgbGFzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOworICAgIGJvb2wgY29ubmVjdEhUVFAgPSB0cnVlOworCisgICAgaWYgKG1Eb3dubG9hZFN0YXRlLT5oYXNTYXZlZFN0YXRlKCkpIHsKKyAgICAgICAgbURvd25sb2FkU3RhdGUtPnJlc3RvcmVTdGF0ZSgKKyAgICAgICAgICAgICAgICB1cmksCisgICAgICAgICAgICAgICAgaXRlbU1ldGEsCisgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgIHRzQnVmZmVyLAorICAgICAgICAgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKKyAgICAgICAgICAgICAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CisgICAgICAgIGNvbm5lY3RIVFRQID0gZmFsc2U7CisgICAgICAgIEZMT0dWKCJyZXN1bWluZzogJyVzJyIsIHVyaS5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWluaXREb3dubG9hZFN0YXRlKAorICAgICAgICAgICAgICAgIHVyaSwKKyAgICAgICAgICAgICAgICBpdGVtTWV0YSwKKyAgICAgICAgICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCisgICAgICAgICAgICAgICAgbGFzdFNlcU51bWJlckluUGxheWxpc3QpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgRkxPR1YoImZldGNoaW5nOiAnJXMnIiwgdXJpLmNfc3RyKCkpOwogICAgIH0KIAogICAgIGludDY0X3QgcmFuZ2Vfb2Zmc2V0LCByYW5nZV9sZW5ndGg7CkBAIC04OTAsMzMgKzEyNDIsMTkgQEAKICAgICAgICAgcmFuZ2VfbGVuZ3RoID0gLTE7CiAgICAgfQogCi0gICAgQUxPR1YoImZldGNoaW5nIHNlZ21lbnQgJWQgZnJvbSAoJWQgLi4gJWQpIiwKLSAgICAgICAgICBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKLQotICAgIEFMT0dWKCJmZXRjaGluZyAnJXMnIiwgdXJpLmNfc3RyKCkpOwotCi0gICAgc3A8RGF0YVNvdXJjZT4gc291cmNlOwotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciwgdHNCdWZmZXI7Ci0gICAgLy8gZGVjcnlwdCBhIGp1bmsgYnVmZmVyIHRvIHByZWZldGNoIGtleTsgc2luY2UgYSBzZXNzaW9uIHVzZXMgb25seSBvbmUgaHR0cCBjb25uZWN0aW9uLAotICAgIC8vIHRoaXMgYXZvaWRzIGludGVybGVhdmVkIGNvbm5lY3Rpb25zIHRvIHRoZSBrZXkgYW5kIHNlZ21lbnQgZmlsZS4KLSAgICB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IGp1bmsgPSBuZXcgQUJ1ZmZlcigxNik7Ci0gICAgICAgIGp1bmstPnNldFJhbmdlKDAsIDE2KTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gZGVjcnlwdEJ1ZmZlcihtU2VxTnVtYmVyIC0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LCBqdW5rLAotICAgICAgICAgICAgICAgIHRydWUgLyogZmlyc3QgKi8pOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBub3RpZnlFcnJvcihlcnIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLy8gYmxvY2std2lzZSBkb3dubG9hZAotICAgIGJvb2wgc3RhcnR1cCA9IG1TdGFydHVwOworICAgIGJvb2wgc2hvdWxkUGF1c2UgPSBmYWxzZTsKICAgICBzc2l6ZV90IGJ5dGVzUmVhZDsKICAgICBkbyB7Ci0gICAgICAgIGJ5dGVzUmVhZCA9IG1TZXNzaW9uLT5mZXRjaEZpbGUoCi0gICAgICAgICAgICAgICAgdXJpLmNfc3RyKCksICZidWZmZXIsIHJhbmdlX29mZnNldCwgcmFuZ2VfbGVuZ3RoLCBrRG93bmxvYWRCbG9ja1NpemUsICZzb3VyY2UpOworICAgICAgICBpbnQ2NF90IHN0YXJ0VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICBieXRlc1JlYWQgPSBtSFRUUERvd25sb2FkZXItPmZldGNoQmxvY2soCisgICAgICAgICAgICAgICAgdXJpLmNfc3RyKCksICZidWZmZXIsIHJhbmdlX29mZnNldCwgcmFuZ2VfbGVuZ3RoLCBrRG93bmxvYWRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgTlVMTCAvKiBhY3R1YWxVUkwgKi8sIGNvbm5lY3RIVFRQKTsKKyAgICAgICAgaW50NjRfdCBkZWxheVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VXM7CiAKKyAgICAgICAgaWYgKGJ5dGVzUmVhZCA9PSBFUlJPUl9OT1RfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgaWYgKGJ5dGVzUmVhZCA8IDApIHsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGJ5dGVzUmVhZDsKICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZmV0Y2ggLnRzIHNlZ21lbnQgYXQgdXJsICclcyciLCB1cmkuY19zdHIoKSk7CkBAIC05MjQsNiArMTI2MiwyMiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gYWRkIHNhbXBsZSBmb3IgYmFuZHdpZHRoIGVzdGltYXRpb24sIGV4Y2x1ZGluZyBzYW1wbGVzIGZyb20gc3VidGl0bGVzIChhcworICAgICAgICAvLyBpdHMgdG9vIHNtYWxsKSwgb3IgZHVyaW5nIHN0YXJ0dXAvcmVzdW1lVW50aWwgKHdoZW4gd2UgY291bGQgaGF2ZSBtb3JlIHRoYW4KKyAgICAgICAgLy8gb25lIGNvbm5lY3Rpb24gb3BlbiB3aGljaCBhZmZlY3RzIGJhbmR3aWR0aCkKKyAgICAgICAgaWYgKCFtU3RhcnR1cCAmJiBtU3RvcFBhcmFtcyA9PSBOVUxMICYmIGJ5dGVzUmVhZCA+IDAKKyAgICAgICAgICAgICAgICAmJiAobVN0cmVhbVR5cGVNYXNrCisgICAgICAgICAgICAgICAgICAgICAgICAmIChMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTworICAgICAgICAgICAgICAgICAgICAgICAgfCBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9WSURFTykpKSB7CisgICAgICAgICAgICBtU2Vzc2lvbi0+YWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQoYnl0ZXNSZWFkLCBkZWxheVVzKTsKKyAgICAgICAgICAgIGlmIChkZWxheVVzID4gMjAwMDAwMGxsKSB7CisgICAgICAgICAgICAgICAgRkxPR1YoImJ5dGVzUmVhZCAlemQgdG9vayAlLjJmIHNlY29uZHMgLSBhYm5vcm1hbCBiYW5kd2lkdGggZGlwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUmVhZCwgKGRvdWJsZSlkZWxheVVzIC8gMS4wZTYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY29ubmVjdEhUVFAgPSBmYWxzZTsKKwogICAgICAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7CiAKICAgICAgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnNpemUoKTsKQEAgLTk0MSwyOCArMTI5NSw3IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoc3RhcnR1cCB8fCBkaXNjb250aW51aXR5KSB7Ci0gICAgICAgICAgICAvLyBTaWduYWwgZGlzY29udGludWl0eS4KLQotICAgICAgICAgICAgaWYgKG1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpIHx8IG1QbGF5bGlzdC0+aXNFdmVudCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgYSBsaXZlIGV2ZW50IHRoaXMgbWFkZSBubyBzZW5zZSBzaW5jZQotICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIGFsbCB0aGUgc2VnbWVudCBiZWZvcmUgdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAvLyBvbmUuCi0gICAgICAgICAgICAgICAgbU5leHRQVFNUaW1lVXMgPSBnZXRTZWdtZW50U3RhcnRUaW1lVXMobVNlcU51bWJlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkaXNjb250aW51aXR5KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koInF1ZXVlaW5nIGRpc2NvbnRpbnVpdHkgKGV4cGxpY2l0PSVkKSIsIGRpc2NvbnRpbnVpdHkpOwotCi0gICAgICAgICAgICAgICAgcXVldWVEaXNjb250aW51aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogZXh0cmEgKi8pOwotCi0gICAgICAgICAgICAgICAgZGlzY29udGludWl0eSA9IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGFydHVwID0gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgICAgYm9vbCBzdGFydFVwID0gbVN0YXJ0dXA7IC8vIHNhdmUgY3VycmVudCBzdGFydCB1cCBzdGF0ZQogCiAgICAgICAgIGVyciA9IE9LOwogICAgICAgICBpZiAoYnVmZmVyU3RhcnRzV2l0aFRzU3luY0J5dGUoYnVmZmVyKSkgewpAQCAtOTc2LDcgKzEzMDksNiBAQAogICAgICAgICAgICAgICAgIHRzQnVmZmVyLT5zZXRSYW5nZSh0c09mZiwgdHNTaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRzQnVmZmVyLT5zZXRSYW5nZSh0c0J1ZmZlci0+b2Zmc2V0KCksIHRzQnVmZmVyLT5zaXplKCkgKyBieXRlc1JlYWQpOwotCiAgICAgICAgICAgICBlcnIgPSBleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0c0Zyb21Ucyh0c0J1ZmZlcik7CiAgICAgICAgIH0KIApAQCAtOTkxLDIzICsxMzIzLDQ1IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX09VVF9PRl9SQU5HRSkgewogICAgICAgICAgICAgLy8gcmVhY2hlZCBzdG9wcGluZyBwb2ludAotICAgICAgICAgICAgc3RvcEFzeW5jKC8qIGNsZWFyID0gKi8gZmFsc2UpOworICAgICAgICAgICAgbm90aWZ5U3RvcFJlYWNoZWQoKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIG5vdGlmeUVycm9yKGVycik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLQorICAgICAgICAvLyBJZiB3ZSdyZSBzd2l0Y2hpbmcsIHBvc3Qgc3RhcnQgbm90aWZpY2F0aW9uCisgICAgICAgIC8vIHRoaXMgc2hvdWxkIG9ubHkgYmUgcG9zdGVkIHdoZW4gdGhlIGxhc3QgY2h1bmsgaXMgZnVsbCBwcm9jZXNzZWQgYnkgVFNQYXJzZXIKKyAgICAgICAgaWYgKG1TZWVrTW9kZSAhPSBMaXZlU2Vzc2lvbjo6a1NlZWtNb2RlRXhhY3RQb3NpdGlvbiAmJiBzdGFydFVwICE9IG1TdGFydHVwKSB7CisgICAgICAgICAgICBDSEVDSyhtU3RhcnRUaW1lVXNOb3RpZnkgIT0gTlVMTCk7CisgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS5jbGVhcigpOworICAgICAgICAgICAgc2hvdWxkUGF1c2UgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzaG91bGRQYXVzZSB8fCBzaG91bGRQYXVzZURvd25sb2FkKCkpIHsKKyAgICAgICAgICAgIC8vIHNhdmUgc3RhdGUgYW5kIHJldHVybiBpZiB0aGlzIGlzIG5vdCB0aGUgbGFzdCBjaHVuaywKKyAgICAgICAgICAgIC8vIGxlYXZpbmcgdGhlIGZldGNoZXIgaW4gcGF1c2VkIHN0YXRlLgorICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgbURvd25sb2FkU3RhdGUtPnNhdmVTdGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1NZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgdHNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hvdWxkUGF1c2UgPSB0cnVlOworICAgICAgICB9CiAgICAgfSB3aGlsZSAoYnl0ZXNSZWFkICE9IDApOwogCiAgICAgaWYgKGJ1ZmZlclN0YXJ0c1dpdGhUc1N5bmNCeXRlKGJ1ZmZlcikpIHsKICAgICAgICAgLy8gSWYgd2UgZG9uJ3Qgc2VlIGEgc3RyZWFtIGluIHRoZSBwcm9ncmFtIHRhYmxlIGFmdGVyIGZldGNoaW5nIGEgZnVsbCB0cyBzZWdtZW50CiAgICAgICAgIC8vIG1hcmsgaXQgYXMgbm9uZXhpc3RlbnQuCi0gICAgICAgIGNvbnN0IHNpemVfdCBrTnVtVHlwZXMgPSBBVFNQYXJzZXI6Ok5VTV9TT1VSQ0VfVFlQRVM7Ci0gICAgICAgIEFUU1BhcnNlcjo6U291cmNlVHlwZSBzcmNUeXBlc1trTnVtVHlwZXNdID0KKyAgICAgICAgQVRTUGFyc2VyOjpTb3VyY2VUeXBlIHNyY1R5cGVzW10gPQogICAgICAgICAgICAgICAgIHsgQVRTUGFyc2VyOjpWSURFTywgQVRTUGFyc2VyOjpBVURJTyB9OwotICAgICAgICBMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSBzdHJlYW1UeXBlc1trTnVtVHlwZXNdID0KKyAgICAgICAgTGl2ZVNlc3Npb246OlN0cmVhbVR5cGUgc3RyZWFtVHlwZXNbXSA9CiAgICAgICAgICAgICAgICAgeyBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9WSURFTywgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfQVVESU8gfTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1UeXBlcyA9IE5FTEVNKHNyY1R5cGVzKTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1UeXBlczsgaSsrKSB7CiAgICAgICAgICAgICBBVFNQYXJzZXI6OlNvdXJjZVR5cGUgc3JjVHlwZSA9IHNyY1R5cGVzW2ldOwpAQCAtMTAzNCw3ICsxMzg4LDYgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGVyciA9IE9LOwogICAgIGlmICh0c0J1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgIEFTdHJpbmcgbWV0aG9kOwogICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZFN0cmluZygiY2lwaGVyLW1ldGhvZCIsICZtZXRob2QpKTsKQEAgLTEwNDgsODEgKzE0MDEsMTE3IEBACiAgICAgfQogCiAgICAgLy8gYnVsayBleHRyYWN0IG5vbi10cyBmaWxlcworICAgIGJvb2wgc3RhcnRVcCA9IG1TdGFydHVwOwogICAgIGlmICh0c0J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIGVyciA9IGV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzKGJ1ZmZlciwgaXRlbU1ldGEpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0cyhidWZmZXIsIGl0ZW1NZXRhKTsKICAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7CiAgICAgICAgICAgICAvLyBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIgdG9vIGxvdy9oaWdoCiAgICAgICAgICAgICBwb3N0TW9uaXRvclF1ZXVlKCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX09VVF9PRl9SQU5HRSkgewogICAgICAgICAgICAgLy8gcmVhY2hlZCBzdG9wcGluZyBwb2ludAotICAgICAgICAgICAgc3RvcEFzeW5jKC8qIGNsZWFyID0gKi9mYWxzZSk7CisgICAgICAgICAgICBub3RpZnlTdG9wUmVhY2hlZCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgbm90aWZ5RXJyb3IoZXJyKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbm90aWZ5RXJyb3IoZXJyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQogICAgICsrbVNlcU51bWJlcjsKIAotICAgIHBvc3RNb25pdG9yUXVldWUoKTsKKyAgICAvLyBpZiBhZGFwdGluZywgcGF1c2UgYWZ0ZXIgZm91bmQgdGhlIG5leHQgc3RhcnRpbmcgcG9pbnQKKyAgICBpZiAobVNlZWtNb2RlICE9IExpdmVTZXNzaW9uOjprU2Vla01vZGVFeGFjdFBvc2l0aW9uICYmIHN0YXJ0VXAgIT0gbVN0YXJ0dXApIHsKKyAgICAgICAgQ0hFQ0sobVN0YXJ0VGltZVVzTm90aWZ5ICE9IE5VTEwpOworICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnBvc3QoKTsKKyAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LmNsZWFyKCk7CisgICAgICAgIHNob3VsZFBhdXNlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIXNob3VsZFBhdXNlKSB7CisgICAgICAgIHBvc3RNb25pdG9yUXVldWUoKTsKKyAgICB9CiB9CiAKLWludDMyX3QgUGxheWxpc3RGZXRjaGVyOjpnZXRTZXFOdW1iZXJXaXRoQW5jaG9yVGltZShpbnQ2NF90IGFuY2hvclRpbWVVcykgY29uc3QgewotICAgIGludDMyX3QgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LCBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdDsKLSAgICBpZiAobVBsYXlsaXN0LT5tZXRhKCkgPT0gTlVMTAotICAgICAgICAgICAgfHwgIW1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoIm1lZGlhLXNlcXVlbmNlIiwgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCkpIHsKLSAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gMDsKLSAgICB9Ci0gICAgbGFzdFNlcU51bWJlckluUGxheWxpc3QgPSBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyBtUGxheWxpc3QtPnNpemUoKSAtIDE7CisvKgorICogcmV0dXJucyB0cnVlIGlmIHdlIG5lZWQgdG8gYWRqdXN0IG1TZXFOdW1iZXIKKyAqLworYm9vbCBQbGF5bGlzdEZldGNoZXI6OmFkanVzdFNlcU51bWJlcldpdGhBbmNob3JUaW1lKGludDY0X3QgYW5jaG9yVGltZVVzKSB7CisgICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSBtUGxheWxpc3QtPmdldEZpcnN0U2VxTnVtYmVyKCk7CiAKLSAgICBpbnQzMl90IGluZGV4ID0gbVNlcU51bWJlciAtIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCAtIDE7Ci0gICAgd2hpbGUgKGluZGV4ID49IDAgJiYgYW5jaG9yVGltZVVzID4gbVN0YXJ0VGltZVVzKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBpdGVtTWV0YTsKLSAgICAgICAgQ0hFQ0sobVBsYXlsaXN0LT5pdGVtQXQoaW5kZXgsIE5VTEwgLyogdXJpICovLCAmaXRlbU1ldGEpKTsKLQotICAgICAgICBpbnQ2NF90IGl0ZW1EdXJhdGlvblVzOwotICAgICAgICBDSEVDSyhpdGVtTWV0YS0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJml0ZW1EdXJhdGlvblVzKSk7Ci0KLSAgICAgICAgYW5jaG9yVGltZVVzIC09IGl0ZW1EdXJhdGlvblVzOwotICAgICAgICAtLWluZGV4OwotICAgIH0KLQotICAgIGludDMyX3QgbmV3U2VxTnVtYmVyID0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgaW5kZXggKyAxOwotICAgIGlmIChuZXdTZXFOdW1iZXIgPD0gbGFzdFNlcU51bWJlckluUGxheWxpc3QpIHsKLSAgICAgICAgcmV0dXJuIG5ld1NlcU51bWJlcjsKKyAgICBpbnQ2NF90IG1pbkRpZmZVcywgbWF4RGlmZlVzOworICAgIGlmIChtU2Vla01vZGUgPT0gTGl2ZVNlc3Npb246OmtTZWVrTW9kZU5leHRTYW1wbGUpIHsKKyAgICAgICAgLy8gaWYgdGhlIHByZXZpb3VzIGZldGNoZXIgcGF1c2VkIGluIHRoZSBtaWRkbGUgb2YgYSBzZWdtZW50LCB3ZQorICAgICAgICAvLyB3YW50IHRvIHN0YXJ0IGF0IGEgc2VnbWVudCB0aGF0IG92ZXJsYXBzIHRoZSBsYXN0IHNhbXBsZQorICAgICAgICBtaW5EaWZmVXMgPSAtbVBsYXlsaXN0LT5nZXRUYXJnZXREdXJhdGlvbigpOworICAgICAgICBtYXhEaWZmVXMgPSAwbGw7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgICAgICAvLyBpZiB0aGUgcHJldmlvdXMgZmV0Y2hlciBwYXVzZWQgYXQgdGhlIGVuZCBvZiBhIHNlZ21lbnQsIGlkZWFsbHkKKyAgICAgICAgLy8gd2Ugd2FudCB0byBzdGFydCBhdCB0aGUgc2VnbWVudCB0aGF0J3Mgcm91Z2hseSBhbGlnbmVkIHdpdGggaXRzCisgICAgICAgIC8vIG5leHQgc2VnbWVudCwgYnV0IGlmIHRoZSB0d28gdmFyaWFudHMgYXJlIG5vdCB3ZWxsIGFsaWduZWQgd2UKKyAgICAgICAgLy8gYWRqdXN0IHRoZSBkaWZmIHRvIHdpdGhpbiAoLVQvMiwgVC8yKQorICAgICAgICBtaW5EaWZmVXMgPSAtbVBsYXlsaXN0LT5nZXRUYXJnZXREdXJhdGlvbigpIC8gMjsKKyAgICAgICAgbWF4RGlmZlVzID0gbVBsYXlsaXN0LT5nZXRUYXJnZXREdXJhdGlvbigpIC8gMjsKICAgICB9CisKKyAgICBpbnQzMl90IG9sZFNlcU51bWJlciA9IG1TZXFOdW1iZXI7CisgICAgc3NpemVfdCBpbmRleCA9IG1TZXFOdW1iZXIgLSBmaXJzdFNlcU51bWJlckluUGxheWxpc3Q7CisKKyAgICAvLyBhZGp1c3QgYW5jaG9yVGltZVVzIHRvIHdpdGhpbiAobWluRGlmZlVzLCBtYXhEaWZmVXMpIGZyb20gbVN0YXJ0VGltZVVzCisgICAgaW50NjRfdCBkaWZmVXMgPSBhbmNob3JUaW1lVXMgLSBtU3RhcnRUaW1lVXM7CisgICAgaWYgKGRpZmZVcyA+IG1heERpZmZVcykgeworICAgICAgICB3aGlsZSAoaW5kZXggPiAwICYmIGRpZmZVcyA+IG1heERpZmZVcykgeworICAgICAgICAgICAgLS1pbmRleDsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGl0ZW1NZXRhOworICAgICAgICAgICAgQ0hFQ0sobVBsYXlsaXN0LT5pdGVtQXQoaW5kZXgsIE5VTEwgLyogdXJpICovLCAmaXRlbU1ldGEpKTsKKworICAgICAgICAgICAgaW50NjRfdCBpdGVtRHVyYXRpb25VczsKKyAgICAgICAgICAgIENIRUNLKGl0ZW1NZXRhLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmaXRlbUR1cmF0aW9uVXMpKTsKKworICAgICAgICAgICAgZGlmZlVzIC09IGl0ZW1EdXJhdGlvblVzOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChkaWZmVXMgPCBtaW5EaWZmVXMpIHsKKyAgICAgICAgd2hpbGUgKGluZGV4ICsgMSA8IChzc2l6ZV90KSBtUGxheWxpc3QtPnNpemUoKQorICAgICAgICAgICAgICAgICYmIGRpZmZVcyA8IG1pbkRpZmZVcykgeworICAgICAgICAgICAgKytpbmRleDsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGl0ZW1NZXRhOworICAgICAgICAgICAgQ0hFQ0sobVBsYXlsaXN0LT5pdGVtQXQoaW5kZXgsIE5VTEwgLyogdXJpICovLCAmaXRlbU1ldGEpKTsKKworICAgICAgICAgICAgaW50NjRfdCBpdGVtRHVyYXRpb25VczsKKyAgICAgICAgICAgIENIRUNLKGl0ZW1NZXRhLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmaXRlbUR1cmF0aW9uVXMpKTsKKworICAgICAgICAgICAgZGlmZlVzICs9IGl0ZW1EdXJhdGlvblVzOworICAgICAgICB9CisgICAgfQorCisgICAgbVNlcU51bWJlciA9IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIGluZGV4OworCisgICAgaWYgKG1TZXFOdW1iZXIgIT0gb2xkU2VxTnVtYmVyKSB7CisgICAgICAgIEZMT0dWKCJndWVzc2VkIHdyb25nIHNlZyBudW1iZXI6IGRpZmYgJWxsZCBvdXQgb2YgWyVsbGQsICVsbGRdIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBhbmNob3JUaW1lVXMgLSBtU3RhcnRUaW1lVXMsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgbWluRGlmZlVzLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG1heERpZmZVcyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIGludDMyX3QgUGxheWxpc3RGZXRjaGVyOjpnZXRTZXFOdW1iZXJGb3JEaXNjb250aW51aXR5KHNpemVfdCBkaXNjb250aW51aXR5U2VxKSBjb25zdCB7Ci0gICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3Q7Ci0gICAgaWYgKG1QbGF5bGlzdC0+bWV0YSgpID09IE5VTEwKLSAgICAgICAgICAgIHx8ICFtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJtZWRpYS1zZXF1ZW5jZSIsICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QpKSB7Ci0gICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7Ci0gICAgfQotCi0gICAgc2l6ZV90IGN1ckRpc2NvbnRpbnVpdHlTZXEgPSBtUGxheWxpc3QtPmdldERpc2NvbnRpbnVpdHlTZXEoKTsKLSAgICBpZiAoZGlzY29udGludWl0eVNlcSA8IGN1ckRpc2NvbnRpbnVpdHlTZXEpIHsKLSAgICAgICAgcmV0dXJuIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA8PSAwID8gMCA6IChmaXJzdFNlcU51bWJlckluUGxheWxpc3QgLSAxKTsKLSAgICB9CisgICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSBtUGxheWxpc3QtPmdldEZpcnN0U2VxTnVtYmVyKCk7CiAKICAgICBzaXplX3QgaW5kZXggPSAwOwogICAgIHdoaWxlIChpbmRleCA8IG1QbGF5bGlzdC0+c2l6ZSgpKSB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBpdGVtTWV0YTsKICAgICAgICAgQ0hFQ0sobVBsYXlsaXN0LT5pdGVtQXQoIGluZGV4LCBOVUxMIC8qIHVyaSAqLywgJml0ZW1NZXRhKSk7Ci0KLSAgICAgICAgaW50NjRfdCBkaXNjb250aW51aXR5OwotICAgICAgICBpZiAoaXRlbU1ldGEtPmZpbmRJbnQ2NCgiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSkgewotICAgICAgICAgICAgY3VyRGlzY29udGludWl0eVNlcSsrOwotICAgICAgICB9Ci0KKyAgICAgICAgc2l6ZV90IGN1ckRpc2NvbnRpbnVpdHlTZXE7CisgICAgICAgIENIRUNLKGl0ZW1NZXRhLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHktc2VxdWVuY2UiLCAoaW50MzJfdCAqKSZjdXJEaXNjb250aW51aXR5U2VxKSk7CisgICAgICAgIGludDMyX3Qgc2VxTnVtYmVyID0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgaW5kZXg7CiAgICAgICAgIGlmIChjdXJEaXNjb250aW51aXR5U2VxID09IGRpc2NvbnRpbnVpdHlTZXEpIHsKLSAgICAgICAgICAgIHJldHVybiBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyBpbmRleDsKKyAgICAgICAgICAgIHJldHVybiBzZXFOdW1iZXI7CisgICAgICAgIH0gZWxzZSBpZiAoY3VyRGlzY29udGludWl0eVNlcSA+IGRpc2NvbnRpbnVpdHlTZXEpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXFOdW1iZXIgPD0gMCA/IDAgOiBzZXFOdW1iZXIgLSAxOwogICAgICAgICB9CiAKICAgICAgICAgKytpbmRleDsKQEAgLTExMzIsMTIgKzE1MjEsNiBAQAogfQogCiBpbnQzMl90IFBsYXlsaXN0RmV0Y2hlcjo6Z2V0U2VxTnVtYmVyRm9yVGltZShpbnQ2NF90IHRpbWVVcykgY29uc3QgewotICAgIGludDMyX3QgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0OwotICAgIGlmIChtUGxheWxpc3QtPm1ldGEoKSA9PSBOVUxMIHx8ICFtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICJtZWRpYS1zZXF1ZW5jZSIsICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QpKSB7Ci0gICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7Ci0gICAgfQotCiAgICAgc2l6ZV90IGluZGV4ID0gMDsKICAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFVzID0gMDsKICAgICB3aGlsZSAoaW5kZXggPCBtUGxheWxpc3QtPnNpemUoKSkgewpAQCAtMTE2MCw3ICsxNTQzLDcgQEAKICAgICAgICAgaW5kZXggPSBtUGxheWxpc3QtPnNpemUoKSAtIDE7CiAgICAgfQogCi0gICAgcmV0dXJuIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIGluZGV4OworICAgIHJldHVybiBtUGxheWxpc3QtPmdldEZpcnN0U2VxTnVtYmVyKCkgKyBpbmRleDsKIH0KIAogY29uc3Qgc3A8QUJ1ZmZlcj4gJlBsYXlsaXN0RmV0Y2hlcjo6c2V0QWNjZXNzVW5pdFByb3BlcnRpZXMoCkBAIC0xMTc1LDE2ICsxNTU4LDM3IEBACiAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImRpc2NhcmQiLCBkaXNjYXJkKTsKICAgICB9CiAKLSAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uU2VjczsKLSAgICBpZiAobVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigidGFyZ2V0LWR1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uU2VjcykpIHsKLSAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigidGFyZ2V0RHVyYXRpb24iLCB0YXJnZXREdXJhdGlvblNlY3MpOwotICAgIH0KLQogICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCBtRGlzY29udGludWl0eVNlcSk7CiAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgZ2V0U2VnbWVudFN0YXJ0VGltZVVzKG1TZXFOdW1iZXIpKTsKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJzZWdtZW50Rmlyc3RUaW1lVXMiLCBtU2VnbWVudEZpcnN0UFRTKTsKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJzZWdtZW50RHVyYXRpb25VcyIsIGdldFNlZ21lbnREdXJhdGlvblVzKG1TZXFOdW1iZXIpKTsKKyAgICBpZiAoIW1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpICYmICFtUGxheWxpc3QtPmlzRXZlbnQoKSkgeworICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJwbGF5bGlzdFRpbWVVcyIsIG1QbGF5bGlzdFRpbWVVcyk7CisgICAgfQogICAgIHJldHVybiBhY2Nlc3NVbml0OwogfQogCitib29sIFBsYXlsaXN0RmV0Y2hlcjo6aXNTdGFydFRpbWVSZWFjaGVkKGludDY0X3QgdGltZVVzKSB7CisgICAgaWYgKCFtRmlyc3RQVFNWYWxpZCkgeworICAgICAgICBtRmlyc3RUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gdHJ1ZTsKKyAgICB9CisgICAgYm9vbCBzdGFydFRpbWVSZWFjaGVkID0gdHJ1ZTsKKyAgICBpZiAobVN0YXJ0VGltZVVzUmVsYXRpdmUpIHsKKyAgICAgICAgRkxPR1YoInN0YXJ0VGltZVVzUmVsYXRpdmUsIHRpbWVVcyAoJWxsZCkgLSAlbGxkID0gJWxsZCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltRmlyc3RUaW1lVXMsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykodGltZVVzIC0gbUZpcnN0VGltZVVzKSk7CisgICAgICAgIHRpbWVVcyAtPSBtRmlyc3RUaW1lVXM7CisgICAgICAgIGlmICh0aW1lVXMgPCAwKSB7CisgICAgICAgICAgICBGTE9HVigiY2xhbXAgbmVnYXRpdmUgdGltZVVzIHRvIDAiKTsKKyAgICAgICAgICAgIHRpbWVVcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnRUaW1lUmVhY2hlZCA9ICh0aW1lVXMgPj0gbVN0YXJ0VGltZVVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXJ0VGltZVJlYWNoZWQ7Cit9CisKIHN0YXR1c190IFBsYXlsaXN0RmV0Y2hlcjo6ZXh0cmFjdEFuZFF1ZXVlQWNjZXNzVW5pdHNGcm9tVHMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIGlmIChtVFNQYXJzZXIgPT0gTlVMTCkgewogICAgICAgICAvLyBVc2UgVFNfVElNRVNUQU1QU19BUkVfQUJTT0xVVEUgc28gcHRzIGNhcnJ5IG92ZXIgYmV0d2VlbiBmZXRjaGVycy4KQEAgLTExOTcsMTIgKzE2MDEsMTYgQEAKICAgICAgICAgLy8gQVRTUGFyc2VyIGZyb20gc2tld2luZyB0aGUgdGltZXN0YW1wcyBvZiBhY2Nlc3MgdW5pdHMuCiAgICAgICAgIGV4dHJhLT5zZXRJbnQ2NChJU3RyZWFtTGlzdGVuZXI6OmtLZXlNZWRpYVRpbWVVcywgMCk7CiAKKyAgICAgICAgLy8gV2hlbiBhZGFwdGluZywgc2lnbmFsIGEgcmVjZW50IG1lZGlhIHRpbWUgdG8gdGhlIHBhcnNlciwKKyAgICAgICAgLy8gc28gdGhhdCBQVFMgd3JhcCBhcm91bmQgaXMgaGFuZGxlZCBmb3IgdGhlIG5ldyB2YXJpYW50LgorICAgICAgICBpZiAobVN0YXJ0VGltZVVzID49IDAgJiYgIW1TdGFydFRpbWVVc1JlbGF0aXZlKSB7CisgICAgICAgICAgICBleHRyYS0+c2V0SW50NjQoSVN0cmVhbUxpc3RlbmVyOjprS2V5UmVjZW50TWVkaWFUaW1lVXMsIG1TdGFydFRpbWVVcyk7CisgICAgICAgIH0KKwogICAgICAgICBtVFNQYXJzZXItPnNpZ25hbERpc2NvbnRpbnVpdHkoCiAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1RJTUUsIGV4dHJhKTsKIAotICAgICAgICBtQWJzb2x1dGVUaW1lQW5jaG9yVXMgPSBtTmV4dFBUU1RpbWVVczsKICAgICAgICAgbU5leHRQVFNUaW1lVXMgPSAtMWxsOwotICAgICAgICBtRmlyc3RQVFNWYWxpZCA9IGZhbHNlOwogICAgIH0KIAogICAgIHNpemVfdCBvZmZzZXQgPSAwOwpAQCAtMTIxOCwzNSArMTYyNiw3NSBAQAogICAgIC8vIHNldFJhbmdlIHRvIGluZGljYXRlIGNvbnN1bWVkIGJ5dGVzLgogICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSArIG9mZnNldCwgYnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpOwogCisgICAgaWYgKG1TZWdtZW50Rmlyc3RQVFMgPCAwbGwpIHsKKyAgICAgICAgLy8gZ2V0IHRoZSBzbWFsbGVzdCBmaXJzdCBQVFMgZnJvbSBhbGwgc3RyZWFtcyBwcmVzZW50IGluIHRoaXMgcGFyc2VyCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBtUGFja2V0U291cmNlcy5zaXplKCk7IGktLSA+IDA7KSB7CisgICAgICAgICAgICBjb25zdCBMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSBzdHJlYW0gPSBtUGFja2V0U291cmNlcy5rZXlBdChpKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk1QRUcyIFRyYW5zcG9ydCBzdHJlYW1zIGRvIG5vdCBjb250YWluIHN1YnRpdGxlcy4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9NRVRBREFUQSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVRTUGFyc2VyOjpTb3VyY2VUeXBlIHR5cGUgPUxpdmVTZXNzaW9uOjpnZXRTb3VyY2VUeXBlRm9yU3RyZWFtKHN0cmVhbSk7CisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFub3RoZXJQYWNrZXRTb3VyY2UgKj4oCisgICAgICAgICAgICAgICAgICAgICAgICBtVFNQYXJzZXItPmdldFNvdXJjZSh0eXBlKS5nZXQoKSk7CisKKyAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBzb3VyY2UtPmdldE1ldGFBZnRlckxhc3REZXF1ZXVlZCgwKTsKKyAgICAgICAgICAgIGlmIChtZXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgICAgICAgICBpZiAobVNlZ21lbnRGaXJzdFBUUyA8IDBsbCB8fCB0aW1lVXMgPCBtU2VnbWVudEZpcnN0UFRTKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZWdtZW50Rmlyc3RQVFMgPSB0aW1lVXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtU2VnbWVudEZpcnN0UFRTIDwgMGxsKSB7CisgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBhbnkgVFMgcGFja2V0LCBjYW4gcmV0dXJuIGVhcmx5CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtU3RhcnRUaW1lVXNSZWxhdGl2ZSkgeworICAgICAgICAgICAgLy8gbVN0YXJ0dXAKKyAgICAgICAgICAgIC8vICAgbVN0YXJ0dXAgaXMgdHJ1ZSB1bnRpbCB3ZSBoYXZlIHF1ZXVlZCBhIHBhY2tldCBmb3IgYWxsIHRoZSBzdHJlYW1zCisgICAgICAgICAgICAvLyAgIHdlIGFyZSBmZXRjaGluZy4gV2UgcXVldWUgcGFja2V0cyB3aG9zZSB0aW1lc3RhbXBzIGFyZSBncmVhdGVyIHRoYW4KKyAgICAgICAgICAgIC8vICAgbVN0YXJ0VGltZVVzLgorICAgICAgICAgICAgLy8gbVNlZ21lbnRTdGFydFRpbWVVcyA+PSAwCisgICAgICAgICAgICAvLyAgIG1TZWdtZW50U3RhcnRUaW1lVXMgaXMgbm9uLW5lZ2F0aXZlIHdoZW4gYWRhcHRpbmcgb3Igc3dpdGNoaW5nIHRyYWNrcworICAgICAgICAgICAgLy8gYWRqdXN0U2VxTnVtYmVyV2l0aEFuY2hvclRpbWUodGltZVVzKSA9PSB0cnVlCisgICAgICAgICAgICAvLyAgIHdlIGd1ZXNzZWQgYSBzZXEgbnVtYmVyIHRoYXQncyBlaXRoZXIgdG9vIGxhcmdlIG9yIHRvbyBzbWFsbC4KKyAgICAgICAgICAgIC8vIElmIHRoaXMgaGFwcGVucywgd2UnbGwgYWRqdXN0IG1TZXFOdW1iZXIgYW5kIHJlc3RhcnQgZmV0Y2hpbmcgZnJvbSBuZXcKKyAgICAgICAgICAgIC8vIGxvY2F0aW9uLiBOb3RlIHRoYXQgd2Ugb25seSB3YW50IHRvIGFkanVzdCBvbmNlLCBzbyBzZXQgbVNlZ21lbnRTdGFydFRpbWVVcworICAgICAgICAgICAgLy8gdG8gLTEgc28gdGhhdCB3ZSBkb24ndCBlbnRlciB0aGlzIGNodW5rIG5leHQgdGltZS4KKyAgICAgICAgICAgIGlmIChtU3RhcnR1cCAmJiBtU2VnbWVudFN0YXJ0VGltZVVzID49IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgYWRqdXN0U2VxTnVtYmVyV2l0aEFuY2hvclRpbWUobVNlZ21lbnRGaXJzdFBUUykpIHsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTdGFydGVkQXQpOworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0U3RyaW5nKCJ1cmkiLCBtVVJJKTsKKyAgICAgICAgICAgICAgICBtSURSRm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtU2VnbWVudFN0YXJ0VGltZVVzID0gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICBmb3IgKHNpemVfdCBpID0gbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyBpLS0gPiAwOykgewogICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRTb3VyY2UgPSBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpOwogCi0gICAgICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgICAgQVRTUGFyc2VyOjpTb3VyY2VUeXBlIHR5cGU7CiAgICAgICAgIGNvbnN0IExpdmVTZXNzaW9uOjpTdHJlYW1UeXBlIHN0cmVhbSA9IG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpOwotICAgICAgICBzd2l0Y2ggKHN0cmVhbSkgewotICAgICAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9WSURFTzoKLSAgICAgICAgICAgICAgICB0eXBlID0gQVRTUGFyc2VyOjpWSURFTzsKLSAgICAgICAgICAgICAgICBrZXkgPSAidGltZVVzVmlkZW8iOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPOgotICAgICAgICAgICAgICAgIHR5cGUgPSBBVFNQYXJzZXI6OkFVRElPOwotICAgICAgICAgICAgICAgIGtleSA9ICJ0aW1lVXNBdWRpbyI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFMT0dFKCJNUEVHMiBUcmFuc3BvcnQgc3RyZWFtcyBkbyBub3QgY29udGFpbiBzdWJ0aXRsZXMuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICBpZiAoc3RyZWFtID09IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUykgeworICAgICAgICAgICAgQUxPR0UoIk1QRUcyIFRyYW5zcG9ydCBzdHJlYW1zIGRvIG5vdCBjb250YWluIHN1YnRpdGxlcy4iKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KIAorICAgICAgICBjb25zdCBjaGFyICprZXkgPSBMaXZlU2Vzc2lvbjo6Z2V0S2V5Rm9yU3RyZWFtKHN0cmVhbSk7CisgICAgICAgIEFUU1BhcnNlcjo6U291cmNlVHlwZSB0eXBlID1MaXZlU2Vzc2lvbjo6Z2V0U291cmNlVHlwZUZvclN0cmVhbShzdHJlYW0pOworCiAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9CiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBbm90aGVyUGFja2V0U291cmNlICo+KAogICAgICAgICAgICAgICAgICAgICBtVFNQYXJzZXItPmdldFNvdXJjZSh0eXBlKS5nZXQoKSk7CkBAIC0xMjU1LDExNiArMTcwMyw2NSBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCAgPSBzb3VyY2UtPmdldEZvcm1hdCgpOworICAgICAgICBib29sIGlzQXZjID0gZm9ybWF0ICE9IE5VTEwgJiYgZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKQorICAgICAgICAgICAgICAgICYmICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisKICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKICAgICAgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CiAgICAgICAgIHdoaWxlIChzb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpCiAgICAgICAgICAgICAgICAgJiYgc291cmNlLT5kZXF1ZXVlQWNjZXNzVW5pdCgmYWNjZXNzVW5pdCkgPT0gT0spIHsKIAorICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogCiAgICAgICAgICAgICBpZiAobVN0YXJ0dXApIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1GaXJzdFBUU1ZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GaXJzdFRpbWVVcyA9IHRpbWVVczsKLSAgICAgICAgICAgICAgICAgICAgbUZpcnN0UFRTVmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVN0YXJ0VGltZVVzUmVsYXRpdmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGltZVVzIC09IG1GaXJzdFRpbWVVczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbCBzdGFydFRpbWVSZWFjaGVkID0gaXNTdGFydFRpbWVSZWFjaGVkKHRpbWVVcyk7CiAKLSAgICAgICAgICAgICAgICBpZiAodGltZVVzIDwgbVN0YXJ0VGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciB1cCB0byB0aGUgY2xvc2VzdCBwcmVjZWRpbmcgSURSIGZyYW1lCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ0aW1lVXMgJSIgUFJJZDY0ICIgdXMgPCBtU3RhcnRUaW1lVXMgJSIgUFJJZDY0ICIgdXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcywgbVN0YXJ0VGltZVVzKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCAgPSBzb3VyY2UtPmdldEZvcm1hdCgpOwotICAgICAgICAgICAgICAgICAgICBib29sIGlzQXZjID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gTlVMTCAmJiBmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNBdmMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0F2YyAmJiBJc0lEUihhY2Nlc3NVbml0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFzdGFydFRpbWVSZWFjaGVkIHx8IChpc0F2YyAmJiAhbUlEUkZvdW5kKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIgdXAgdG8gdGhlIGNsb3Nlc3QgcHJlY2VkaW5nIElEUiBmcmFtZSBpbiB0aGUgbmV4dCBzZWdlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIGNsb3Nlc3Qgc3VjY2VlZGluZyBJRFIgZnJhbWUgYWZ0ZXIgdGhlIGV4YWN0IHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgIEZTTE9HVihzdHJlYW0sICJ0aW1lVXMoJWxsZCktbVN0YXJ0VGltZVVzKCVsbGQpPSVsbGQsIG1JRFJGb3VuZD0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltU3RhcnRUaW1lVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMgLSBtU3RhcnRUaW1lVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlEUkZvdW5kKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXZjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc0lEUihhY2Nlc3NVbml0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU0xPR1Yoc3RyZWFtLCAiZm91bmQgSURSLCBjbGVhciBtVmlkZW9CdWZmZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSURSRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1JRFJGb3VuZCAmJiBtU3RhcnRUaW1lVXNSZWxhdGl2ZSAmJiAhc3RhcnRUaW1lUmVhY2hlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTTE9HVihzdHJlYW0sICJzYXZpbmcgQVZDIHZpZGVvIEFjY2Vzc1VuaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0VGltZVJlYWNoZWQgfHwgKGlzQXZjICYmICFtSURSRm91bmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKLSAgICAgICAgICAgIGlmIChtU3RhcnRUaW1lVXNOb3RpZnkgIT0gTlVMTCAmJiB0aW1lVXMgPiBtU3RhcnRUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKLSAgICAgICAgICAgICAgICBpZiAobVBsYXlsaXN0LT5tZXRhKCkgPT0gTlVMTCB8fCAhbVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVkaWEtc2VxdWVuY2UiLCAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0KSkgewotICAgICAgICAgICAgICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb25TZWNzOwotICAgICAgICAgICAgICAgIENIRUNLKG1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoInRhcmdldC1kdXJhdGlvbiIsICZ0YXJnZXREdXJhdGlvblNlY3MpKTsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSB0YXJnZXREdXJhdGlvblNlY3MgKiAxMDAwMDAwbGw7Ci0gICAgICAgICAgICAgICAgLy8gbVN0YXJ0dXAKLSAgICAgICAgICAgICAgICAvLyAgIG1TdGFydHVwIGlzIHRydWUgdW50aWwgd2UgaGF2ZSBxdWV1ZWQgYSBwYWNrZXQgZm9yIGFsbCB0aGUgc3RyZWFtcwotICAgICAgICAgICAgICAgIC8vICAgd2UgYXJlIGZldGNoaW5nLiBXZSBxdWV1ZSBwYWNrZXRzIHdob3NlIHRpbWVzdGFtcHMgYXJlIGdyZWF0ZXIgdGhhbgotICAgICAgICAgICAgICAgIC8vICAgbVN0YXJ0VGltZVVzLgotICAgICAgICAgICAgICAgIC8vIG1TZWdtZW50U3RhcnRUaW1lVXMgPj0gMAotICAgICAgICAgICAgICAgIC8vICAgbVNlZ21lbnRTdGFydFRpbWVVcyBpcyBub24tbmVnYXRpdmUgd2hlbiBhZGFwdGluZyBvciBzd2l0Y2hpbmcgdHJhY2tzCi0gICAgICAgICAgICAgICAgLy8gbVNlcU51bWJlciA+IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdAotICAgICAgICAgICAgICAgIC8vICAgZG9uJ3QgZGVjcmVtZW50IG1TZXFOdW1iZXIgaWYgaXQgYWxyZWFkeSBwb2ludHMgdG8gdGhlIDFzdCBzZWdtZW50Ci0gICAgICAgICAgICAgICAgLy8gdGltZVVzIC0gbVN0YXJ0VGltZVVzID4gdGFyZ2V0RHVyYXRpb25VczoKLSAgICAgICAgICAgICAgICAvLyAgIFRoaXMgYW5kIHRoZSAyIGFib3ZlIGNvbmRpdGlvbnMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW4gYWRhcHRpbmcgaW4gYSBsaXZlCi0gICAgICAgICAgICAgICAgLy8gICBzdHJlYW07IHRoZSBvbGQgZmV0Y2hlciBoYXMgYWxyZWFkeSBmZXRjaGVkIHRvIG1TdGFydFRpbWVVczsgdGhlIG5ldyBmZXRjaGVyCi0gICAgICAgICAgICAgICAgLy8gICB3b3VsZCBzdGFydCBmZXRjaGluZyBhZnRlciB0aW1lVXMsIHdoaWNoIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gbVN0YXJ0VGltZVVzOwotICAgICAgICAgICAgICAgIC8vICAgdGhlIG9sZCBmZXRjaGVyIHdvdWxkIHRoZW4gY29udGludWUgZmV0Y2hpbmcgZGF0YSB1bnRpbCB0aW1lVXMuIFdlIGRvbid0IHdhbnQKLSAgICAgICAgICAgICAgICAvLyAgIHRpbWVVcyB0byBiZSB0b28gZmFyIGFoZWFkIG9mIG1TdGFydFRpbWVVcyBiZWNhdXNlIHdlIHdhbnQgdGhlIG9sZCBmZXRjaGVyIHRvCi0gICAgICAgICAgICAgICAgLy8gICBzdG9wIGFzIGVhcmx5IGFzIHBvc3NpYmxlLiBUaGUgZGVmaW5pdGlvbiBvZiBiZWluZyAidG9vIGZhciBhaGVhZCIgaXMKLSAgICAgICAgICAgICAgICAvLyAgIGFyYml0cmFyeTsgaGVyZSB3ZSB1c2UgdGFyZ2V0RHVyYXRpb25VcyBhcyB0aHJlc2hvbGQuCi0gICAgICAgICAgICAgICAgaWYgKG1TdGFydHVwICYmIG1TZWdtZW50U3RhcnRUaW1lVXMgPj0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVNlcU51bWJlciA+IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGltZVVzIC0gbVN0YXJ0VGltZVVzID4gdGFyZ2V0RHVyYXRpb25VcykgewotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IGd1ZXNzZWQgYSBzdGFydGluZyB0aW1lc3RhbXAgdGhhdCBpcyB0b28gaGlnaCB3aGVuIGFkYXB0aW5nIGluIGEKLSAgICAgICAgICAgICAgICAgICAgLy8gbGl2ZSBzdHJlYW07IHJlLWFkanVzdCBiYXNlZCBvbiB0aGUgYWN0dWFsIHRpbWVzdGFtcCBleHRyYWN0ZWQgZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gbWVkaWEgc2VnbWVudDsgaWYgd2UgZGlkbid0IG1vdmUgYmFja3dhcmQgYWZ0ZXIgdGhlIHJlLWFkanVzdG1lbnQKLSAgICAgICAgICAgICAgICAgICAgLy8gKG5ld1NlcU51bWJlciksIHN0YXJ0IGF0IGxlYXN0IDEgc2VnbWVudCBwcmlvci4KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuZXdTZXFOdW1iZXIgPSBnZXRTZXFOdW1iZXJXaXRoQW5jaG9yVGltZSh0aW1lVXMpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3U2VxTnVtYmVyID49IG1TZXFOdW1iZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC0tbVNlcU51bWJlcjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBuZXdTZXFOdW1iZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFN0YXJ0ZWRBdCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxOwotICAgICAgICAgICAgICAgIGlmICghbVN0YXJ0VGltZVVzTm90aWZ5LT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCAmc2VxKSkgewotICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgbURpc2NvbnRpbnVpdHlTZXEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzOwotICAgICAgICAgICAgICAgIGlmICghbVN0YXJ0VGltZVVzTm90aWZ5LT5maW5kSW50NjQoa2V5LCAmc3RhcnRUaW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50NjQoa2V5LCB0aW1lVXMpOwotCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbU1hc2sgPSAwOwotICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPmZpbmRJbnQzMigic3RyZWFtTWFzayIsIChpbnQzMl90ICopICZzdHJlYW1NYXNrKTsKKyAgICAgICAgICAgIGlmIChtU3RhcnRUaW1lVXNOb3RpZnkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbU1hc2sgPSAwOworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+ZmluZEludDMyKCJzdHJlYW1NYXNrIiwgKGludDMyX3QgKikgJnN0cmVhbU1hc2spOworICAgICAgICAgICAgICAgIGlmICgobVN0cmVhbVR5cGVNYXNrICYgbVBhY2tldFNvdXJjZXMua2V5QXQoaSkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhKHN0cmVhbU1hc2sgJiBtUGFja2V0U291cmNlcy5rZXlBdChpKSkpIHsKICAgICAgICAgICAgICAgICAgICAgc3RyZWFtTWFzayB8PSBtUGFja2V0U291cmNlcy5rZXlBdChpKTsKICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigic3RyZWFtTWFzayIsIHN0cmVhbU1hc2spOworICAgICAgICAgICAgICAgICAgICBGU0xPR1Yoc3RyZWFtLCAiZm91bmQgc3RhcnQgcG9pbnQsIHRpbWVVcz0lbGxkLCBzdHJlYW1NYXNrIGJlY29tZXMgJXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZVVzLCBzdHJlYW1NYXNrKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTWFzayA9PSBtU3RyZWFtVHlwZU1hc2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZMT0dWKCJmb3VuZCBzdGFydCBwb2ludCBmb3IgYWxsIHN0cmVhbXMiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydHVwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVN0b3BQYXJhbXMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8vIFF1ZXVlIGRpc2NvbnRpbnVpdHkgaW4gb3JpZ2luYWwgc3RyZWFtLgogICAgICAgICAgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eVNlcTsKICAgICAgICAgICAgICAgICBpbnQ2NF90IHN0b3BUaW1lVXM7CiAgICAgICAgICAgICAgICAgaWYgKCFtU3RvcFBhcmFtcy0+ZmluZEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgJmRpc2NvbnRpbnVpdHlTZXEpCkBAIC0xMzcyLDE0ICsxNzY5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhbVN0b3BQYXJhbXMtPmZpbmRJbnQ2NChrZXksICZzdG9wVGltZVVzKQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGRpc2NvbnRpbnVpdHlTZXEgPT0gbURpc2NvbnRpbnVpdHlTZXEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGltZVVzID49IHN0b3BUaW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KG1TZXNzaW9uLT5jcmVhdGVGb3JtYXRDaGFuZ2VCdWZmZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIEZTTE9HVihzdHJlYW0sICJyZWFjaGVkIHN0b3AgcG9pbnQsIHRpbWVVcz0lbGxkIiwgKGxvbmcgbG9uZyl0aW1lVXMpOwogICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZU1hc2sgJj0gfnN0cmVhbTsKICAgICAgICAgICAgICAgICAgICAgbVBhY2tldFNvdXJjZXMucmVtb3ZlSXRlbXNBdChpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG8gTk9UIGRlcXVldWUgYW55IGRpc2NvbnRpbnVpdGllcyBleGNlcHQgZm9yIGZvcm1hdCBjaGFuZ2UuCiAgICAgICAgICAgICBpZiAoc3RyZWFtID09IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1ZJREVPKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBkaXNjYXJkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CkBAIC0xMzg4LDExICsxNzg0LDIxIEBACiAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+ZGVxdWV1ZUFjY2Vzc1VuaXQoJnZpZGVvQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgc2V0QWNjZXNzVW5pdFByb3BlcnRpZXModmlkZW9CdWZmZXIsIHNvdXJjZSwgZGlzY2FyZCk7CiAgICAgICAgICAgICAgICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KHZpZGVvQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBidWZmZXJUaW1lVXM7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKHZpZGVvQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJmJ1ZmZlclRpbWVVcykpOworICAgICAgICAgICAgICAgICAgICBGU0xPR1Yoc3RyZWFtLCAicXVldWVBY2Nlc3NVbml0IChzYXZlZCksIHRpbWVVcz0lbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWJ1ZmZlclRpbWVVcyk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0gPT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfTUVUQURBVEEgJiYgIW1IYXNNZXRhZGF0YSkgeworICAgICAgICAgICAgICAgIG1IYXNNZXRhZGF0YSA9IHRydWU7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdE1ldGFkYXRhRGV0ZWN0ZWQpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzZXRBY2Nlc3NVbml0UHJvcGVydGllcyhhY2Nlc3NVbml0LCBzb3VyY2UpOwogICAgICAgICAgICAgcGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICBGU0xPR1Yoc3RyZWFtLCAicXVldWVBY2Nlc3NVbml0LCB0aW1lVXM9JWxsZCIsIChsb25nIGxvbmcpdGltZVVzKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE0MTAsNyArMTgxNiw3IEBACiAKICAgICBpZiAoIW1TdHJlYW1UeXBlTWFzaykgewogICAgICAgICAvLyBTaWduYWwgZ2FwIGlzIGZpbGxlZCBiZXR3ZWVuIG9yaWdpbmFsIGFuZCBuZXcgc3RyZWFtLgotICAgICAgICBBTE9HVigiRVJST1IgT1VUIE9GIFJBTkdFIik7CisgICAgICAgIEZMT0dWKCJyZWFjaGVkIHN0b3AgcG9pbnQgZm9yIGFsbCBzdHJlYW1zIik7CiAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogCkBAIC0xNDYxLDE0ICsxODY3LDExIEBACiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgZ2V0U2VnbWVudFN0YXJ0VGltZVVzKG1TZXFOdW1iZXIpKTsKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgbURpc2NvbnRpbnVpdHlTZXEpOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoInN1YnRpdGxlR2VuZXJhdGlvbiIsIG1TdWJ0aXRsZUdlbmVyYXRpb24pOwotCiAgICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGJ1ZmZlcik7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKICAgICBpZiAobU5leHRQVFNUaW1lVXMgPj0gMGxsKSB7Ci0gICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcyA9IG1OZXh0UFRTVGltZVVzOwogICAgICAgICBtTmV4dFBUU1RpbWVVcyA9IC0xbGw7CiAgICAgfQogCkBAIC0xNTY5LDExICsxOTcyLDIzIEBACiAgICAgQ0hFQ0socGFja2V0U291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwogCiAgICAgaW50NjRfdCB0aW1lVXMgPSAoUFRTICogMTAwbGwpIC8gOWxsOwotICAgIGlmICghbUZpcnN0UFRTVmFsaWQpIHsKKyAgICBpZiAobVN0YXJ0dXAgJiYgIW1GaXJzdFBUU1ZhbGlkKSB7CiAgICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gdHJ1ZTsKICAgICAgICAgbUZpcnN0VGltZVVzID0gdGltZVVzOwogICAgIH0KIAorICAgIGlmIChtU2VnbWVudEZpcnN0UFRTIDwgMGxsKSB7CisgICAgICAgIG1TZWdtZW50Rmlyc3RQVFMgPSB0aW1lVXM7CisgICAgICAgIGlmICghbVN0YXJ0VGltZVVzUmVsYXRpdmUpIHsKKyAgICAgICAgICAgIC8vIER1cGxpY2F0ZWQgbG9naWMgZnJvbSBob3cgd2UgaGFuZGxlIC50cyBwbGF5bGlzdHMuCisgICAgICAgICAgICBpZiAobVN0YXJ0dXAgJiYgbVNlZ21lbnRTdGFydFRpbWVVcyA+PSAwCisgICAgICAgICAgICAgICAgICAgICYmIGFkanVzdFNlcU51bWJlcldpdGhBbmNob3JUaW1lKHRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICBtU2VnbWVudFN0YXJ0VGltZVVzID0gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKICAgICB3aGlsZSAob2Zmc2V0IDwgYnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgY29uc3QgdWludDhfdCAqYWR0c0hlYWRlciA9IGJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0OwpAQCAtMTYxNyw0MCArMjAzMiwxOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVN0YXJ0VGltZVVzTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uU2VjczsKLSAgICAgICAgICAgICAgICBDSEVDSyhtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJ0YXJnZXQtZHVyYXRpb24iLCAmdGFyZ2V0RHVyYXRpb25TZWNzKSk7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCB0YXJnZXREdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb25TZWNzICogMTAwMDAwMGxsOwotCi0gICAgICAgICAgICAgICAgLy8gRHVwbGljYXRlZCBsb2dpYyBmcm9tIGhvdyB3ZSBoYW5kbGUgLnRzIHBsYXlsaXN0cy4KLSAgICAgICAgICAgICAgICBpZiAobVN0YXJ0dXAgJiYgbVNlZ21lbnRTdGFydFRpbWVVcyA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aW1lVXMgLSBtU3RhcnRUaW1lVXMgPiB0YXJnZXREdXJhdGlvblVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgbmV3U2VxTnVtYmVyID0gZ2V0U2VxTnVtYmVyV2l0aEFuY2hvclRpbWUodGltZVVzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1NlcU51bWJlciA+PSBtU2VxTnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAtLW1TZXFOdW1iZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gbmV3U2VxTnVtYmVyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50NjQoInRpbWVVc0F1ZGlvIiwgdGltZVVzKTsKLSAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgbURpc2NvbnRpbnVpdHlTZXEpOwogICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoInN0cmVhbU1hc2siLCBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTyk7Ci0gICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgbVN0YXJ0dXAgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChtU3RvcFBhcmFtcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBRdWV1ZSBkaXNjb250aW51aXR5IGluIG9yaWdpbmFsIHN0cmVhbS4KICAgICAgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eVNlcTsKICAgICAgICAgICAgIGludDY0X3Qgc3RvcFRpbWVVczsKICAgICAgICAgICAgIGlmICghbVN0b3BQYXJhbXMtPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZkaXNjb250aW51aXR5U2VxKQogICAgICAgICAgICAgICAgICAgICB8fCBkaXNjb250aW51aXR5U2VxID4gbURpc2NvbnRpbnVpdHlTZXEKICAgICAgICAgICAgICAgICAgICAgfHwgIW1TdG9wUGFyYW1zLT5maW5kSW50NjQoInRpbWVVc0F1ZGlvIiwgJnN0b3BUaW1lVXMpCiAgICAgICAgICAgICAgICAgICAgIHx8IChkaXNjb250aW51aXR5U2VxID09IG1EaXNjb250aW51aXR5U2VxICYmIHVuaXRUaW1lVXMgPj0gc3RvcFRpbWVVcykpIHsKLSAgICAgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChtU2Vzc2lvbi0+Y3JlYXRlRm9ybWF0Q2hhbmdlQnVmZmVyKCkpOwogICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlTWFzayA9IDA7CiAgICAgICAgICAgICAgICAgbVBhY2tldFNvdXJjZXMuY2xlYXIoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwpAQCAtMTY4NywzMyArMjA4MCwxMSBAQAogICAgIG1zZy0+cG9zdCgpOwogfQogCi1pbnQ2NF90IFBsYXlsaXN0RmV0Y2hlcjo6cmVzdW1lVGhyZXNob2xkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgIGlmIChtc2ctPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSAmJiBkdXJhdGlvblVzID4gMCkgewotICAgICAgICByZXR1cm4ga051bVNraXBGcmFtZXMgKiBkdXJhdGlvblVzOwotICAgIH0KLQotICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICBtc2ctPmZpbmRPYmplY3QoImZvcm1hdCIsICZvYmopOwotICAgIE1ldGFEYXRhICpmb3JtYXQgPSBzdGF0aWNfY2FzdDxNZXRhRGF0YSAqPihvYmouZ2V0KCkpOwotCi0gICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLSAgICBib29sIGF1ZGlvID0gIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KTsKLSAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgLy8gQXNzdW1lcyAxMDAwIHNhbXBsZXMgcGVyIGZyYW1lLgotICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwotICAgICAgICByZXR1cm4ga051bVNraXBGcmFtZXMgIC8qIGZyYW1lcyAqLyAqIDEwMDAgLyogc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICogKDEwMDAwMDAgLyBzYW1wbGVSYXRlKSAvKiBzYW1wbGUgZHVyYXRpb24gKHVzKSAqLzsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZTsKLSAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKGtLZXlGcmFtZVJhdGUsICZmcmFtZVJhdGUpICYmIGZyYW1lUmF0ZSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBrTnVtU2tpcEZyYW1lcyAqICgxMDAwMDAwIC8gZnJhbWVSYXRlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiA1MDAwMDBsbDsKK3ZvaWQgUGxheWxpc3RGZXRjaGVyOjp1cGRhdGVUYXJnZXREdXJhdGlvbigpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VGFyZ2V0RHVyYXRpb25VcGRhdGUpOworICAgIG1zZy0+c2V0SW50NjQoInRhcmdldER1cmF0aW9uVXMiLCBtUGxheWxpc3QtPmdldFRhcmdldER1cmF0aW9uKCkpOworICAgIG1zZy0+cG9zdCgpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaAppbmRleCA0ZTE1Zjg1Li5jOGNhNDU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaApAQCAtMjcsNyArMjcsNyBAQAogCiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOwotc3RydWN0IERhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291cmNlOwogc3RydWN0IEhUVFBCYXNlOwogc3RydWN0IExpdmVEYXRhU291cmNlOwogc3RydWN0IE0zVVBhcnNlcjsKQEAgLTM2LDYgKzM2LDcgQEAKIHN0cnVjdCBQbGF5bGlzdEZldGNoZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5CdWZmZXJlZER1cmF0aW9uVXM7CiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0Rvd25sb2FkQmxvY2tTaXplOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtGZXRjaGVyUmVzdW1lVGhyZXNob2xkOwogCiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0U3RhcnRlZCwKQEAgLTQzLDM2ICs0NCw0MyBAQAogICAgICAgICBrV2hhdFN0b3BwZWQsCiAgICAgICAgIGtXaGF0RXJyb3IsCiAgICAgICAgIGtXaGF0RHVyYXRpb25VcGRhdGUsCi0gICAgICAgIGtXaGF0VGVtcG9yYXJpbHlEb25lRmV0Y2hpbmcsCisgICAgICAgIGtXaGF0VGFyZ2V0RHVyYXRpb25VcGRhdGUsCiAgICAgICAgIGtXaGF0UHJlcGFyZWQsCiAgICAgICAgIGtXaGF0UHJlcGFyYXRpb25GYWlsZWQsCiAgICAgICAgIGtXaGF0U3RhcnRlZEF0LAorICAgICAgICBrV2hhdFN0b3BSZWFjaGVkLAorICAgICAgICBrV2hhdFBsYXlsaXN0RmV0Y2hlZCwKKyAgICAgICAga1doYXRNZXRhZGF0YURldGVjdGVkLAogICAgIH07CiAKICAgICBQbGF5bGlzdEZldGNoZXIoCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgICAgIGNvbnN0IHNwPExpdmVTZXNzaW9uPiAmc2Vzc2lvbiwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGludDMyX3QgaWQsCiAgICAgICAgICAgICBpbnQzMl90IHN1YnRpdGxlR2VuZXJhdGlvbik7CiAKLSAgICBzcDxEYXRhU291cmNlPiBnZXREYXRhU291cmNlKCk7CisgICAgaW50MzJfdCBnZXRGZXRjaGVySUQoKSBjb25zdDsKIAogICAgIHZvaWQgc3RhcnRBc3luYygKICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZhdWRpb1NvdXJjZSwKICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZ2aWRlb1NvdXJjZSwKICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZzdWJ0aXRsZVNvdXJjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZtZXRhZGF0YVNvdXJjZSwKICAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSAtMWxsLCAgICAgICAgIC8vIHN0YXJ0aW5nIHRpbWVzdGFtcHMKICAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudFN0YXJ0VGltZVVzID0gLTFsbCwgLy8gc3RhcnRpbmcgcG9zaXRpb24gd2l0aGluIHBsYXlsaXN0CiAgICAgICAgICAgICAvLyBzdGFydFRpbWVVcyE9c2VnbWVudFN0YXJ0VGltZVVzIG9ubHkgd2hlbiBwbGF5bGlzdCBpcyBsaXZlCi0gICAgICAgICAgICBpbnQzMl90IHN0YXJ0RGlzY29udGludWl0eVNlcSA9IDAsCi0gICAgICAgICAgICBib29sIGFkYXB0aXZlID0gZmFsc2UpOworICAgICAgICAgICAgaW50MzJfdCBzdGFydERpc2NvbnRpbnVpdHlTZXEgPSAtMSwKKyAgICAgICAgICAgIExpdmVTZXNzaW9uOjpTZWVrTW9kZSBzZWVrTW9kZSA9IExpdmVTZXNzaW9uOjprU2Vla01vZGVFeGFjdFBvc2l0aW9uKTsKIAotICAgIHZvaWQgcGF1c2VBc3luYygpOworICAgIHZvaWQgcGF1c2VBc3luYyhmbG9hdCB0aHJlc2hvbGRSYXRpbywgYm9vbCBkaXNjb25uZWN0KTsKIAogICAgIHZvaWQgc3RvcEFzeW5jKGJvb2wgY2xlYXIgPSB0cnVlKTsKIAogICAgIHZvaWQgcmVzdW1lVW50aWxBc3luYyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcyk7CiAKKyAgICB2b2lkIGZldGNoUGxheWxpc3RBc3luYygpOworCiAgICAgdWludDMyX3QgZ2V0U3RyZWFtVHlwZU1hc2soKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU3RyZWFtVHlwZU1hc2s7CiAgICAgfQpAQCAtOTMsOCArMTAxLDExIEBACiAgICAgICAgIGtXaGF0TW9uaXRvclF1ZXVlICAgPSAnbW9uaScsCiAgICAgICAgIGtXaGF0UmVzdW1lVW50aWwgICAgPSAncnNtZScsCiAgICAgICAgIGtXaGF0RG93bmxvYWROZXh0ICAgPSAnZGxueCcsCisgICAgICAgIGtXaGF0RmV0Y2hQbGF5bGlzdCAgPSAnZmxzdCcKICAgICB9OwogCisgICAgc3RydWN0IERvd25sb2FkU3RhdGU7CisKICAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4TW9uaXRvckRlbGF5VXM7CiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga051bVNraXBGcmFtZXM7CiAKQEAgLTEwNSw5ICsxMTYsMTIgQEAKICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKICAgICBzcDxBTWVzc2FnZT4gbVN0YXJ0VGltZVVzTm90aWZ5OwogCisgICAgc3A8SFRUUERvd25sb2FkZXI+IG1IVFRQRG93bmxvYWRlcjsKICAgICBzcDxMaXZlU2Vzc2lvbj4gbVNlc3Npb247CiAgICAgQVN0cmluZyBtVVJJOwogCisgICAgaW50MzJfdCBtRmV0Y2hlcklEOworCiAgICAgdWludDMyX3QgbVN0cmVhbVR5cGVNYXNrOwogICAgIGludDY0X3QgbVN0YXJ0VGltZVVzOwogCkBAIC0xMTYsNyArMTMwLDcgQEAKICAgICAvLyBhZGFwdGluZyBvciBzd2l0Y2hpbmcgdHJhY2tzLgogICAgIGludDY0X3QgbVNlZ21lbnRTdGFydFRpbWVVczsKIAotICAgIHNzaXplX3QgbURpc2NvbnRpbnVpdHlTZXE7CisgICAgaW50MzJfdCBtRGlzY29udGludWl0eVNlcTsKICAgICBib29sIG1TdGFydFRpbWVVc1JlbGF0aXZlOwogICAgIHNwPEFNZXNzYWdlPiBtU3RvcFBhcmFtczsgLy8gbWVzc2FnZSBjb250YWluaW5nIHRoZSBsYXRlc3QgdGltZXN0YW1wcyB3ZSBzaG91bGQgZmV0Y2guCiAKQEAgLTEyNiwxNyArMTQwLDIxIEBACiAgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgc3A8QUJ1ZmZlcj4gPiBtQUVTS2V5Rm9yVVJJOwogCiAgICAgaW50NjRfdCBtTGFzdFBsYXlsaXN0RmV0Y2hUaW1lVXM7CisgICAgaW50NjRfdCBtUGxheWxpc3RUaW1lVXM7CiAgICAgc3A8TTNVUGFyc2VyPiBtUGxheWxpc3Q7CiAgICAgaW50MzJfdCBtU2VxTnVtYmVyOwogICAgIGludDMyX3QgbU51bVJldHJpZXM7CiAgICAgYm9vbCBtU3RhcnR1cDsKLSAgICBib29sIG1BZGFwdGl2ZTsKLSAgICBib29sIG1QcmVwYXJlZDsKKyAgICBib29sIG1JRFJGb3VuZDsKKyAgICBpbnQzMl90IG1TZWVrTW9kZTsKKyAgICBib29sIG1UaW1lQ2hhbmdlU2lnbmFsZWQ7CiAgICAgaW50NjRfdCBtTmV4dFBUU1RpbWVVczsKIAogICAgIGludDMyX3QgbU1vbml0b3JRdWV1ZUdlbmVyYXRpb247CiAgICAgY29uc3QgaW50MzJfdCBtU3VidGl0bGVHZW5lcmF0aW9uOwogCisgICAgaW50MzJfdCBtTGFzdERpc2NvbnRpbnVpdHlTZXE7CisKICAgICBlbnVtIFJlZnJlc2hTdGF0ZSB7CiAgICAgICAgIElOSVRJQUxfTUlOSU1VTV9SRUxPQURfREVMQVksCiAgICAgICAgIEZJUlNUX1VOQ0hBTkdFRF9SRUxPQURfQVRURU1QVCwKQEAgLTE1MCw5ICsxNjgsOCBAQAogICAgIHNwPEFUU1BhcnNlcj4gbVRTUGFyc2VyOwogCiAgICAgYm9vbCBtRmlyc3RQVFNWYWxpZDsKLSAgICB1aW50NjRfdCBtRmlyc3RQVFM7CiAgICAgaW50NjRfdCBtRmlyc3RUaW1lVXM7Ci0gICAgaW50NjRfdCBtQWJzb2x1dGVUaW1lQW5jaG9yVXM7CisgICAgaW50NjRfdCBtU2VnbWVudEZpcnN0UFRTOwogICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG1WaWRlb0J1ZmZlcjsKIAogICAgIC8vIFN0b3JlcyB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIHRvIGRlY3J5cHQgdGhlIG5leHQgYmxvY2sgb2YgY2lwaGVyIHRleHQsIHdoaWNoIGNhbgpAQCAtMTYwLDYgKzE3NywxMyBAQAogICAgIC8vIHRoZSBsYXN0IGJsb2NrIG9mIGNpcGhlciB0ZXh0IChjaXBoZXItYmxvY2sgY2hhaW5pbmcpLgogICAgIHVuc2lnbmVkIGNoYXIgbUFFU0luaXRWZWNbMTZdOwogCisgICAgTXV0ZXggbVRocmVzaG9sZExvY2s7CisgICAgZmxvYXQgbVRocmVzaG9sZFJhdGlvOworCisgICAgc3A8RG93bmxvYWRTdGF0ZT4gbURvd25sb2FkU3RhdGU7CisKKyAgICBib29sIG1IYXNNZXRhZGF0YTsKKwogICAgIC8vIFNldCBmaXJzdCB0byB0cnVlIGlmIGRlY3J5cHRpbmcgdGhlIGZpcnN0IHNlZ21lbnQgb2YgYSBwbGF5bGlzdCBzZWdtZW50LiBXaGVuCiAgICAgLy8gZmlyc3QgaXMgdHJ1ZSwgcmVzZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlCiAgICAgLy8gaW5mb3JtYXRpb24gaW4gdGhlIG1hbmlmZXN0OyBvdGhlcndpc2UsIHVzZSB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFzCkBAIC0xNzUsNiArMTk5LDEwIEBACiAKICAgICB2b2lkIHBvc3RNb25pdG9yUXVldWUoaW50NjRfdCBkZWxheVVzID0gMCwgaW50NjRfdCBtaW5EZWxheVVzID0gMCk7CiAgICAgdm9pZCBjYW5jZWxNb25pdG9yUXVldWUoKTsKKyAgICB2b2lkIHNldFN0b3BwaW5nVGhyZXNob2xkKGZsb2F0IHRocmVzaG9sZFJhdGlvLCBib29sIGRpc2Nvbm5lY3QpOworICAgIHZvaWQgcmVzZXRTdG9wcGluZ1RocmVzaG9sZChib29sIGRpc2Nvbm5lY3QpOworICAgIGZsb2F0IGdldFN0b3BwaW5nVGhyZXNob2xkKCk7CisgICAgYm9vbCBzaG91bGRQYXVzZURvd25sb2FkKCk7CiAKICAgICBpbnQ2NF90IGRlbGF5VXNUb1JlZnJlc2hQbGF5bGlzdCgpIGNvbnN0OwogICAgIHN0YXR1c190IHJlZnJlc2hQbGF5bGlzdCgpOwpAQCAtMTgyLDEyICsyMTAsMTkgQEAKICAgICAvLyBSZXR1cm5zIHRoZSBtZWRpYSB0aW1lIGluIHVzIG9mIHRoZSBzZWdtZW50IHNwZWNpZmllZCBieSBzZXFOdW1iZXIuCiAgICAgLy8gVGhpcyBpcyBjb21wdXRlZCBieSBzdW1taW5nIHRoZSBkdXJhdGlvbnMgb2YgYWxsIHNlZ21lbnRzIGJlZm9yZSBpdC4KICAgICBpbnQ2NF90IGdldFNlZ21lbnRTdGFydFRpbWVVcyhpbnQzMl90IHNlcU51bWJlcikgY29uc3Q7CisgICAgLy8gUmV0dXJucyB0aGUgZHVyYXRpb24gdGltZSBpbiB1cyBvZiB0aGUgc2VnbWVudCBzcGVjaWZpZWQuCisgICAgaW50NjRfdCBnZXRTZWdtZW50RHVyYXRpb25VcyhpbnQzMl90IHNlcU51bWJlcikgY29uc3Q7CiAKICAgICBzdGF0dXNfdCBvblN0YXJ0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uUGF1c2UoKTsKICAgICB2b2lkIG9uU3RvcChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCBvbk1vbml0b3JRdWV1ZSgpOwogICAgIHZvaWQgb25Eb3dubG9hZE5leHQoKTsKKyAgICBib29sIGluaXREb3dubG9hZFN0YXRlKAorICAgICAgICAgICAgQVN0cmluZyAmdXJpLAorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+ICZpdGVtTWV0YSwKKyAgICAgICAgICAgIGludDMyX3QgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKKyAgICAgICAgICAgIGludDMyX3QgJmxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKIAogICAgIC8vIFJlc3VtZSBhIGZldGNoZXIgdG8gY29udGludWUgdW50aWwgdGhlIHN0b3BwaW5nIHBvaW50IHN0b3JlZCBpbiBtc2cuCiAgICAgc3RhdHVzX3Qgb25SZXN1bWVVbnRpbChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC0xOTYsMjUgKzIzMSwyNCBAQAogICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQsCiAgICAgICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmc291cmNlLAogICAgICAgICAgICAgYm9vbCBkaXNjYXJkID0gZmFsc2UpOworICAgIGJvb2wgaXNTdGFydFRpbWVSZWFjaGVkKGludDY0X3QgdGltZVVzKTsKICAgICBzdGF0dXNfdCBleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0c0Zyb21Ucyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAogICAgIHN0YXR1c190IGV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzKAogICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpdGVtTWV0YSk7CiAKKyAgICB2b2lkIG5vdGlmeVN0b3BSZWFjaGVkKCk7CiAgICAgdm9pZCBub3RpZnlFcnJvcihzdGF0dXNfdCBlcnIpOwogCiAgICAgdm9pZCBxdWV1ZURpc2NvbnRpbnVpdHkoCiAgICAgICAgICAgICBBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlIHR5cGUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEpOwogCi0gICAgaW50MzJfdCBnZXRTZXFOdW1iZXJXaXRoQW5jaG9yVGltZShpbnQ2NF90IGFuY2hvclRpbWVVcykgY29uc3Q7CisgICAgYm9vbCBhZGp1c3RTZXFOdW1iZXJXaXRoQW5jaG9yVGltZShpbnQ2NF90IGFuY2hvclRpbWVVcyk7CiAgICAgaW50MzJfdCBnZXRTZXFOdW1iZXJGb3JEaXNjb250aW51aXR5KHNpemVfdCBkaXNjb250aW51aXR5U2VxKSBjb25zdDsKICAgICBpbnQzMl90IGdldFNlcU51bWJlckZvclRpbWUoaW50NjRfdCB0aW1lVXMpIGNvbnN0OwogCiAgICAgdm9pZCB1cGRhdGVEdXJhdGlvbigpOwotCi0gICAgLy8gQmVmb3JlIHJlc3VtaW5nIGEgZmV0Y2hlciBpbiBvblJlc3VtZSwgY2hlY2sgdGhlIHJlbWFpbmluZyBkdXJhdGlvbiBpcyBsb25nZXIgdGhhbiB0aGF0Ci0gICAgLy8gcmV0dXJuZWQgYnkgcmVzdW1lVGhyZXNob2xkLgotICAgIGludDY0X3QgcmVzdW1lVGhyZXNob2xkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIHVwZGF0ZVRhcmdldER1cmF0aW9uKCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQbGF5bGlzdEZldGNoZXIpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsKaW5kZXggMjE5NGMzOC4uNjhiZDAxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsKQEAgLTQsNyArNCw4IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gXAogCUlEMy5jcHAKIAotTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9pZDMKIApAQCAtMTcsNyArMTgsOCBAQAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKIAl0ZXN0aWQzLmNwcAogCi1MT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGlic3RhZ2VmcmlnaHQgbGlidXRpbHMgbGlibG9nIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCmluZGV4IDc3ZDY1ZTAuLjc1OGIyYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSAiSFRUUEJhc2UuaCIKICNpbmNsdWRlICJUaW1lZEV2ZW50UXVldWUuaCIKIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CkBAIC0zMSwyMCArMzIsMjAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgQXVkaW9QbGF5ZXI7CitjbGFzcyBBdWRpb1BsYXllcjsKIHN0cnVjdCBDbG9ja0VzdGltYXRvcjsKLXN0cnVjdCBEYXRhU291cmNlOwotc3RydWN0IE1lZGlhQnVmZmVyOworY2xhc3MgSURhdGFTb3VyY2U7CitjbGFzcyBNZWRpYUJ1ZmZlcjsKIHN0cnVjdCBNZWRpYUV4dHJhY3RvcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIHN0cnVjdCBOdUNhY2hlZFNvdXJjZTI7Ci1zdHJ1Y3QgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK2NsYXNzIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CiAKIGNsYXNzIERybU1hbmFnZXJDbGluZXQ7CiBjbGFzcyBEZWNyeXB0SGFuZGxlOwogCiBjbGFzcyBUaW1lZFRleHREcml2ZXI7Ci1zdHJ1Y3QgV1ZNRXh0cmFjdG9yOworY2xhc3MgV1ZNRXh0cmFjdG9yOwogCiBzdHJ1Y3QgQXdlc29tZVJlbmRlcmVyIDogcHVibGljIFJlZkJhc2UgewogICAgIEF3ZXNvbWVSZW5kZXJlcigpIHt9CkBAIC05Myw2ICs5NCw4IEBACiAKICAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKICAgICBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSk7CisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSk7CisgICAgc3RhdHVzX3QgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKTsKICAgICBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGFyY2VsICZyZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KTsKICAgICBzdGF0dXNfdCBzZXRDYWNoZVN0YXRDb2xsZWN0RnJlcShjb25zdCBQYXJjZWwgJnJlcXVlc3QpOwogCkBAIC0xODAsNiArMTgzLDcgQEAKICAgICBzcDxNZWRpYVNvdXJjZT4gbU9teFNvdXJjZTsKICAgICBzcDxNZWRpYVNvdXJjZT4gbUF1ZGlvU291cmNlOwogICAgIEF1ZGlvUGxheWVyICptQXVkaW9QbGF5ZXI7CisgICAgQXVkaW9QbGF5YmFja1JhdGUgbVBsYXliYWNrU2V0dGluZ3M7CiAgICAgaW50NjRfdCBtRHVyYXRpb25VczsKIAogICAgIGludDMyX3QgbURpc3BsYXlXaWR0aDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2FsbGJhY2tEYXRhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0NhbGxiYWNrRGF0YVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMjFkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0NhbGxiYWNrRGF0YVNvdXJjZS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DQUxMQkFDS0RBVEFTT1VSQ0VfSAorI2RlZmluZSBBTkRST0lEX0NBTExCQUNLREFUQVNPVVJDRV9ICisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJRGF0YVNvdXJjZTsKK2NsYXNzIElNZW1vcnk7CisKKy8vIEEgc3RhZ2VmcmlnaHQgRGF0YVNvdXJjZSB0aGF0IHdyYXBzIGEgYmluZGVyIElEYXRhU291cmNlLiBJdCdzIGEgIkNhbGxiYWNrIgorLy8gRGF0YVNvdXJjZSBiZWNhdXNlIGl0IGNhbGxzIGJhY2sgdG8gdGhlIElEYXRhU291cmNlIGZvciBkYXRhLgorY2xhc3MgQ2FsbGJhY2tEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworcHVibGljOgorICAgIENhbGxiYWNrRGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4mIGlEYXRhU291cmNlKTsKKyAgICB2aXJ0dWFsIH5DYWxsYmFja0RhdGFTb3VyY2UoKTsKKworICAgIC8vIERhdGFTb3VyY2UgaW1wbGVtZW50YXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOworCitwcml2YXRlOgorICAgIHNwPElEYXRhU291cmNlPiBtSURhdGFTb3VyY2U7CisgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENhbGxiYWNrRGF0YVNvdXJjZSk7Cit9OworCisKKy8vIEEgY2FjaGluZyBEYXRhU291cmNlIHRoYXQgd3JhcHMgYSBDYWxsYmFja0RhdGFTb3VyY2UuIEZvciByZWFkcyBzbWFsbGVyCisvLyB0aGFuIGtDYWNoZVNpemUgaXQgd2lsbCByZWFkIHVwIHRvIGtDYWNoZVNpemUgYWhlYWQgYW5kIGNhY2hlIGl0LgorLy8gVGhpcyByZWR1Y2VzIHRoZSBudW1iZXIgb2YgYmluZGVyIHJvdW5kIHRyaXBzIHRvIHRoZSBJRGF0YVNvdXJjZSBhbmQgaGFzIGEgc2lnbmlmaWNhbnQKKy8vIGltcGFjdCBvbiB0aW1lIHRha2VuIGZvciBmaWxldHlwZSBzbmlmZmluZyBhbmQgbWV0YWRhdGEgZXh0cmFjdGlvbi4KK2NsYXNzIFRpbnlDYWNoZVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKK3B1YmxpYzoKKyAgICBUaW55Q2FjaGVTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIHNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCogc2l6ZSk7CisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOworCitwcml2YXRlOgorICAgIC8vIDJrYiBjb21lcyBmcm9tIGV4cGVyaW1lbnRpbmcgd2l0aCB0aGUgdGltZS10by1maXJzdC1mcmFtZSBmcm9tIGEgTWVkaWFQbGF5ZXIKKyAgICAvLyB3aXRoIGFuIGluLW1lbW9yeSBNZWRpYURhdGFTb3VyY2Ugc291cmNlIG9uIGEgTmV4dXMgNS4gQmV5b25kIDJrYiB0aGVyZSB3YXMKKyAgICAvLyBubyBpbXByb3ZlbWVudC4KKyAgICBlbnVtIHsKKyAgICAgICAga0NhY2hlU2l6ZSA9IDIwNDgsCisgICAgfTsKKworICAgIHNwPERhdGFTb3VyY2U+IG1Tb3VyY2U7CisgICAgdWludDhfdCBtQ2FjaGVba0NhY2hlU2l6ZV07CisgICAgb2ZmNjRfdCBtQ2FjaGVkT2Zmc2V0OworICAgIHNpemVfdCBtQ2FjaGVkU2l6ZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRpbnlDYWNoZVNvdXJjZSk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9DQUxMQkFDS0RBVEFTT1VSQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHMlBTRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyUFNFeHRyYWN0b3IuaAppbmRleCBmYjc2NTY0Li4yMmNiMDJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyUFNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyUFNFeHRyYWN0b3IuaApAQCAtMjgsNyArMjgsNyBAQAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdHJ1Y3QgVHJhY2s7Ci1zdHJ1Y3QgU3RyaW5nODsKK2NsYXNzIFN0cmluZzg7CiAKIHN0cnVjdCBNUEVHMlBTRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKICAgICBNUEVHMlBTRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaAppbmRleCBkYjExODdkLi44ZWI4ZjZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaApAQCAtMjAsNyArMjAsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzAsNyArMzIsNyBAQAogc3RydWN0IEFUU1BhcnNlcjsKIGNsYXNzIERhdGFTb3VyY2U7CiBzdHJ1Y3QgTVBFRzJUU1NvdXJjZTsKLXN0cnVjdCBTdHJpbmc4OworY2xhc3MgU3RyaW5nODsKIAogc3RydWN0IE1QRUcyVFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewogICAgIE1QRUcyVFNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7CkBAIC01NCwxMCArNTYsMjEgQEAKIAogICAgIFZlY3RvcjxzcDxBbm90aGVyUGFja2V0U291cmNlPiA+IG1Tb3VyY2VJbXBsczsKIAorICAgIFZlY3RvcjxLZXllZFZlY3RvcjxpbnQ2NF90LCBvZmY2NF90PiA+IG1TeW5jUG9pbnRzOworICAgIC8vIFN5bmMgcG9pbnRzIHVzZWQgZm9yIHNlZWtpbmcgLS0tIG5vcm1hbGx5IG9uZSBmb3IgdmlkZW8gdHJhY2sgaXMgdXNlZC4KKyAgICAvLyBJZiBubyB2aWRlbyB0cmFjayBpcyBwcmVzZW50LCBhdWRpbyB0cmFjayB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KKyAgICBLZXllZFZlY3RvcjxpbnQ2NF90LCBvZmY2NF90PiAqbVNlZWtTeW5jUG9pbnRzOworCiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogCiAgICAgdm9pZCBpbml0KCk7CiAgICAgc3RhdHVzX3QgZmVlZE1vcmUoKTsKKyAgICBzdGF0dXNfdCBzZWVrKGludDY0X3Qgc2Vla1RpbWVVcywKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUmIHNlZWtNb2RlKTsKKyAgICBzdGF0dXNfdCBxdWV1ZURpc2NvbnRpbnVpdHlGb3JTZWVrKGludDY0X3QgYWN0dWFsU2Vla1RpbWVVcyk7CisgICAgc3RhdHVzX3Qgc2Vla0JleW9uZChpbnQ2NF90IHNlZWtUaW1lVXMpOworCisgICAgc3RhdHVzX3QgZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyVFNFeHRyYWN0b3IpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaAppbmRleCAxZmU2ZmNmLi4zMDY3YzNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCkBAIC04Myw2ICs4Myw4IEBACiAKICAgICBWZWN0b3I8U2lkeEVudHJ5PiBtU2lkeEVudHJpZXM7CiAgICAgb2ZmNjRfdCBtTW9vZk9mZnNldDsKKyAgICBib29sIG1Nb29mRm91bmQ7CisgICAgYm9vbCBtTWRhdEZvdW5kOwogCiAgICAgVmVjdG9yPFBzc2hJbmZvPiBtUHNzaDsKIApAQCAtMTAyLDExICsxMDQsMTUgQEAKICAgICBTdHJpbmc4IG1MYXN0Q29tbWVudE5hbWU7CiAgICAgU3RyaW5nOCBtTGFzdENvbW1lbnREYXRhOwogCisgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEFTdHJpbmc+IG1NZXRhS2V5TWFwOworCiAgICAgc3RhdHVzX3QgcmVhZE1ldGFEYXRhKCk7CiAgICAgc3RhdHVzX3QgcGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQsIGludCBkZXB0aCk7CiAgICAgc3RhdHVzX3QgcGFyc2VJVHVuZXNNZXRhRGF0YShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogICAgIHN0YXR1c190IHBhcnNlM0dQUE1ldGFEYXRhKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgaW50IGRlcHRoKTsKICAgICB2b2lkIHBhcnNlSUQzdjJNZXRhRGF0YShvZmY2NF90IG9mZnNldCk7CisgICAgc3RhdHVzX3QgcGFyc2VRVE1ldGFLZXkob2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VRVE1ldGFWYWwoaW50MzJfdCBrZXlJZCwgb2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSk7CiAKICAgICBzdGF0dXNfdCB1cGRhdGVBdWRpb1RyYWNrSW5mb0Zyb21FU0RTX01QRUc0QXVkaW8oCiAgICAgICAgICAgICBjb25zdCB2b2lkICplc2RzX2RhdGEsIHNpemVfdCBlc2RzX3NpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKaW5kZXggODI5YzM4Yi4uYjIwYjJlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oCkBAIC0yNCw3ICsyNCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBPTVhNYXN0ZXI7Ci1jbGFzcyBPTVhOb2RlSW5zdGFuY2U7CitzdHJ1Y3QgT01YTm9kZUluc3RhbmNlOwogCiBjbGFzcyBPTVggOiBwdWJsaWMgQm5PTVgsCiAgICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgewpAQCAtNjksNyArNjksNyBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9VMzIqIHVzYWdlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcmVNZXRhRGF0YUluQnVmZmVycygKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUsCkBAIC04MSw3ICs4MSw3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAotICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9CT09MIGNyb3NzUHJvY2Vzcyk7CisgICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX1UzMiBhbGxvdHRlZFNpemUsIE9NWF9CT09MIGNyb3NzUHJvY2Vzcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUdyYXBoaWNCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKQEAgLTkzLDcgKzkzLDE3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUlucHV0U3VyZmFjZSgKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAotICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyKTsKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwKKyAgICAgICAgICAgIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBlcnNpc3RlbnRJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIsCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAqYnVmZmVyQ29uc3VtZXIpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICZidWZmZXJDb25zdW1lciwKKyAgICAgICAgICAgIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0obm9kZV9pZCBub2RlKTsKIApAQCAtMTAzLDE4ICsxMTMsMTggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJXaXRoQmFja3VwKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCi0gICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKTsKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfVTMyIGFsbG90dGVkU2l6ZSwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZnJlZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBidWZmZXJfaWQgYnVmZmVyKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmlsbEJ1ZmZlcihub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZmlsbEJ1ZmZlcihub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIsIGludCBmZW5jZUZkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZW1wdHlCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsCiAgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyLAogICAgICAgICAgICAgT01YX1UzMiByYW5nZV9vZmZzZXQsIE9NWF9VMzIgcmFuZ2VfbGVuZ3RoLAotICAgICAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCk7CisgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEV4dGVuc2lvbkluZGV4KAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLApAQCAtMTQwLDEwICsxNTAsMTAgQEAKICAgICAgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBFdmVudERhdGEpOwogCiAgICAgT01YX0VSUk9SVFlQRSBPbkVtcHR5QnVmZmVyRG9uZSgKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyLCBpbnQgZmVuY2VGZCk7CiAKICAgICBPTVhfRVJST1JUWVBFIE9uRmlsbEJ1ZmZlckRvbmUoCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcik7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlciwgaW50IGZlbmNlRmQpOwogCiAgICAgdm9pZCBpbnZhbGlkYXRlTm9kZUlEKG5vZGVfaWQgbm9kZSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oCmluZGV4IDYxNmRkYTEuLmJkMzNhYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaApAQCAtMjgsNyArMjgsOSBAQAogCiBjbGFzcyBJT01YT2JzZXJ2ZXI7CiBzdHJ1Y3QgT01YTWFzdGVyOwotc3RydWN0IEdyYXBoaWNCdWZmZXJTb3VyY2U7CitjbGFzcyBHcmFwaGljQnVmZmVyU291cmNlOworCitzdGF0dXNfdCBTdGF0dXNGcm9tT01YRXJyb3IoT01YX0VSUk9SVFlQRSBlcnIpOwogCiBzdHJ1Y3QgT01YTm9kZUluc3RhbmNlIHsKICAgICBPTVhOb2RlSW5zdGFuY2UoCkBAIC01Nyw3ICs1OSw4IEBACiAKICAgICBzdGF0dXNfdCBnZXRHcmFwaGljQnVmZmVyVXNhZ2UoT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9VMzIqIHVzYWdlKTsKIAotICAgIHN0YXR1c190IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSk7CisgICAgc3RhdHVzX3Qgc3RvcmVNZXRhRGF0YUluQnVmZmVycygKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUsIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSk7CiAKICAgICBzdGF0dXNfdCBwcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUsCkBAIC02OSw3ICs3Miw3IEBACiAKICAgICBzdGF0dXNfdCB1c2VCdWZmZXIoCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKLSAgICAgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIsIE9NWF9CT09MIGNyb3NzUHJvY2Vzcyk7CisgICAgICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfVTMyIGFsbG90dGVkU2l6ZSwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKTsKIAogICAgIHN0YXR1c190IHVzZUdyYXBoaWNCdWZmZXIoCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsCkBAIC04MCw3ICs4MywxNiBAQAogICAgICAgICAgICAgT01YOjpidWZmZXJfaWQgYnVmZmVyKTsKIAogICAgIHN0YXR1c190IGNyZWF0ZUlucHV0U3VyZmFjZSgKLSAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIpOworICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwKKyAgICAgICAgICAgIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgY3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICpidWZmZXJDb25zdW1lcik7CisKKyAgICBzdGF0dXNfdCBzZXRJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gJmJ1ZmZlckNvbnN1bWVyLAorICAgICAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKTsKIAogICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKIApAQCAtOTAsMjEgKzEwMiwyMCBAQAogCiAgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJXaXRoQmFja3VwKAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCi0gICAgICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfQk9PTCBjcm9zc1Byb2Nlc3MpOworICAgICAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlciwgT01YX1UzMiBhbGxvdHRlZFNpemUsIE9NWF9CT09MIGNyb3NzUHJvY2Vzcyk7CiAKICAgICBzdGF0dXNfdCBmcmVlQnVmZmVyKE9NWF9VMzIgcG9ydEluZGV4LCBPTVg6OmJ1ZmZlcl9pZCBidWZmZXIpOwogCi0gICAgc3RhdHVzX3QgZmlsbEJ1ZmZlcihPTVg6OmJ1ZmZlcl9pZCBidWZmZXIpOworICAgIHN0YXR1c190IGZpbGxCdWZmZXIoT01YOjpidWZmZXJfaWQgYnVmZmVyLCBpbnQgZmVuY2VGZCk7CiAKICAgICBzdGF0dXNfdCBlbXB0eUJ1ZmZlcigKICAgICAgICAgICAgIE9NWDo6YnVmZmVyX2lkIGJ1ZmZlciwKICAgICAgICAgICAgIE9NWF9VMzIgcmFuZ2VPZmZzZXQsIE9NWF9VMzIgcmFuZ2VMZW5ndGgsCi0gICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXAsIGludCBmZW5jZUZkKTsKIAotICAgIHN0YXR1c190IGVtcHR5RGlyZWN0QnVmZmVyKAotICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciwKLSAgICAgICAgICAgIE9NWF9VMzIgcmFuZ2VPZmZzZXQsIE9NWF9VMzIgcmFuZ2VMZW5ndGgsCi0gICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wKTsKKyAgICBzdGF0dXNfdCBlbXB0eUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyLCBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50IGZlbmNlRmQpOwogCiAgICAgc3RhdHVzX3QgZ2V0RXh0ZW5zaW9uSW5kZXgoCiAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXJhbWV0ZXJOYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCk7CkBAIC0xMTksNiArMTMwLDggQEAKICAgICAgICAgcmV0dXJuIG1Jc1NlY3VyZTsKICAgICB9CiAKKyAgICAvLyBoYW5kbGVzIG1lc3NhZ2VzIGFuZCByZW1vdmVzIHRoZW0gZnJvbSB0aGUgbGlzdAorICAgIHZvaWQgb25NZXNzYWdlcyhzdGQ6Omxpc3Q8b214X21lc3NhZ2U+ICZtZXNzYWdlcyk7CiAgICAgdm9pZCBvbk1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZyk7CiAgICAgdm9pZCBvbk9ic2VydmVyRGllZChPTVhNYXN0ZXIgKm1hc3Rlcik7CiAgICAgdm9pZCBvbkdldEhhbmRsZUZhaWxlZCgpOwpAQCAtMTU2LDkgKzE2OSw3IEBACiAgICAgdWludDMyX3QgbUJ1ZmZlcklEQ291bnQ7CiAgICAgS2V5ZWRWZWN0b3I8T01YOjpidWZmZXJfaWQsIE9NWF9CVUZGRVJIRUFERVJUWVBFICo+IG1CdWZmZXJJRFRvQnVmZmVySGVhZGVyOwogICAgIEtleWVkVmVjdG9yPE9NWF9CVUZGRVJIRUFERVJUWVBFICosIE9NWDo6YnVmZmVyX2lkPiBtQnVmZmVySGVhZGVyVG9CdWZmZXJJRDsKLQotICAgIC8vIG1ldGFkYXRhIG1vZGUgdHJhY2tpbmcKLSAgICBib29sIG1Vc2luZ01ldGFkYXRhWzJdOworICAgIE1ldGFkYXRhQnVmZmVyVHlwZSBtTWV0YWRhdGFUeXBlWzJdOwogCiAgICAgLy8gRm9yIGRlYnVnIHN1cHBvcnQKICAgICBjaGFyICptTmFtZTsKQEAgLTIwOCwxNiArMjE5LDM1IEBACiAgICAgICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIpOwogCiAgICAgc3RhdHVzX3Qgc3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKAotICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKLSAgICAgICAgICAgIE9NWF9CT09MIHVzZUdyYXBoaWNCdWZmZXIsIE9NWF9CT09MICp1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGEpOworICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKTsKKworICAgIC8vIFN0b3JlcyBmZW5jZSBpbnRvIGJ1ZmZlciBpZiBpdCBpcyBBTldCdWZmZXIgdHlwZSBhbmQgaGFzIGVub3VnaCBzcGFjZS4KKyAgICAvLyBvdGhlcndpc2UsIHdhaXRzIGZvciB0aGUgZmVuY2UgdG8gc2lnbmFsLiAgVGFrZXMgb3duZXJzaGlwIG9mIHxmZW5jZUZkfC4KKyAgICBzdGF0dXNfdCBzdG9yZUZlbmNlSW5NZXRhX2woCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyLCBpbnQgZmVuY2VGZCwgT01YX1UzMiBwb3J0SW5kZXgpOworCisgICAgLy8gUmV0cmlldmVzIHRoZSBmZW5jZSBmcm9tIGJ1ZmZlciBpZiBBTldCdWZmZXIgdHlwZSBhbmQgaGFzIGVub3VnaCBzcGFjZS4gT3RoZXJ3aXNlLCByZXR1cm5zIC0xCisgICAgaW50IHJldHJpZXZlRmVuY2VGcm9tTWV0YV9sKAorICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciwgT01YX1UzMiBwb3J0SW5kZXgpOwogCiAgICAgc3RhdHVzX3QgZW1wdHlCdWZmZXJfbCgKICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIsCi0gICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnRwdHJfdCBkZWJ1Z0FkZHIpOworICAgICAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50cHRyX3QgZGVidWdBZGRyLCBpbnQgZmVuY2VGZCk7CiAKKyAgICBzdGF0dXNfdCB1cGRhdGVHcmFwaGljQnVmZmVySW5NZXRhX2woCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsCisgICAgICAgICAgICBPTVg6OmJ1ZmZlcl9pZCBidWZmZXIsIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIpOworCisgICAgc3RhdHVzX3QgY3JlYXRlR3JhcGhpY0J1ZmZlclNvdXJjZSgKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lciAvKiBudWxsYWJsZSAqLywKKyAgICAgICAgICAgIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSk7CiAgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gZ2V0R3JhcGhpY0J1ZmZlclNvdXJjZSgpOwogICAgIHZvaWQgc2V0R3JhcGhpY0J1ZmZlclNvdXJjZShjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgYnVmZmVyU291cmNlKTsKIAorICAgIC8vIEhhbmRsZXMgfG1zZ3wsIGFuZCBtYXkgbW9kaWZ5IGl0LiBSZXR1cm5zIHRydWUgaWZmIGNvbXBsZXRlbHkgaGFuZGxlZCBpdCBhbmQKKyAgICAvLyB8bXNnfCBkb2VzIG5vdCBuZWVkIHRvIGJlIHNlbnQgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLgorICAgIGJvb2wgaGFuZGxlTWVzc2FnZShvbXhfbWVzc2FnZSAmbXNnKTsKKwogICAgIE9NWE5vZGVJbnN0YW5jZShjb25zdCBPTVhOb2RlSW5zdGFuY2UgJik7CiAgICAgT01YTm9kZUluc3RhbmNlICZvcGVyYXRvcj0oY29uc3QgT01YTm9kZUluc3RhbmNlICYpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT2dnRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09nZ0V4dHJhY3Rvci5oCmluZGV4IGU5N2M4Y2QuLmM2NDdjYmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT2dnRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaApAQCAtMjcsNyArMjcsNyBAQAogY2xhc3MgRGF0YVNvdXJjZTsKIGNsYXNzIFN0cmluZzg7CiAKLXN0cnVjdCBNeVZvcmJpc0V4dHJhY3RvcjsKK3N0cnVjdCBNeU9nZ0V4dHJhY3RvcjsKIHN0cnVjdCBPZ2dTb3VyY2U7CiAKIHN0cnVjdCBPZ2dFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewpAQCAtNDgsNyArNDgsNyBAQAogICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAKLSAgICBNeVZvcmJpc0V4dHJhY3RvciAqbUltcGw7CisgICAgTXlPZ2dFeHRyYWN0b3IgKm1JbXBsOwogCiAgICAgT2dnRXh0cmFjdG9yKGNvbnN0IE9nZ0V4dHJhY3RvciAmKTsKICAgICBPZ2dFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBPZ2dFeHRyYWN0b3IgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmgKaW5kZXggNjBjOWU3ZS4uNzA1MzI0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVJdGVyYXRvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaApAQCAtMTgsNyArMTgsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBTYW1wbGVUYWJsZTsKK2NsYXNzIFNhbXBsZVRhYmxlOwogCiBzdHJ1Y3QgU2FtcGxlSXRlcmF0b3IgewogICAgIFNhbXBsZUl0ZXJhdG9yKFNhbXBsZVRhYmxlICp0YWJsZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdE9NWENvbXBvbmVudC5oCmluZGV4IGEzOWM4OTMuLjNhYjZmODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdE9NWENvbXBvbmVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdE9NWENvbXBvbmVudC5oCkBAIC0xNjgsNDggKzE2OCwxNiBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRPTVhDb21wb25lbnQpOwogfTsKIAotLy8gbWluaW1hbCBpbXBsZW1lbnRhdGlvbnMgb2YgaXNfc2FtZSBhbmQgc3RhdGljX2Fzc2VydCB0aGF0IHdvcmsgb24gSywKLS8vIHRob3VnaCBlcnJvciBtZXNzYWdlcyBhcmUgbWluaW1hbAotCi0vLyBhIHR5cGUgdGhhdCBoYXMgYSBtZW1iZXIgY29uc3RhbnQgb2YgYSBzcGVjaWZpZWQgdHlwZSBhbmQgdmFsdWUKLXRlbXBsYXRlPHR5cGVuYW1lIFQsIFQgc29tZXZhbHVlPgotc3RydWN0IGNvbXBhdF9pbnRlZ3JhbF9jb25zdGFudAotewotICAgIHN0YXRpYyBjb25zdCBUIHZhbHVlID0gc29tZXZhbHVlOwotfTsKLQotLy8gdHlwZXMgdG8gaG9sZCB0cnVlIGFuZCBmYWxzZQotdHlwZWRlZiBjb21wYXRfaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgdHJ1ZT4gY29tcGF0X3RydWVfdHlwZTsKLXR5cGVkZWYgY29tcGF0X2ludGVncmFsX2NvbnN0YW50PGJvb2wsIGZhbHNlPiBjb21wYXRfZmFsc2VfdHlwZTsKLQotLy8gYSB0eXBlIHRoYXQgaW5kaWNhdGVzIHR3byBvdGhlciB0eXBlcyBhcmUgZGlmZmVyZW50Ci10ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IHN0cnVjdCBjb21wYXRfaXNfc2FtZSA6IHB1YmxpYyBjb21wYXRfZmFsc2VfdHlwZSB7IH07Ci0KLS8vIGEgdHlwZSB0aGF0IGluZGljYXRlcyB0d28gb3RoZXIgdHlwZXMgYXJlIHRoZSBzYW1lCi10ZW1wbGF0ZTx0eXBlbmFtZSBzYW1ldHlwZT4gc3RydWN0IGNvbXBhdF9pc19zYW1lPHNhbWV0eXBlLCBzYW1ldHlwZT4gOiBwdWJsaWMgY29tcGF0X3RydWVfdHlwZSB7IH07Ci0vLyBmb3IgdGhlIHNwZWNpZmljIHVzZSBiZWxvdywgd2Ugd2FudCB0byBjb25zaWRlciAiY29uc3QgdHlwZSIgYW5kICJ0eXBlIiB0byBiZSB0aGUgc2FtZQotdGVtcGxhdGU8dHlwZW5hbWUgc2FtZXR5cGU+IHN0cnVjdCBjb21wYXRfaXNfc2FtZTxjb25zdCBzYW1ldHlwZSwgc2FtZXR5cGU+IDogcHVibGljIGNvbXBhdF90cnVlX3R5cGUgeyB9OwotCi0KLS8vIENvbXBpbGUgdGltZSBhc3NlcnQuIE5vdGUgdGhhdCB0aGUgbWVzc2FnZSBpcyBpZ25vcmVkLiBJbnN0ZWFkLCB0aGUKLS8vIGNvbXBpbGVyIHdpbGwgcmVwb3J0IGEgZGl2aXNpb24gYnkgemVybyBhbmQvb3IgYSBub24tY29uc3RhbnQgZXhwcmVzc2lvbgotLy8gd2hlbiB0aGUgYXNzZXJ0aW9uIHRyaWdnZXJzLgotI2RlZmluZSBTVEFUSUNfQVNTRVJUKGUsIG0pIFwKLSAgICBkbyB7IFwKLSAgICAgICAgZW51bSB7IFNUQVRJQ19BU1NFUlRfXyA9IDEvKGUpIH07IFwKLSAgICB9IHdoaWxlICgwKQotCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogYm9vbCBpc1ZhbGlkT01YUGFyYW0oVCAqYSkgewotICBTVEFUSUNfQVNTRVJUKG9mZnNldG9mKHR5cGVvZigqYSksIG5TaXplKSA9PSAwLCAiblNpemUgbm90IGF0IG9mZnNldCAwIik7Ci0gIGNvbnN0IGJvb2wgaXNTYW1lMSA9IGNvbXBhdF9pc19zYW1lPHR5cGVvZihhLT5uU2l6ZSksIE9NWF9VMzI+Ojp2YWx1ZTsKLSAgU1RBVElDX0FTU0VSVChpc1NhbWUxLCAiblNpemUgaGFzIHdyb25nIHR5cGUiKTsKLSAgU1RBVElDX0FTU0VSVChvZmZzZXRvZih0eXBlb2YoKmEpLCBuVmVyc2lvbikgPT0gNCwgIm5WZXJzaW9uIG5vdCBhdCBvZmZzZXQgNCIpOwotICBjb25zdCBib29sIGlzU2FtZTIgPSBjb21wYXRfaXNfc2FtZTx0eXBlb2YoYS0+blZlcnNpb24pLCBPTVhfVkVSU0lPTlRZUEU+Ojp2YWx1ZTsKLSAgU1RBVElDX0FTU0VSVChpc1NhbWUyLCAiblZlcnNpb24gaGFzIHdyb25nIHR5cGUiKTsKKyAgc3RhdGljX2Fzc2VydChvZmZzZXRvZih0eXBlb2YoKmEpLCBuU2l6ZSkgPT0gMCwgIm5TaXplIG5vdCBhdCBvZmZzZXQgMCIpOworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTwgZGVjbHR5cGUoYS0+blNpemUpLCBPTVhfVTMyPjo6dmFsdWUsICJuU2l6ZSBoYXMgd3JvbmcgdHlwZSIpOworICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKHR5cGVvZigqYSksIG5WZXJzaW9uKSA9PSA0LCAiblZlcnNpb24gbm90IGF0IG9mZnNldCA0Iik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPCBkZWNsdHlwZShhLT5uVmVyc2lvbiksIE9NWF9WRVJTSU9OVFlQRT46OnZhbHVlLAorICAgICAgICAgICJuVmVyc2lvbiBoYXMgd3JvbmcgdHlwZSIpOwogCiAgIGlmIChhLT5uU2l6ZSA8IHNpemVvZigqYSkpIHsKLSAgICAgIEFMT0dFKCJiLzI3MjA3Mjc1OiBuZWVkICV6dSwgZ290ICVsdSIsIHNpemVvZigqYSksIGEtPm5TaXplKTsKKyAgICAgIEFMT0dFKCJiLzI3MjA3Mjc1OiBuZWVkICV6dSwgZ290ICV1Iiwgc2l6ZW9mKCphKSwgYS0+blNpemUpOwogICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzIwNzI3NSIpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCmluZGV4IGZhM2VhODkuLjc1N2IzMDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCkBAIC0xOSwyMiArMTksMjcgQEAKICNkZWZpbmUgU09GVFdBUkVfUkVOREVSRVJfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KIAorI2luY2x1ZGUgPGxpc3Q+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwogCiBjbGFzcyBTb2Z0d2FyZVJlbmRlcmVyIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3cpOworICAgIGV4cGxpY2l0IFNvZnR3YXJlUmVuZGVyZXIoCisgICAgICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlV2luZG93LCBpbnQzMl90IHJvdGF0aW9uID0gMCk7CiAKICAgICB+U29mdHdhcmVSZW5kZXJlcigpOwogCi0gICAgdm9pZCByZW5kZXIoCi0gICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50NjRfdCB0aW1lc3RhbXBOcywKKyAgICBzdGQ6Omxpc3Q8RnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvPiByZW5kZXIoCisgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50NjRfdCBtZWRpYVRpbWVVcywgbnNlY3NfdCByZW5kZXJUaW1lTnMsCiAgICAgICAgICAgICB2b2lkICpwbGF0Zm9ybVByaXZhdGUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICB2b2lkIGNsZWFyVHJhY2tlcigpOwogCiBwcml2YXRlOgogICAgIGVudW0gWVVWTW9kZSB7CkBAIC00OCw2ICs1Myw4IEBACiAgICAgaW50MzJfdCBtV2lkdGgsIG1IZWlnaHQ7CiAgICAgaW50MzJfdCBtQ3JvcExlZnQsIG1Dcm9wVG9wLCBtQ3JvcFJpZ2h0LCBtQ3JvcEJvdHRvbTsKICAgICBpbnQzMl90IG1Dcm9wV2lkdGgsIG1Dcm9wSGVpZ2h0OworICAgIGludDMyX3QgbVJvdGF0aW9uRGVncmVlczsKKyAgICBGcmFtZVJlbmRlclRyYWNrZXIgbVJlbmRlclRyYWNrZXI7CiAKICAgICBTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CiAgICAgU29mdHdhcmVSZW5kZXJlciAmb3BlcmF0b3I9KGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IDY2MzJjMjcuLmZkNzM5ZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0yNSw3ICsyNSw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IERhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291cmNlOwogY2xhc3MgTWVkaWFFeHRyYWN0b3I7CiAKIHN0cnVjdCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyIDogcHVibGljIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UgewpAQCAtMzgsNiArMzgsNyBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIHNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIFZpZGVvRnJhbWUgKmdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKTsKICAgICB2aXJ0dWFsIE1lZGlhQWxidW1BcnQgKmV4dHJhY3RBbGJ1bUFydCgpOwpAQCAtNTMsNiArNTQsOCBAQAogICAgIE1lZGlhQWxidW1BcnQgKm1BbGJ1bUFydDsKIAogICAgIHZvaWQgcGFyc2VNZXRhRGF0YSgpOworICAgIC8vIERlbGV0ZSBhbGJ1bSBhcnQgYW5kIGNsZWFyIG1ldGFkYXRhLgorICAgIHZvaWQgY2xlYXJNZXRhZGF0YSgpOwogCiAgICAgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcihjb25zdCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyICYpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1RpbWVkRXZlbnRRdWV1ZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaW1lZEV2ZW50UXVldWUuaAppbmRleCAyOTYzMTUwLi44OTBmN2U4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1RpbWVkRXZlbnRRdWV1ZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVGltZWRFdmVudFF1ZXVlLmgKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIGZpcmUoVGltZWRFdmVudFF1ZXVlICpxdWV1ZSwgaW50NjRfdCBub3dfdXMpID0gMDsKIAogICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBUaW1lZEV2ZW50UXVldWU7CisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgVGltZWRFdmVudFF1ZXVlOwogCiAgICAgICAgIGV2ZW50X2lkIG1FdmVudElEOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1ZCUklTZWVrZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVkJSSVNlZWtlci5oCmluZGV4IDFhMmJmOWYuLmM1N2Q1NzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVkJSSVNlZWtlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVkJSSVNlZWtlci5oCkBAIC0yNCw3ICsyNCw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IERhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291cmNlOwogCiBzdHJ1Y3QgVkJSSVNlZWtlciA6IHB1YmxpYyBNUDNTZWVrZXIgewogICAgIHN0YXRpYyBzcDxWQlJJU2Vla2VyPiBDcmVhdGVGcm9tU291cmNlKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9YSU5HU2Vla2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1hJTkdTZWVrZXIuaAppbmRleCBjNDA4NTc2Li5jY2UwNGYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1hJTkdTZWVrZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1hJTkdTZWVrZXIuaApAQCAtMjIsNyArMjIsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBEYXRhU291cmNlOworY2xhc3MgRGF0YVNvdXJjZTsKIAogc3RydWN0IFhJTkdTZWVrZXIgOiBwdWJsaWMgTVAzU2Vla2VyIHsKICAgICBzdGF0aWMgc3A8WElOR1NlZWtlcj4gQ3JlYXRlRnJvbVNvdXJjZSgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvYXZjX3V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2F2Y191dGlscy5oCmluZGV4IGMyNzBiYzEuLmRhZmEwN2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvYXZjX3V0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9hdmNfdXRpbHMuaApAQCAtMzYsNiArMzYsMTEgQEAKICAgICBrQVZDUHJvZmlsZUNBVkxDNDQ0SW50cmEgPSAweDJjCiB9OwogCitzdHJ1Y3QgTkFMUG9zaXRpb24geworICAgIHNpemVfdCBuYWxPZmZzZXQ7CisgICAgc2l6ZV90IG5hbFNpemU7Cit9OworCiAvLyBPcHRpb25hbGx5IHJldHVybnMgc2FtcGxlIGFzcGVjdCByYXRpbyBhcyB3ZWxsLgogdm9pZCBGaW5kQVZDRGltZW5zaW9ucygKICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNlcVBhcmFtU2V0LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQubWsKaW5kZXggNDQ2ZmY4Yy4uMWU4YzJiMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9BbmRyb2lkLm1rCkBAIC04LDcgKzgsOCBAQAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4L2xpYndlYm0gXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X21hdHJvc2thCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcAppbmRleCBjMzBlODA3Li5lY2MyNTczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwCkBAIC05NDQsNiArOTQ0LDExIEBACiAgICAgICAgIEFMT0dWKCJjb2RlYyBpZCA9ICVzIiwgY29kZWNJRCk7CiAgICAgICAgIEFMT0dWKCJjb2RlYyBuYW1lID0gJXMiLCB0cmFjay0+R2V0Q29kZWNOYW1lQXNVVEY4KCkpOwogCisgICAgICAgIGlmIChjb2RlY0lEID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dXKCJ1bmtub3duIGNvZGVjSUQgaXMgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKICAgICAgICAgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemU7CiAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvZGVjUHJpdmF0ZSA9CiAgICAgICAgICAgICB0cmFjay0+R2V0Q29kZWNQcml2YXRlKGNvZGVjUHJpdmF0ZVNpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCmluZGV4IDFlYWU2Y2YuLjJmMmIxMTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIApAQCAtNDcsMTUgKzQ4LDE5IEBACiBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUU1BhY2tldFNpemUgPSAxODg7CiAKIHN0cnVjdCBBVFNQYXJzZXI6OlByb2dyYW0gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgUHJvZ3JhbShBVFNQYXJzZXIgKnBhcnNlciwgdW5zaWduZWQgcHJvZ3JhbU51bWJlciwgdW5zaWduZWQgcHJvZ3JhbU1hcFBJRCk7CisgICAgUHJvZ3JhbShBVFNQYXJzZXIgKnBhcnNlciwgdW5zaWduZWQgcHJvZ3JhbU51bWJlciwgdW5zaWduZWQgcHJvZ3JhbU1hcFBJRCwKKyAgICAgICAgICAgIGludDY0X3QgbGFzdFJlY292ZXJlZFBUUyk7CiAKICAgICBib29sIHBhcnNlUFNJU2VjdGlvbigKICAgICAgICAgICAgIHVuc2lnbmVkIHBpZCwgQUJpdFJlYWRlciAqYnIsIHN0YXR1c190ICplcnIpOwogCisgICAgLy8gUGFzcyB0byBhcHByb3ByaWF0ZSBzdHJlYW0gYWNjb3JkaW5nIHRvIHBpZCwgYW5kIHNldCBldmVudCBpZiBpdCdzIGEgUEVTCisgICAgLy8gd2l0aCBhIHN5bmMgZnJhbWUuCisgICAgLy8gTm90ZSB0aGF0IHRoZSBtZXRob2QgaXRzZWxmIGRvZXMgbm90IHRvdWNoIGV2ZW50LgogICAgIGJvb2wgcGFyc2VQSUQoCiAgICAgICAgICAgICB1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGNvbnRpbnVpdHlfY291bnRlciwKICAgICAgICAgICAgIHVuc2lnbmVkIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IsCi0gICAgICAgICAgICBBQml0UmVhZGVyICpiciwgc3RhdHVzX3QgKmVycik7CisgICAgICAgICAgICBBQml0UmVhZGVyICpiciwgc3RhdHVzX3QgKmVyciwgU3luY0V2ZW50ICpldmVudCk7CiAKICAgICB2b2lkIHNpZ25hbERpc2NvbnRpbnVpdHkoCiAgICAgICAgICAgICBEaXNjb250aW51aXR5VHlwZSB0eXBlLCBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhKTsKQEAgLTg2LDE0ICs5MSwyMiBAQAogICAgIH0KIAogcHJpdmF0ZToKKyAgICBzdHJ1Y3QgU3RyZWFtSW5mbyB7CisgICAgICAgIHVuc2lnbmVkIG1UeXBlOworICAgICAgICB1bnNpZ25lZCBtUElEOworICAgIH07CisKICAgICBBVFNQYXJzZXIgKm1QYXJzZXI7CiAgICAgdW5zaWduZWQgbVByb2dyYW1OdW1iZXI7CiAgICAgdW5zaWduZWQgbVByb2dyYW1NYXBQSUQ7CiAgICAgS2V5ZWRWZWN0b3I8dW5zaWduZWQsIHNwPFN0cmVhbT4gPiBtU3RyZWFtczsKICAgICBib29sIG1GaXJzdFBUU1ZhbGlkOwogICAgIHVpbnQ2NF90IG1GaXJzdFBUUzsKKyAgICBpbnQ2NF90IG1MYXN0UmVjb3ZlcmVkUFRTOwogCiAgICAgc3RhdHVzX3QgcGFyc2VQcm9ncmFtTWFwKEFCaXRSZWFkZXIgKmJyKTsKKyAgICBpbnQ2NF90IHJlY292ZXJQVFModWludDY0X3QgUFRTXzMzYml0KTsKKyAgICBib29sIHN3aXRjaFBJRHMoY29uc3QgVmVjdG9yPFN0cmVhbUluZm8+ICZpbmZvcyk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQcm9ncmFtKTsKIH07CkBAIC0xMDgsMTAgKzEyMSwxNCBAQAogICAgIHVuc2lnbmVkIHBpZCgpIGNvbnN0IHsgcmV0dXJuIG1FbGVtZW50YXJ5UElEOyB9CiAgICAgdm9pZCBzZXRQSUQodW5zaWduZWQgcGlkKSB7IG1FbGVtZW50YXJ5UElEID0gcGlkOyB9CiAKKyAgICAvLyBQYXJzZSB0aGUgcGF5bG9hZCBhbmQgc2V0IGV2ZW50IHdoZW4gUEVTIHdpdGggYSBzeW5jIGZyYW1lIGlzIGRldGVjdGVkLgorICAgIC8vIFRoaXMgbWV0aG9kIGtub3dzIHdoZW4gYSBQRVMgc3RhcnRzOyBzbyByZWNvcmQgbVBlc1N0YXJ0T2Zmc2V0IGluIHRoYXQKKyAgICAvLyBjYXNlLgogICAgIHN0YXR1c190IHBhcnNlKAogICAgICAgICAgICAgdW5zaWduZWQgY29udGludWl0eV9jb3VudGVyLAogICAgICAgICAgICAgdW5zaWduZWQgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwKLSAgICAgICAgICAgIEFCaXRSZWFkZXIgKmJyKTsKKyAgICAgICAgICAgIEFCaXRSZWFkZXIgKmJyLAorICAgICAgICAgICAgU3luY0V2ZW50ICpldmVudCk7CiAKICAgICB2b2lkIHNpZ25hbERpc2NvbnRpbnVpdHkoCiAgICAgICAgICAgICBEaXNjb250aW51aXR5VHlwZSB0eXBlLCBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhKTsKQEAgLTEyMiw2ICsxMzksNyBAQAogCiAgICAgYm9vbCBpc0F1ZGlvKCkgY29uc3Q7CiAgICAgYm9vbCBpc1ZpZGVvKCkgY29uc3Q7CisgICAgYm9vbCBpc01ldGEoKSBjb25zdDsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflN0cmVhbSgpOwpAQCAtMTM5LDE3ICsxNTcsMjQgQEAKICAgICBib29sIG1FT1NSZWFjaGVkOwogCiAgICAgdWludDY0X3QgbVByZXZQVFM7CisgICAgb2ZmNjRfdCBtUGVzU3RhcnRPZmZzZXQ7CiAKICAgICBFbGVtZW50YXJ5U3RyZWFtUXVldWUgKm1RdWV1ZTsKIAotICAgIHN0YXR1c190IGZsdXNoKCk7Ci0gICAgc3RhdHVzX3QgcGFyc2VQRVMoQUJpdFJlYWRlciAqYnIpOworICAgIC8vIEZsdXNoIGFjY3VtdWxhdGVkIHBheWxvYWQgaWYgbmVjZXNzYXJ5IC0tLSBpLmUuIGF0IEVPUyBvciBhdCB0aGUgc3RhcnQgb2YKKyAgICAvLyBhbm90aGVyIHBheWxvYWQuIGV2ZW50IGlzIHNldCBpZiB0aGUgZmx1c2hlZCBwYXlsb2FkIGlzIFBFUyB3aXRoIGEgc3luYworICAgIC8vIGZyYW1lLgorICAgIHN0YXR1c190IGZsdXNoKFN5bmNFdmVudCAqZXZlbnQpOworICAgIC8vIFN0cmlwIGFuZCBwYXJzZSBQRVMgaGVhZGVycyBhbmQgcGFzcyByZW1haW5pbmcgcGF5bG9hZCBpbnRvIG9uUGF5bG9hZAorICAgIC8vIHdpdGggcGFyc2VkIG1ldGFkYXRhLiBldmVudCBpcyBzZXQgaWYgdGhlIFBFUyBjb250YWlucyBhIHN5bmMgZnJhbWUuCisgICAgc3RhdHVzX3QgcGFyc2VQRVMoQUJpdFJlYWRlciAqYnIsIFN5bmNFdmVudCAqZXZlbnQpOwogCisgICAgLy8gRmVlZCB0aGUgcGF5bG9hZCBpbnRvIG1RdWV1ZSBhbmQgaWYgYSBwYWNrZXQgaXMgaWRlbnRpZmllZCwgcXVldWUgaXQKKyAgICAvLyBpbnRvIG1Tb3VyY2UuIElmIHRoZSBwYWNrZXQgaXMgYSBzeW5jIGZyYW1lLiBzZXQgZXZlbnQgd2l0aCBzdGFydCBvZmZzZXQKKyAgICAvLyBhbmQgdGltZXN0YW1wIG9mIHRoZSBwYWNrZXQuCiAgICAgdm9pZCBvblBheWxvYWREYXRhKAogICAgICAgICAgICAgdW5zaWduZWQgUFRTX0RUU19mbGFncywgdWludDY0X3QgUFRTLCB1aW50NjRfdCBEVFMsCi0gICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2b2lkIGV4dHJhY3RBQUNGcmFtZXMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgU3luY0V2ZW50ICpldmVudCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJlYW0pOwogfTsKQEAgLTE1OCwxMCArMTgzLDEyIEBACiAgICAgUFNJU2VjdGlvbigpOwogCiAgICAgc3RhdHVzX3QgYXBwZW5kKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIHNldFNraXBCeXRlcyh1aW50OF90IHNraXApOwogICAgIHZvaWQgY2xlYXIoKTsKIAogICAgIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0OwogICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0OworICAgIGJvb2wgaXNDUkNPa2F5KCkgY29uc3Q7CiAKICAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3Q7CiAgICAgc2l6ZV90IHNpemUoKSBjb25zdDsKQEAgLTE3MSwxOSArMTk4LDM0IEBACiAKIHByaXZhdGU6CiAgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKKyAgICB1aW50OF90IG1Ta2lwQnl0ZXM7CisgICAgc3RhdGljIHVpbnQzMl90IENSQ19UQUJMRVtdOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUFNJU2VjdGlvbik7CiB9OwogCitBVFNQYXJzZXI6OlN5bmNFdmVudDo6U3luY0V2ZW50KG9mZjY0X3Qgb2Zmc2V0KQorICAgIDogbUluaXQoZmFsc2UpLCBtT2Zmc2V0KG9mZnNldCksIG1UaW1lVXMoMCkge30KKwordm9pZCBBVFNQYXJzZXI6OlN5bmNFdmVudDo6aW5pdChvZmY2NF90IG9mZnNldCwgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgIGludDY0X3QgdGltZVVzKSB7CisgICAgbUluaXQgPSB0cnVlOworICAgIG1PZmZzZXQgPSBvZmZzZXQ7CisgICAgbU1lZGlhU291cmNlID0gc291cmNlOworICAgIG1UaW1lVXMgPSB0aW1lVXM7Cit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIEFUU1BhcnNlcjo6UHJvZ3JhbTo6UHJvZ3JhbSgKLSAgICAgICAgQVRTUGFyc2VyICpwYXJzZXIsIHVuc2lnbmVkIHByb2dyYW1OdW1iZXIsIHVuc2lnbmVkIHByb2dyYW1NYXBQSUQpCisgICAgICAgIEFUU1BhcnNlciAqcGFyc2VyLCB1bnNpZ25lZCBwcm9ncmFtTnVtYmVyLCB1bnNpZ25lZCBwcm9ncmFtTWFwUElELAorICAgICAgICBpbnQ2NF90IGxhc3RSZWNvdmVyZWRQVFMpCiAgICAgOiBtUGFyc2VyKHBhcnNlciksCiAgICAgICBtUHJvZ3JhbU51bWJlcihwcm9ncmFtTnVtYmVyKSwKICAgICAgIG1Qcm9ncmFtTWFwUElEKHByb2dyYW1NYXBQSUQpLAogICAgICAgbUZpcnN0UFRTVmFsaWQoZmFsc2UpLAotICAgICAgbUZpcnN0UFRTKDApIHsKKyAgICAgIG1GaXJzdFBUUygwKSwKKyAgICAgIG1MYXN0UmVjb3ZlcmVkUFRTKGxhc3RSZWNvdmVyZWRQVFMpIHsKICAgICBBTE9HVigibmV3IHByb2dyYW0gbnVtYmVyICV1IiwgcHJvZ3JhbU51bWJlcik7CiB9CiAKQEAgLTIwMyw3ICsyNDUsNyBAQAogYm9vbCBBVFNQYXJzZXI6OlByb2dyYW06OnBhcnNlUElEKAogICAgICAgICB1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGNvbnRpbnVpdHlfY291bnRlciwKICAgICAgICAgdW5zaWduZWQgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwKLSAgICAgICAgQUJpdFJlYWRlciAqYnIsIHN0YXR1c190ICplcnIpIHsKKyAgICAgICAgQUJpdFJlYWRlciAqYnIsIHN0YXR1c190ICplcnIsIFN5bmNFdmVudCAqZXZlbnQpIHsKICAgICAqZXJyID0gT0s7CiAKICAgICBzc2l6ZV90IGluZGV4ID0gbVN0cmVhbXMuaW5kZXhPZktleShwaWQpOwpAQCAtMjEyLDcgKzI1NCw3IEBACiAgICAgfQogCiAgICAgKmVyciA9IG1TdHJlYW1zLmVkaXRWYWx1ZUF0KGluZGV4KS0+cGFyc2UoCi0gICAgICAgICAgICBjb250aW51aXR5X2NvdW50ZXIsIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IsIGJyKTsKKyAgICAgICAgICAgIGNvbnRpbnVpdHlfY291bnRlciwgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwgYnIsIGV2ZW50KTsKIAogICAgIHJldHVybiB0cnVlOwogfQpAQCAtMjM4LDEwICsyODAsNzUgQEAKICAgICB9CiB9CiAKLXN0cnVjdCBTdHJlYW1JbmZvIHsKLSAgICB1bnNpZ25lZCBtVHlwZTsKLSAgICB1bnNpZ25lZCBtUElEOwotfTsKK2Jvb2wgQVRTUGFyc2VyOjpQcm9ncmFtOjpzd2l0Y2hQSURzKGNvbnN0IFZlY3RvcjxTdHJlYW1JbmZvPiAmaW5mb3MpIHsKKyAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKworICAgIGlmIChtU3RyZWFtcy5zaXplKCkgPT0gaW5mb3Muc2l6ZSgpKSB7CisgICAgICAgIC8vIGJ1aWxkIHR5cGUtPlBJRHMgbWFwIGZvciBvbGQgYW5kIG5ldyBtYXBwaW5nCisgICAgICAgIHNpemVfdCBpOworICAgICAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBWZWN0b3I8aW50MzJfdD4gPiBvbGRUeXBlMlBJRHMsIG5ld1R5cGUyUElEczsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1TdHJlYW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gb2xkVHlwZTJQSURzLmluZGV4T2ZLZXkobVN0cmVhbXNbaV0tPnR5cGUoKSk7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgb2xkVHlwZTJQSURzLmFkZChtU3RyZWFtc1tpXS0+dHlwZSgpLCBWZWN0b3I8aW50MzJfdD4oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvbGRUeXBlMlBJRHMuZWRpdFZhbHVlRm9yKG1TdHJlYW1zW2ldLT50eXBlKCkpLnB1c2hfYmFjayhtU3RyZWFtc1tpXS0+cGlkKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG5ld1R5cGUyUElEcy5pbmRleE9mS2V5KGluZm9zW2ldLm1UeXBlKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBuZXdUeXBlMlBJRHMuYWRkKGluZm9zW2ldLm1UeXBlLCBWZWN0b3I8aW50MzJfdD4oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXdUeXBlMlBJRHMuZWRpdFZhbHVlRm9yKGluZm9zW2ldLm1UeXBlKS5wdXNoX2JhY2soaW5mb3NbaV0ubVBJRCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3ZSBjYW4gcmVjb3ZlciBpZiB0aGUgbnVtYmVyIG9mIHN0cmVhbXMgZm9yIGVhY2ggdHlwZSBoYXNuJ3QgY2hhbmdlZAorICAgICAgICBpZiAob2xkVHlwZTJQSURzLnNpemUoKSA9PSBuZXdUeXBlMlBJRHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvbGRUeXBlMlBJRHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAvLyBLZXllZFZlY3RvciBpcyBzb3J0ZWQsIHdlIGp1c3QgY29tcGFyZSBrZXkgYW5kIHNpemUgb2YgZWFjaCBpbmRleAorICAgICAgICAgICAgICAgIGlmIChvbGRUeXBlMlBJRHMua2V5QXQoaSkgIT0gbmV3VHlwZTJQSURzLmtleUF0KGkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBvbGRUeXBlMlBJRHNbaV0uc2l6ZSgpICE9IG5ld1R5cGUyUElEc1tpXS5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAvLyBzYXZlIGN1cnJlbnQgc3RyZWFtcyB0byB0ZW1wCisgICAgICAgICAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBzcDxTdHJlYW0+ID4gdGVtcDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtU3RyZWFtcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICB0ZW1wLmFkZChtU3RyZWFtcy5rZXlBdChpKSwgbVN0cmVhbXMuZWRpdFZhbHVlQXQoaSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU3RyZWFtcy5jbGVhcigpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRlbXAuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgdHdvIGNoZWNrcyBiZWxvdyBzaG91bGRuJ3QgaGFwcGVuLAorICAgICAgICAgICAgICAgIC8vIHdlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0aGUgc3RyZWFtIGNvdW50IG1hdGNoZXMKKyAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbmV3VHlwZTJQSURzLmluZGV4T2ZLZXkodGVtcFtpXS0+dHlwZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgVmVjdG9yPGludDMyX3Q+ICZuZXdQSURzID0gbmV3VHlwZTJQSURzLmVkaXRWYWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAobmV3UElEcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbmV4dCBQSUQgZm9yIHRlbXBbaV0tPnR5cGUoKSBpbiB0aGUgbmV3IFBJRCBtYXAKKyAgICAgICAgICAgICAgICBWZWN0b3I8aW50MzJfdD46Oml0ZXJhdG9yIGl0ID0gbmV3UElEcy5iZWdpbigpOworCisgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBQSUQgb2YgdGhlIHN0cmVhbSwgYW5kIGFkZCBpdCBiYWNrCisgICAgICAgICAgICAgICAgdGVtcC5lZGl0VmFsdWVBdChpKS0+c2V0UElEKCppdCk7CisgICAgICAgICAgICAgICAgbVN0cmVhbXMuYWRkKHRlbXBbaV0tPnBpZCgpLCB0ZW1wLmVkaXRWYWx1ZUF0KGkpKTsKKworICAgICAgICAgICAgICAgIC8vIHJlbW92ZWQgdGhlIHVzZWQgUElECisgICAgICAgICAgICAgICAgbmV3UElEcy5lcmFzZShpdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CiAKIHN0YXR1c190IEFUU1BhcnNlcjo6UHJvZ3JhbTo6cGFyc2VQcm9ncmFtTWFwKEFCaXRSZWFkZXIgKmJyKSB7CiAgICAgdW5zaWduZWQgdGFibGVfaWQgPSBici0+Z2V0Qml0cyg4KTsKQEAgLTI1NywxMyArMzY0LDExIEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDB1KTsKKyAgICBici0+c2tpcEJpdHMoMSk7ICAvLyAnMCcKICAgICBNWV9MT0dWKCIgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cygyKSk7CiAKICAgICB1bnNpZ25lZCBzZWN0aW9uX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDEyKTsKICAgICBBTE9HVigiICBzZWN0aW9uX2xlbmd0aCA9ICV1Iiwgc2VjdGlvbl9sZW5ndGgpOwotICAgIENIRUNLX0VRKHNlY3Rpb25fbGVuZ3RoICYgMHhjMDAsIDB1KTsKLSAgICBDSEVDS19MRShzZWN0aW9uX2xlbmd0aCwgMTAyMXUpOwogCiAgICAgTVlfTE9HVigiICBwcm9ncmFtX251bWJlciA9ICV1IiwgYnItPmdldEJpdHMoMTYpKTsKICAgICBNWV9MT0dWKCIgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cygyKSk7CkBAIC0yODAsNyArMzg1LDYgQEAKIAogICAgIHVuc2lnbmVkIHByb2dyYW1faW5mb19sZW5ndGggPSBici0+Z2V0Qml0cygxMik7CiAgICAgQUxPR1YoIiAgcHJvZ3JhbV9pbmZvX2xlbmd0aCA9ICV1IiwgcHJvZ3JhbV9pbmZvX2xlbmd0aCk7Ci0gICAgQ0hFQ0tfRVEocHJvZ3JhbV9pbmZvX2xlbmd0aCAmIDB4YzAwLCAwdSk7CiAKICAgICBici0+c2tpcEJpdHMocHJvZ3JhbV9pbmZvX2xlbmd0aCAqIDgpOyAgLy8gc2tpcCBkZXNjcmlwdG9ycwogCkBAIC0yOTEsOCArMzk1LDcgQEAKICAgICAvLyBmaW5hbCBDUkMuCiAgICAgc2l6ZV90IGluZm9CeXRlc1JlbWFpbmluZyA9IHNlY3Rpb25fbGVuZ3RoIC0gOSAtIHByb2dyYW1faW5mb19sZW5ndGggLSA0OwogCi0gICAgd2hpbGUgKGluZm9CeXRlc1JlbWFpbmluZyA+IDApIHsKLSAgICAgICAgQ0hFQ0tfR0UoaW5mb0J5dGVzUmVtYWluaW5nLCA1dSk7CisgICAgd2hpbGUgKGluZm9CeXRlc1JlbWFpbmluZyA+PSA1KSB7CiAKICAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSA9IGJyLT5nZXRCaXRzKDgpOwogICAgICAgICBBTE9HVigiICAgIHN0cmVhbV90eXBlID0gMHglMDJ4Iiwgc3RyZWFtVHlwZSk7CkBAIC0zMDYsOSArNDA5LDYgQEAKIAogICAgICAgICB1bnNpZ25lZCBFU19pbmZvX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDEyKTsKICAgICAgICAgQUxPR1YoIiAgICBFU19pbmZvX2xlbmd0aCA9ICV1IiwgRVNfaW5mb19sZW5ndGgpOwotICAgICAgICBDSEVDS19FUShFU19pbmZvX2xlbmd0aCAmIDB4YzAwLCAwdSk7Ci0KLSAgICAgICAgQ0hFQ0tfR0UoaW5mb0J5dGVzUmVtYWluaW5nIC0gNSwgRVNfaW5mb19sZW5ndGgpOwogCiAjaWYgMAogICAgICAgICBici0+c2tpcEJpdHMoRVNfaW5mb19sZW5ndGggKiA4KTsgIC8vIHNraXAgZGVzY3JpcHRvcnMKQEAgLTMyMCwxMyArNDIwLDEzIEBACiAgICAgICAgICAgICB1bnNpZ25lZCBkZXNjTGVuZ3RoID0gYnItPmdldEJpdHMoOCk7CiAgICAgICAgICAgICBBTE9HVigiICAgICAgbGVuID0gJXUiLCBkZXNjTGVuZ3RoKTsKIAotICAgICAgICAgICAgQ0hFQ0tfR0UoaW5mb19ieXRlc19yZW1haW5pbmcsIDIgKyBkZXNjTGVuZ3RoKTsKLQorICAgICAgICAgICAgaWYgKGluZm9fYnl0ZXNfcmVtYWluaW5nIDwgZGVzY0xlbmd0aCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBici0+c2tpcEJpdHMoZGVzY0xlbmd0aCAqIDgpOwogCiAgICAgICAgICAgICBpbmZvX2J5dGVzX3JlbWFpbmluZyAtPSBkZXNjTGVuZ3RoICsgMjsKICAgICAgICAgfQotICAgICAgICBDSEVDS19FUShpbmZvX2J5dGVzX3JlbWFpbmluZywgMHUpOwogI2VuZGlmCiAKICAgICAgICAgU3RyZWFtSW5mbyBpbmZvOwpAQCAtMzM3LDcgKzQzNyw5IEBACiAgICAgICAgIGluZm9CeXRlc1JlbWFpbmluZyAtPSA1ICsgRVNfaW5mb19sZW5ndGg7CiAgICAgfQogCi0gICAgQ0hFQ0tfRVEoaW5mb0J5dGVzUmVtYWluaW5nLCAwdSk7CisgICAgaWYgKGluZm9CeXRlc1JlbWFpbmluZyAhPSAwKSB7CisgICAgICAgIEFMT0dXKCJTZWN0aW9uIGRhdGEgcmVtYWlucyB1bmNvbnN1bWVkIik7CisgICAgfQogICAgIE1ZX0xPR1YoIiAgQ1JDID0gMHglMDh4IiwgYnItPmdldEJpdHMoMzIpKTsKIAogICAgIGJvb2wgUElEc0NoYW5nZWQgPSBmYWxzZTsKQEAgLTM3MCwzOSArNDcyLDggQEAKICAgICAgICAgfQogI2VuZGlmCiAKLSAgICAgICAgLy8gVGhlIG9ubHkgY2FzZSB3ZSBjYW4gcmVjb3ZlciBmcm9tIGlzIGlmIHdlIGhhdmUgdHdvIHN0cmVhbXMKLSAgICAgICAgLy8gYW5kIHRoZXkgc3dpdGNoZWQgUElEcy4KLQotICAgICAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLQotICAgICAgICBpZiAobVN0cmVhbXMuc2l6ZSgpID09IDIgJiYgaW5mb3Muc2l6ZSgpID09IDIpIHsKLSAgICAgICAgICAgIGNvbnN0IFN0cmVhbUluZm8gJmluZm8xID0gaW5mb3MuaXRlbUF0KDApOwotICAgICAgICAgICAgY29uc3QgU3RyZWFtSW5mbyAmaW5mbzIgPSBpbmZvcy5pdGVtQXQoMSk7Ci0KLSAgICAgICAgICAgIHNwPFN0cmVhbT4gczEgPSBtU3RyZWFtcy5lZGl0VmFsdWVBdCgwKTsKLSAgICAgICAgICAgIHNwPFN0cmVhbT4gczIgPSBtU3RyZWFtcy5lZGl0VmFsdWVBdCgxKTsKLQotICAgICAgICAgICAgYm9vbCBjYXNlQSA9Ci0gICAgICAgICAgICAgICAgaW5mbzEubVBJRCA9PSBzMS0+cGlkKCkgJiYgaW5mbzEubVR5cGUgPT0gczItPnR5cGUoKQotICAgICAgICAgICAgICAgICAgICAmJiBpbmZvMi5tUElEID09IHMyLT5waWQoKSAmJiBpbmZvMi5tVHlwZSA9PSBzMS0+dHlwZSgpOwotCi0gICAgICAgICAgICBib29sIGNhc2VCID0KLSAgICAgICAgICAgICAgICBpbmZvMS5tUElEID09IHMyLT5waWQoKSAmJiBpbmZvMS5tVHlwZSA9PSBzMS0+dHlwZSgpCi0gICAgICAgICAgICAgICAgICAgICYmIGluZm8yLm1QSUQgPT0gczEtPnBpZCgpICYmIGluZm8yLm1UeXBlID09IHMyLT50eXBlKCk7Ci0KLSAgICAgICAgICAgIGlmIChjYXNlQSB8fCBjYXNlQikgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBpZDEgPSBzMS0+cGlkKCk7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgcGlkMiA9IHMyLT5waWQoKTsKLSAgICAgICAgICAgICAgICBzMS0+c2V0UElEKHBpZDIpOwotICAgICAgICAgICAgICAgIHMyLT5zZXRQSUQocGlkMSk7Ci0KLSAgICAgICAgICAgICAgICBtU3RyZWFtcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIG1TdHJlYW1zLmFkZChzMS0+cGlkKCksIHMxKTsKLSAgICAgICAgICAgICAgICBtU3RyZWFtcy5hZGQoczItPnBpZCgpLCBzMik7Ci0KLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICAvLyB3ZSBjYW4gcmVjb3ZlciBpZiBudW1iZXIgb2Ygc3RyZWFtcyBmb3IgZWFjaCB0eXBlIHJlbWFpbiB0aGUgc2FtZQorICAgICAgICBib29sIHN1Y2Nlc3MgPSBzd2l0Y2hQSURzKGluZm9zKTsKIAogICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICAgICAgIEFMT0dJKCJTdHJlYW0gUElEcyBjaGFuZ2VkIGFuZCB3ZSBjYW5ub3QgcmVjb3Zlci4iKTsKQEAgLTQyNiw2ICs0OTcsMzIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK2ludDY0X3QgQVRTUGFyc2VyOjpQcm9ncmFtOjpyZWNvdmVyUFRTKHVpbnQ2NF90IFBUU18zM2JpdCkgeworICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgbG93ZXIgMzMtYml0IG9mIHRoZSBQVFMuIEl0IGNvdWxkIG92ZXJmbG93IHdpdGhpbiBhCisgICAgLy8gcmVhc29uYWJsZSBhbW91bnQgb2YgdGltZS4gVG8gaGFuZGxlIHRoZSB3cmFwLWFyb3VuZCwgdXNlIGZhbmN5IG1hdGgKKyAgICAvLyB0byBnZXQgYW4gZXh0ZW5kZWQgUFRTIHRoYXQgaXMgd2l0aGluIFstMHhmZmZmZmZmZiwgMHhmZmZmZmZmZl0KKyAgICAvLyBvZiB0aGUgbGF0ZXN0IHJlY292ZXJlZCBQVFMuCisgICAgaWYgKG1MYXN0UmVjb3ZlcmVkUFRTIDwgMGxsKSB7CisgICAgICAgIC8vIFVzZSB0aGUgb3JpZ2luYWwgMzNiaXQgbnVtYmVyIGZvciAxc3QgZnJhbWUsIHRoZSByZWFzb24gaXMgdGhhdAorICAgICAgICAvLyBpZiAxc3QgZnJhbWUgd3JhcHMgdG8gbmVnYXRpdmUgdGhhdCdzIGZhciBhd2F5IGZyb20gMCwgd2UgY291bGQKKyAgICAgICAgLy8gbmV2ZXIgc3RhcnQuIE9ubHkgc3RhcnQgd3JhcHBpbmcgYXJvdW5kIGZyb20gMm5kIGZyYW1lLgorICAgICAgICBtTGFzdFJlY292ZXJlZFBUUyA9IHN0YXRpY19jYXN0PGludDY0X3Q+KFBUU18zM2JpdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUxhc3RSZWNvdmVyZWRQVFMgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PigKKyAgICAgICAgICAgICAgICAoKG1MYXN0UmVjb3ZlcmVkUFRTIC0gUFRTXzMzYml0ICsgMHgxMDAwMDAwMDBsbCkKKyAgICAgICAgICAgICAgICAmIDB4ZmZmZmZmZmUwMDAwMDAwMHVsbCkgfCBQVFNfMzNiaXQpOworICAgICAgICAvLyBXZSBzdGFydCBmcm9tIDAsIGJ1dCByZWNvdmVyZWQgUFRTIGNvdWxkIGJlIHNsaWdodGx5IGJlbG93IDAuCisgICAgICAgIC8vIENsYW1wIGl0IHRvIDAgYXMgcmVzdCBvZiB0aGUgcGlwZWxpbmUgZG9lc24ndCB0YWtlIG5lZ2F0aXZlIHB0cy4KKyAgICAgICAgLy8gKGVnLiB2aWRlbyBpcyByZWFkIGZpcnN0IGFuZCBzdGFydHMgYXQgMCwgYnV0IGF1ZGlvIHN0YXJ0cyBhdCAweGZmZmZmZmYwKQorICAgICAgICBpZiAobUxhc3RSZWNvdmVyZWRQVFMgPCAwbGwpIHsKKyAgICAgICAgICAgIEFMT0dJKCJDbGFtcGluZyBuZWdhdGl2ZSByZWNvdmVyZWQgUFRTICglIiBQUklkNjQgIikgdG8gMCIsIG1MYXN0UmVjb3ZlcmVkUFRTKTsKKyAgICAgICAgICAgIG1MYXN0UmVjb3ZlcmVkUFRTID0gMGxsOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1MYXN0UmVjb3ZlcmVkUFRTOworfQorCiBzcDxNZWRpYVNvdXJjZT4gQVRTUGFyc2VyOjpQcm9ncmFtOjpnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKSB7CiAgICAgc2l6ZV90IGluZGV4ID0gKHR5cGUgPT0gQVVESU8pID8gMCA6IDA7CiAKQEAgLTQ1Niw2ICs1NTMsOCBAQAogfQogCiBpbnQ2NF90IEFUU1BhcnNlcjo6UHJvZ3JhbTo6Y29udmVydFBUU1RvVGltZXN0YW1wKHVpbnQ2NF90IFBUUykgeworICAgIFBUUyA9IHJlY292ZXJQVFMoUFRTKTsKKwogICAgIGlmICghKG1QYXJzZXItPm1GbGFncyAmIFRTX1RJTUVTVEFNUFNfQVJFX0FCU09MVVRFKSkgewogICAgICAgICBpZiAoIW1GaXJzdFBUU1ZhbGlkKSB7CiAgICAgICAgICAgICBtRmlyc3RQVFNWYWxpZCA9IHRydWU7CkBAIC01MzAsNiArNjI5LDExIEBACiAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6QUMzKTsKICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NRVRBREFUQToKKyAgICAgICAgICAgIG1RdWV1ZSA9IG5ldyBFbGVtZW50YXJ5U3RyZWFtUXVldWUoCisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TUVUQURBVEEpOworICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTU0OSw3ICs2NTMsOCBAQAogCiBzdGF0dXNfdCBBVFNQYXJzZXI6OlN0cmVhbTo6cGFyc2UoCiAgICAgICAgIHVuc2lnbmVkIGNvbnRpbnVpdHlfY291bnRlciwKLSAgICAgICAgdW5zaWduZWQgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwgQUJpdFJlYWRlciAqYnIpIHsKKyAgICAgICAgdW5zaWduZWQgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwgQUJpdFJlYWRlciAqYnIsCisgICAgICAgIFN5bmNFdmVudCAqZXZlbnQpIHsKICAgICBpZiAobVF1ZXVlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KQEAgLTU4MCwxOSArNjg1LDIyIEBACiAgICAgbUV4cGVjdGVkQ29udGludWl0eUNvdW50ZXIgPSAoY29udGludWl0eV9jb3VudGVyICsgMSkgJiAweDBmOwogCiAgICAgaWYgKHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IpIHsKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSAoZXZlbnQgIT0gTlVMTCkgPyBldmVudC0+Z2V0T2Zmc2V0KCkgOiAwOwogICAgICAgICBpZiAobVBheWxvYWRTdGFydGVkKSB7CiAgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2UgcnVuIHRoZSBkYW5nZXIgb2YgcmVjZWl2aW5nIHRoZSB0cmFpbGluZyBieXRlcwogICAgICAgICAgICAgLy8gb2YgYSBQRVMgcGFja2V0IHRoYXQgd2UgbmV2ZXIgc2F3IHRoZSBzdGFydCBvZiBhbmQgYXNzdW1pbmcKICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBhIGNvbXBsZXRlIFBFUyBwYWNrZXQuCiAKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGZsdXNoKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBmbHVzaChldmVudCk7CiAKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIEFMT0dXKCJFcnJvciAoJTA4eCkgaGFwcGVuZWQgd2hpbGUgZmx1c2hpbmc7IHdlIHNpbXBseSBkaXNjYXJkICIKKyAgICAgICAgICAgICAgICAgICAgICAidGhlIFBFUyBwYWNrZXQgYW5kIGNvbnRpbnVlLiIsIGVycik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBtUGF5bG9hZFN0YXJ0ZWQgPSB0cnVlOworICAgICAgICBtUGVzU3RhcnRPZmZzZXQgPSBvZmZzZXQ7CiAgICAgfQogCiAgICAgaWYgKCFtUGF5bG9hZFN0YXJ0ZWQpIHsKQEAgLTYwMCw3ICs3MDgsMTAgQEAKICAgICB9CiAKICAgICBzaXplX3QgcGF5bG9hZFNpemVCaXRzID0gYnItPm51bUJpdHNMZWZ0KCk7Ci0gICAgQ0hFQ0tfRVEocGF5bG9hZFNpemVCaXRzICUgOCwgMHUpOworICAgIGlmIChwYXlsb2FkU2l6ZUJpdHMgJSA4ICE9IDB1KSB7CisgICAgICAgIEFMT0dFKCJXcm9uZyB2YWx1ZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAogICAgIHNpemVfdCBuZWVkZWRTaXplID0gbUJ1ZmZlci0+c2l6ZSgpICsgcGF5bG9hZFNpemVCaXRzIC8gODsKICAgICBpZiAobUJ1ZmZlci0+Y2FwYWNpdHkoKSA8IG5lZWRlZFNpemUpIHsKQEAgLTY0OCw2ICs3NTksMTMgQEAKICAgICB9CiB9CiAKK2Jvb2wgQVRTUGFyc2VyOjpTdHJlYW06OmlzTWV0YSgpIGNvbnN0IHsKKyAgICBpZiAobVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9NRVRBREFUQSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiB2b2lkIEFUU1BhcnNlcjo6U3RyZWFtOjpzaWduYWxEaXNjb250aW51aXR5KAogICAgICAgICBEaXNjb250aW51aXR5VHlwZSB0eXBlLCBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhKSB7CiAgICAgbUV4cGVjdGVkQ29udGludWl0eUNvdW50ZXIgPSAtMTsKQEAgLTY1Nyw2ICs3NzUsNyBAQAogICAgIH0KIAogICAgIG1QYXlsb2FkU3RhcnRlZCA9IGZhbHNlOworICAgIG1FT1NSZWFjaGVkID0gZmFsc2U7CiAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAKICAgICBib29sIGNsZWFyRm9ybWF0ID0gZmFsc2U7CkBAIC02OTUsMTAgKzgxNCwxMCBAQAogICAgICAgICBtU291cmNlLT5zaWduYWxFT1MoZmluYWxSZXN1bHQpOwogICAgIH0KICAgICBtRU9TUmVhY2hlZCA9IHRydWU7Ci0gICAgZmx1c2goKTsKKyAgICBmbHVzaChOVUxMKTsKIH0KIAotc3RhdHVzX3QgQVRTUGFyc2VyOjpTdHJlYW06OnBhcnNlUEVTKEFCaXRSZWFkZXIgKmJyKSB7CitzdGF0dXNfdCBBVFNQYXJzZXI6OlN0cmVhbTo6cGFyc2VQRVMoQUJpdFJlYWRlciAqYnIsIFN5bmNFdmVudCAqZXZlbnQpIHsKICAgICB1bnNpZ25lZCBwYWNrZXRfc3RhcnRjb2RlX3ByZWZpeCA9IGJyLT5nZXRCaXRzKDI0KTsKIAogICAgIEFMT0dWKCJwYWNrZXRfc3RhcnRjb2RlX3ByZWZpeCA9IDB4JTA4eCIsIHBhY2tldF9zdGFydGNvZGVfcHJlZml4KTsKQEAgLTcxMCw4ICs4MjksNiBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIENIRUNLX0VRKHBhY2tldF9zdGFydGNvZGVfcHJlZml4LCAweDAwMDAwMXUpOwotCiAgICAgdW5zaWduZWQgc3RyZWFtX2lkID0gYnItPmdldEJpdHMoOCk7CiAgICAgQUxPR1YoInN0cmVhbV9pZCA9IDB4JTAyeCIsIHN0cmVhbV9pZCk7CiAKQEAgLTcyNiw3ICs4NDMsOSBAQAogICAgICAgICAgICAgJiYgc3RyZWFtX2lkICE9IDB4ZmYgIC8vIHByb2dyYW1fc3RyZWFtX2RpcmVjdG9yeQogICAgICAgICAgICAgJiYgc3RyZWFtX2lkICE9IDB4ZjIgIC8vIERTTUNDCiAgICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmOCkgeyAgLy8gSC4yMjIuMSB0eXBlIEUKLSAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMiksIDJ1KTsKKyAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDIpICE9IDJ1KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CiAKICAgICAgICAgTVlfTE9HVigiUEVTX3NjcmFtYmxpbmdfY29udHJvbCA9ICV1IiwgYnItPmdldEJpdHMoMikpOwogICAgICAgICBNWV9MT0dWKCJQRVNfcHJpb3JpdHkgPSAldSIsIGJyLT5nZXRCaXRzKDEpKTsKQEAgLTc2MCwzNCArODc5LDUxIEBACiAgICAgICAgIHVpbnQ2NF90IFBUUyA9IDAsIERUUyA9IDA7CiAKICAgICAgICAgaWYgKFBUU19EVFNfZmxhZ3MgPT0gMiB8fCBQVFNfRFRTX2ZsYWdzID09IDMpIHsKLSAgICAgICAgICAgIENIRUNLX0dFKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZywgNXUpOworICAgICAgICAgICAgaWYgKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyA8IDV1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDQpICE9IFBUU19EVFNfZmxhZ3MpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiUEVTIGRhdGEgRXJyb3IhIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFBUUyA9ICgodWludDY0X3QpYnItPmdldEJpdHMoMykpIDw8IDMwOwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici0+Z2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBQVFMgfD0gKCh1aW50NjRfdClici0+Z2V0Qml0cygxNSkpIDw8IDE1OwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici0+Z2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBQVFMgfD0gYnItPmdldEJpdHMoMTUpOwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici0+Z2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEFMT0dWKCJQVFMgPSAweCUwMTYiIFBSSXg2NCAiICglLjJmKSIsIFBUUywgUFRTIC8gOTAwMDAuMCk7CiAKICAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA1OwogCiAgICAgICAgICAgICBpZiAoUFRTX0RUU19mbGFncyA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0Uob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nLCA1dSk7CisgICAgICAgICAgICAgICAgaWYgKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyA8IDV1KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoNCksIDF1KTsKKyAgICAgICAgICAgICAgICBpZiAoYnItPmdldEJpdHMoNCkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBEVFMgPSAoKHVpbnQ2NF90KWJyLT5nZXRCaXRzKDMpKSA8PCAzMDsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgICAgIGlmIChici0+Z2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBEVFMgfD0gKCh1aW50NjRfdClici0+Z2V0Qml0cygxNSkpIDw8IDE1OwotICAgICAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIERUUyB8PSBici0+Z2V0Qml0cygxNSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgICAgICBpZiAoYnItPmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBBTE9HVigiRFRTID0gJSIgUFJJdTY0LCBEVFMpOwogCkBAIC03OTYsMzEgKzkzMiw0NyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKEVTQ1JfZmxhZykgewotICAgICAgICAgICAgQ0hFQ0tfR0Uob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nLCA2dSk7CisgICAgICAgICAgICBpZiAob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIDwgNnUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBici0+Z2V0Qml0cygyKTsKIAogICAgICAgICAgICAgdWludDY0X3QgRVNDUiA9ICgodWludDY0X3QpYnItPmdldEJpdHMoMykpIDw8IDMwOwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici0+Z2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBFU0NSIHw9ICgodWludDY0X3QpYnItPmdldEJpdHMoMTUpKSA8PCAxNTsKLSAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICBpZiAoYnItPmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogICAgICAgICAgICAgRVNDUiB8PSBici0+Z2V0Qml0cygxNSk7Ci0gICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQUxPR1YoIkVTQ1IgPSAlIiBQUkl1NjQsIEVTQ1IpOwogICAgICAgICAgICAgTVlfTE9HVigiRVNDUl9leHRlbnNpb24gPSAldSIsIGJyLT5nZXRCaXRzKDkpKTsKIAotICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici0+Z2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA2OwogICAgICAgICB9CiAKICAgICAgICAgaWYgKEVTX3JhdGVfZmxhZykgewotICAgICAgICAgICAgQ0hFQ0tfR0Uob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nLCAzdSk7CisgICAgICAgICAgICBpZiAob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIDwgM3UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIE1ZX0xPR1YoIkVTX3JhdGUgPSAldSIsIGJyLT5nZXRCaXRzKDIyKSk7Ci0gICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDM7CiAgICAgICAgIH0KQEAgLTgzMCw3ICs5ODIsOSBAQAogICAgICAgICAvLyBFUyBkYXRhIGZvbGxvd3MuCiAKICAgICAgICAgaWYgKFBFU19wYWNrZXRfbGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgIENIRUNLX0dFKFBFU19wYWNrZXRfbGVuZ3RoLCBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoICsgMyk7CisgICAgICAgICAgICBpZiAoUEVTX3BhY2tldF9sZW5ndGggPCBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoICsgMykgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVuc2lnbmVkIGRhdGFMZW5ndGggPQogICAgICAgICAgICAgICAgIFBFU19wYWNrZXRfbGVuZ3RoIC0gMyAtIFBFU19oZWFkZXJfZGF0YV9sZW5ndGg7CkBAIC04NDMsMzUgKzk5NywzOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIENIRUNLX0dFKGJyLT5udW1CaXRzTGVmdCgpLCBkYXRhTGVuZ3RoICogOCk7Ci0KICAgICAgICAgICAgIG9uUGF5bG9hZERhdGEoCi0gICAgICAgICAgICAgICAgICAgIFBUU19EVFNfZmxhZ3MsIFBUUywgRFRTLCBici0+ZGF0YSgpLCBkYXRhTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgUFRTX0RUU19mbGFncywgUFRTLCBEVFMsIGJyLT5kYXRhKCksIGRhdGFMZW5ndGgsIGV2ZW50KTsKIAogICAgICAgICAgICAgYnItPnNraXBCaXRzKGRhdGFMZW5ndGggKiA4KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG9uUGF5bG9hZERhdGEoCiAgICAgICAgICAgICAgICAgICAgIFBUU19EVFNfZmxhZ3MsIFBUUywgRFRTLAotICAgICAgICAgICAgICAgICAgICBici0+ZGF0YSgpLCBici0+bnVtQml0c0xlZnQoKSAvIDgpOworICAgICAgICAgICAgICAgICAgICBici0+ZGF0YSgpLCBici0+bnVtQml0c0xlZnQoKSAvIDgsIGV2ZW50KTsKIAogICAgICAgICAgICAgc2l6ZV90IHBheWxvYWRTaXplQml0cyA9IGJyLT5udW1CaXRzTGVmdCgpOwotICAgICAgICAgICAgQ0hFQ0tfRVEocGF5bG9hZFNpemVCaXRzICUgOCwgMHUpOworICAgICAgICAgICAgaWYgKHBheWxvYWRTaXplQml0cyAlIDggIT0gMHUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBBTE9HVigiVGhlcmUncyAlenUgYnl0ZXMgb2YgcGF5bG9hZC4iLCBwYXlsb2FkU2l6ZUJpdHMgLyA4KTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoc3RyZWFtX2lkID09IDB4YmUpIHsgIC8vIHBhZGRpbmdfc3RyZWFtCi0gICAgICAgIENIRUNLX05FKFBFU19wYWNrZXRfbGVuZ3RoLCAwdSk7CisgICAgICAgIGlmIChQRVNfcGFja2V0X2xlbmd0aCA9PSAwdSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQogICAgICAgICBici0+c2tpcEJpdHMoUEVTX3BhY2tldF9sZW5ndGggKiA4KTsKICAgICB9IGVsc2UgewotICAgICAgICBDSEVDS19ORShQRVNfcGFja2V0X2xlbmd0aCwgMHUpOworICAgICAgICBpZiAoUEVTX3BhY2tldF9sZW5ndGggPT0gMHUpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KICAgICAgICAgYnItPnNraXBCaXRzKFBFU19wYWNrZXRfbGVuZ3RoICogOCk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBVFNQYXJzZXI6OlN0cmVhbTo6Zmx1c2goKSB7Ci0gICAgaWYgKG1CdWZmZXItPnNpemUoKSA9PSAwKSB7CitzdGF0dXNfdCBBVFNQYXJzZXI6OlN0cmVhbTo6Zmx1c2goU3luY0V2ZW50ICpldmVudCkgeworICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApIHsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIApAQCAtODc5LDcgKzEwMzcsNyBAQAogCiAgICAgQUJpdFJlYWRlciBicihtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZVBFUygmYnIpOworICAgIHN0YXR1c190IGVyciA9IHBhcnNlUEVTKCZiciwgZXZlbnQpOwogCiAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAKQEAgLTg4OCw3ICsxMDQ2LDcgQEAKIAogdm9pZCBBVFNQYXJzZXI6OlN0cmVhbTo6b25QYXlsb2FkRGF0YSgKICAgICAgICAgdW5zaWduZWQgUFRTX0RUU19mbGFncywgdWludDY0X3QgUFRTLCB1aW50NjRfdCAvKiBEVFMgKi8sCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCBTeW5jRXZlbnQgKmV2ZW50KSB7CiAjaWYgMAogICAgIEFMT0dJKCJwYXlsb2FkIHN0cmVhbVR5cGUgMHglMDJ4LCBQVFMgPSAweCUwMTZsbHgsIGRQVFMgPSAlbGxkIiwKICAgICAgICAgICBtU3RyZWFtVHlwZSwKQEAgLTkxNSw2ICsxMDczLDcgQEAKICAgICB9CiAKICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0OworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKICAgICB3aGlsZSAoKGFjY2Vzc1VuaXQgPSBtUXVldWUtPmRlcXVldWVBY2Nlc3NVbml0KCkpICE9IE5VTEwpIHsKICAgICAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtUXVldWUtPmdldEZvcm1hdCgpOwpAQCAtOTQyLDYgKzExMDEsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKICAgICAgICAgfQorCisgICAgICAgIGlmICgoZXZlbnQgIT0gTlVMTCkgJiYgIWZvdW5kICYmIG1RdWV1ZS0+Z2V0Rm9ybWF0KCkgIT0gTlVMTCkgeworICAgICAgICAgICAgaW50MzJfdCBzeW5jID0gMDsKKyAgICAgICAgICAgIGlmIChhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigiaXNTeW5jIiwgJnN5bmMpICYmIHN5bmMpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgICAgICBpZiAoYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQtPmluaXQobVBlc1N0YXJ0T2Zmc2V0LCBtU291cmNlLCB0aW1lVXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtOTYzLDYgKzExMzMsMTQgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBNRVRBOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNNZXRhKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNvdXJjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTk3Nyw2ICsxMTU1LDcgQEAKICAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcygtMWxsKSwKICAgICAgIG1UaW1lT2Zmc2V0VmFsaWQoZmFsc2UpLAogICAgICAgbVRpbWVPZmZzZXRVcygwbGwpLAorICAgICAgbUxhc3RSZWNvdmVyZWRQVFMoLTFsbCksCiAgICAgICBtTnVtVFNQYWNrZXRzUGFyc2VkKDApLAogICAgICAgbU51bVBDUnMoMCkgewogICAgIG1QU0lTZWN0aW9ucy5hZGQoMCAvKiBQSUQgKi8sIG5ldyBQU0lTZWN0aW9uKTsKQEAgLTk4NSwzMSArMTE2NCw1NCBAQAogQVRTUGFyc2VyOjp+QVRTUGFyc2VyKCkgewogfQogCi1zdGF0dXNfdCBBVFNQYXJzZXI6OmZlZWRUU1BhY2tldChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIENIRUNLX0VRKHNpemUsIGtUU1BhY2tldFNpemUpOworc3RhdHVzX3QgQVRTUGFyc2VyOjpmZWVkVFNQYWNrZXQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgIFN5bmNFdmVudCAqZXZlbnQpIHsKKyAgICBpZiAoc2l6ZSAhPSBrVFNQYWNrZXRTaXplKSB7CisgICAgICAgIEFMT0dFKCJXcm9uZyBUUyBwYWNrZXQgc2l6ZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAogICAgIEFCaXRSZWFkZXIgYnIoKGNvbnN0IHVpbnQ4X3QgKilkYXRhLCBrVFNQYWNrZXRTaXplKTsKLSAgICByZXR1cm4gcGFyc2VUUygmYnIpOworICAgIHJldHVybiBwYXJzZVRTKCZiciwgZXZlbnQpOwogfQogCiB2b2lkIEFUU1BhcnNlcjo6c2lnbmFsRGlzY29udGludWl0eSgKICAgICAgICAgRGlzY29udGludWl0eVR5cGUgdHlwZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZleHRyYSkgewogICAgIGludDY0X3QgbWVkaWFUaW1lVXM7Ci0gICAgaWYgKCh0eXBlICYgRElTQ09OVElOVUlUWV9USU1FKQotICAgICAgICAgICAgJiYgZXh0cmEgIT0gTlVMTAotICAgICAgICAgICAgJiYgZXh0cmEtPmZpbmRJbnQ2NCgKLSAgICAgICAgICAgICAgICBJU3RyZWFtTGlzdGVuZXI6OmtLZXlNZWRpYVRpbWVVcywgJm1lZGlhVGltZVVzKSkgewotICAgICAgICBtQWJzb2x1dGVUaW1lQW5jaG9yVXMgPSBtZWRpYVRpbWVVczsKKyAgICBpZiAoKHR5cGUgJiBESVNDT05USU5VSVRZX1RJTUUpICYmIGV4dHJhICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGV4dHJhLT5maW5kSW50NjQoSVN0cmVhbUxpc3RlbmVyOjprS2V5TWVkaWFUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKKyAgICAgICAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcyA9IG1lZGlhVGltZVVzOworICAgICAgICB9CisgICAgICAgIGlmICgobUZsYWdzICYgVFNfVElNRVNUQU1QU19BUkVfQUJTT0xVVEUpCisgICAgICAgICAgICAgICAgJiYgZXh0cmEtPmZpbmRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgSVN0cmVhbUxpc3RlbmVyOjprS2V5UmVjZW50TWVkaWFUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKKyAgICAgICAgICAgIGlmIChtQWJzb2x1dGVUaW1lQW5jaG9yVXMgPj0gMGxsKSB7CisgICAgICAgICAgICAgICAgbWVkaWFUaW1lVXMgLT0gbUFic29sdXRlVGltZUFuY2hvclVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1UaW1lT2Zmc2V0VmFsaWQpIHsKKyAgICAgICAgICAgICAgICBtZWRpYVRpbWVVcyAtPSBtVGltZU9mZnNldFVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxhc3RSZWNvdmVyZWRQVFMgPSAobWVkaWFUaW1lVXMgKiA5KSAvIDEwMDsKKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAodHlwZSA9PSBESVNDT05USU5VSVRZX0FCU09MVVRFX1RJTUUpIHsKICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgIENIRUNLKGV4dHJhLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgaWYgKCFleHRyYS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSkgeworICAgICAgICAgICAgQUxPR0UoInRpbWVVcyBub3QgZm91bmQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgICAgIENIRUNLKG1Qcm9ncmFtcy5lbXB0eSgpKTsKKyAgICAgICAgaWYgKCFtUHJvZ3JhbXMuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0UoIm1Qcm9ncmFtcyBpcyBub3QgZW1wdHkiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBtQWJzb2x1dGVUaW1lQW5jaG9yVXMgPSB0aW1lVXM7CiAgICAgICAgIHJldHVybjsKICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRElTQ09OVElOVUlUWV9USU1FX09GRlNFVCkgewogICAgICAgICBpbnQ2NF90IG9mZnNldDsKLSAgICAgICAgQ0hFQ0soZXh0cmEtPmZpbmRJbnQ2NCgib2Zmc2V0IiwgJm9mZnNldCkpOworICAgICAgICBpZiAoIWV4dHJhLT5maW5kSW50NjQoIm9mZnNldCIsICZvZmZzZXQpKSB7CisgICAgICAgICAgICBBTE9HRSgib2Zmc2V0IG5vdCBmb3VuZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKICAgICAgICAgbVRpbWVPZmZzZXRWYWxpZCA9IHRydWU7CiAgICAgICAgIG1UaW1lT2Zmc2V0VXMgPSBvZmZzZXQ7CkBAIC0xMDIyLDcgKzEyMjQsMTAgQEAKIH0KIAogdm9pZCBBVFNQYXJzZXI6OnNpZ25hbEVPUyhzdGF0dXNfdCBmaW5hbFJlc3VsdCkgewotICAgIENIRUNLX05FKGZpbmFsUmVzdWx0LCAoc3RhdHVzX3QpT0spOworICAgIGlmIChmaW5hbFJlc3VsdCA9PSAoc3RhdHVzX3QpIE9LKSB7CisgICAgICAgIEFMT0dFKCJmaW5hbFJlc3VsdCBub3QgT0siKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVByb2dyYW1zLnNpemUoKTsgKytpKSB7CiAgICAgICAgIG1Qcm9ncmFtcy5lZGl0SXRlbUF0KGkpLT5zaWduYWxFT1MoZmluYWxSZXN1bHQpOwpAQCAtMTAzOCwxNCArMTI0MywxMiBAQAogICAgIH0KICAgICB1bnNpZ25lZCBzZWN0aW9uX3N5bnRheF9pbmRpY3RvciA9IGJyLT5nZXRCaXRzKDEpOwogICAgIEFMT0dWKCIgIHNlY3Rpb25fc3ludGF4X2luZGljdG9yID0gJXUiLCBzZWN0aW9uX3N5bnRheF9pbmRpY3Rvcik7Ci0gICAgQ0hFQ0tfRVEoc2VjdGlvbl9zeW50YXhfaW5kaWN0b3IsIDF1KTsKIAotICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAwdSk7CisgICAgYnItPnNraXBCaXRzKDEpOyAgLy8gJzAnCiAgICAgTVlfTE9HVigiICByZXNlcnZlZCA9ICV1IiwgYnItPmdldEJpdHMoMikpOwogCiAgICAgdW5zaWduZWQgc2VjdGlvbl9sZW5ndGggPSBici0+Z2V0Qml0cygxMik7CiAgICAgQUxPR1YoIiAgc2VjdGlvbl9sZW5ndGggPSAldSIsIHNlY3Rpb25fbGVuZ3RoKTsKLSAgICBDSEVDS19FUShzZWN0aW9uX2xlbmd0aCAmIDB4YzAwLCAwdSk7CiAKICAgICBNWV9MT0dWKCIgIHRyYW5zcG9ydF9zdHJlYW1faWQgPSAldSIsIGJyLT5nZXRCaXRzKDE2KSk7CiAgICAgTVlfTE9HVigiICByZXNlcnZlZCA9ICV1IiwgYnItPmdldEJpdHMoMikpOwpAQCAtMTA1NSw3ICsxMjU4LDYgQEAKICAgICBNWV9MT0dWKCIgIGxhc3Rfc2VjdGlvbl9udW1iZXIgPSAldSIsIGJyLT5nZXRCaXRzKDgpKTsKIAogICAgIHNpemVfdCBudW1Qcm9ncmFtQnl0ZXMgPSAoc2VjdGlvbl9sZW5ndGggLSA1IC8qIGhlYWRlciAqLyAtIDQgLyogY3JjICovKTsKLSAgICBDSEVDS19FUSgobnVtUHJvZ3JhbUJ5dGVzICUgNCksIDB1KTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUHJvZ3JhbUJ5dGVzIC8gNDsgKytpKSB7CiAgICAgICAgIHVuc2lnbmVkIHByb2dyYW1fbnVtYmVyID0gYnItPmdldEJpdHMoMTYpOwpAQCAtMTA4Myw3ICsxMjg1LDcgQEAKIAogICAgICAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgICAgICAgIG1Qcm9ncmFtcy5wdXNoKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb2dyYW0odGhpcywgcHJvZ3JhbV9udW1iZXIsIHByb2dyYW1NYXBQSUQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9ncmFtKHRoaXMsIHByb2dyYW1fbnVtYmVyLCBwcm9ncmFtTWFwUElELCBtTGFzdFJlY292ZXJlZFBUUykpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVBTSVNlY3Rpb25zLmluZGV4T2ZLZXkocHJvZ3JhbU1hcFBJRCkgPCAwKSB7CkBAIC0xMDk4LDcgKzEzMDAsOCBAQAogc3RhdHVzX3QgQVRTUGFyc2VyOjpwYXJzZVBJRCgKICAgICAgICAgQUJpdFJlYWRlciAqYnIsIHVuc2lnbmVkIFBJRCwKICAgICAgICAgdW5zaWduZWQgY29udGludWl0eV9jb3VudGVyLAotICAgICAgICB1bnNpZ25lZCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yKSB7CisgICAgICAgIHVuc2lnbmVkIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IsCisgICAgICAgIFN5bmNFdmVudCAqZXZlbnQpIHsKICAgICBzc2l6ZV90IHNlY3Rpb25JbmRleCA9IG1QU0lTZWN0aW9ucy5pbmRleE9mS2V5KFBJRCk7CiAKICAgICBpZiAoc2VjdGlvbkluZGV4ID49IDApIHsKQEAgLTExMDYsMTQgKzEzMDksMTggQEAKIAogICAgICAgICBpZiAocGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvcikgewogICAgICAgICAgICAgaWYgKCFzZWN0aW9uLT5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgQUxPR1coInBhcnNlUElEIGVuY291bnRlcnMgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciB3aGVuIHNlY3Rpb24gaXMgbm90IGVtcHR5Iik7CisgICAgICAgICAgICAgICAgc2VjdGlvbi0+Y2xlYXIoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdW5zaWduZWQgc2tpcCA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgc2VjdGlvbi0+c2V0U2tpcEJ5dGVzKHNraXAgKyAxKTsgIC8vIHNraXAgZmlsbGVyIGJ5dGVzICsgcG9pbnRlciBmaWVsZCBpdHNlbGYKICAgICAgICAgICAgIGJyLT5za2lwQml0cyhza2lwICogOCk7CiAgICAgICAgIH0KIAotICAgICAgICBDSEVDSygoYnItPm51bUJpdHNMZWZ0KCkgJSA4KSA9PSAwKTsKKyAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpICUgOCAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CiAgICAgICAgIHN0YXR1c190IGVyciA9IHNlY3Rpb24tPmFwcGVuZChici0+ZGF0YSgpLCBici0+bnVtQml0c0xlZnQoKSAvIDgpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTExMjQsNiArMTMzMSw5IEBACiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoIXNlY3Rpb24tPmlzQ1JDT2theSgpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CiAgICAgICAgIEFCaXRSZWFkZXIgc2VjdGlvbkJpdHMoc2VjdGlvbi0+ZGF0YSgpLCBzZWN0aW9uLT5zaXplKCkpOwogCiAgICAgICAgIGlmIChQSUQgPT0gMCkgewpAQCAtMTE2Myw3ICsxMzczLDcgQEAKICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICBpZiAobVByb2dyYW1zLmVkaXRJdGVtQXQoaSktPnBhcnNlUElEKAogICAgICAgICAgICAgICAgICAgICBQSUQsIGNvbnRpbnVpdHlfY291bnRlciwgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgYnIsICZlcnIpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyLCAmZXJyLCBldmVudCkpIHsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQpAQCAtMTE4MCwxMCArMTM5MCwxNSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBBVFNQYXJzZXI6OnBhcnNlQWRhcHRhdGlvbkZpZWxkKEFCaXRSZWFkZXIgKmJyLCB1bnNpZ25lZCBQSUQpIHsKK3N0YXR1c190IEFUU1BhcnNlcjo6cGFyc2VBZGFwdGF0aW9uRmllbGQoQUJpdFJlYWRlciAqYnIsIHVuc2lnbmVkIFBJRCkgewogICAgIHVuc2lnbmVkIGFkYXB0YXRpb25fZmllbGRfbGVuZ3RoID0gYnItPmdldEJpdHMoOCk7CiAKICAgICBpZiAoYWRhcHRhdGlvbl9maWVsZF9sZW5ndGggPiAwKSB7CisgICAgICAgIGlmIChhZGFwdGF0aW9uX2ZpZWxkX2xlbmd0aCAqIDggPiBici0+bnVtQml0c0xlZnQoKSkgeworICAgICAgICAgICAgQUxPR1YoIkFkYXB0YXRpb24gZmllbGQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGEgc2luZ2xlIFRTIHBhY2tldC4iKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKwogICAgICAgICB1bnNpZ25lZCBkaXNjb250aW51aXR5X2luZGljYXRvciA9IGJyLT5nZXRCaXRzKDEpOwogCiAgICAgICAgIGlmIChkaXNjb250aW51aXR5X2luZGljYXRvcikgewpAQCAtMTE5Niw2ICsxNDExLDkgQEAKICAgICAgICAgc2l6ZV90IG51bUJpdHNSZWFkID0gNDsKIAogICAgICAgICBpZiAoUENSX2ZsYWcpIHsKKyAgICAgICAgICAgIGlmIChhZGFwdGF0aW9uX2ZpZWxkX2xlbmd0aCAqIDggPCA1MikgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBici0+c2tpcEJpdHMoNCk7CiAgICAgICAgICAgICB1aW50NjRfdCBQQ1JfYmFzZSA9IGJyLT5nZXRCaXRzKDMyKTsKICAgICAgICAgICAgIFBDUl9iYXNlID0gKFBDUl9iYXNlIDw8IDEpIHwgYnItPmdldEJpdHMoMSk7CkBAIC0xMjI2LDEzICsxNDQ0LDEyIEBACiAgICAgICAgICAgICBudW1CaXRzUmVhZCArPSA1MjsKICAgICAgICAgfQogCi0gICAgICAgIENIRUNLX0dFKGFkYXB0YXRpb25fZmllbGRfbGVuZ3RoICogOCwgbnVtQml0c1JlYWQpOwotCiAgICAgICAgIGJyLT5za2lwQml0cyhhZGFwdGF0aW9uX2ZpZWxkX2xlbmd0aCAqIDggLSBudW1CaXRzUmVhZCk7CiAgICAgfQorICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQVRTUGFyc2VyOjpwYXJzZVRTKEFCaXRSZWFkZXIgKmJyKSB7CitzdGF0dXNfdCBBVFNQYXJzZXI6OnBhcnNlVFMoQUJpdFJlYWRlciAqYnIsIFN5bmNFdmVudCAqZXZlbnQpIHsKICAgICBBTE9HVigiLS0tIik7CiAKICAgICB1bnNpZ25lZCBzeW5jX2J5dGUgPSBici0+Z2V0Qml0cyg4KTsKQEAgLTEyNjQsMTUgKzE0ODEsMTYgQEAKIAogICAgIC8vIEFMT0dJKCJQSUQgPSAweCUwNHgsIGNvbnRpbnVpdHlfY291bnRlciA9ICV1IiwgUElELCBjb250aW51aXR5X2NvdW50ZXIpOwogCi0gICAgaWYgKGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9PSAyIHx8IGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9PSAzKSB7Ci0gICAgICAgIHBhcnNlQWRhcHRhdGlvbkZpZWxkKGJyLCBQSUQpOwotICAgIH0KLQogICAgIHN0YXR1c190IGVyciA9IE9LOwogCi0gICAgaWYgKGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9PSAxIHx8IGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9PSAzKSB7Ci0gICAgICAgIGVyciA9IHBhcnNlUElEKAotICAgICAgICAgICAgICAgIGJyLCBQSUQsIGNvbnRpbnVpdHlfY291bnRlciwgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvcik7CisgICAgaWYgKGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9PSAyIHx8IGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9PSAzKSB7CisgICAgICAgIGVyciA9IHBhcnNlQWRhcHRhdGlvbkZpZWxkKGJyLCBQSUQpOworICAgIH0KKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIGlmIChhZGFwdGF0aW9uX2ZpZWxkX2NvbnRyb2wgPT0gMSB8fCBhZGFwdGF0aW9uX2ZpZWxkX2NvbnRyb2wgPT0gMykgeworICAgICAgICAgICAgZXJyID0gcGFyc2VQSUQoYnIsIFBJRCwgY29udGludWl0eV9jb3VudGVyLAorICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yLCBldmVudCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICArK21OdW1UU1BhY2tldHNQYXJzZWQ7CkBAIC0xMzQ2LDcgKzE1NjQsNzkgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotQVRTUGFyc2VyOjpQU0lTZWN0aW9uOjpQU0lTZWN0aW9uKCkgeworCisvLyBDUkMzMiB1c2VkIGZvciBQU0kgc2VjdGlvbi4gVGhlIHRhYmxlIHdhcyBnZW5lcmF0ZWQgYnkgZm9sbG93aW5nIGNvbW1hbmQ6CisvLyAkIHB5dGhvbiBweWNyYy5weSAtLW1vZGVsIGNyYy0zMi1tcGVnIC0tYWxnb3JpdGhtIHRhYmxlLWRyaXZlbiAtLWdlbmVyYXRlIGMKKy8vIFZpc2l0IGh0dHA6Ly93d3cudHR5MS5uZXQvcHljcmMvaW5kZXhfZW4uaHRtbCBmb3IgbW9yZSBkZXRhaWxzLgordWludDMyX3QgQVRTUGFyc2VyOjpQU0lTZWN0aW9uOjpDUkNfVEFCTEVbXSA9IHsKKyAgICAweDAwMDAwMDAwLCAweDA0YzExZGI3LCAweDA5ODIzYjZlLCAweDBkNDMyNmQ5LAorICAgIDB4MTMwNDc2ZGMsIDB4MTdjNTZiNmIsIDB4MWE4NjRkYjIsIDB4MWU0NzUwMDUsCisgICAgMHgyNjA4ZWRiOCwgMHgyMmM5ZjAwZiwgMHgyZjhhZDZkNiwgMHgyYjRiY2I2MSwKKyAgICAweDM1MGM5YjY0LCAweDMxY2Q4NmQzLCAweDNjOGVhMDBhLCAweDM4NGZiZGJkLAorICAgIDB4NGMxMWRiNzAsIDB4NDhkMGM2YzcsIDB4NDU5M2UwMWUsIDB4NDE1MmZkYTksCisgICAgMHg1ZjE1YWRhYywgMHg1YmQ0YjAxYiwgMHg1Njk3OTZjMiwgMHg1MjU2OGI3NSwKKyAgICAweDZhMTkzNmM4LCAweDZlZDgyYjdmLCAweDYzOWIwZGE2LCAweDY3NWExMDExLAorICAgIDB4NzkxZDQwMTQsIDB4N2RkYzVkYTMsIDB4NzA5ZjdiN2EsIDB4NzQ1ZTY2Y2QsCisgICAgMHg5ODIzYjZlMCwgMHg5Y2UyYWI1NywgMHg5MWExOGQ4ZSwgMHg5NTYwOTAzOSwKKyAgICAweDhiMjdjMDNjLCAweDhmZTZkZDhiLCAweDgyYTVmYjUyLCAweDg2NjRlNmU1LAorICAgIDB4YmUyYjViNTgsIDB4YmFlYTQ2ZWYsIDB4YjdhOTYwMzYsIDB4YjM2ODdkODEsCisgICAgMHhhZDJmMmQ4NCwgMHhhOWVlMzAzMywgMHhhNGFkMTZlYSwgMHhhMDZjMGI1ZCwKKyAgICAweGQ0MzI2ZDkwLCAweGQwZjM3MDI3LCAweGRkYjA1NmZlLCAweGQ5NzE0YjQ5LAorICAgIDB4YzczNjFiNGMsIDB4YzNmNzA2ZmIsIDB4Y2ViNDIwMjIsIDB4Y2E3NTNkOTUsCisgICAgMHhmMjNhODAyOCwgMHhmNmZiOWQ5ZiwgMHhmYmI4YmI0NiwgMHhmZjc5YTZmMSwKKyAgICAweGUxM2VmNmY0LCAweGU1ZmZlYjQzLCAweGU4YmNjZDlhLCAweGVjN2RkMDJkLAorICAgIDB4MzQ4NjcwNzcsIDB4MzA0NzZkYzAsIDB4M2QwNDRiMTksIDB4MzljNTU2YWUsCisgICAgMHgyNzgyMDZhYiwgMHgyMzQzMWIxYywgMHgyZTAwM2RjNSwgMHgyYWMxMjA3MiwKKyAgICAweDEyOGU5ZGNmLCAweDE2NGY4MDc4LCAweDFiMGNhNmExLCAweDFmY2RiYjE2LAorICAgIDB4MDE4YWViMTMsIDB4MDU0YmY2YTQsIDB4MDgwOGQwN2QsIDB4MGNjOWNkY2EsCisgICAgMHg3ODk3YWIwNywgMHg3YzU2YjZiMCwgMHg3MTE1OTA2OSwgMHg3NWQ0OGRkZSwKKyAgICAweDZiOTNkZGRiLCAweDZmNTJjMDZjLCAweDYyMTFlNmI1LCAweDY2ZDBmYjAyLAorICAgIDB4NWU5ZjQ2YmYsIDB4NWE1ZTViMDgsIDB4NTcxZDdkZDEsIDB4NTNkYzYwNjYsCisgICAgMHg0ZDliMzA2MywgMHg0OTVhMmRkNCwgMHg0NDE5MGIwZCwgMHg0MGQ4MTZiYSwKKyAgICAweGFjYTVjNjk3LCAweGE4NjRkYjIwLCAweGE1MjdmZGY5LCAweGExZTZlMDRlLAorICAgIDB4YmZhMWIwNGIsIDB4YmI2MGFkZmMsIDB4YjYyMzhiMjUsIDB4YjJlMjk2OTIsCisgICAgMHg4YWFkMmIyZiwgMHg4ZTZjMzY5OCwgMHg4MzJmMTA0MSwgMHg4N2VlMGRmNiwKKyAgICAweDk5YTk1ZGYzLCAweDlkNjg0MDQ0LCAweDkwMmI2NjlkLCAweDk0ZWE3YjJhLAorICAgIDB4ZTBiNDFkZTcsIDB4ZTQ3NTAwNTAsIDB4ZTkzNjI2ODksIDB4ZWRmNzNiM2UsCisgICAgMHhmM2IwNmIzYiwgMHhmNzcxNzY4YywgMHhmYTMyNTA1NSwgMHhmZWYzNGRlMiwKKyAgICAweGM2YmNmMDVmLCAweGMyN2RlZGU4LCAweGNmM2VjYjMxLCAweGNiZmZkNjg2LAorICAgIDB4ZDViODg2ODMsIDB4ZDE3OTliMzQsIDB4ZGMzYWJkZWQsIDB4ZDhmYmEwNWEsCisgICAgMHg2OTBjZTBlZSwgMHg2ZGNkZmQ1OSwgMHg2MDhlZGI4MCwgMHg2NDRmYzYzNywKKyAgICAweDdhMDg5NjMyLCAweDdlYzk4Yjg1LCAweDczOGFhZDVjLCAweDc3NGJiMGViLAorICAgIDB4NGYwNDBkNTYsIDB4NGJjNTEwZTEsIDB4NDY4NjM2MzgsIDB4NDI0NzJiOGYsCisgICAgMHg1YzAwN2I4YSwgMHg1OGMxNjYzZCwgMHg1NTgyNDBlNCwgMHg1MTQzNWQ1MywKKyAgICAweDI1MWQzYjllLCAweDIxZGMyNjI5LCAweDJjOWYwMGYwLCAweDI4NWUxZDQ3LAorICAgIDB4MzYxOTRkNDIsIDB4MzJkODUwZjUsIDB4M2Y5Yjc2MmMsIDB4M2I1YTZiOWIsCisgICAgMHgwMzE1ZDYyNiwgMHgwN2Q0Y2I5MSwgMHgwYTk3ZWQ0OCwgMHgwZTU2ZjBmZiwKKyAgICAweDEwMTFhMGZhLCAweDE0ZDBiZDRkLCAweDE5OTM5Yjk0LCAweDFkNTI4NjIzLAorICAgIDB4ZjEyZjU2MGUsIDB4ZjVlZTRiYjksIDB4ZjhhZDZkNjAsIDB4ZmM2YzcwZDcsCisgICAgMHhlMjJiMjBkMiwgMHhlNmVhM2Q2NSwgMHhlYmE5MWJiYywgMHhlZjY4MDYwYiwKKyAgICAweGQ3MjdiYmI2LCAweGQzZTZhNjAxLCAweGRlYTU4MGQ4LCAweGRhNjQ5ZDZmLAorICAgIDB4YzQyM2NkNmEsIDB4YzBlMmQwZGQsIDB4Y2RhMWY2MDQsIDB4Yzk2MGViYjMsCisgICAgMHhiZDNlOGQ3ZSwgMHhiOWZmOTBjOSwgMHhiNGJjYjYxMCwgMHhiMDdkYWJhNywKKyAgICAweGFlM2FmYmEyLCAweGFhZmJlNjE1LCAweGE3YjhjMGNjLCAweGEzNzlkZDdiLAorICAgIDB4OWIzNjYwYzYsIDB4OWZmNzdkNzEsIDB4OTJiNDViYTgsIDB4OTY3NTQ2MWYsCisgICAgMHg4ODMyMTYxYSwgMHg4Y2YzMGJhZCwgMHg4MWIwMmQ3NCwgMHg4NTcxMzBjMywKKyAgICAweDVkOGE5MDk5LCAweDU5NGI4ZDJlLCAweDU0MDhhYmY3LCAweDUwYzliNjQwLAorICAgIDB4NGU4ZWU2NDUsIDB4NGE0ZmZiZjIsIDB4NDcwY2RkMmIsIDB4NDNjZGMwOWMsCisgICAgMHg3YjgyN2QyMSwgMHg3ZjQzNjA5NiwgMHg3MjAwNDY0ZiwgMHg3NmMxNWJmOCwKKyAgICAweDY4ODYwYmZkLCAweDZjNDcxNjRhLCAweDYxMDQzMDkzLCAweDY1YzUyZDI0LAorICAgIDB4MTE5YjRiZTksIDB4MTU1YTU2NWUsIDB4MTgxOTcwODcsIDB4MWNkODZkMzAsCisgICAgMHgwMjlmM2QzNSwgMHgwNjVlMjA4MiwgMHgwYjFkMDY1YiwgMHgwZmRjMWJlYywKKyAgICAweDM3OTNhNjUxLCAweDMzNTJiYmU2LCAweDNlMTE5ZDNmLCAweDNhZDA4MDg4LAorICAgIDB4MjQ5N2QwOGQsIDB4MjA1NmNkM2EsIDB4MmQxNWViZTMsIDB4MjlkNGY2NTQsCisgICAgMHhjNWE5MjY3OSwgMHhjMTY4M2JjZSwgMHhjYzJiMWQxNywgMHhjOGVhMDBhMCwKKyAgICAweGQ2YWQ1MGE1LCAweGQyNmM0ZDEyLCAweGRmMmY2YmNiLCAweGRiZWU3NjdjLAorICAgIDB4ZTNhMWNiYzEsIDB4ZTc2MGQ2NzYsIDB4ZWEyM2YwYWYsIDB4ZWVlMmVkMTgsCisgICAgMHhmMGE1YmQxZCwgMHhmNDY0YTBhYSwgMHhmOTI3ODY3MywgMHhmZGU2OWJjNCwKKyAgICAweDg5YjhmZDA5LCAweDhkNzllMGJlLCAweDgwM2FjNjY3LCAweDg0ZmJkYmQwLAorICAgIDB4OWFiYzhiZDUsIDB4OWU3ZDk2NjIsIDB4OTMzZWIwYmIsIDB4OTdmZmFkMGMsCisgICAgMHhhZmIwMTBiMSwgMHhhYjcxMGQwNiwgMHhhNjMyMmJkZiwgMHhhMmYzMzY2OCwKKyAgICAweGJjYjQ2NjZkLCAweGI4NzU3YmRhLCAweGI1MzY1ZDAzLCAweGIxZjc0MGI0CisgICAgfTsKKworQVRTUGFyc2VyOjpQU0lTZWN0aW9uOjpQU0lTZWN0aW9uKCkgOgorICAgIG1Ta2lwQnl0ZXMoMCkgewogfQogCiBBVFNQYXJzZXI6OlBTSVNlY3Rpb246On5QU0lTZWN0aW9uKCkgewpAQCAtMTM3NywxMCArMTY2NywxNSBAQAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBBVFNQYXJzZXI6OlBTSVNlY3Rpb246OnNldFNraXBCeXRlcyh1aW50OF90IHNraXApIHsKKyAgICBtU2tpcEJ5dGVzID0gc2tpcDsKK30KKwogdm9pZCBBVFNQYXJzZXI6OlBTSVNlY3Rpb246OmNsZWFyKCkgewogICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAgICAgfQorICAgIG1Ta2lwQnl0ZXMgPSAwOwogfQogCiBib29sIEFUU1BhcnNlcjo6UFNJU2VjdGlvbjo6aXNDb21wbGV0ZSgpIGNvbnN0IHsKQEAgLTE0MDQsNCArMTY5OSwzNyBAQAogICAgIHJldHVybiBtQnVmZmVyID09IE5VTEwgPyAwIDogbUJ1ZmZlci0+c2l6ZSgpOwogfQogCitib29sIEFUU1BhcnNlcjo6UFNJU2VjdGlvbjo6aXNDUkNPa2F5KCkgY29uc3QgeworICAgIGlmICghaXNDb21wbGV0ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdWludDhfdCogZGF0YSA9IG1CdWZmZXItPmRhdGEoKTsKKworICAgIC8vIFJldHVybiB0cnVlIGlmIHNlY3Rpb25fc3ludGF4X2luZGljYXRvciBzYXlzIG5vIHNlY3Rpb24gZm9sbG93cyB0aGUgZmllbGQgc2VjdGlvbl9sZW5ndGguCisgICAgaWYgKChkYXRhWzFdICYgMHg4MCkgPT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBzZWN0aW9uTGVuZ3RoID0gVTE2X0FUKGRhdGEgKyAxKSAmIDB4ZmZmOworICAgIEFMT0dWKCJzZWN0aW9uTGVuZ3RoICV1LCBza2lwICV1Iiwgc2VjdGlvbkxlbmd0aCwgbVNraXBCeXRlcyk7CisKKworICAgIGlmKHNlY3Rpb25MZW5ndGggPCBtU2tpcEJ5dGVzKSB7CisgICAgICAgIEFMT0dFKCJiLzI4MzMzMDA2Iik7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjgzMzMwMDYiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFNraXAgdGhlIHByZWNlZGluZyBmaWVsZCBwcmVzZW50IHdoZW4gcGF5bG9hZCBzdGFydCBpbmRpY2F0b3IgaXMgb24uCisgICAgc2VjdGlvbkxlbmd0aCAtPSBtU2tpcEJ5dGVzOworCisgICAgdWludDMyX3QgY3JjID0gMHhmZmZmZmZmZjsKKyAgICBmb3IodW5zaWduZWQgaSA9IDA7IGkgPCBzZWN0aW9uTGVuZ3RoICsgNCAvKiBjcmMgKi87IGkrKykgeworICAgICAgICB1aW50OF90IGIgPSBkYXRhW2ldOworICAgICAgICBpbnQgaW5kZXggPSAoKGNyYyA+PiAyNCkgXiAoYiAmIDB4ZmYpKSAmIDB4ZmY7CisgICAgICAgIGNyYyA9IENSQ19UQUJMRVtpbmRleF0gXiAoY3JjIDw8IDgpOworICAgIH0KKyAgICBBTE9HVigiY3JjOiAlMDh4XG4iLCBjcmMpOworICAgIHJldHVybiAoY3JjID09IDApOworfQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCmluZGV4IDc1ZDc2ZGMuLjQzMGE4ZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaApAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtMzAsNyArMzEsNiBAQAogCiBjbGFzcyBBQml0UmVhZGVyOwogc3RydWN0IEFCdWZmZXI7Ci1zdHJ1Y3QgTWVkaWFTb3VyY2U7CiAKIHN0cnVjdCBBVFNQYXJzZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgZW51bSBEaXNjb250aW51aXR5VHlwZSB7CkBAIC00Niw2ICs0Niw5IEBACiAgICAgICAgICAgICBESVNDT05USU5VSVRZX0FVRElPX0ZPUk1BVAogICAgICAgICAgICAgICAgIHwgRElTQ09OVElOVUlUWV9WSURFT19GT1JNQVQKICAgICAgICAgICAgICAgICB8IERJU0NPTlRJTlVJVFlfVElNRSwKKyAgICAgICAgRElTQ09OVElOVUlUWV9GT1JNQVRfT05MWSAgICAgICA9CisgICAgICAgICAgICBESVNDT05USU5VSVRZX0FVRElPX0ZPUk1BVAorICAgICAgICAgICAgICAgIHwgRElTQ09OVElOVUlUWV9WSURFT19GT1JNQVQsCiAgICAgfTsKIAogICAgIGVudW0gRmxhZ3MgewpAQCAtNTksOSArNjIsNDMgQEAKICAgICAgICAgQUxJR05FRF9WSURFT19EQVRBICAgICAgICAgPSAyLAogICAgIH07CiAKKyAgICAvLyBFdmVudCBpcyB1c2VkIHRvIHNpZ25hbCBzeW5jIHBvaW50IGV2ZW50IGF0IGZlZWRUU1BhY2tldCgpLgorICAgIHN0cnVjdCBTeW5jRXZlbnQgeworICAgICAgICBTeW5jRXZlbnQob2ZmNjRfdCBvZmZzZXQpOworCisgICAgICAgIHZvaWQgaW5pdChvZmY2NF90IG9mZnNldCwgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMpOworCisgICAgICAgIGJvb2wgaXNJbml0KCkgeyByZXR1cm4gbUluaXQ7IH0KKyAgICAgICAgb2ZmNjRfdCBnZXRPZmZzZXQoKSB7IHJldHVybiBtT2Zmc2V0OyB9CisgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmZ2V0TWVkaWFTb3VyY2UoKSB7IHJldHVybiBtTWVkaWFTb3VyY2U7IH0KKyAgICAgICAgaW50NjRfdCBnZXRUaW1lVXMoKSB7IHJldHVybiBtVGltZVVzOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBib29sIG1Jbml0OworICAgICAgICAvKgorICAgICAgICAgKiBtSW5pdCA9PSBmYWxzZTogdGhlIGN1cnJlbnQgb2Zmc2V0CisgICAgICAgICAqIG1Jbml0ID09IHRydWU6IHRoZSBzdGFydCBvZmZzZXQgb2Ygc3luYyBwYXlsb2FkCisgICAgICAgICAqLworICAgICAgICBvZmY2NF90IG1PZmZzZXQ7CisgICAgICAgIC8qIFRoZSBtZWRpYSBzb3VyY2Ugb2JqZWN0IGZvciB0aGlzIGV2ZW50LiAqLworICAgICAgICBzcDxNZWRpYVNvdXJjZT4gbU1lZGlhU291cmNlOworICAgICAgICAvKiBUaGUgdGltZXN0YW1wIG9mIHRoZSBzeW5jIGZyYW1lLiAqLworICAgICAgICBpbnQ2NF90IG1UaW1lVXM7CisgICAgfTsKKwogICAgIEFUU1BhcnNlcih1aW50MzJfdCBmbGFncyA9IDApOwogCi0gICAgc3RhdHVzX3QgZmVlZFRTUGFja2V0KGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICAvLyBGZWVkIGEgVFMgcGFja2V0IGludG8gdGhlIHBhcnNlci4gdW5pbml0aWFsaXplZCBldmVudCB3aXRoIHRoZSBzdGFydAorICAgIC8vIG9mZnNldCBvZiB0aGlzIFRTIHBhY2tldCBnb2VzIGluLCBhbmQgaWYgdGhlIHBhcnNlciBkZXRlY3RzIFBFUyB3aXRoCisgICAgLy8gYSBzeW5jIGZyYW1lLCB0aGUgZXZlbnQgd2lsbCBiZSBpbml0aWFpbHplZCB3aXRoIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlCisgICAgLy8gUEVTLiBOb3RlIHRoYXQgdGhlIG9mZnNldCBvZiB0aGUgZXZlbnQgY2FuIGJlIGRpZmZlcmVudCBmcm9tIHdoYXQgd2UgZmVkLAorICAgIC8vIGFzIGEgUEVTIG1heSBjb25zaXN0IG9mIG11bHRpcGxlIFRTIHBhY2tldHMuCisgICAgLy8KKyAgICAvLyBFdmVuIGluIHRoZSBjYXNlIGZlZWRUU1BhY2tldCgpIHJldHVybnMgbm9uLU9LIHZhbHVlLCBldmVudCBzdGlsbCBtYXkgYmUKKyAgICAvLyBpbml0aWFsaXplZCBpZiB0aGUgcGFyc2luZyBmYWlsZWQgYWZ0ZXIgdGhlIGRldGVjdGlvbi4KKyAgICBzdGF0dXNfdCBmZWVkVFNQYWNrZXQoCisgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgU3luY0V2ZW50ICpldmVudCA9IE5VTEwpOwogCiAgICAgdm9pZCBzaWduYWxEaXNjb250aW51aXR5KAogICAgICAgICAgICAgRGlzY29udGludWl0eVR5cGUgdHlwZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZleHRyYSk7CkBAIC03MSw3ICsxMDgsOCBAQAogICAgIGVudW0gU291cmNlVHlwZSB7CiAgICAgICAgIFZJREVPID0gMCwKICAgICAgICAgQVVESU8gPSAxLAotICAgICAgICBOVU1fU09VUkNFX1RZUEVTID0gMgorICAgICAgICBNRVRBICA9IDIsCisgICAgICAgIE5VTV9TT1VSQ0VfVFlQRVMgPSAzCiAgICAgfTsKICAgICBzcDxNZWRpYVNvdXJjZT4gZ2V0U291cmNlKFNvdXJjZVR5cGUgdHlwZSk7CiAgICAgYm9vbCBoYXNTb3VyY2UoU291cmNlVHlwZSB0eXBlKSBjb25zdDsKQEAgLTg3LDYgKzEyNSw3IEBACiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzJfQVVESU8gICAgICAgICAgPSAweDA0LAogICAgICAgICBTVFJFQU1UWVBFX01QRUcyX0FVRElPX0FEVFMgICAgID0gMHgwZiwKICAgICAgICAgU1RSRUFNVFlQRV9NUEVHNF9WSURFTyAgICAgICAgICA9IDB4MTAsCisgICAgICAgIFNUUkVBTVRZUEVfTUVUQURBVEEgICAgICAgICAgICAgPSAweDE1LAogICAgICAgICBTVFJFQU1UWVBFX0gyNjQgICAgICAgICAgICAgICAgID0gMHgxYiwKIAogICAgICAgICAvLyBGcm9tIEFUU0MgQS81MyBQYXJ0IDM6MjAwOSwgNi43LjEKQEAgLTExNSwyMCArMTU0LDMxIEBACiAKICAgICBib29sIG1UaW1lT2Zmc2V0VmFsaWQ7CiAgICAgaW50NjRfdCBtVGltZU9mZnNldFVzOworICAgIGludDY0X3QgbUxhc3RSZWNvdmVyZWRQVFM7CiAKICAgICBzaXplX3QgbU51bVRTUGFja2V0c1BhcnNlZDsKIAogICAgIHZvaWQgcGFyc2VQcm9ncmFtQXNzb2NpYXRpb25UYWJsZShBQml0UmVhZGVyICpicik7CiAgICAgdm9pZCBwYXJzZVByb2dyYW1NYXAoQUJpdFJlYWRlciAqYnIpOwotICAgIHZvaWQgcGFyc2VQRVMoQUJpdFJlYWRlciAqYnIpOworICAgIC8vIFBhcnNlIFBFUyBwYWNrZXQgd2hlcmUgYnIgaXMgcG9pbnRpbmcgdG8uIElmIHRoZSBQRVMgY29udGFpbnMgYSBzeW5jCisgICAgLy8gZnJhbWUsIHNldCBldmVudCB3aXRoIHRoZSB0aW1lIGFuZCB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoaXMgUEVTLgorICAgIC8vIE5vdGUgdGhhdCB0aGUgbWV0aG9kIGl0c2VsZiBkb2VzIG5vdCB0b3VjaCBldmVudC4KKyAgICB2b2lkIHBhcnNlUEVTKEFCaXRSZWFkZXIgKmJyLCBTeW5jRXZlbnQgKmV2ZW50KTsKIAorICAgIC8vIFN0cmlwIHJlbWFpbmluZyBwYWNrZXQgaGVhZGVycyBhbmQgcGFzcyB0byBhcHByb3ByaWF0ZSBwcm9ncmFtL3N0cmVhbQorICAgIC8vIHRvIHBhcnNlIHRoZSBwYXlsb2FkLiBJZiB0aGUgcGF5bG9hZCB0dXJucyBvdXQgdG8gYmUgUEVTIGFuZCBjb250YWlucworICAgIC8vIGEgc3luYyBmcmFtZSwgZXZlbnQgc2hhbGwgYmUgc2V0IHdpdGggdGhlIHRpbWUgYW5kIHN0YXJ0IG9mZnNldCBvZiB0aGUKKyAgICAvLyBQRVMuCisgICAgLy8gTm90ZSB0aGF0IHRoZSBtZXRob2QgaXRzZWxmIGRvZXMgbm90IHRvdWNoIGV2ZW50LgogICAgIHN0YXR1c190IHBhcnNlUElEKAogICAgICAgICBBQml0UmVhZGVyICpiciwgdW5zaWduZWQgUElELAogICAgICAgICB1bnNpZ25lZCBjb250aW51aXR5X2NvdW50ZXIsCi0gICAgICAgIHVuc2lnbmVkIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IpOworICAgICAgICB1bnNpZ25lZCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yLAorICAgICAgICBTeW5jRXZlbnQgKmV2ZW50KTsKIAotICAgIHZvaWQgcGFyc2VBZGFwdGF0aW9uRmllbGQoQUJpdFJlYWRlciAqYnIsIHVuc2lnbmVkIFBJRCk7Ci0gICAgc3RhdHVzX3QgcGFyc2VUUyhBQml0UmVhZGVyICpicik7CisgICAgc3RhdHVzX3QgcGFyc2VBZGFwdGF0aW9uRmllbGQoQUJpdFJlYWRlciAqYnIsIHVuc2lnbmVkIFBJRCk7CisgICAgLy8gc2VlIGZlZWRUU1BhY2tldCgpLgorICAgIHN0YXR1c190IHBhcnNlVFMoQUJpdFJlYWRlciAqYnIsIFN5bmNFdmVudCAqZXZlbnQpOwogCiAgICAgdm9pZCB1cGRhdGVQQ1IodW5zaWduZWQgUElELCB1aW50NjRfdCBQQ1IsIHNpemVfdCBieXRlT2Zmc2V0RnJvbVN0YXJ0KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLm1rCmluZGV4IGMxN2EwYjcuLjE2YjAxNjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsKQEAgLTEzLDcgKzEzLDggQEAKIAkkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCi1MT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfbXBlZzJ0cwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcAppbmRleCBmMjY2ZmU3Li5jYWJkZTMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKQEAgLTE5LDYgKzE5LDggQEAKIAogI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKIAorI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTI3LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CkBAIC0zOCwxNyArNDEsMjIgQEAKIEFub3RoZXJQYWNrZXRTb3VyY2U6OkFub3RoZXJQYWNrZXRTb3VyY2UoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKQogICAgIDogbUlzQXVkaW8oZmFsc2UpLAogICAgICAgbUlzVmlkZW8oZmFsc2UpLAorICAgICAgbUVuYWJsZWQodHJ1ZSksCiAgICAgICBtRm9ybWF0KE5VTEwpLAogICAgICAgbUxhc3RRdWV1ZWRUaW1lVXMoMCksCiAgICAgICBtRU9TUmVzdWx0KE9LKSwKICAgICAgIG1MYXRlc3RFbnF1ZXVlZE1ldGEoTlVMTCksCi0gICAgICBtTGF0ZXN0RGVxdWV1ZWRNZXRhKE5VTEwpLAotICAgICAgbVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudCgwKSB7CisgICAgICBtTGF0ZXN0RGVxdWV1ZWRNZXRhKE5VTEwpIHsKICAgICBzZXRGb3JtYXQobWV0YSk7CisKKyAgICBtRGlzY29udGludWl0eVNlZ21lbnRzLnB1c2hfYmFjayhEaXNjb250aW51aXR5U2VnbWVudCgpKTsKIH0KIAogdm9pZCBBbm90aGVyUGFja2V0U291cmNlOjpzZXRGb3JtYXQoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKSB7Ci0gICAgQ0hFQ0sobUZvcm1hdCA9PSBOVUxMKTsKKyAgICBpZiAobUZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIC8vIE9ubHkgYWxsb3dlZCB0byBiZSBzZXQgb25jZS4gUmVxdWlyZXMgZXhwbGljaXQgY2xlYXIgdG8gcmVzZXQuCisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBtSXNBdWRpbyA9IGZhbHNlOwogICAgIG1Jc1ZpZGVvID0gZmFsc2U7CkBAIC02Niw3ICs3NCw3IEBACiAgICAgfSBlbHNlICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgewogICAgICAgICBtSXNWaWRlbyA9IHRydWU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQ0hFQ0soIXN0cm5jYXNlY21wKCJ0ZXh0LyIsIG1pbWUsIDUpKTsKKyAgICAgICAgQ0hFQ0soIXN0cm5jYXNlY21wKCJ0ZXh0LyIsIG1pbWUsIDUpIHx8ICFzdHJuY2FzZWNtcCgiYXBwbGljYXRpb24vIiwgbWltZSwgMTIpKTsKICAgICB9CiB9CiAKQEAgLTkxLDEzICs5OSwxMiBAQAogICAgIHdoaWxlIChpdCAhPSBtQnVmZmVycy5lbmQoKSkgewogICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSAqaXQ7CiAgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eTsKLSAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmZGlzY29udGludWl0eSkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgc3A8UmVmQmFzZT4gb2JqZWN0OwotICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRPYmplY3QoImZvcm1hdCIsICZvYmplY3QpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUZvcm1hdCA9IHN0YXRpY19jYXN0PE1ldGFEYXRhKj4ob2JqZWN0LmdldCgpKTsKKyAgICAgICAgaWYgKCFidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJmRpc2NvbnRpbnVpdHkpKSB7CisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmplY3Q7CisgICAgICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRPYmplY3QoImZvcm1hdCIsICZvYmplY3QpKSB7CisgICAgICAgICAgICAgICAgc2V0Rm9ybWF0KHN0YXRpY19jYXN0PE1ldGFEYXRhKj4ob2JqZWN0LmdldCgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICArK2l0OwpAQCAtMTIzLDE1ICsxMzAsMjQgQEAKICAgICAgICAgICAgICAgICBtRm9ybWF0LmNsZWFyKCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC0tbVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudDsKKyAgICAgICAgICAgIG1EaXNjb250aW51aXR5U2VnbWVudHMuZXJhc2UobURpc2NvbnRpbnVpdHlTZWdtZW50cy5iZWdpbigpKTsKKyAgICAgICAgICAgIC8vIENIRUNLKCFtRGlzY29udGludWl0eVNlZ21lbnRzLmVtcHR5KCkpOwogICAgICAgICAgICAgcmV0dXJuIElORk9fRElTQ09OVElOVUlUWTsKICAgICAgICAgfQogCisgICAgICAgIC8vIENIRUNLKCFtRGlzY29udGludWl0eVNlZ21lbnRzLmVtcHR5KCkpOworICAgICAgICBEaXNjb250aW51aXR5U2VnbWVudCAmc2VnID0gKm1EaXNjb250aW51aXR5U2VnbWVudHMuYmVnaW4oKTsKKworICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgbUxhdGVzdERlcXVldWVkTWV0YSA9ICgqYnVmZmVyKS0+bWV0YSgpLT5kdXAoKTsKKyAgICAgICAgQ0hFQ0sobUxhdGVzdERlcXVldWVkTWV0YS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisgICAgICAgIGlmICh0aW1lVXMgPiBzZWcubU1heERlcXVlVGltZVVzKSB7CisgICAgICAgICAgICBzZWcubU1heERlcXVlVGltZVVzID0gdGltZVVzOworICAgICAgICB9CiAKICAgICAgICAgc3A8UmVmQmFzZT4gb2JqZWN0OwogICAgICAgICBpZiAoKCpidWZmZXIpLT5tZXRhKCktPmZpbmRPYmplY3QoImZvcm1hdCIsICZvYmplY3QpKSB7Ci0gICAgICAgICAgICBtRm9ybWF0ID0gc3RhdGljX2Nhc3Q8TWV0YURhdGEqPihvYmplY3QuZ2V0KCkpOworICAgICAgICAgICAgc2V0Rm9ybWF0KHN0YXRpY19jYXN0PE1ldGFEYXRhKj4ob2JqZWN0LmdldCgpKSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gT0s7CkBAIC0xNDAsNiArMTU2LDEyIEBACiAgICAgcmV0dXJuIG1FT1NSZXN1bHQ7CiB9CiAKK3ZvaWQgQW5vdGhlclBhY2tldFNvdXJjZTo6cmVxdWV1ZUFjY2Vzc1VuaXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIC8vIFRPRE86IHVwZGF0ZSBjb3JyZXNwb25kaW5nIGJvb2sga2VlcGluZyBpbmZvLgorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbUJ1ZmZlcnMucHVzaF9mcm9udChidWZmZXIpOworfQorCiBzdGF0dXNfdCBBbm90aGVyUGFja2V0U291cmNlOjpyZWFkKAogICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKikgewogICAgICpvdXQgPSBOVUxMOwpAQCAtMTUzLDcgKzE3NSw2IEBACiAKICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gKm1CdWZmZXJzLmJlZ2luKCk7CiAgICAgICAgIG1CdWZmZXJzLmVyYXNlKG1CdWZmZXJzLmJlZ2luKCkpOwotICAgICAgICBtTGF0ZXN0RGVxdWV1ZWRNZXRhID0gYnVmZmVyLT5tZXRhKCktPmR1cCgpOwogCiAgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eTsKICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmZGlzY29udGludWl0eSkpIHsKQEAgLTE2MSwyMSArMTgyLDQwIEBACiAgICAgICAgICAgICAgICAgbUZvcm1hdC5jbGVhcigpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBtRGlzY29udGludWl0eVNlZ21lbnRzLmVyYXNlKG1EaXNjb250aW51aXR5U2VnbWVudHMuYmVnaW4oKSk7CisgICAgICAgICAgICAvLyBDSEVDSyghbURpc2NvbnRpbnVpdHlTZWdtZW50cy5lbXB0eSgpKTsKICAgICAgICAgICAgIHJldHVybiBJTkZPX0RJU0NPTlRJTlVJVFk7CiAgICAgICAgIH0KIAorICAgICAgICBtTGF0ZXN0RGVxdWV1ZWRNZXRhID0gYnVmZmVyLT5tZXRhKCktPmR1cCgpOworCiAgICAgICAgIHNwPFJlZkJhc2U+IG9iamVjdDsKICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kT2JqZWN0KCJmb3JtYXQiLCAmb2JqZWN0KSkgewotICAgICAgICAgICAgbUZvcm1hdCA9IHN0YXRpY19jYXN0PE1ldGFEYXRhKj4ob2JqZWN0LmdldCgpKTsKKyAgICAgICAgICAgIHNldEZvcm1hdChzdGF0aWNfY2FzdDxNZXRhRGF0YSo+KG9iamVjdC5nZXQoKSkpOwogICAgICAgICB9CiAKICAgICAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgLy8gQ0hFQ0soIW1EaXNjb250aW51aXR5U2VnbWVudHMuZW1wdHkoKSk7CisgICAgICAgIERpc2NvbnRpbnVpdHlTZWdtZW50ICZzZWcgPSAqbURpc2NvbnRpbnVpdHlTZWdtZW50cy5iZWdpbigpOworICAgICAgICBpZiAodGltZVVzID4gc2VnLm1NYXhEZXF1ZVRpbWVVcykgeworICAgICAgICAgICAgc2VnLm1NYXhEZXF1ZVRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgfQogCiAgICAgICAgIE1lZGlhQnVmZmVyICptZWRpYUJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihidWZmZXIpOwogCiAgICAgICAgIG1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CiAKKyAgICAgICAgaW50MzJfdCBpc1N5bmM7CisgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJpc1N5bmMiLCAmaXNTeW5jKSkgeworICAgICAgICAgICAgbWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGlzU3luYyk7CisgICAgICAgIH0KKworICAgICAgICBzcDxBQnVmZmVyPiBzZWk7CisgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEJ1ZmZlcigic2VpIiwgJnNlaSkgJiYgc2VpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0RGF0YShrS2V5U0VJLCAwLCBzZWktPmRhdGEoKSwgc2VpLT5zaXplKCkpOworICAgICAgICB9CisKICAgICAgICAgKm91dCA9IG1lZGlhQnVmZmVyOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQpAQCAtMjAzLDE4ICsyNDMsMzUgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGludDY0X3QgbGFzdFF1ZXVlZFRpbWVVczsKLSAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbGFzdFF1ZXVlZFRpbWVVcykpOwotICAgIG1MYXN0UXVldWVkVGltZVVzID0gbGFzdFF1ZXVlZFRpbWVVczsKLSAgICBBTE9HVigicXVldWVBY2Nlc3NVbml0IHRpbWVVcz0lIiBQUklpNjQgIiB1cyAoJS4yZiBzZWNzKSIsIG1MYXN0UXVldWVkVGltZVVzLCBtTGFzdFF1ZXVlZFRpbWVVcyAvIDFFNik7Ci0KICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIG1CdWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOwogICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CiAKICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHk7Ci0gICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmZGlzY29udGludWl0eSkpIHsKLSAgICAgICAgKyttUXVldWVkRGlzY29udGludWl0eUNvdW50OworICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJmRpc2NvbnRpbnVpdHkpKXsKKyAgICAgICAgQUxPR1YoInF1ZXVlaW5nIGEgZGlzY29udGludWl0eSB3aXRoIHF1ZXVlQWNjZXNzVW5pdCIpOworCisgICAgICAgIG1MYXN0UXVldWVkVGltZVVzID0gMGxsOworICAgICAgICBtRU9TUmVzdWx0ID0gT0s7CisgICAgICAgIG1MYXRlc3RFbnF1ZXVlZE1ldGEgPSBOVUxMOworCisgICAgICAgIG1EaXNjb250aW51aXR5U2VnbWVudHMucHVzaF9iYWNrKERpc2NvbnRpbnVpdHlTZWdtZW50KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBsYXN0UXVldWVkVGltZVVzOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZsYXN0UXVldWVkVGltZVVzKSk7CisgICAgbUxhc3RRdWV1ZWRUaW1lVXMgPSBsYXN0UXVldWVkVGltZVVzOworICAgIEFMT0dWKCJxdWV1ZUFjY2Vzc1VuaXQgdGltZVVzPSUiIFBSSWk2NCAiIHVzICglLjJmIHNlY3MpIiwKKyAgICAgICAgICAgIG1MYXN0UXVldWVkVGltZVVzLCBtTGFzdFF1ZXVlZFRpbWVVcyAvIDFFNik7CisKKyAgICAvLyBDSEVDSyghbURpc2NvbnRpbnVpdHlTZWdtZW50cy5lbXB0eSgpKTsKKyAgICBEaXNjb250aW51aXR5U2VnbWVudCAmdGFpbFNlZyA9ICooLS1tRGlzY29udGludWl0eVNlZ21lbnRzLmVuZCgpKTsKKyAgICBpZiAobGFzdFF1ZXVlZFRpbWVVcyA+IHRhaWxTZWcubU1heEVucXVlVGltZVVzKSB7CisgICAgICAgIHRhaWxTZWcubU1heEVucXVlVGltZVVzID0gbGFzdFF1ZXVlZFRpbWVVczsKKyAgICB9CisgICAgaWYgKHRhaWxTZWcubU1heERlcXVlVGltZVVzID09IC0xKSB7CisgICAgICAgIHRhaWxTZWcubU1heERlcXVlVGltZVVzID0gbGFzdFF1ZXVlZFRpbWVVczsKICAgICB9CiAKICAgICBpZiAobUxhdGVzdEVucXVldWVkTWV0YSA9PSBOVUxMKSB7CkBAIC0yNDAsNyArMjk3LDkgQEAKIAogICAgIG1CdWZmZXJzLmNsZWFyKCk7CiAgICAgbUVPU1Jlc3VsdCA9IE9LOwotICAgIG1RdWV1ZWREaXNjb250aW51aXR5Q291bnQgPSAwOworCisgICAgbURpc2NvbnRpbnVpdHlTZWdtZW50cy5jbGVhcigpOworICAgIG1EaXNjb250aW51aXR5U2VnbWVudHMucHVzaF9iYWNrKERpc2NvbnRpbnVpdHlTZWdtZW50KCkpOwogCiAgICAgbUZvcm1hdCA9IE5VTEw7CiAgICAgbUxhdGVzdEVucXVldWVkTWV0YSA9IE5VTEw7CkBAIC0yNjcsNiArMzI2LDE0IEBACiAKICAgICAgICAgICAgICsraXQ7CiAgICAgICAgIH0KKworICAgICAgICBmb3IgKExpc3Q8RGlzY29udGludWl0eVNlZ21lbnQ+OjppdGVyYXRvciBpdDIgPSBtRGlzY29udGludWl0eVNlZ21lbnRzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaXQyICE9IG1EaXNjb250aW51aXR5U2VnbWVudHMuZW5kKCk7CisgICAgICAgICAgICAgICAgKytpdDIpIHsKKyAgICAgICAgICAgIERpc2NvbnRpbnVpdHlTZWdtZW50ICZzZWcgPSAqaXQyOworICAgICAgICAgICAgc2VnLmNsZWFyKCk7CisgICAgICAgIH0KKwogICAgIH0KIAogICAgIG1FT1NSZXN1bHQgPSBPSzsKQEAgLTI3Nyw3ICszNDQsOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgKyttUXVldWVkRGlzY29udGludWl0eUNvdW50OworICAgIG1EaXNjb250aW51aXR5U2VnbWVudHMucHVzaF9iYWNrKERpc2NvbnRpbnVpdHlTZWdtZW50KCkpOworCiAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoMCk7CiAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJkaXNjb250aW51aXR5Iiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4odHlwZSkpOwogICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRNZXNzYWdlKCJleHRyYSIsIGV4dHJhKTsKQEAgLTI5Niw2ICszNjQsMTAgQEAKIAogYm9vbCBBbm90aGVyUGFja2V0U291cmNlOjpoYXNCdWZmZXJBdmFpbGFibGUoc3RhdHVzX3QgKmZpbmFsUmVzdWx0KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAqZmluYWxSZXN1bHQgPSBPSzsKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgaWYgKCFtQnVmZmVycy5lbXB0eSgpKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTMwNCw4NiArMzc2LDUzIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIEFub3RoZXJQYWNrZXRTb3VyY2U6Omhhc0RhdGFCdWZmZXJBdmFpbGFibGUoc3RhdHVzX3QgKmZpbmFsUmVzdWx0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAqZmluYWxSZXN1bHQgPSBPSzsKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdDsKKyAgICBmb3IgKGl0ID0gbUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUJ1ZmZlcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5OworICAgICAgICBpZiAoISgqaXQpLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqZmluYWxSZXN1bHQgPSBtRU9TUmVzdWx0OworICAgIHJldHVybiBmYWxzZTsKK30KKworc2l6ZV90IEFub3RoZXJQYWNrZXRTb3VyY2U6OmdldEF2YWlsYWJsZUJ1ZmZlckNvdW50KHN0YXR1c190ICpmaW5hbFJlc3VsdCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAqZmluYWxSZXN1bHQgPSBPSzsKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIW1CdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXJzLnNpemUoKTsKKyAgICB9CisgICAgKmZpbmFsUmVzdWx0ID0gbUVPU1Jlc3VsdDsKKyAgICByZXR1cm4gMDsKK30KKwogaW50NjRfdCBBbm90aGVyUGFja2V0U291cmNlOjpnZXRCdWZmZXJlZER1cmF0aW9uVXMoc3RhdHVzX3QgKmZpbmFsUmVzdWx0KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gZ2V0QnVmZmVyZWREdXJhdGlvblVzX2woZmluYWxSZXN1bHQpOwotfQotCi1pbnQ2NF90IEFub3RoZXJQYWNrZXRTb3VyY2U6OmdldEJ1ZmZlcmVkRHVyYXRpb25Vc19sKHN0YXR1c190ICpmaW5hbFJlc3VsdCkgewogICAgICpmaW5hbFJlc3VsdCA9IG1FT1NSZXN1bHQ7CiAKLSAgICBpZiAobUJ1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWUxID0gLTE7Ci0gICAgaW50NjRfdCB0aW1lMiA9IC0xOwogICAgIGludDY0X3QgZHVyYXRpb25VcyA9IDA7Ci0KLSAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbUJ1ZmZlcnMuYmVnaW4oKTsKLSAgICB3aGlsZSAoaXQgIT0gbUJ1ZmZlcnMuZW5kKCkpIHsKLSAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciA9ICppdDsKLQotICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKSB7Ci0gICAgICAgICAgICBpZiAodGltZTEgPCAwIHx8IHRpbWVVcyA8IHRpbWUxKSB7Ci0gICAgICAgICAgICAgICAgdGltZTEgPSB0aW1lVXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0aW1lMiA8IDAgfHwgdGltZVVzID4gdGltZTIpIHsKLSAgICAgICAgICAgICAgICB0aW1lMiA9IHRpbWVVczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBkaXNjb250aW51aXR5LCByZXNldCBldmVyeXRoaW5nLgotICAgICAgICAgICAgZHVyYXRpb25VcyArPSB0aW1lMiAtIHRpbWUxOwotICAgICAgICAgICAgdGltZTEgPSB0aW1lMiA9IC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgKytpdDsKKyAgICBmb3IgKExpc3Q8RGlzY29udGludWl0eVNlZ21lbnQ+OjppdGVyYXRvciBpdCA9IG1EaXNjb250aW51aXR5U2VnbWVudHMuYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IG1EaXNjb250aW51aXR5U2VnbWVudHMuZW5kKCk7CisgICAgICAgICAgICArK2l0KSB7CisgICAgICAgIGNvbnN0IERpc2NvbnRpbnVpdHlTZWdtZW50ICZzZWcgPSAqaXQ7CisgICAgICAgIC8vIGRlcXVldWVkIGFjY2VzcyB1bml0cyBzaG91bGQgYmUgYSBzdWJzZXQgb2YgZW5xdWV1ZWQgYWNjZXNzIHVuaXRzCisgICAgICAgIC8vIENIRUNLKHNlZy5tYXhFbnF1ZVRpbWVVcyA+PSBzZWcubU1heERlcXVlVGltZVVzKTsKKyAgICAgICAgZHVyYXRpb25VcyArPSAoc2VnLm1NYXhFbnF1ZVRpbWVVcyAtIHNlZy5tTWF4RGVxdWVUaW1lVXMpOwogICAgIH0KIAotICAgIHJldHVybiBkdXJhdGlvblVzICsgKHRpbWUyIC0gdGltZTEpOwotfQotCi0vLyBBIGNoZWFwZXIgYnV0IGxlc3MgcHJlY2lzZSB2ZXJzaW9uIG9mIGdldEJ1ZmZlcmVkRHVyYXRpb25VcyB0aGF0IHdlIHdvdWxkIGxpa2UgdG8gdXNlIGluCi0vLyBMaXZlU2Vzc2lvbjo6ZGVxdWV1ZUFjY2Vzc1VuaXQgdG8gdHJpZ2dlciBkb3dud2FyZHMgYWRhcHRhdGlvbi4KLWludDY0X3QgQW5vdGhlclBhY2tldFNvdXJjZTo6Z2V0RXN0aW1hdGVkRHVyYXRpb25VcygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmIChtQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChtUXVldWVkRGlzY29udGludWl0eUNvdW50ID4gMCkgewotICAgICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKLSAgICAgICAgcmV0dXJuIGdldEJ1ZmZlcmVkRHVyYXRpb25Vc19sKCZmaW5hbFJlc3VsdCk7Ci0gICAgfQotCi0gICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1CdWZmZXJzLmJlZ2luKCk7Ci0gICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gKml0OwotCi0gICAgaW50NjRfdCBzdGFydFRpbWVVczsKLSAgICBidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmc3RhcnRUaW1lVXMpOwotICAgIGlmIChzdGFydFRpbWVVcyA8IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaXQgPSBtQnVmZmVycy5lbmQoKTsKLSAgICAtLWl0OwotICAgIGJ1ZmZlciA9ICppdDsKLQotICAgIGludDY0X3QgZW5kVGltZVVzOwotICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZlbmRUaW1lVXMpOwotICAgIGlmIChlbmRUaW1lVXMgPCAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGludDY0X3QgZGlmZlVzOwotICAgIGlmIChlbmRUaW1lVXMgPiBzdGFydFRpbWVVcykgewotICAgICAgICBkaWZmVXMgPSBlbmRUaW1lVXMgLSBzdGFydFRpbWVVczsKLSAgICB9IGVsc2UgewotICAgICAgICBkaWZmVXMgPSBzdGFydFRpbWVVcyAtIGVuZFRpbWVVczsKLSAgICB9Ci0gICAgcmV0dXJuIGRpZmZVczsKKyAgICByZXR1cm4gZHVyYXRpb25VczsKIH0KIAogc3RhdHVzX3QgQW5vdGhlclBhY2tldFNvdXJjZTo6bmV4dEJ1ZmZlclRpbWUoaW50NjRfdCAqdGltZVVzKSB7CkBAIC00MjIsNCArNDYxLDE3MSBAQAogICAgIHJldHVybiBtTGF0ZXN0RGVxdWV1ZWRNZXRhOwogfQogCit2b2lkIEFub3RoZXJQYWNrZXRTb3VyY2U6OmVuYWJsZShib29sIGVuYWJsZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbUVuYWJsZWQgPSBlbmFibGU7Cit9CisKKy8qCisgKiByZXR1cm5zIHRoZSBzYW1wbGUgbWV0YSB0aGF0J3MgZGVsYXlVcyBhZnRlciBxdWV1ZSBoZWFkCisgKiAoTlVMTCBpZiBzdWNoIHNhbXBsZSBpcyB1bmF2YWlsYWJsZSkKKyAqLworc3A8QU1lc3NhZ2U+IEFub3RoZXJQYWNrZXRTb3VyY2U6OmdldE1ldGFBZnRlckxhc3REZXF1ZXVlZChpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGludDY0X3QgZmlyc3RVcyA9IC0xOworICAgIGludDY0X3QgbGFzdFVzID0gLTE7CisgICAgaW50NjRfdCBkdXJhdGlvblVzID0gMDsKKworICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQ7CisgICAgZm9yIChpdCA9IG1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIgPSAqaXQ7CisgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eTsKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmZGlzY29udGludWl0eSkpIHsKKyAgICAgICAgICAgIGR1cmF0aW9uVXMgKz0gbGFzdFVzIC0gZmlyc3RVczsKKyAgICAgICAgICAgIGZpcnN0VXMgPSAtMTsKKyAgICAgICAgICAgIGxhc3RVcyA9IC0xOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSkgeworICAgICAgICAgICAgaWYgKGZpcnN0VXMgPCAwKSB7CisgICAgICAgICAgICAgICAgZmlyc3RVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXN0VXMgPCAwIHx8IHRpbWVVcyA+IGxhc3RVcykgeworICAgICAgICAgICAgICAgIGxhc3RVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkdXJhdGlvblVzICsgKGxhc3RVcyAtIGZpcnN0VXMpID49IGRlbGF5VXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyLT5tZXRhKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiByZW1vdmVzIHNhbXBsZXMgd2l0aCB0aW1lIGVxdWFsIG9yIGFmdGVyIG1ldGEKKyAqLwordm9pZCBBbm90aGVyUGFja2V0U291cmNlOjp0cmltQnVmZmVyc0FmdGVyTWV0YSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtZXRhKSB7CisgICAgaWYgKG1ldGEgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygidHJpbW1pbmcgd2l0aCBOVUxMIG1ldGEsIGlnbm9yaW5nIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtQnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBITFNUaW1lIHN0b3BUaW1lKG1ldGEpOworICAgIEFMT0dWKCJ0cmltQnVmZmVyc0FmdGVyTWV0YTogZGlzY29udGludWl0eVNlcSAlZCwgdGltZVVzICVsbGQiLAorICAgICAgICAgICAgc3RvcFRpbWUubVNlcSwgKGxvbmcgbG9uZylzdG9wVGltZS5tVGltZVVzKTsKKworICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQ7CisgICAgTGlzdDxEaXNjb250aW51aXR5U2VnbWVudCA+OjppdGVyYXRvciBpdDI7CisgICAgc3A8QU1lc3NhZ2U+IG5ld0xhdGVzdEVucXVldWVkTWV0YSA9IE5VTEw7CisgICAgaW50NjRfdCBuZXdMYXN0UXVldWVkVGltZVVzID0gMDsKKyAgICBmb3IgKGl0ID0gbUJ1ZmZlcnMuYmVnaW4oKSwgaXQyID0gbURpc2NvbnRpbnVpdHlTZWdtZW50cy5iZWdpbigpOyBpdCAhPSBtQnVmZmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyID0gKml0OworICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHk7CisgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJmRpc2NvbnRpbnVpdHkpKSB7CisgICAgICAgICAgICAvLyBDSEVDSyhpdDIgIT0gbURpc2NvbnRpbnVpdHlTZWdtZW50cy5lbmQoKSk7CisgICAgICAgICAgICArK2l0MjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgSExTVGltZSBjdXJUaW1lKGJ1ZmZlci0+bWV0YSgpKTsKKyAgICAgICAgaWYgKCEoY3VyVGltZSA8IHN0b3BUaW1lKSkgeworICAgICAgICAgICAgQUxPR1YoInRyaW1taW5nIGZyb20gJWxsZCAoaW5jbHVzaXZlKSB0byBlbmQiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWN1clRpbWUubVRpbWVVcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBuZXdMYXRlc3RFbnF1ZXVlZE1ldGEgPSBidWZmZXItPm1ldGEoKTsKKyAgICAgICAgbmV3TGFzdFF1ZXVlZFRpbWVVcyA9IGN1clRpbWUubVRpbWVVczsKKyAgICB9CisKKyAgICBtQnVmZmVycy5lcmFzZShpdCwgbUJ1ZmZlcnMuZW5kKCkpOworICAgIG1MYXRlc3RFbnF1ZXVlZE1ldGEgPSBuZXdMYXRlc3RFbnF1ZXVlZE1ldGE7CisgICAgbUxhc3RRdWV1ZWRUaW1lVXMgPSBuZXdMYXN0UXVldWVkVGltZVVzOworCisgICAgRGlzY29udGludWl0eVNlZ21lbnQgJnNlZyA9ICppdDI7CisgICAgaWYgKG5ld0xhdGVzdEVucXVldWVkTWV0YSAhPSBOVUxMKSB7CisgICAgICAgIHNlZy5tTWF4RW5xdWVUaW1lVXMgPSBuZXdMYXN0UXVldWVkVGltZVVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHNlZy5jbGVhcigpOworICAgIH0KKyAgICBtRGlzY29udGludWl0eVNlZ21lbnRzLmVyYXNlKCsraXQyLCBtRGlzY29udGludWl0eVNlZ21lbnRzLmVuZCgpKTsKK30KKworLyoKKyAqIHJlbW92ZXMgc2FtcGxlcyB3aXRoIHRpbWUgZXF1YWwgb3IgYmVmb3JlIG1ldGE7CisgKiByZXR1cm5zIGZpcnN0IHNhbXBsZSBsZWZ0IGluIHRoZSBxdWV1ZS4KKyAqCisgKiAoZm9yIEFWQywgaWYgdHJpbSBoYXBwZW5zLCB0aGUgc2FtcGxlcyBsZWZ0IHdpbGwgYWx3YXlzIHN0YXJ0CisgKiBhdCBuZXh0IElEUi4pCisgKi8KK3NwPEFNZXNzYWdlPiBBbm90aGVyUGFja2V0U291cmNlOjp0cmltQnVmZmVyc0JlZm9yZU1ldGEoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbWV0YSkgeworICAgIEhMU1RpbWUgc3RhcnRUaW1lKG1ldGEpOworICAgIEFMT0dWKCJ0cmltQnVmZmVyc0JlZm9yZU1ldGE6IGRpc2NvbnRpbnVpdHlTZXEgJWQsIHRpbWVVcyAlbGxkIiwKKyAgICAgICAgICAgIHN0YXJ0VGltZS5tU2VxLCAobG9uZyBsb25nKXN0YXJ0VGltZS5tVGltZVVzKTsKKworICAgIHNwPEFNZXNzYWdlPiBmaXJzdE1ldGE7CisgICAgaW50NjRfdCBmaXJzdFRpbWVVcyA9IC0xOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1CdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8TWV0YURhdGE+IGZvcm1hdDsKKyAgICBib29sIGlzQXZjID0gZmFsc2U7CisKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0OworICAgIGZvciAoaXQgPSBtQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQnVmZmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyID0gKml0OworICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHk7CisgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJmRpc2NvbnRpbnVpdHkpKSB7CisgICAgICAgICAgICBtRGlzY29udGludWl0eVNlZ21lbnRzLmVyYXNlKG1EaXNjb250aW51aXR5U2VnbWVudHMuYmVnaW4oKSk7CisgICAgICAgICAgICAvLyBDSEVDSyghbURpc2NvbnRpbnVpdHlTZWdtZW50cy5lbXB0eSgpKTsKKyAgICAgICAgICAgIGZvcm1hdCA9IE5VTEw7CisgICAgICAgICAgICBpc0F2YyA9IGZhbHNlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmplY3Q7CisgICAgICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRPYmplY3QoImZvcm1hdCIsICZvYmplY3QpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWltZTsKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBzdGF0aWNfY2FzdDxNZXRhRGF0YSo+KG9iamVjdC5nZXQoKSk7CisgICAgICAgICAgICAgICAgaXNBdmMgPSBmb3JtYXQgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaXNBdmMgJiYgIUlzSURSKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgSExTVGltZSBjdXJUaW1lKGJ1ZmZlci0+bWV0YSgpKTsKKyAgICAgICAgaWYgKHN0YXJ0VGltZSA8IGN1clRpbWUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJ0cmltbWluZyBmcm9tIGJlZ2lubmluZyB0byAlbGxkIChub3QgaW5jbHVzaXZlKSIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpY3VyVGltZS5tVGltZVVzKTsKKyAgICAgICAgICAgIGZpcnN0TWV0YSA9IGJ1ZmZlci0+bWV0YSgpOworICAgICAgICAgICAgZmlyc3RUaW1lVXMgPSBjdXJUaW1lLm1UaW1lVXM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQnVmZmVycy5lcmFzZShtQnVmZmVycy5iZWdpbigpLCBpdCk7CisgICAgbUxhdGVzdERlcXVldWVkTWV0YSA9IE5VTEw7CisKKyAgICAvLyBDSEVDSyghbURpc2NvbnRpbnVpdHlTZWdtZW50cy5lbXB0eSgpKTsKKyAgICBEaXNjb250aW51aXR5U2VnbWVudCAmc2VnID0gKm1EaXNjb250aW51aXR5U2VnbWVudHMuYmVnaW4oKTsKKyAgICBpZiAoZmlyc3RUaW1lVXMgPj0gMCkgeworICAgICAgICBzZWcubU1heERlcXVlVGltZVVzID0gZmlyc3RUaW1lVXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2VnLmNsZWFyKCk7CisgICAgfQorCisgICAgcmV0dXJuIGZpcnN0TWV0YTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKaW5kZXggODA5YTg1OC4uMjhhMGU4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKQEAgLTQzLDE0ICs0MywyMCBAQAogCiAgICAgdm9pZCBjbGVhcigpOwogCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHdlIGhhdmUgYW55IHBhY2tldHMgaW5jbHVkaW5nIGRpc2NvbnRpbnVpdGllcwogICAgIGJvb2wgaGFzQnVmZmVyQXZhaWxhYmxlKHN0YXR1c190ICpmaW5hbFJlc3VsdCk7CiAKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgd2UgaGF2ZSBwYWNrZXRzIHRoYXQncyBub3QgZGlzY29udGludWl0aWVzCisgICAgYm9vbCBoYXNEYXRhQnVmZmVyQXZhaWxhYmxlKHN0YXR1c190ICpmaW5hbFJlc3VsdCk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGJ1ZmZlcnMuIGZpbmFsUmVzdWx0IGlzIGFsd2F5cyBPSworICAgIC8vIGlmIHRoaXMgbWV0aG9kIHJldHVybnMgbm9uLTAsIG9yIHRoZSBmaW5hbCByZXN1bHQgaWYgaXQgcmV0dXJucyAwLgorICAgIHNpemVfdCBnZXRBdmFpbGFibGVCdWZmZXJDb3VudChzdGF0dXNfdCAqZmluYWxSZXN1bHQpOworCiAgICAgLy8gUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBsYXN0IGFuZCB0aGUgZmlyc3QgcXVldWVkCiAgICAgLy8gcHJlc2VudGF0aW9uIHRpbWVzdGFtcHMgc2luY2UgdGhlIGxhc3QgZGlzY29udGludWl0eSAoaWYgYW55KS4KICAgICBpbnQ2NF90IGdldEJ1ZmZlcmVkRHVyYXRpb25VcyhzdGF0dXNfdCAqZmluYWxSZXN1bHQpOwogCi0gICAgaW50NjRfdCBnZXRFc3RpbWF0ZWREdXJhdGlvblVzKCk7Ci0KICAgICBzdGF0dXNfdCBuZXh0QnVmZmVyVGltZShpbnQ2NF90ICp0aW1lVXMpOwogCiAgICAgdm9pZCBxdWV1ZUFjY2Vzc1VuaXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CkBAIC02MywyMSArNjksNDggQEAKICAgICB2b2lkIHNpZ25hbEVPUyhzdGF0dXNfdCByZXN1bHQpOwogCiAgICAgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoc3A8QUJ1ZmZlcj4gKmJ1ZmZlcik7CisgICAgdm9pZCByZXF1ZXVlQWNjZXNzVW5pdChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAogICAgIGJvb2wgaXNGaW5pc2hlZChpbnQ2NF90IGR1cmF0aW9uKSBjb25zdDsKIAorICAgIHZvaWQgZW5hYmxlKGJvb2wgZW5hYmxlKTsKKwogICAgIHNwPEFNZXNzYWdlPiBnZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKTsKICAgICBzcDxBTWVzc2FnZT4gZ2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCk7CisgICAgc3A8QU1lc3NhZ2U+IGdldE1ldGFBZnRlckxhc3REZXF1ZXVlZChpbnQ2NF90IGRlbGF5VXMpOworCisgICAgdm9pZCB0cmltQnVmZmVyc0FmdGVyTWV0YShjb25zdCBzcDxBTWVzc2FnZT4gJm1ldGEpOworICAgIHNwPEFNZXNzYWdlPiB0cmltQnVmZmVyc0JlZm9yZU1ldGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtZXRhKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFub3RoZXJQYWNrZXRTb3VyY2UoKTsKIAogcHJpdmF0ZToKKworICAgIHN0cnVjdCBEaXNjb250aW51aXR5U2VnbWVudCB7CisgICAgICAgIGludDY0X3QgbU1heERlcXVlVGltZVVzLCBtTWF4RW5xdWVUaW1lVXM7CisgICAgICAgIERpc2NvbnRpbnVpdHlTZWdtZW50KCkKKyAgICAgICAgICAgIDogbU1heERlcXVlVGltZVVzKC0xKSwKKyAgICAgICAgICAgICAgbU1heEVucXVlVGltZVVzKC0xKSB7CisgICAgICAgIH07CisKKyAgICAgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIG1NYXhEZXF1ZVRpbWVVcyA9IG1NYXhFbnF1ZVRpbWVVcyA9IC0xOworICAgICAgICB9CisgICAgfTsKKworICAgIC8vIERpc2NvbnRpbnVpdHkgc2VnbWVudHMgYXJlIGNvbnNlY3V0aXZlIGFjY2VzcyB1bml0cyBiZXR3ZWVuCisgICAgLy8gZGlzY29udGludWl0eSBtYXJrZXJzLiBUaGVyZSBzaG91bGQgYWx3YXlzIGJlIGF0IGxlYXN0IF9PTkVfCisgICAgLy8gZGlzY29udGludWl0eSBzZWdtZW50LCBoZW5jZSB0aGUgdmFyaW91cyBDSEVDS3MgaW4KKyAgICAvLyBBbm90aGVyUGFja2V0U291cmNlLmNwcCBmb3Igbm9uLWVtcHR5KCktbmVzcy4KKyAgICBMaXN0PERpc2NvbnRpbnVpdHlTZWdtZW50PiBtRGlzY29udGludWl0eVNlZ21lbnRzOworCiAgICAgTXV0ZXggbUxvY2s7CiAgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CiAKICAgICBib29sIG1Jc0F1ZGlvOwogICAgIGJvb2wgbUlzVmlkZW87CisgICAgYm9vbCBtRW5hYmxlZDsKICAgICBzcDxNZXRhRGF0YT4gbUZvcm1hdDsKICAgICBpbnQ2NF90IG1MYXN0UXVldWVkVGltZVVzOwogICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiBtQnVmZmVyczsKQEAgLTg1LDEwICsxMTgsNyBAQAogICAgIHNwPEFNZXNzYWdlPiBtTGF0ZXN0RW5xdWV1ZWRNZXRhOwogICAgIHNwPEFNZXNzYWdlPiBtTGF0ZXN0RGVxdWV1ZWRNZXRhOwogCi0gICAgc2l6ZV90ICBtUXVldWVkRGlzY29udGludWl0eUNvdW50OwotCiAgICAgYm9vbCB3YXNGb3JtYXRDaGFuZ2UoaW50MzJfdCBkaXNjb250aW51aXR5VHlwZSkgY29uc3Q7Ci0gICAgaW50NjRfdCBnZXRCdWZmZXJlZER1cmF0aW9uVXNfbChzdGF0dXNfdCAqZmluYWxSZXN1bHQpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQW5vdGhlclBhY2tldFNvdXJjZSk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKaW5kZXggNTUyN2RmMC4uMzZlYzM2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCkBAIC01Niw2ICs1Niw4IEBACiAgICAgaWYgKGNsZWFyRm9ybWF0KSB7CiAgICAgICAgIG1Gb3JtYXQuY2xlYXIoKTsKICAgICB9CisKKyAgICBtRU9TUmVhY2hlZCA9IGZhbHNlOwogfQogCiAvLyBQYXJzZSBBQzMgaGVhZGVyIGFzc3VtaW5nIHRoZSBjdXJyZW50IHB0ciBpcyBzdGFydCBwb3NpdGlvbiBvZiBzeW5jZnJhbWUsCkBAIC00MTUsMTMgKzQxNywxNCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjYXNlIFBDTV9BVURJTzoKKyAgICAgICAgICAgIGNhc2UgTUVUQURBVEE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBtb2RlOiAlZCIsIG1Nb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfQogCkBAIC00OTksOCArNTAyLDEzIEBACiAgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHNFZpZGVvKCk7CiAgICAgICAgIGNhc2UgUENNX0FVRElPOgogICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0UENNQXVkaW8oKTsKKyAgICAgICAgY2FzZSBNRVRBREFUQToKKyAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdE1ldGFkYXRhKCk7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBDSEVDS19FUSgodW5zaWduZWQpbU1vZGUsICh1bnNpZ25lZClNUEVHX0FVRElPKTsKKyAgICAgICAgICAgIGlmIChtTW9kZSAhPSBNUEVHX0FVRElPKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlVua25vd24gbW9kZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0TVBFR0F1ZGlvKCk7CiAgICAgfQogfQpAQCAtNTM3LDggKzU0NSwxMiBAQAogICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpOwogCiAgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSk7Ci0gICAgQ0hFQ0tfR0UodGltZVVzLCAwbGwpOworICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKKyAgICAgICAgQUxPR0UoIm5lZ2F0aXZlIHRpbWVVcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJpc1N5bmMiLCAxKTsKIAogICAgIG1lbW1vdmUoCiAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCksCkBAIC01NTYsMTUgKzU2OCwyNCBAQAogICAgIH0KIAogICAgIEFCaXRSZWFkZXIgYml0cyhtQnVmZmVyLT5kYXRhKCksIDQpOwotICAgIENIRUNLX0VRKGJpdHMuZ2V0Qml0cyg4KSwgMHhhMCk7CisgICAgaWYgKGJpdHMuZ2V0Qml0cyg4KSAhPSAweGEwKSB7CisgICAgICAgIEFMT0dFKCJVbmV4cGVjdGVkIGJpdCB2YWx1ZXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIHVuc2lnbmVkIG51bUFVcyA9IGJpdHMuZ2V0Qml0cyg4KTsKICAgICBiaXRzLnNraXBCaXRzKDgpOwogICAgIHVuc2lnbmVkIHF1YW50aXphdGlvbl93b3JkX2xlbmd0aCBfX3VudXNlZCA9IGJpdHMuZ2V0Qml0cygyKTsKICAgICB1bnNpZ25lZCBhdWRpb19zYW1wbGluZ19mcmVxdWVuY3kgPSBiaXRzLmdldEJpdHMoMyk7CiAgICAgdW5zaWduZWQgbnVtX2NoYW5uZWxzID0gYml0cy5nZXRCaXRzKDMpOwogCi0gICAgQ0hFQ0tfRVEoYXVkaW9fc2FtcGxpbmdfZnJlcXVlbmN5LCAyKTsgIC8vIDQ4a0h6Ci0gICAgQ0hFQ0tfRVEobnVtX2NoYW5uZWxzLCAxdSk7ICAvLyBzdGVyZW8hCisgICAgaWYgKGF1ZGlvX3NhbXBsaW5nX2ZyZXF1ZW5jeSAhPSAyKSB7CisgICAgICAgIEFMT0dFKCJXcm9uZyBzYW1wbGluZyBmcmVxIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobnVtX2NoYW5uZWxzICE9IDF1KSB7CisgICAgICAgIEFMT0dFKCJXcm9uZyBjaGFubmVsICMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewogICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOwpAQCAtNTg2LDggKzYwNywxMiBAQAogICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSArIDQsIHBheWxvYWRTaXplKTsKIAogICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAocGF5bG9hZFNpemUgKyA0KTsKLSAgICBDSEVDS19HRSh0aW1lVXMsIDBsbCk7CisgICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgICAgICBBTE9HRSgiTmVnYXRpdmUgdGltZVVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImlzU3luYyIsIDEpOwogCiAgICAgaW50MTZfdCAqcHRyID0gKGludDE2X3QgKilhY2Nlc3NVbml0LT5kYXRhKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXlsb2FkU2l6ZSAvIHNpemVvZihpbnQxNl90KTsgKytpKSB7CkBAIC02MDksMjIgKzYzNCwyNSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBDSEVDSyghbVJhbmdlSW5mb3MuZW1wdHkoKSk7CisgICAgaWYgKG1SYW5nZUluZm9zLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAgICAgY29uc3QgUmFuZ2VJbmZvICZpbmZvID0gKm1SYW5nZUluZm9zLmJlZ2luKCk7CiAgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IGluZm8ubUxlbmd0aCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBDSEVDS19HRShpbmZvLm1UaW1lc3RhbXBVcywgMGxsKTsKKyAgICBpZiAoaW5mby5tVGltZXN0YW1wVXMgPCAwbGwpIHsKKyAgICAgICAgQUxPR0UoIk5lZ2F0aXZlIGluZm8ubVRpbWVzdGFtcFVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogICAgIC8vIFRoZSBpZGVhIGhlcmUgaXMgY29uc3VtZSBhbGwgQUFDIGZyYW1lcyBzdGFydGluZyBhdCBvZmZzZXRzIGJlZm9yZQogICAgIC8vIGluZm8ubUxlbmd0aCBzbyB3ZSBjYW4gYXNzaWduIGEgbWVhbmluZ2Z1bCB0aW1lc3RhbXAgd2l0aG91dAogICAgIC8vIGhhdmluZyB0byBpbnRlcnBvbGF0ZS4KICAgICAvLyBUaGUgZmluYWwgQUFDIGZyYW1lIG1heSB3ZWxsIGV4dGVuZCBpbnRvIHRoZSBuZXh0IFJhbmdlSW5mbyBidXQKICAgICAvLyB0aGF0J3Mgb2suCi0gICAgLy8gVE9ETzogdGhlIGxvZ2ljIGNvbW1lbnRlZCBhYm92ZSBpcyBza2lwcGVkIGJlY2F1c2UgY29kZWMgY2Fubm90IHRha2UKLSAgICAvLyBhcmJpdHJhcnkgc2l6ZWQgaW5wdXQgYnVmZmVyczsKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKICAgICB3aGlsZSAob2Zmc2V0IDwgaW5mby5tTGVuZ3RoKSB7CiAgICAgICAgIGlmIChvZmZzZXQgKyA3ID4gbUJ1ZmZlci0+c2l6ZSgpKSB7CkBAIC02MzUsMTcgKzY2MywyNiBAQAogCiAgICAgICAgIC8vIGFkdHNfZml4ZWRfaGVhZGVyCiAKLSAgICAgICAgQ0hFQ0tfRVEoYml0cy5nZXRCaXRzKDEyKSwgMHhmZmZ1KTsKKyAgICAgICAgaWYgKGJpdHMuZ2V0Qml0cygxMikgIT0gMHhmZmZ1KSB7CisgICAgICAgICAgICBBTE9HRSgiV3JvbmcgYXRkc19maXhlZF9oZWFkZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgICAgIGJpdHMuc2tpcEJpdHMoMyk7ICAvLyBJRCwgbGF5ZXIKICAgICAgICAgYm9vbCBwcm90ZWN0aW9uX2Fic2VudCBfX3VudXNlZCA9IGJpdHMuZ2V0Qml0cygxKSAhPSAwOwogCiAgICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKICAgICAgICAgICAgIHVuc2lnbmVkIHByb2ZpbGUgPSBiaXRzLmdldEJpdHMoMik7Ci0gICAgICAgICAgICBDSEVDS19ORShwcm9maWxlLCAzdSk7CisgICAgICAgICAgICBpZiAocHJvZmlsZSA9PSAzdSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJwcm9maWxlIHNob3VsZCBub3QgYmUgMyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQogICAgICAgICAgICAgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCA9IGJpdHMuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgIGJpdHMuZ2V0Qml0cygxKTsgIC8vIHByaXZhdGVfYml0CiAgICAgICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24gPSBiaXRzLmdldEJpdHMoMyk7Ci0gICAgICAgICAgICBDSEVDS19ORShjaGFubmVsX2NvbmZpZ3VyYXRpb24sIDB1KTsKKyAgICAgICAgICAgIGlmIChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPT0gMHUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiY2hhbm5lbF9jb25maWcgc2hvdWxkIG5vdCBiZSAwIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBiaXRzLnNraXBCaXRzKDIpOyAgLy8gb3JpZ2luYWxfY29weSwgaG9tZQogCiAgICAgICAgICAgICBtRm9ybWF0ID0gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKApAQCAtNjU1LDggKzY5MiwxNCBAQAogCiAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CiAgICAgICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzOwotICAgICAgICAgICAgQ0hFQ0sobUZvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwotICAgICAgICAgICAgQ0hFQ0sobUZvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscykpOworICAgICAgICAgICAgaWYgKCFtRm9ybWF0LT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJTYW1wbGVSYXRlIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtRm9ybWF0LT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDaGFubmVsQ291bnQgbm90IGZvdW5kIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBBQUMgY29kZWMgY29uZmlnICglZCBIeiwgJWQgY2hhbm5lbHMpIiwKICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOwpAQCAtNjc5LDcgKzcyMiw4IEBACiAKICAgICAgICAgaWYgKG51bWJlcl9vZl9yYXdfZGF0YV9ibG9ja3NfaW5fZnJhbWUgIT0gMCkgewogICAgICAgICAgICAgLy8gVG8gYmUgaW1wbGVtZW50ZWQuCi0gICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgQUxPR0UoIlNob3VsZCBub3QgcmVhY2ggaGVyZS4iKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG9mZnNldCArIGFhY19mcmFtZV9sZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKQEAgLTY4OSwxMiArNzMzLDkgQEAKICAgICAgICAgc2l6ZV90IGhlYWRlclNpemUgX191bnVzZWQgPSBwcm90ZWN0aW9uX2Fic2VudCA/IDcgOiA5OwogCiAgICAgICAgIG9mZnNldCArPSBhYWNfZnJhbWVfbGVuZ3RoOwotICAgICAgICAvLyBUT0RPOiBtb3ZlIGJhY2sgdG8gY29uY2F0ZW5hdGlvbiB3aGVuIGNvZGVjIGNhbiBzdXBwb3J0IGFyYml0cmFyeSBpbnB1dCBidWZmZXJzLgotICAgICAgICAvLyBGb3Igbm93IG9ubHkgcXVldWUgYSBzaW5nbGUgYnVmZmVyCi0gICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXBBQUMob2Zmc2V0KTsKKyAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKG9mZnNldCk7CiAKICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIob2Zmc2V0KTsKICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCksIG9mZnNldCk7CkBAIC03MDQsNiArNzQ1LDcgQEAKICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpOwogCiAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJpc1N5bmMiLCAxKTsKIAogICAgIHJldHVybiBhY2Nlc3NVbml0OwogfQpAQCAtNzEzLDcgKzc1NSw5IEBACiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CiAKICAgICB3aGlsZSAoc2l6ZSA+IDApIHsKLSAgICAgICAgQ0hFQ0soIW1SYW5nZUluZm9zLmVtcHR5KCkpOworICAgICAgICBpZiAobVJhbmdlSW5mb3MuZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRpbWVVczsKKyAgICAgICAgfQogCiAgICAgICAgIFJhbmdlSW5mbyAqaW5mbyA9ICYqbVJhbmdlSW5mb3MuYmVnaW4oKTsKIApAQCAtNzQxLDUwICs3ODUsNiBAQAogICAgIHJldHVybiB0aW1lVXM7CiB9CiAKLS8vIFRPRE86IGF2b2lkIGludGVycG9sYXRpbmcgdGltZXN0YW1wcyBvbmNlIGNvZGVjIHN1cHBvcnRzIGFyYml0cmFyeSBzaXplZCBpbnB1dCBidWZmZXJzCi1pbnQ2NF90IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZmV0Y2hUaW1lc3RhbXBBQUMoc2l6ZV90IHNpemUpIHsKLSAgICBpbnQ2NF90IHRpbWVVcyA9IC0xOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gICAgc2l6ZV90IHNhbXBsZXNpemUgPSBzaXplOwotICAgIHdoaWxlIChzaXplID4gMCkgewotICAgICAgICBDSEVDSyghbVJhbmdlSW5mb3MuZW1wdHkoKSk7Ci0KLSAgICAgICAgUmFuZ2VJbmZvICppbmZvID0gJiptUmFuZ2VJbmZvcy5iZWdpbigpOwotCi0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgdGltZVVzID0gaW5mby0+bVRpbWVzdGFtcFVzOwotICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmZvLT5tTGVuZ3RoID4gc2l6ZSkgewotICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwotICAgICAgICAgICAgQ0hFQ0sobUZvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwotICAgICAgICAgICAgaW5mby0+bUxlbmd0aCAtPSBzaXplOwotICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSAxMDI0ICogc2l6ZSAvIHNhbXBsZXNpemU7Ci0gICAgICAgICAgICBpbmZvLT5tVGltZXN0YW1wVXMgKz0gbnVtU2FtcGxlcyAqIDEwMDAwMDBsbCAvIHNhbXBsZVJhdGU7Ci0gICAgICAgICAgICBzaXplID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNpemUgLT0gaW5mby0+bUxlbmd0aDsKLQotICAgICAgICAgICAgbVJhbmdlSW5mb3MuZXJhc2UobVJhbmdlSW5mb3MuYmVnaW4oKSk7Ci0gICAgICAgICAgICBpbmZvID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgaWYgKHRpbWVVcyA9PSAwbGwpIHsKLSAgICAgICAgQUxPR1YoIlJldHVybmluZyAwIHRpbWVzdGFtcCIpOwotICAgIH0KLQotICAgIHJldHVybiB0aW1lVXM7Ci19Ci0KLXN0cnVjdCBOQUxQb3NpdGlvbiB7Ci0gICAgc2l6ZV90IG5hbE9mZnNldDsKLSAgICBzaXplX3QgbmFsU2l6ZTsKLX07Ci0KIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRIMjY0KCkgewogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBtQnVmZmVyLT5kYXRhKCk7CiAKQEAgLTc5MiwxMSArNzkyLDEzIEBACiAgICAgVmVjdG9yPE5BTFBvc2l0aW9uPiBuYWxzOwogCiAgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IDA7CisgICAgc2l6ZV90IHNlaUNvdW50ID0gMDsKIAogICAgIHN0YXR1c190IGVycjsKICAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKICAgICBzaXplX3QgbmFsU2l6ZTsKICAgICBib29sIGZvdW5kU2xpY2UgPSBmYWxzZTsKKyAgICBib29sIGZvdW5kSURSID0gZmFsc2U7CiAgICAgd2hpbGUgKChlcnIgPSBnZXROZXh0TkFMVW5pdCgmZGF0YSwgJnNpemUsICZuYWxTdGFydCwgJm5hbFNpemUpKSA9PSBPSykgewogICAgICAgICBpZiAobmFsU2l6ZSA9PSAwKSBjb250aW51ZTsKIApAQCAtODA0LDYgKzgwNiw5IEBACiAgICAgICAgIGJvb2wgZmx1c2ggPSBmYWxzZTsKIAogICAgICAgICBpZiAobmFsVHlwZSA9PSAxIHx8IG5hbFR5cGUgPT0gNSkgeworICAgICAgICAgICAgaWYgKG5hbFR5cGUgPT0gNSkgeworICAgICAgICAgICAgICAgIGZvdW5kSURSID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChmb3VuZFNsaWNlKSB7CiAgICAgICAgICAgICAgICAgQUJpdFJlYWRlciBicihuYWxTdGFydCArIDEsIG5hbFNpemUpOwogICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZpcnN0X21iX2luX3NsaWNlID0gcGFyc2VVRSgmYnIpOwpAQCAtODIxLDYgKzgyNiw5IEBACiAgICAgICAgICAgICAvLyBuZXh0IGZyYW1lLgogCiAgICAgICAgICAgICBmbHVzaCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAobmFsVHlwZSA9PSA2ICYmIG5hbFNpemUgPiAwKSB7CisgICAgICAgICAgICAvLyBmb3VuZCBub24temVybyBzaXplZCBTRUkKKyAgICAgICAgICAgICsrc2VpQ291bnQ7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZmx1c2gpIHsKQEAgLTgyOSwyMSArODM3LDMyIEBACiAKICAgICAgICAgICAgIHNpemVfdCBhdVNpemUgPSA0ICogbmFscy5zaXplKCkgKyB0b3RhbFNpemU7CiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoYXVTaXplKTsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IHNlaTsKKworICAgICAgICAgICAgaWYgKHNlaUNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHNlaSA9IG5ldyBBQnVmZmVyKHNlaUNvdW50ICogc2l6ZW9mKE5BTFBvc2l0aW9uKSk7CisgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRCdWZmZXIoInNlaSIsIHNlaSk7CisgICAgICAgICAgICB9CiAKICNpZiAhTE9HX05ERUJVRwogICAgICAgICAgICAgQVN0cmluZyBvdXQ7CiAjZW5kaWYKIAogICAgICAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisgICAgICAgICAgICBzaXplX3Qgc2VpSW5kZXggPSAwOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYWxzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgTkFMUG9zaXRpb24gJnBvcyA9IG5hbHMuaXRlbUF0KGkpOwogCiAgICAgICAgICAgICAgICAgdW5zaWduZWQgbmFsVHlwZSA9IG1CdWZmZXItPmRhdGEoKVtwb3MubmFsT2Zmc2V0XSAmIDB4MWY7CiAKLSAgICAgICAgICAgICAgICBpZiAobmFsVHlwZSA9PSA2KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IHNlaSA9IG5ldyBBQnVmZmVyKHBvcy5uYWxTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHNlaS0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCkgKyBwb3MubmFsT2Zmc2V0LCBwb3MubmFsU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0QnVmZmVyKCJzZWkiLCBzZWkpOworICAgICAgICAgICAgICAgIGlmIChuYWxUeXBlID09IDYgJiYgcG9zLm5hbFNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZWlJbmRleCA+PSBzZWktPnNpemUoKSAvIHNpemVvZihOQUxQb3NpdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJXcm9uZyBzZWlJbmRleCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgTkFMUG9zaXRpb24gJnNlaVBvcyA9ICgoTkFMUG9zaXRpb24gKilzZWktPmRhdGEoKSlbc2VpSW5kZXgrK107CisgICAgICAgICAgICAgICAgICAgIHNlaVBvcy5uYWxPZmZzZXQgPSBkc3RPZmZzZXQgKyA0OworICAgICAgICAgICAgICAgICAgICBzZWlQb3MubmFsU2l6ZSA9IHBvcy5uYWxTaXplOwogICAgICAgICAgICAgICAgIH0KIAogI2lmICFMT0dfTkRFQlVHCkBAIC04NzgsOSArODk3LDE1IEBACiAgICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBuZXh0U2Nhbik7CiAKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAobmV4dFNjYW4pOwotICAgICAgICAgICAgQ0hFQ0tfR0UodGltZVVzLCAwbGwpOworICAgICAgICAgICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJOZWdhdGl2ZSB0aW1lVXMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICAgICAgICAgIGlmIChmb3VuZElEUikgeworICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImlzU3luYyIsIDEpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgbUZvcm1hdCA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShhY2Nlc3NVbml0KTsKQEAgLTg5Nyw3ICs5MjIsMTAgQEAKIAogICAgICAgICB0b3RhbFNpemUgKz0gbmFsU2l6ZTsKICAgICB9Ci0gICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpLUVBR0FJTik7CisgICAgaWYgKGVyciAhPSAoc3RhdHVzX3QpLUVBR0FJTikgeworICAgICAgICBBTE9HRSgiVW5leHBldGVkIGVyciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICAgICByZXR1cm4gTlVMTDsKIH0KQEAgLTkxNCw5ICs5NDIsMTIgQEAKIAogICAgIHNpemVfdCBmcmFtZVNpemU7CiAgICAgaW50IHNhbXBsaW5nUmF0ZSwgbnVtQ2hhbm5lbHMsIGJpdHJhdGUsIG51bVNhbXBsZXM7Ci0gICAgQ0hFQ0soR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAorICAgIGlmICghR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAogICAgICAgICAgICAgICAgIGhlYWRlciwgJmZyYW1lU2l6ZSwgJnNhbXBsaW5nUmF0ZSwgJm51bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICZiaXRyYXRlLCAmbnVtU2FtcGxlcykpOworICAgICAgICAgICAgICAgICZiaXRyYXRlLCAmbnVtU2FtcGxlcykpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgYXVkaW8gZnJhbWUgc2l6ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICAgICBpZiAoc2l6ZSA8IGZyYW1lU2l6ZSkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTkzNCw5ICs5NjUsMTMgQEAKICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBmcmFtZVNpemUpOwogCiAgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChmcmFtZVNpemUpOwotICAgIENIRUNLX0dFKHRpbWVVcywgMGxsKTsKKyAgICBpZiAodGltZVVzIDwgMGxsKSB7CisgICAgICAgIEFMT0dFKCJOZWdhdGl2ZSB0aW1lVXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJpc1N5bmMiLCAxKTsKIAogICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKQEAgLTk1NSw3ICs5OTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCiAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGluZ1JhdGUpOwpAQCAtOTY2LDcgKzEwMDEsMTAgQEAKIH0KIAogc3RhdGljIHZvaWQgRW5jb2RlU2l6ZTE0KHVpbnQ4X3QgKipfcHRyLCBzaXplX3Qgc2l6ZSkgewotICAgIENIRUNLX0xFKHNpemUsIDB4M2ZmZik7CisgICAgaWYgKHNpemUgPiAweDNmZmYpIHsKKyAgICAgICAgQUxPR0UoIldyb25nIHNpemUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIHVpbnQ4X3QgKnB0ciA9ICpfcHRyOwogCkBAIC0xMDEzLDYgKzEwNTEsOSBAQAogICAgIGludCBwcHJldlN0YXJ0Q29kZSA9IC0xOwogICAgIGludCBwcmV2U3RhcnRDb2RlID0gLTE7CiAgICAgaW50IGN1cnJlbnRTdGFydENvZGUgPSAtMTsKKyAgICBib29sIGdvcEZvdW5kID0gZmFsc2U7CisgICAgYm9vbCBpc0Nsb3NlZEdvcCA9IGZhbHNlOworICAgIGJvb2wgYnJva2VuTGluayA9IGZhbHNlOwogCiAgICAgc2l6ZV90IG9mZnNldCA9IDA7CiAgICAgd2hpbGUgKG9mZnNldCArIDMgPCBzaXplKSB7CkBAIC0xMDM4LDcgKzEwNzksMTAgQEAKICAgICAgICAgICAgIC8vIHNlcUhlYWRlciB3aXRob3V0L3dpdGggZXh0ZW5zaW9uCiAKICAgICAgICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBDSEVDS19HRShzaXplLCA3dSk7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCA3dSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiU2l6ZSB0b28gc21hbGwiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgdW5zaWduZWQgd2lkdGggPQogICAgICAgICAgICAgICAgICAgICAoZGF0YVs0XSA8PCA0KSB8IGRhdGFbNV0gPj4gNDsKQEAgLTEwNzUsNiArMTExOSwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1Gb3JtYXQgIT0gTlVMTCAmJiBjdXJyZW50U3RhcnRDb2RlID09IDB4YjgpIHsKKyAgICAgICAgICAgIC8vIEdPUCBsYXllcgorICAgICAgICAgICAgZ29wRm91bmQgPSB0cnVlOworICAgICAgICAgICAgaXNDbG9zZWRHb3AgPSAoZGF0YVtvZmZzZXQgKyA3XSAmIDB4NDApICE9IDA7CisgICAgICAgICAgICBicm9rZW5MaW5rID0gKGRhdGFbb2Zmc2V0ICsgN10gJiAweDIwKSAhPSAwOworICAgICAgICB9CisKICAgICAgICAgaWYgKG1Gb3JtYXQgIT0gTlVMTCAmJiBjdXJyZW50U3RhcnRDb2RlID09IDB4MDApIHsKICAgICAgICAgICAgIC8vIFBpY3R1cmUgc3RhcnQKIApAQCAtMTA5MSwxMSArMTE0MiwxNyBAQAogICAgICAgICAgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSAtIG9mZnNldCk7CiAKICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0UodGltZVVzLCAwbGwpOworICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5lZ2F0aXZlIHRpbWVVcyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwOwogCiAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZ29wRm91bmQgJiYgKCFicm9rZW5MaW5rIHx8IGlzQ2xvc2VkR29wKSkgeworICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJpc1N5bmMiLCAxKTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBBTE9HVigicmV0dXJuaW5nIE1QRUcgdmlkZW8gYWNjZXNzIHVuaXQgYXQgdGltZSAlIiBQUklkNjQgIiB1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzKTsKQEAgLTExMjEsNyArMTE3OCw3IEBACiAgICAgfQogCiAgICAgaWYgKG1lbWNtcChrU3RhcnRDb2RlLCBkYXRhLCAzKSkgewotICAgICAgICBUUkVTUEFTUygpOworICAgICAgICByZXR1cm4gLUVBR0FJTjsKICAgICB9CiAKICAgICBzaXplX3Qgb2Zmc2V0ID0gMzsKQEAgLTExODEsMjUgKzEyMzgsMzcgQEAKIAogICAgICAgICAgICAgY2FzZSBFWFBFQ1RfVklTVUFMX09CSkVDVF9TVEFSVDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShjaHVua1R5cGUsIDB4YjUpOworICAgICAgICAgICAgICAgIGlmIChjaHVua1R5cGUgIT0gMHhiNSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVW5leHBlY3RlZCBjaHVua1R5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHN0YXRlID0gRVhQRUNUX1ZPX1NUQVJUOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjYXNlIEVYUEVDVF9WT19TVEFSVDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDSEVDS19MRShjaHVua1R5cGUsIDB4MWYpOworICAgICAgICAgICAgICAgIGlmIChjaHVua1R5cGUgPiAweDFmKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbmV4cGVjdGVkIGNodW5rVHlwZSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBFWFBFQ1RfVk9MX1NUQVJUOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjYXNlIEVYUEVDVF9WT0xfU1RBUlQ6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soKGNodW5rVHlwZSAmIDB4ZjApID09IDB4MjApOworICAgICAgICAgICAgICAgIGlmICgoY2h1bmtUeXBlICYgMHhmMCkgIT0gMHgyMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiV3JvbmcgY2h1bmtUeXBlIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIENIRUNLKEV4dHJhY3REaW1lbnNpb25zRnJvbVZPTEhlYWRlcigKKyAgICAgICAgICAgICAgICBpZiAoIUV4dHJhY3REaW1lbnNpb25zRnJvbVZPTEhlYWRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVtvZmZzZXRdLCBjaHVua1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLCAmaGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBkaW1lbnNpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgc3RhdGUgPSBXQUlUX0ZPUl9WT1BfU1RBUlQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMjQwLDYgKzEzMDksOCBAQAogICAgICAgICAgICAgY2FzZSBTS0lQX1RPX1ZPUF9TVEFSVDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoY2h1bmtUeXBlID09IDB4YjYpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZvcENvZGluZ1R5cGUgPSAoZGF0YVtvZmZzZXQgKyA0XSAmIDB4YzApID4+IDY7CisKICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGNodW5rU2l6ZTsKIAogICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIob2Zmc2V0KTsKQEAgLTEyNTAsMTEgKzEzMjEsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgc2l6ZSk7CiAKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBDSEVDS19HRSh0aW1lVXMsIDBsbCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOZWdhdGl2ZSB0aW1ldXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKIAogICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICAgICAgICAgICAgICBpZiAodm9wQ29kaW5nVHlwZSA9PSAwKSB7ICAvLyBpbnRyYS1jb2RlZCBWT1AKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImlzU3luYyIsIDEpOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJldHVybmluZyBNUEVHNCB2aWRlbyBhY2Nlc3MgdW5pdCBhdCB0aW1lICUiIFBSSWQ2NCAiIHVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMpOwpAQCAtMTI3MSw3ICsxMzQ4LDggQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIHN0YXRlOiAlZCIsIHN0YXRlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChkaXNjYXJkKSB7CkBAIC0xMzAwLDUgKzEzNzgsMjUgQEAKICAgICB9CiB9CiAKK3NwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRNZXRhZGF0YSgpIHsKKyAgICBzaXplX3Qgc2l6ZSA9IG1CdWZmZXItPnNpemUoKTsKKyAgICBpZiAoIXNpemUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKHNpemUpOworICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAoc2l6ZSk7CisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKworICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgc2l6ZSk7CisgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisKKyAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9EQVRBX1RJTUVEX0lEMyk7CisgICAgfQorCisgICAgcmV0dXJuIGFjY2Vzc1VuaXQ7Cit9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCmluZGV4IGE2ZDgxMmYuLmU5Zjk2YjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCkBAIC0zNyw2ICszNyw3IEBACiAgICAgICAgIE1QRUdfVklERU8sCiAgICAgICAgIE1QRUc0X1ZJREVPLAogICAgICAgICBQQ01fQVVESU8sCisgICAgICAgIE1FVEFEQVRBLAogICAgIH07CiAKICAgICBlbnVtIEZsYWdzIHsKQEAgLTc1LDExICs3NiwxMSBAQAogICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0TVBFR1ZpZGVvKCk7CiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHNFZpZGVvKCk7CiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRQQ01BdWRpbygpOworICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0TWV0YWRhdGEoKTsKIAogICAgIC8vIGNvbnN1bWUgYSBsb2dpY2FsIChjb21wcmVzc2VkKSBhY2Nlc3MgdW5pdCBvZiBzaXplICJzaXplIiwKICAgICAvLyByZXR1cm5zIGl0cyB0aW1lc3RhbXAgaW4gdXMgKG9yIC0xIGlmIG5vIHRpbWUgaW5mb3JtYXRpb24pLgogICAgIGludDY0X3QgZmV0Y2hUaW1lc3RhbXAoc2l6ZV90IHNpemUpOwotICAgIGludDY0X3QgZmV0Y2hUaW1lc3RhbXBBQUMoc2l6ZV90IHNpemUpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRWxlbWVudGFyeVN0cmVhbVF1ZXVlKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyUFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlBTRXh0cmFjdG9yLmNwcAppbmRleCA4NTg1OWY3Li42ZDlmZTlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyUFNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJQU0V4dHJhY3Rvci5jcHAKQEAgLTI2NSw3ICsyNjUsMTAgQEAKICAgICB9CiAKICAgICB1bnNpZ25lZCBQRVNfcGFja2V0X2xlbmd0aCA9IFUxNl9BVChtQnVmZmVyLT5kYXRhKCkgKyA0KTsKLSAgICBDSEVDS19ORShQRVNfcGFja2V0X2xlbmd0aCwgMHUpOworICAgIGlmIChQRVNfcGFja2V0X2xlbmd0aCA9PSAwdSkgeworICAgICAgICBBTE9HRSgiUEVTX3BhY2tldF9sZW5ndGggaXMgMCIpOworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CiAKICAgICBzaXplX3QgbiA9IFBFU19wYWNrZXRfbGVuZ3RoICsgNjsKIApAQCAtMjg2LDcgKzI4OSwxMCBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIENIRUNLX0VRKHBhY2tldF9zdGFydGNvZGVfcHJlZml4LCAweDAwMDAwMXUpOworICAgIGlmIChwYWNrZXRfc3RhcnRjb2RlX3ByZWZpeCAhPSAweDAwMDAwMXUpIHsKKyAgICAgICAgQUxPR0UoIldyb25nIFBFUyBwcmVmaXgiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CiAKICAgICB1bnNpZ25lZCBzdHJlYW1faWQgPSBici5nZXRCaXRzKDgpOwogICAgIEFMT0dWKCJzdHJlYW1faWQgPSAweCUwMngiLCBzdHJlYW1faWQpOwpAQCAtMzY2LDggKzM3Miw3IEBACiAgICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmZiAgLy8gcHJvZ3JhbV9zdHJlYW1fZGlyZWN0b3J5CiAgICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmMiAgLy8gRFNNQ0MKICAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGY4KSB7ICAvLyBILjIyMi4xIHR5cGUgRQotICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDIpLCAydSk7Ci0KKyAgICAgICAgLyogdW5zaWduZWQgUEVTX21hcmtlcl9iaXRzID0gKi9ici5nZXRCaXRzKDIpOyAgLy8gc2hvdWxkIGJlIDB4MihoZXgpCiAgICAgICAgIC8qIHVuc2lnbmVkIFBFU19zY3JhbWJsaW5nX2NvbnRyb2wgPSAqL2JyLmdldEJpdHMoMik7CiAgICAgICAgIC8qIHVuc2lnbmVkIFBFU19wcmlvcml0eSA9ICovYnIuZ2V0Qml0cygxKTsKICAgICAgICAgLyogdW5zaWduZWQgZGF0YV9hbGlnbm1lbnRfaW5kaWNhdG9yID0gKi9ici5nZXRCaXRzKDEpOwpAQCAtNDAwLDE2ICs0MDUsMjYgQEAKICAgICAgICAgdWludDY0X3QgUFRTID0gMCwgRFRTID0gMDsKIAogICAgICAgICBpZiAoUFRTX0RUU19mbGFncyA9PSAyIHx8IFBUU19EVFNfZmxhZ3MgPT0gMykgewotICAgICAgICAgICAgQ0hFQ0tfR0Uob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nLCA1dSk7CisgICAgICAgICAgICBpZiAob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIDwgNXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDQpLCBQVFNfRFRTX2ZsYWdzKTsKKyAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDQpICE9IFBUU19EVFNfZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBQVFMgPSAoKHVpbnQ2NF90KWJyLmdldEJpdHMoMykpIDw8IDMwOwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogICAgICAgICAgICAgUFRTIHw9ICgodWludDY0X3QpYnIuZ2V0Qml0cygxNSkpIDw8IDE1OwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogICAgICAgICAgICAgUFRTIHw9IGJyLmdldEJpdHMoMTUpOwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBBTE9HVigiUFRTID0gJSIgUFJJdTY0LCBQVFMpOwogICAgICAgICAgICAgLy8gQUxPR0koIlBUUyA9ICUuMmYgc2VjcyIsIFBUUyAvIDkwMDAwLjBmKTsKQEAgLTQxNywxNiArNDMyLDI2IEBACiAgICAgICAgICAgICBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgLT0gNTsKIAogICAgICAgICAgICAgaWYgKFBUU19EVFNfZmxhZ3MgPT0gMykgewotICAgICAgICAgICAgICAgIENIRUNLX0dFKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZywgNXUpOworICAgICAgICAgICAgICAgIGlmIChvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgPCA1dSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoNCksIDF1KTsKKyAgICAgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cyg0KSAhPSAxdSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIERUUyA9ICgodWludDY0X3QpYnIuZ2V0Qml0cygzKSkgPDwgMzA7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIERUUyB8PSAoKHVpbnQ2NF90KWJyLmdldEJpdHMoMTUpKSA8PCAxNTsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRFRTIHw9IGJyLmdldEJpdHMoMTUpOwotICAgICAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIEFMT0dWKCJEVFMgPSAlIiBQUkl1NjQsIERUUyk7CiAKQEAgLTQzNSw0MCArNDYwLDYyIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoRVNDUl9mbGFnKSB7Ci0gICAgICAgICAgICBDSEVDS19HRShvcHRpb25hbF9ieXRlc19yZW1haW5pbmcsIDZ1KTsKKyAgICAgICAgICAgIGlmIChvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgPCA2dSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJyLmdldEJpdHMoMik7CiAKICAgICAgICAgICAgIHVpbnQ2NF90IEVTQ1IgPSAoKHVpbnQ2NF90KWJyLmdldEJpdHMoMykpIDw8IDMwOwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogICAgICAgICAgICAgRVNDUiB8PSAoKHVpbnQ2NF90KWJyLmdldEJpdHMoMTUpKSA8PCAxNTsKLSAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIEVTQ1IgfD0gYnIuZ2V0Qml0cygxNSk7Ci0gICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEFMT0dWKCJFU0NSID0gJSIgUFJJdTY0LCBFU0NSKTsKICAgICAgICAgICAgIC8qIHVuc2lnbmVkIEVTQ1JfZXh0ZW5zaW9uID0gKi9ici5nZXRCaXRzKDkpOwogCi0gICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA2OwogICAgICAgICB9CiAKICAgICAgICAgaWYgKEVTX3JhdGVfZmxhZykgewotICAgICAgICAgICAgQ0hFQ0tfR0Uob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nLCAzdSk7CisgICAgICAgICAgICBpZiAob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIDwgM3UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvKiB1bnNpZ25lZCBFU19yYXRlID0gKi9ici5nZXRCaXRzKDIyKTsKLSAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDM7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAqIDgpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKwogICAgICAgICBici5za2lwQml0cyhvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgKiA4KTsKIAogICAgICAgICAvLyBFUyBkYXRhIGZvbGxvd3MuCiAKLSAgICAgICAgQ0hFQ0tfR0UoUEVTX3BhY2tldF9sZW5ndGgsIFBFU19oZWFkZXJfZGF0YV9sZW5ndGggKyAzKTsKKyAgICAgICAgaWYgKFBFU19wYWNrZXRfbGVuZ3RoIDwgUEVTX2hlYWRlcl9kYXRhX2xlbmd0aCArIDMpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KIAogICAgICAgICB1bnNpZ25lZCBkYXRhTGVuZ3RoID0KICAgICAgICAgICAgIFBFU19wYWNrZXRfbGVuZ3RoIC0gMyAtIFBFU19oZWFkZXJfZGF0YV9sZW5ndGg7CkBAIC00ODEsNyArNTI4LDkgQEAKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KIAotICAgICAgICBDSEVDS19HRShici5udW1CaXRzTGVmdCgpLCBkYXRhTGVuZ3RoICogOCk7CisgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgZGF0YUxlbmd0aCAqIDgpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KIAogICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVRyYWNrcy5pbmRleE9mS2V5KHN0cmVhbV9pZCk7CiAgICAgICAgIGlmIChpbmRleCA8IDAgJiYgbVNjYW5uaW5nKSB7CkBAIC01MjEsMTAgKzU3MCwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoc3RyZWFtX2lkID09IDB4YmUpIHsgIC8vIHBhZGRpbmdfc3RyZWFtCi0gICAgICAgIENIRUNLX05FKFBFU19wYWNrZXRfbGVuZ3RoLCAwdSk7CisgICAgICAgIGlmIChQRVNfcGFja2V0X2xlbmd0aCA9PSAwdSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQogICAgICAgICBici5za2lwQml0cyhQRVNfcGFja2V0X2xlbmd0aCAqIDgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLX05FKFBFU19wYWNrZXRfbGVuZ3RoLCAwdSk7CisgICAgICAgIGlmIChQRVNfcGFja2V0X2xlbmd0aCA9PSAwdSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQogICAgICAgICBici5za2lwQml0cyhQRVNfcGFja2V0X2xlbmd0aCAqIDgpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKaW5kZXggNzRjYjVkOC4uY2JlOTY3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCkBAIC0xNiwxNyArMTYsMjIgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNUEVHMlRTRXh0cmFjdG9yIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgpAQCAtNDAsNyArNDUsNyBAQAogICAgIE1QRUcyVFNTb3VyY2UoCiAgICAgICAgICAgICBjb25zdCBzcDxNUEVHMlRTRXh0cmFjdG9yPiAmZXh0cmFjdG9yLAogICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwsCi0gICAgICAgICAgICBib29sIHNlZWthYmxlKTsKKyAgICAgICAgICAgIGJvb2wgZG9lc1NlZWspOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CkBAIC01NCw4ICs1OSw4IEBACiAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbUltcGw7CiAKICAgICAvLyBJZiB0aGVyZSBhcmUgYm90aCBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtcywgb25seSB0aGUgdmlkZW8gc3RyZWFtCi0gICAgLy8gd2lsbCBiZSBzZWVrYWJsZSwgb3RoZXJ3aXNlIHRoZSBzaW5nbGUgc3RyZWFtIHdpbGwgYmUgc2Vla2FibGUuCi0gICAgYm9vbCBtU2Vla2FibGU7CisgICAgLy8gd2lsbCBzaWduYWwgc2VlayBvbiB0aGUgZXh0cmFjdG9yOyBvdGhlcndpc2UgdGhlIHNpbmdsZSBzdHJlYW0gd2lsbCBzZWVrLgorICAgIGJvb2wgbURvZXNTZWVrOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVBFRzJUU1NvdXJjZSk7CiB9OwpAQCAtNjMsMTAgKzY4LDEwIEBACiBNUEVHMlRTU291cmNlOjpNUEVHMlRTU291cmNlKAogICAgICAgICBjb25zdCBzcDxNUEVHMlRTRXh0cmFjdG9yPiAmZXh0cmFjdG9yLAogICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCwKLSAgICAgICAgYm9vbCBzZWVrYWJsZSkKKyAgICAgICAgYm9vbCBkb2VzU2VlaykKICAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKICAgICAgIG1JbXBsKGltcGwpLAotICAgICAgbVNlZWthYmxlKHNlZWthYmxlKSB7CisgICAgICBtRG9lc1NlZWsoZG9lc1NlZWspIHsKIH0KIAogc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewpAQCAtODUsMjcgKzkwLDE4IEBACiAgICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCi0gICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7Ci0gICAgd2hpbGUgKCFtSW1wbC0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKLSAgICAgICAgaWYgKGZpbmFsUmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPmZlZWRNb3JlKCk7CisgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKKyAgICBpZiAobURvZXNTZWVrICYmIG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKSB7CisgICAgICAgIC8vIHNlZWsgaXMgbmVlZGVkCisgICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNlZWsoc2Vla1RpbWVVcywgc2Vla01vZGUpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBtSW1wbC0+c2lnbmFsRU9TKGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKLSAgICBpZiAobVNlZWthYmxlICYmIG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKSB7Ci0gICAgICAgIC8vIEEgc2VlayB3YXMgcmVxdWVzdGVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkgc3VwcG9ydCBzZWVraW5nIGFuZCBzbyBjYW4gb25seSAic2VlayIgdG8KLSAgICAgICAgLy8gdGhlIGN1cnJlbnQgcG9zaXRpb24KLSAgICAgICAgaW50NjRfdCBuZXh0QnVmVGltZVVzOwotICAgICAgICBpZiAobUltcGwtPm5leHRCdWZmZXJUaW1lKCZuZXh0QnVmVGltZVVzKSAhPSBPSyB8fCBzZWVrVGltZVVzICE9IG5leHRCdWZUaW1lVXMpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICAgICAgfQorICAgIGlmIChtRXh0cmFjdG9yLT5mZWVkVW50aWxCdWZmZXJBdmFpbGFibGUobUltcGwpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAogICAgIHJldHVybiBtSW1wbC0+cmVhZChvdXQsIG9wdGlvbnMpOwpAQCAtMTI5LDIwICsxMjUsMTAgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgYm9vbCBzZWVrYWJsZSA9IHRydWU7Ci0gICAgaWYgKG1Tb3VyY2VJbXBscy5zaXplKCkgPiAxKSB7Ci0gICAgICAgIENIRUNLX0VRKG1Tb3VyY2VJbXBscy5zaXplKCksIDJ1KTsKLQotICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2VJbXBscy5lZGl0SXRlbUF0KGluZGV4KS0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLQotICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLCA2KSkgewotICAgICAgICAgICAgc2Vla2FibGUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBuZXcgTVBFRzJUU1NvdXJjZSh0aGlzLCBtU291cmNlSW1wbHMuZWRpdEl0ZW1BdChpbmRleCksIHNlZWthYmxlKTsKKyAgICAvLyBUaGUgc2VlayByZWZlcmVuY2UgdHJhY2sgKHZpZGVvIGlmIHByZXNlbnQ7IGF1ZGlvIG90aGVyd2lzZSkgcGVyZm9ybXMKKyAgICAvLyBzZWVrIHJlcXVlc3RzLCB3aGlsZSBvdGhlciB0cmFja3MgaWdub3JlIHJlcXVlc3RzLgorICAgIHJldHVybiBuZXcgTVBFRzJUU1NvdXJjZSh0aGlzLCBtU291cmNlSW1wbHMuZWRpdEl0ZW1BdChpbmRleCksCisgICAgICAgICAgICAobVNlZWtTeW5jUG9pbnRzID09ICZtU3luY1BvaW50cy5lZGl0SXRlbUF0KGluZGV4KSkpOwogfQogCiBzcDxNZXRhRGF0YT4gTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKQEAgLTE2MSw3ICsxNDcsNyBAQAogdm9pZCBNUEVHMlRTRXh0cmFjdG9yOjppbml0KCkgewogICAgIGJvb2wgaGF2ZUF1ZGlvID0gZmFsc2U7CiAgICAgYm9vbCBoYXZlVmlkZW8gPSBmYWxzZTsKLSAgICBpbnQgbnVtUGFja2V0c1BhcnNlZCA9IDA7CisgICAgaW50NjRfdCBzdGFydFRpbWUgPSBBTG9vcGVyOjpHZXROb3dVcygpOwogCiAgICAgd2hpbGUgKGZlZWRNb3JlKCkgPT0gT0spIHsKICAgICAgICAgaWYgKGhhdmVBdWRpbyAmJiBoYXZlVmlkZW8pIHsKQEAgLTE3NSw2ICsxNjEsOCBAQAogICAgICAgICAgICAgaWYgKGltcGwgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGhhdmVWaWRlbyA9IHRydWU7CiAgICAgICAgICAgICAgICAgbVNvdXJjZUltcGxzLnB1c2goaW1wbCk7CisgICAgICAgICAgICAgICAgbVN5bmNQb2ludHMucHVzaCgpOworICAgICAgICAgICAgICAgIG1TZWVrU3luY1BvaW50cyA9ICZtU3luY1BvaW50cy5lZGl0VG9wKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTg2LDE1ICsxNzQsNzUgQEAKICAgICAgICAgICAgIGlmIChpbXBsICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwogICAgICAgICAgICAgICAgIG1Tb3VyY2VJbXBscy5wdXNoKGltcGwpOworICAgICAgICAgICAgICAgIG1TeW5jUG9pbnRzLnB1c2goKTsKKyAgICAgICAgICAgICAgICBpZiAoIWhhdmVWaWRlbykgeworICAgICAgICAgICAgICAgICAgICBtU2Vla1N5bmNQb2ludHMgPSAmbVN5bmNQb2ludHMuZWRpdFRvcCgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmICgrK251bVBhY2tldHNQYXJzZWQgPiAxMDAwMCkgeworICAgICAgICAvLyBXYWl0IG9ubHkgZm9yIDIgc2Vjb25kcyB0byBkZXRlY3QgYXVkaW8vdmlkZW8gc3RyZWFtcy4KKyAgICAgICAgaWYgKEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWUgPiAyMDAwMDAwbGwpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR0koImhhdmVBdWRpbz0lZCwgaGF2ZVZpZGVvPSVkIiwgaGF2ZUF1ZGlvLCBoYXZlVmlkZW8pOworICAgIG9mZjY0X3Qgc2l6ZTsKKyAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LICYmIChoYXZlQXVkaW8gfHwgaGF2ZVZpZGVvKSkgeworICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBpbXBsID0gaGF2ZVZpZGVvCisgICAgICAgICAgICAgICAgPyAoQW5vdGhlclBhY2tldFNvdXJjZSAqKW1QYXJzZXItPmdldFNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6VklERU8pLmdldCgpCisgICAgICAgICAgICAgICAgOiAoQW5vdGhlclBhY2tldFNvdXJjZSAqKW1QYXJzZXItPmdldFNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6QVVESU8pLmdldCgpOworICAgICAgICBzaXplX3QgcHJldlN5bmNTaXplID0gMTsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gLTE7CisgICAgICAgIExpc3Q8aW50NjRfdD4gZHVyYXRpb25zOworICAgICAgICAvLyBFc3RpbWF0ZSBkdXJhdGlvbiAtLS0gc3RhYmlsaXplIHVudGlsIHlvdSBnZXQgPDUwMG1zIGRldmlhdGlvbi4KKyAgICAgICAgd2hpbGUgKGZlZWRNb3JlKCkgPT0gT0sKKyAgICAgICAgICAgICAgICAmJiBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lIDw9IDIwMDAwMDBsbCkgeworICAgICAgICAgICAgaWYgKG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpID4gcHJldlN5bmNTaXplKSB7CisgICAgICAgICAgICAgICAgcHJldlN5bmNTaXplID0gbVNlZWtTeW5jUG9pbnRzLT5zaXplKCk7CisgICAgICAgICAgICAgICAgaW50NjRfdCBkaWZmVXMgPSBtU2Vla1N5bmNQb2ludHMtPmtleUF0KHByZXZTeW5jU2l6ZSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAtIG1TZWVrU3luY1BvaW50cy0+a2V5QXQoMCk7CisgICAgICAgICAgICAgICAgb2ZmNjRfdCBkaWZmT2Zmc2V0ID0gbVNlZWtTeW5jUG9pbnRzLT52YWx1ZUF0KHByZXZTeW5jU2l6ZSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAtIG1TZWVrU3luY1BvaW50cy0+dmFsdWVBdCgwKTsKKyAgICAgICAgICAgICAgICBkdXJhdGlvblVzID0gc2l6ZSAqIGRpZmZVcyAvIGRpZmZPZmZzZXQ7CisgICAgICAgICAgICAgICAgZHVyYXRpb25zLnB1c2hfYmFjayhkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb25zLnNpemUoKSA+IDUpIHsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25zLmVyYXNlKGR1cmF0aW9ucy5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtaW4gPSAqZHVyYXRpb25zLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWF4ID0gKmR1cmF0aW9ucy5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKExpc3Q8aW50NjRfdD46Oml0ZXJhdG9yIGkgPSBkdXJhdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICE9IGR1cmF0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW4gPiAqaSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9ICppOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heCA8ICppKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gKmk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1heCAtIG1pbiA8IDUwMCAqIDEwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgaW50NjRfdCBidWZmZXJlZER1cmF0aW9uVXM7CisgICAgICAgIGJ1ZmZlcmVkRHVyYXRpb25VcyA9IGltcGwtPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZXJyKTsKKyAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBkdXJhdGlvblVzID0gYnVmZmVyZWREdXJhdGlvblVzOworICAgICAgICB9CisgICAgICAgIGlmIChkdXJhdGlvblVzID4gMCkgeworICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+IG1ldGEgPSBpbXBsLT5nZXRGb3JtYXQoKTsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICBpbXBsLT5zZXRGb3JtYXQobWV0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HSSgiaGF2ZUF1ZGlvPSVkLCBoYXZlVmlkZW89JWQsIGVsYXNwZWRUaW1lPSUiIFBSSWQ2NCwKKyAgICAgICAgICAgIGhhdmVBdWRpbywgaGF2ZVZpZGVvLCBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lKTsKIH0KIAogc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6ZmVlZE1vcmUoKSB7CkBAIC0yMTAsMTIgKzI1OCwyMDYgQEAKICAgICAgICAgcmV0dXJuIChuIDwgMCkgPyAoc3RhdHVzX3QpbiA6IEVSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCisgICAgQVRTUGFyc2VyOjpTeW5jRXZlbnQgZXZlbnQobU9mZnNldCk7CiAgICAgbU9mZnNldCArPSBuOwotICAgIHJldHVybiBtUGFyc2VyLT5mZWVkVFNQYWNrZXQocGFja2V0LCBrVFNQYWNrZXRTaXplKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtUGFyc2VyLT5mZWVkVFNQYWNrZXQocGFja2V0LCBrVFNQYWNrZXRTaXplLCAmZXZlbnQpOworICAgIGlmIChldmVudC5pc0luaXQoKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKG1Tb3VyY2VJbXBsc1tpXS5nZXQoKSA9PSBldmVudC5nZXRNZWRpYVNvdXJjZSgpLmdldCgpKSB7CisgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8aW50NjRfdCwgb2ZmNjRfdD4gKnN5bmNQb2ludHMgPSAmbVN5bmNQb2ludHMuZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgICAgICAgICBzeW5jUG9pbnRzLT5hZGQoZXZlbnQuZ2V0VGltZVVzKCksIGV2ZW50LmdldE9mZnNldCgpKTsKKyAgICAgICAgICAgICAgICAvLyBXZSdyZSBrZWVwaW5nIHRoZSBzaXplIG9mIHRoZSBzeW5jIHBvaW50cyBhdCBtb3N0IDVtYiBwZXIgYSB0cmFjay4KKyAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHN5bmNQb2ludHMtPnNpemUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+PSAzMjc2ODApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBmaXJzdFRpbWVVcyA9IHN5bmNQb2ludHMtPmtleUF0KDApOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGxhc3RUaW1lVXMgPSBzeW5jUG9pbnRzLT5rZXlBdChzaXplIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRUaW1lVXMoKSAtIGZpcnN0VGltZVVzID4gbGFzdFRpbWVVcyAtIGV2ZW50LmdldFRpbWVVcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jUG9pbnRzLT5yZW1vdmVJdGVtc0F0KDAsIDQwOTYpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luY1BvaW50cy0+cmVtb3ZlSXRlbXNBdChzaXplIC0gNDA5NiwgNDA5Nik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKIH0KIAogdWludDMyX3QgTVBFRzJUU0V4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIENBTl9QQVVTRTsKKyAgICByZXR1cm4gQ0FOX1BBVVNFIHwgQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEOworfQorCitzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpzZWVrKGludDY0X3Qgc2Vla1RpbWVVcywKKyAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSAmc2Vla01vZGUpIHsKKyAgICBpZiAobVNlZWtTeW5jUG9pbnRzID09IE5VTEwgfHwgbVNlZWtTeW5jUG9pbnRzLT5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR1coIk5vIHN5bmMgcG9pbnQgdG8gc2VlayB0by4iKTsKKyAgICAgICAgLy8gLi4uIGFuZCB0aGVyZWZvcmUgd2UgaGF2ZSBub3RoaW5nIHVzZWZ1bCB0byBkbyBoZXJlLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgd2UncmUgc2Vla2luZyBiZXlvbmQgdGhlIGtub3duIGFyZWEuCisgICAgYm9vbCBzaG91bGRTZWVrQmV5b25kID0KKyAgICAgICAgICAgIChzZWVrVGltZVVzID4gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdChtU2Vla1N5bmNQb2ludHMtPnNpemUoKSAtIDEpKTsKKworICAgIC8vIERldGVybWluZSB0aGUgc3luYyBwb2ludCB0byBzZWVrLgorICAgIHNpemVfdCBpbmRleCA9IDA7CisgICAgZm9yICg7IGluZGV4IDwgbVNlZWtTeW5jUG9pbnRzLT5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBtU2Vla1N5bmNQb2ludHMtPmtleUF0KGluZGV4KTsKKyAgICAgICAgaWYgKHRpbWVVcyA+IHNlZWtUaW1lVXMpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoIChzZWVrTW9kZSkgeworICAgICAgICBjYXNlIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gbVNlZWtTeW5jUG9pbnRzLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiTmV4dCBzeW5jIG5vdCBmb3VuZDsgc3RhcnRpbmcgZnJvbSB0aGUgbGF0ZXN0IHN5bmMuIik7CisgICAgICAgICAgICAgICAgLS1pbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM6CisgICAgICAgIGNhc2UgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1Q6CisgICAgICAgICAgICBBTE9HVygic2Vla01vZGUgbm90IHN1cHBvcnRlZDogJWQ7IGZhbGxpbmcgYmFjayB0byBQUkVWSU9VU19TWU5DIiwKKyAgICAgICAgICAgICAgICAgICAgc2Vla01vZGUpOworICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoCisgICAgICAgIGNhc2UgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJQcmV2aW91cyBzeW5jIG5vdCBmb3VuZDsgc3RhcnRpbmcgZnJvbSB0aGUgZWFybGllc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgInN5bmMuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC0taW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFzaG91bGRTZWVrQmV5b25kIHx8IG1PZmZzZXQgPD0gbVNlZWtTeW5jUG9pbnRzLT52YWx1ZUF0KGluZGV4KSkgeworICAgICAgICBpbnQ2NF90IGFjdHVhbFNlZWtUaW1lVXMgPSBtU2Vla1N5bmNQb2ludHMtPmtleUF0KGluZGV4KTsKKyAgICAgICAgbU9mZnNldCA9IG1TZWVrU3luY1BvaW50cy0+dmFsdWVBdChpbmRleCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IHF1ZXVlRGlzY29udGludWl0eUZvclNlZWsoYWN0dWFsU2Vla1RpbWVVcyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2hvdWxkU2Vla0JleW9uZCkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZWVrQmV5b25kKHNlZWtUaW1lVXMpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRmFzdC1mb3J3YXJkIHRvIHN5bmMgZnJhbWUuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlSW1wbHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwgPSBtU291cmNlSW1wbHNbaV07CisgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKGltcGwpOworICAgICAgICB3aGlsZSAoaW1wbC0+aGFzQnVmZmVyQXZhaWxhYmxlKCZlcnIpKSB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IGltcGwtPmdldE1ldGFBZnRlckxhc3REZXF1ZXVlZCgwKTsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgIGlmIChtZXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3Qgc3luYzsKKyAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoImlzU3luYyIsICZzeW5jKSAmJiBzeW5jKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSBpbXBsLT5kZXF1ZXVlQWNjZXNzVW5pdCgmYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKGltcGwpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpxdWV1ZURpc2NvbnRpbnVpdHlGb3JTZWVrKGludDY0X3QgYWN0dWFsU2Vla1RpbWVVcykgeworICAgIC8vIFNpZ25hbCBkaXNjb250aW51aXR5CisgICAgc3A8QU1lc3NhZ2U+IGV4dHJhKG5ldyBBTWVzc2FnZSk7CisgICAgZXh0cmEtPnNldEludDY0KElTdHJlYW1MaXN0ZW5lcjo6a0tleU1lZGlhVGltZVVzLCBhY3R1YWxTZWVrVGltZVVzKTsKKyAgICBtUGFyc2VyLT5zaWduYWxEaXNjb250aW51aXR5KEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9USU1FLCBleHRyYSk7CisKKyAgICAvLyBBZnRlciBkaXNjb250aW51aXR5LCBpbXBsIHNob3VsZCBvbmx5IGhhdmUgZGlzY29udGludWl0aWVzCisgICAgLy8gd2l0aCB0aGUgbGFzdCBiZWluZyB3aGF0IHdlIHF1ZXVlZC4gRGVxdWV1ZSB0aGVtIGFsbCBoZXJlLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsID0gbVNvdXJjZUltcGxzLml0ZW1BdChpKTsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIHdoaWxlIChpbXBsLT5oYXNCdWZmZXJBdmFpbGFibGUoJmVycikpIHsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gaW1wbC0+ZGVxdWV1ZUFjY2Vzc1VuaXQoJmJ1ZmZlcik7CisgICAgICAgICAgICAvLyBJZiB0aGUgc291cmNlIGNvbnRhaW5zIGFueXRoaW5nIGJ1dCBkaXNjb250aW51aXR5LCB0aGF0J3MKKyAgICAgICAgICAgIC8vIGEgcHJvZ3JhbW1pbmcgbWlzdGFrZS4KKyAgICAgICAgICAgIENIRUNLKGVyciA9PSBJTkZPX0RJU0NPTlRJTlVJVFkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRmVlZCB1bnRpbCB3ZSBoYXZlIGEgYnVmZmVyIGZvciBlYWNoIHNvdXJjZS4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCA9IG1Tb3VyY2VJbXBscy5pdGVtQXQoaSk7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKGltcGwpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpzZWVrQmV5b25kKGludDY0X3Qgc2Vla1RpbWVVcykgeworICAgIC8vIElmIHdlJ3JlIHNlZWtpbmcgYmV5b25kIHdoZXJlIHdlIGtub3cgLS0tIHJlYWQgdW50aWwgd2UgcmVhY2ggdGhlcmUuCisgICAgc2l6ZV90IHN5bmNQb2ludHNTaXplID0gbVNlZWtTeW5jUG9pbnRzLT5zaXplKCk7CisKKyAgICB3aGlsZSAoc2Vla1RpbWVVcyA+IG1TZWVrU3luY1BvaW50cy0+a2V5QXQoCisgICAgICAgICAgICBtU2Vla1N5bmNQb2ludHMtPnNpemUoKSAtIDEpKSB7CisgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgaWYgKHN5bmNQb2ludHNTaXplIDwgbVNlZWtTeW5jUG9pbnRzLT5zaXplKCkpIHsKKyAgICAgICAgICAgIHN5bmNQb2ludHNTaXplID0gbVNlZWtTeW5jUG9pbnRzLT5zaXplKCk7CisgICAgICAgICAgICBpbnQ2NF90IHN5bmNUaW1lVXMgPSBtU2Vla1N5bmNQb2ludHMtPmtleUF0KHN5bmNQb2ludHNTaXplIC0gMSk7CisgICAgICAgICAgICAvLyBEZXF1ZXVlIGJ1ZmZlcnMgYmVmb3JlIHN5bmMgcG9pbnQgaW4gb3JkZXIgdG8gYXZvaWQgdG9vIG11Y2gKKyAgICAgICAgICAgIC8vIGNhY2hlIGJ1aWxkaW5nIHVwLgorICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlSW1wbHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCA9IG1Tb3VyY2VJbXBsc1tpXTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGVyciA9IGltcGwtPm5leHRCdWZmZXJUaW1lKCZ0aW1lVXMpKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBpZiAodGltZVVzIDwgc3luY1RpbWVVcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW1wbC0+ZGVxdWV1ZUFjY2Vzc1VuaXQoJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSAtRVdPVUxEQkxPQ0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZlZWRNb3JlKCkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpmZWVkVW50aWxCdWZmZXJBdmFpbGFibGUoCisgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsKSB7CisgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CisgICAgd2hpbGUgKCFpbXBsLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgeworICAgICAgICBpZiAoZmluYWxSZXN1bHQgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBmaW5hbFJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IGVyciA9IGZlZWRNb3JlKCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGltcGwtPnNpZ25hbEVPUyhlcnIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsKaW5kZXggYWFhODMzNC4uNWYwZjU2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsKQEAgLTEsMTEgKzEsOCBAQAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotaWZlcSAoJChUQVJHRVRfREVWSUNFKSwgbWFudGEpCi0gICAgTE9DQUxfQ0ZMQUdTICs9IC1EU1VSRkFDRV9JU19CR1IzMgotZW5kaWYKLQogTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZyYW1lRHJvcHBlci5jcHAgICAgICAgICAgICAgIFwKICAgICAgICAgR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgICAgICAgXAogICAgICAgICBPTVguY3BwICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE9NWE1hc3Rlci5jcHAgICAgICAgICAgICAgICAgIFwKQEAgLTM0LDYgKzMxLDggQEAKICAgICAgICAgbGliZGwKIAogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfb214CitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0OTUyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuY3BwCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkZyYW1lRHJvcHBlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkZyYW1lRHJvcHBlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4Sml0dGVyVXMgPSAyMDAwOworCitGcmFtZURyb3BwZXI6OkZyYW1lRHJvcHBlcigpCisgICAgOiBtRGVzaXJlZE1pblRpbWVVcygtMSksCisgICAgICBtTWluSW50ZXJ2YWxVcygwKSB7Cit9CisKK0ZyYW1lRHJvcHBlcjo6fkZyYW1lRHJvcHBlcigpIHsKK30KKworc3RhdHVzX3QgRnJhbWVEcm9wcGVyOjpzZXRNYXhGcmFtZVJhdGUoZmxvYXQgbWF4RnJhbWVSYXRlKSB7CisgICAgaWYgKG1heEZyYW1lUmF0ZSA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJmcmFtZXJhdGUgc2hvdWxkIGJlIHBvc2l0aXZlIGJ1dCBnb3QgJWYuIiwgbWF4RnJhbWVSYXRlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbU1pbkludGVydmFsVXMgPSAoaW50NjRfdCkgKDEwMDAwMDAuMGYgLyBtYXhGcmFtZVJhdGUpOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBGcmFtZURyb3BwZXI6OnNob3VsZERyb3AoaW50NjRfdCB0aW1lVXMpIHsKKyAgICBpZiAobU1pbkludGVydmFsVXMgPD0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1EZXNpcmVkTWluVGltZVVzIDwgMCkgeworICAgICAgICBtRGVzaXJlZE1pblRpbWVVcyA9IHRpbWVVcyArIG1NaW5JbnRlcnZhbFVzOworICAgICAgICBBTE9HVigiZmlyc3QgZnJhbWUgJWxsZCwgbmV4dCBkZXNpcmVkIGZyYW1lICVsbGQiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZVVzLCAobG9uZyBsb25nKW1EZXNpcmVkTWluVGltZVVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh0aW1lVXMgPCAobURlc2lyZWRNaW5UaW1lVXMgLSBrTWF4Sml0dGVyVXMpKSB7CisgICAgICAgIEFMT0dWKCJkcm9wIGZyYW1lICVsbGQsIGRlc2lyZWQgZnJhbWUgJWxsZCwgZGlmZiAlbGxkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVVcywgKGxvbmcgbG9uZyltRGVzaXJlZE1pblRpbWVVcywKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKShtRGVzaXJlZE1pblRpbWVVcyAtIHRpbWVVcykpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IG4gPSAodGltZVVzIC0gbURlc2lyZWRNaW5UaW1lVXMgKyBrTWF4Sml0dGVyVXMpIC8gbU1pbkludGVydmFsVXM7CisgICAgbURlc2lyZWRNaW5UaW1lVXMgKz0gKG4gKyAxKSAqIG1NaW5JbnRlcnZhbFVzOworICAgIEFMT0dWKCJrZWVwIGZyYW1lICVsbGQsIG5leHQgZGVzaXJlZCBmcmFtZSAlbGxkLCBkaWZmICVsbGQiLAorICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsIChsb25nIGxvbmcpbURlc2lyZWRNaW5UaW1lVXMsCisgICAgICAgICAgICAobG9uZyBsb25nKShtRGVzaXJlZE1pblRpbWVVcyAtIHRpbWVVcykpOworICAgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWE2ZDRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZSQU1FX0RST1BQRVJfSF8KKworI2RlZmluZSBGUkFNRV9EUk9QUEVSX0hfCisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEZyYW1lRHJvcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICAvLyBObyBmcmFtZXMgd2lsbCBiZSBkcm9wcGVkIHVudGlsIGEgdmFsaWQgbWF4IGZyYW1lIHJhdGUgaXMgc2V0LgorICAgIEZyYW1lRHJvcHBlcigpOworCisgICAgLy8gbWF4RnJhbWVSYXRlIHJlcXVpcmVkIHRvIGJlIHBvc2l0aXZlLgorICAgIHN0YXR1c190IHNldE1heEZyYW1lUmF0ZShmbG9hdCBtYXhGcmFtZVJhdGUpOworCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtYXggZnJhbWUgcmF0ZSBoYXMgbm90IGJlZW4gc2V0IHZpYSBzZXRNYXhGcmFtZVJhdGUuCisgICAgYm9vbCBzaG91bGREcm9wKGludDY0X3QgdGltZVVzKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkZyYW1lRHJvcHBlcigpOworCitwcml2YXRlOgorICAgIGludDY0X3QgbURlc2lyZWRNaW5UaW1lVXM7CisgICAgaW50NjRfdCBtTWluSW50ZXJ2YWxVczsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZyYW1lRHJvcHBlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEZSQU1FX0RST1BQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcAppbmRleCAyOTQ1NjQ0Li4xYTdkYzlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC0yMywyOCArMjMsMTA0IEBACiAjaW5jbHVkZSAiR3JhcGhpY0J1ZmZlclNvdXJjZS5oIgogCiAjaW5jbHVkZSA8T01YX0NvcmUuaD4KKyNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KICNpbmNsdWRlIDxndWkvQnVmZmVySXRlbS5oPgorI2luY2x1ZGUgPEhhcmR3YXJlQVBJLmg+CiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgIkZyYW1lRHJvcHBlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBib29sIEVYVFJBX0NIRUNLID0gdHJ1ZTsKIAorR3JhcGhpY0J1ZmZlclNvdXJjZTo6UGVyc2lzdGVudFByb3h5TGlzdGVuZXI6OlBlcnNpc3RlbnRQcm94eUxpc3RlbmVyKAorICAgICAgICBjb25zdCB3cDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAmY29uc3VtZXIsCisgICAgICAgIGNvbnN0IHdwPENvbnN1bWVyTGlzdGVuZXI+JiBjb25zdW1lckxpc3RlbmVyKSA6CisgICAgbUNvbnN1bWVyTGlzdGVuZXIoY29uc3VtZXJMaXN0ZW5lciksCisgICAgbUNvbnN1bWVyKGNvbnN1bWVyKSB7fQogCi1HcmFwaGljQnVmZmVyU291cmNlOjpHcmFwaGljQnVmZmVyU291cmNlKE9NWE5vZGVJbnN0YW5jZSogbm9kZUluc3RhbmNlLAotICAgICAgICB1aW50MzJfdCBidWZmZXJXaWR0aCwgdWludDMyX3QgYnVmZmVySGVpZ2h0LCB1aW50MzJfdCBidWZmZXJDb3VudCwKLSAgICAgICAgYm9vbCB1c2VHcmFwaGljQnVmZmVySW5NZXRhKSA6CitHcmFwaGljQnVmZmVyU291cmNlOjpQZXJzaXN0ZW50UHJveHlMaXN0ZW5lcjo6flBlcnNpc3RlbnRQcm94eUxpc3RlbmVyKCkge30KKwordm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpQZXJzaXN0ZW50UHJveHlMaXN0ZW5lcjo6b25GcmFtZUF2YWlsYWJsZSgKKyAgICAgICAgY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgeworICAgIHNwPENvbnN1bWVyTGlzdGVuZXI+IGxpc3RlbmVyKG1Db25zdW1lckxpc3RlbmVyLnByb21vdGUoKSk7CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgbGlzdGVuZXItPm9uRnJhbWVBdmFpbGFibGUoaXRlbSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXIobUNvbnN1bWVyLnByb21vdGUoKSk7CisgICAgICAgIGlmIChjb25zdW1lciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQnVmZmVySXRlbSBiaTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gY29uc3VtZXItPmFjcXVpcmVCdWZmZXIoJmJpLCAwKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIlBlcnNpc3RlbnRQcm94eUxpc3RlbmVyOiBhY3F1aXJlQnVmZmVyIGZhaWxlZCAoJWQpIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IGNvbnN1bWVyLT5kZXRhY2hCdWZmZXIoYmkubUJ1Zik7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJQZXJzaXN0ZW50UHJveHlMaXN0ZW5lcjogZGV0YWNoQnVmZmVyIGZhaWxlZCAoJWQpIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IGNvbnN1bWVyLT5hdHRhY2hCdWZmZXIoJmJpLm1CdWYsIGJpLm1HcmFwaGljQnVmZmVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIlBlcnNpc3RlbnRQcm94eUxpc3RlbmVyOiBhdHRhY2hCdWZmZXIgZmFpbGVkICglZCkiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gY29uc3VtZXItPnJlbGVhc2VCdWZmZXIoYmkubUJ1ZiwgMCwKKyAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBiaS5tRmVuY2UpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiUGVyc2lzdGVudFByb3h5TGlzdGVuZXI6IHJlbGVhc2VCdWZmZXIgZmFpbGVkICglZCkiLCBlcnIpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OlBlcnNpc3RlbnRQcm94eUxpc3RlbmVyOjpvbkZyYW1lUmVwbGFjZWQoCisgICAgICAgIGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIHsKKyAgICBzcDxDb25zdW1lckxpc3RlbmVyPiBsaXN0ZW5lcihtQ29uc3VtZXJMaXN0ZW5lci5wcm9tb3RlKCkpOworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIGxpc3RlbmVyLT5vbkZyYW1lUmVwbGFjZWQoaXRlbSk7CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OlBlcnNpc3RlbnRQcm94eUxpc3RlbmVyOjpvbkJ1ZmZlcnNSZWxlYXNlZCgpIHsKKyAgICBzcDxDb25zdW1lckxpc3RlbmVyPiBsaXN0ZW5lcihtQ29uc3VtZXJMaXN0ZW5lci5wcm9tb3RlKCkpOworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIGxpc3RlbmVyLT5vbkJ1ZmZlcnNSZWxlYXNlZCgpOworICAgIH0KK30KKwordm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpQZXJzaXN0ZW50UHJveHlMaXN0ZW5lcjo6b25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKSB7CisgICAgc3A8Q29uc3VtZXJMaXN0ZW5lcj4gbGlzdGVuZXIobUNvbnN1bWVyTGlzdGVuZXIucHJvbW90ZSgpKTsKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBsaXN0ZW5lci0+b25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKTsKKyAgICB9Cit9CisKK0dyYXBoaWNCdWZmZXJTb3VyY2U6OkdyYXBoaWNCdWZmZXJTb3VyY2UoCisgICAgICAgIE9NWE5vZGVJbnN0YW5jZSogbm9kZUluc3RhbmNlLAorICAgICAgICB1aW50MzJfdCBidWZmZXJXaWR0aCwKKyAgICAgICAgdWludDMyX3QgYnVmZmVySGVpZ2h0LAorICAgICAgICB1aW50MzJfdCBidWZmZXJDb3VudCwKKyAgICAgICAgdWludDMyX3QgY29uc3VtZXJVc2FnZSwKKyAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gJmNvbnN1bWVyKSA6CiAgICAgbUluaXRDaGVjayhVTktOT1dOX0VSUk9SKSwKICAgICBtTm9kZUluc3RhbmNlKG5vZGVJbnN0YW5jZSksCiAgICAgbUV4ZWN1dGluZyhmYWxzZSksCiAgICAgbVN1c3BlbmRlZChmYWxzZSksCisgICAgbUlzUGVyc2lzdGVudChmYWxzZSksCisgICAgbUNvbnN1bWVyKGNvbnN1bWVyKSwKICAgICBtTnVtRnJhbWVzQXZhaWxhYmxlKDApLAorICAgIG1OdW1CdWZmZXJBY3F1aXJlZCgwKSwKICAgICBtRW5kT2ZTdHJlYW0oZmFsc2UpLAogICAgIG1FbmRPZlN0cmVhbVNlbnQoZmFsc2UpLAogICAgIG1NYXhUaW1lc3RhbXBHYXBVcygtMWxsKSwKQEAgLTU0LDE1ICsxMzAsMTUgQEAKICAgICBtUmVwZWF0QWZ0ZXJVcygtMWxsKSwKICAgICBtUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbigwKSwKICAgICBtUmVwZWF0TGFzdEZyYW1lVGltZXN0YW1wKC0xbGwpLAotICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCgtMSksCi0gICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlckZyYW1lTnVtKDApLAotICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJVc2VDb3VudCgwKSwKKyAgICBtTGF0ZXN0QnVmZmVySWQoLTEpLAorICAgIG1MYXRlc3RCdWZmZXJGcmFtZU51bSgwKSwKKyAgICBtTGF0ZXN0QnVmZmVyVXNlQ291bnQoMCksCisgICAgbUxhdGVzdEJ1ZmZlckZlbmNlKEZlbmNlOjpOT19GRU5DRSksCiAgICAgbVJlcGVhdEJ1ZmZlckRlZmVycmVkKGZhbHNlKSwKICAgICBtVGltZVBlckNhcHR1cmVVcygtMWxsKSwKICAgICBtVGltZVBlckZyYW1lVXMoLTFsbCksCiAgICAgbVByZXZDYXB0dXJlVXMoLTFsbCksCi0gICAgbVByZXZGcmFtZVVzKC0xbGwpLAotICAgIG1Vc2VHcmFwaGljQnVmZmVySW5NZXRhKHVzZUdyYXBoaWNCdWZmZXJJbk1ldGEpIHsKKyAgICBtUHJldkZyYW1lVXMoLTFsbCkgewogCiAgICAgQUxPR1YoIkdyYXBoaWNCdWZmZXJTb3VyY2Ugdz0ldSBoPSV1IGM9JXUiLAogICAgICAgICAgICAgYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCwgYnVmZmVyQ291bnQpOwpAQCAtNzMsMjYgKzE0OSwzOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgU3RyaW5nOCBuYW1lKCJHcmFwaGljQnVmZmVyU291cmNlIik7CisgICAgaWYgKG1Db25zdW1lciA9PSBOVUxMKSB7CisgICAgICAgIFN0cmluZzggbmFtZSgiR3JhcGhpY0J1ZmZlclNvdXJjZSIpOwogCi0gICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZtUHJvZHVjZXIsICZtQ29uc3VtZXIpOwotICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJOYW1lKG5hbWUpOwotICAgIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7Ci0gICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIpOworICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJm1Qcm9kdWNlciwgJm1Db25zdW1lcik7CisgICAgICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJOYW1lKG5hbWUpOwogCi0gICAgbUluaXRDaGVjayA9IG1Db25zdW1lci0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChidWZmZXJDb3VudCk7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgQlEgbWF4IGFjcXVpcmVkIGJ1ZmZlciBjb3VudCB0byAldTogJWQiLAotICAgICAgICAgICAgICAgIGJ1ZmZlckNvdW50LCBtSW5pdENoZWNrKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICAvLyB1c2UgY29uc3VtZXIgdXNhZ2UgYml0cyBxdWVyaWVkIGZyb20gZW5jb2RlciwgYnV0IGFsd2F5cyBhZGQgSFdfVklERU9fRU5DT0RFUgorICAgICAgICAvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAgICAgICAgY29uc3VtZXJVc2FnZSB8PSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CisgICAgICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoY29uc3VtZXJVc2FnZSk7CisKKyAgICAgICAgbUluaXRDaGVjayA9IG1Db25zdW1lci0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChidWZmZXJDb3VudCk7CisgICAgICAgIGlmIChtSW5pdENoZWNrICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBCUSBtYXggYWNxdWlyZWQgYnVmZmVyIGNvdW50IHRvICV1OiAlZCIsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckNvdW50LCBtSW5pdENoZWNrKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc1BlcnNpc3RlbnQgPSB0cnVlOwogICAgIH0KLQorICAgIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CiAgICAgLy8gTm90ZSB0aGF0IHdlIGNhbid0IGNyZWF0ZSBhbiBzcDwuLi4+KHRoaXMpIGluIGEgY3RvciB0aGF0IHdpbGwgbm90IGtlZXAgYQogICAgIC8vIHJlZmVyZW5jZSBvbmNlIHRoZSBjdG9yIGVuZHMsIGFzIHRoYXQgd291bGQgY2F1c2UgdGhlIHJlZmNvdW50IG9mICd0aGlzJwogICAgIC8vIGRyb3BwaW5nIHRvIDAgYXQgdGhlIGVuZCBvZiB0aGUgY3Rvci4gIFNpbmNlIGFsbCB3ZSBuZWVkIGlzIGEgd3A8Li4uPgogICAgIC8vIHRoYXQncyB3aGF0IHdlIGNyZWF0ZS4KICAgICB3cDxCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lcio+KHRoaXMpOwotICAgIHNwPEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXI+IHByb3h5ID0gbmV3IEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXIobGlzdGVuZXIpOworICAgIHNwPElDb25zdW1lckxpc3RlbmVyPiBwcm94eTsKKyAgICBpZiAoIW1Jc1BlcnNpc3RlbnQpIHsKKyAgICAgICAgcHJveHkgPSBuZXcgQnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJveHkgPSBuZXcgUGVyc2lzdGVudFByb3h5TGlzdGVuZXIobUNvbnN1bWVyLCBsaXN0ZW5lcik7CisgICAgfQogCiAgICAgbUluaXRDaGVjayA9IG1Db25zdW1lci0+Y29uc3VtZXJDb25uZWN0KHByb3h5LCBmYWxzZSk7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gTk9fRVJST1IpIHsKQEAgLTEwNSw4ICsxOTMsMTUgQEAKIH0KIAogR3JhcGhpY0J1ZmZlclNvdXJjZTo6fkdyYXBoaWNCdWZmZXJTb3VyY2UoKSB7Ci0gICAgQUxPR1YoIn5HcmFwaGljQnVmZmVyU291cmNlIik7Ci0gICAgaWYgKG1Db25zdW1lciAhPSBOVUxMKSB7CisgICAgaWYgKG1MYXRlc3RCdWZmZXJJZCA+PSAwKSB7CisgICAgICAgIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICAgICAgbUxhdGVzdEJ1ZmZlcklkLCBtTGF0ZXN0QnVmZmVyRnJhbWVOdW0sCisgICAgICAgICAgICAgICAgbUJ1ZmZlclNsb3RbbUxhdGVzdEJ1ZmZlcklkXSwgbUxhdGVzdEJ1ZmZlckZlbmNlKTsKKyAgICB9CisgICAgaWYgKG1OdW1CdWZmZXJBY3F1aXJlZCAhPSAwKSB7CisgICAgICAgIEFMT0dXKCJwb3RlbnRpYWwgYnVmZmVyIGxlYWsgKGFjcXVpcmVkICVkKSIsIG1OdW1CdWZmZXJBY3F1aXJlZCk7CisgICAgfQorICAgIGlmIChtQ29uc3VtZXIgIT0gTlVMTCAmJiAhbUlzUGVyc2lzdGVudCkgewogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmNvbnN1bWVyRGlzY29ubmVjdCgpOwogICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBBTE9HVygiY29uc3VtZXJEaXNjb25uZWN0IGZhaWxlZDogJWQiLCBlcnIpOwpAQCAtMTUzLDkgKzI0OCw5IEBACiAgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yKTsKICAgICAgICAgbUxvb3Blci0+c3RhcnQoKTsKIAotICAgICAgICBpZiAobUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkID49IDApIHsKKyAgICAgICAgaWYgKG1MYXRlc3RCdWZmZXJJZCA+PSAwKSB7CiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0KLSAgICAgICAgICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXRSZXBlYXRMYXN0RnJhbWUsIG1SZWZsZWN0b3ItPmlkKCkpOworICAgICAgICAgICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdFJlcGVhdExhc3RGcmFtZSwgbVJlZmxlY3Rvcik7CiAKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCArK21SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uKTsKICAgICAgICAgICAgIG1zZy0+cG9zdChtUmVwZWF0QWZ0ZXJVcyk7CkBAIC0yMTgsOSArMzEzLDggQEAKICAgICBtQ29kZWNCdWZmZXJzLmFkZChjb2RlY0J1ZmZlcik7CiB9CiAKLXZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6Y29kZWNCdWZmZXJFbXB0aWVkKE9NWF9CVUZGRVJIRUFERVJUWVBFKiBoZWFkZXIpIHsKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6Y29kZWNCdWZmZXJFbXB0aWVkKE9NWF9CVUZGRVJIRUFERVJUWVBFKiBoZWFkZXIsIGludCBmZW5jZUZkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7Ci0KICAgICBpZiAoIW1FeGVjdXRpbmcpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTIyOSw2ICszMjMsOSBAQAogICAgIGlmIChjYmkgPCAwKSB7CiAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4KICAgICAgICAgQUxPR0UoImNvZGVjQnVmZmVyRW1wdGllZDogYnVmZmVyIG5vdCByZWNvZ25pemVkIChoPSVwKSIsIGhlYWRlcik7CisgICAgICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgICAgIDo6Y2xvc2UoZmVuY2VGZCk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMjUwLDMwICszNDcsMzMgQEAKICAgICAgICAgfQogICAgICAgICAvLyBObyBHcmFwaGljQnVmZmVyIHRvIGRlYWwgd2l0aCwgbm8gYWRkaXRpb25hbCBpbnB1dCBvciBvdXRwdXQgaXMKICAgICAgICAgLy8gZXhwZWN0ZWQsIHNvIGp1c3QgcmV0dXJuLgorICAgICAgICBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgICAgICA6OmNsb3NlKGZlbmNlRmQpOworICAgICAgICB9CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoRVhUUkFfQ0hFQ0spIHsKKyAgICBpZiAoRVhUUkFfQ0hFQ0sgJiYgaGVhZGVyLT5uQWxsb2NMZW4gPj0gc2l6ZW9mKE1ldGFkYXRhQnVmZmVyVHlwZSkpIHsKICAgICAgICAgLy8gUHVsbCB0aGUgZ3JhcGhpYyBidWZmZXIgaGFuZGxlIGJhY2sgb3V0IG9mIHRoZSBidWZmZXIsIGFuZCBjb25maXJtCiAgICAgICAgIC8vIHRoYXQgaXQgbWF0Y2hlcyBleHBlY3RhdGlvbnMuCiAgICAgICAgIE9NWF9VOCogZGF0YSA9IGhlYWRlci0+cEJ1ZmZlcjsKICAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlIHR5cGUgPSAqKE1ldGFkYXRhQnVmZmVyVHlwZSAqKWRhdGE7Ci0gICAgICAgIGlmICh0eXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7Ci0gICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgYnVmZmVySGFuZGxlOwotICAgICAgICAgICAgbWVtY3B5KCZidWZmZXJIYW5kbGUsIGRhdGEgKyA0LCBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7Ci0gICAgICAgICAgICBpZiAoYnVmZmVySGFuZGxlICE9IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UKKyAgICAgICAgICAgICAgICAmJiBoZWFkZXItPm5BbGxvY0xlbiA+PSBzaXplb2YoVmlkZW9HcmFsbG9jTWV0YWRhdGEpKSB7CisgICAgICAgICAgICBWaWRlb0dyYWxsb2NNZXRhZGF0YSAmZ3JhbGxvY01ldGEgPSAqKFZpZGVvR3JhbGxvY01ldGFkYXRhICopZGF0YTsKKyAgICAgICAgICAgIGlmIChncmFsbG9jTWV0YS5wSGFuZGxlICE9IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUpIHsKICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCiAgICAgICAgICAgICAgICAgQUxPR0UoImNvZGVjQnVmZmVyRW1wdGllZDogYnVmZmVyJ3MgaGFuZGxlIGlzICVwLCBleHBlY3RlZCAlcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJIYW5kbGUsIGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY01ldGEucEhhbmRsZSwgY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgQ0hFQ0soISJjb2RlY0J1ZmZlckVtcHRpZWQ6IG1pc21hdGNoZWQgYnVmZmVyIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhcGhpY0J1ZmZlcikgewotICAgICAgICAgICAgR3JhcGhpY0J1ZmZlciAqYnVmZmVyOwotICAgICAgICAgICAgbWVtY3B5KCZidWZmZXIsIGRhdGEgKyA0LCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyICE9IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLmdldCgpKSB7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyCisgICAgICAgICAgICAgICAgJiYgaGVhZGVyLT5uQWxsb2NMZW4gPj0gc2l6ZW9mKFZpZGVvTmF0aXZlTWV0YWRhdGEpKSB7CisgICAgICAgICAgICBWaWRlb05hdGl2ZU1ldGFkYXRhICZuYXRpdmVNZXRhID0gKihWaWRlb05hdGl2ZU1ldGFkYXRhICopZGF0YTsKKyAgICAgICAgICAgIGlmIChuYXRpdmVNZXRhLnBCdWZmZXIgIT0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpKSB7CiAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgogICAgICAgICAgICAgICAgIEFMT0dFKCJjb2RlY0J1ZmZlckVtcHRpZWQ6IGJ1ZmZlciBpcyAlcCwgZXhwZWN0ZWQgJXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVNZXRhLnBCdWZmZXIsIGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKSk7CiAgICAgICAgICAgICAgICAgQ0hFQ0soISJjb2RlY0J1ZmZlckVtcHRpZWQ6IG1pc21hdGNoZWQgYnVmZmVyIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI4MywyMCArMzgzLDIxIEBACiAgICAgLy8gSWYgd2UgZmluZCBhIG1hdGNoLCByZWxlYXNlIHRoYXQgc2xvdC4gIElmIHdlIGRvbid0LCB0aGUgQnVmZmVyUXVldWUKICAgICAvLyBoYXMgZHJvcHBlZCB0aGF0IEdyYXBoaWNCdWZmZXIsIGFuZCB0aGVyZSdzIG5vdGhpbmcgZm9yIHVzIHRvIHJlbGVhc2UuCiAgICAgaW50IGlkID0gY29kZWNCdWZmZXIubUJ1ZjsKKyAgICBzcDxGZW5jZT4gZmVuY2UgPSBuZXcgRmVuY2UoZmVuY2VGZCk7CiAgICAgaWYgKG1CdWZmZXJTbG90W2lkXSAhPSBOVUxMICYmCiAgICAgICAgIG1CdWZmZXJTbG90W2lkXS0+aGFuZGxlID09IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUpIHsKICAgICAgICAgQUxPR1YoImNiaSAlZCBtYXRjaGVzIGJxIHNsb3QgJWQsIGhhbmRsZT0lcCIsCiAgICAgICAgICAgICAgICAgY2JpLCBpZCwgbUJ1ZmZlclNsb3RbaWRdLT5oYW5kbGUpOwogCi0gICAgICAgIGlmIChpZCA9PSBtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQpIHsKLSAgICAgICAgICAgIENIRUNLX0dUKG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJVc2VDb3VudC0tLCAwKTsKKyAgICAgICAgaWYgKGlkID09IG1MYXRlc3RCdWZmZXJJZCkgeworICAgICAgICAgICAgQ0hFQ0tfR1QobUxhdGVzdEJ1ZmZlclVzZUNvdW50LS0sIDApOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGlkLCBjb2RlY0J1ZmZlci5tRnJhbWVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIEZlbmNlOjpOT19GRU5DRSk7CisgICAgICAgICAgICByZWxlYXNlQnVmZmVyKGlkLCBjb2RlY0J1ZmZlci5tRnJhbWVOdW1iZXIsIG1CdWZmZXJTbG90W2lkXSwgZmVuY2UpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoImNvZGVjQnVmZmVyRW1wdGllZDogbm8gbWF0Y2ggZm9yIGVtcHRpZWQgYnVmZmVyIGluIGNiaSAlZCIsCiAgICAgICAgICAgICAgICAgY2JpKTsKKyAgICAgICAgLy8gd2Ugd2lsbCBub3QgcmV1c2UgY29kZWMgYnVmZmVyLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHdhaXQgZm9yIGZlbmNlCiAgICAgfQogCiAgICAgLy8gTWFyayB0aGUgY29kZWMgYnVmZmVyIGFzIGF2YWlsYWJsZSBieSBjbGVhcmluZyB0aGUgR3JhcGhpY0J1ZmZlciByZWYuCkBAIC0zMTQsMTEgKzQxNSwxMSBAQAogICAgICAgICBBTE9HVigiYnVmZmVyIGZyZWVkLCBFT1MgcGVuZGluZyIpOwogICAgICAgICBzdWJtaXRFbmRPZklucHV0U3RyZWFtX2woKTsKICAgICB9IGVsc2UgaWYgKG1SZXBlYXRCdWZmZXJEZWZlcnJlZCkgewotICAgICAgICBib29sIHN1Y2Nlc3MgPSByZXBlYXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbCgpOworICAgICAgICBib29sIHN1Y2Nlc3MgPSByZXBlYXRMYXRlc3RCdWZmZXJfbCgpOwogICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgQUxPR1YoImRlZmVycmVkIHJlcGVhdExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sIFNVQ0NFU1MiKTsKKyAgICAgICAgICAgIEFMT0dWKCJkZWZlcnJlZCByZXBlYXRMYXRlc3RCdWZmZXJfbCBTVUNDRVNTIik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiZGVmZXJyZWQgcmVwZWF0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2wgRkFJTFVSRSIpOworICAgICAgICAgICAgQUxPR1YoImRlZmVycmVkIHJlcGVhdExhdGVzdEJ1ZmZlcl9sIEZBSUxVUkUiKTsKICAgICAgICAgfQogICAgICAgICBtUmVwZWF0QnVmZmVyRGVmZXJyZWQgPSBmYWxzZTsKICAgICB9CkBAIC0zNzIsMTAgKzQ3MywxMSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICArK21OdW1CdWZmZXJBY3F1aXJlZDsKICAgICAgICAgICAgIC0tbU51bUZyYW1lc0F2YWlsYWJsZTsKIAotICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIGl0ZW0ubUZlbmNlKTsKKyAgICAgICAgICAgIHJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5tR3JhcGhpY0J1ZmZlciwgaXRlbS5tRmVuY2UpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0zODMsMTIgKzQ4NSwxMiBAQAogICAgIG1TdXNwZW5kZWQgPSBmYWxzZTsKIAogICAgIGlmIChtRXhlY3V0aW5nICYmIG1OdW1GcmFtZXNBdmFpbGFibGUgPT0gMCAmJiBtUmVwZWF0QnVmZmVyRGVmZXJyZWQpIHsKLSAgICAgICAgaWYgKHJlcGVhdExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sKCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCJzdXNwZW5kL2RlZmVycmVkIHJlcGVhdExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sIFNVQ0NFU1MiKTsKKyAgICAgICAgaWYgKHJlcGVhdExhdGVzdEJ1ZmZlcl9sKCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJzdXNwZW5kL2RlZmVycmVkIHJlcGVhdExhdGVzdEJ1ZmZlcl9sIFNVQ0NFU1MiKTsKIAogICAgICAgICAgICAgbVJlcGVhdEJ1ZmZlckRlZmVycmVkID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigic3VzcGVuZC9kZWZlcnJlZCByZXBlYXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbCBGQUlMVVJFIik7CisgICAgICAgICAgICBBTE9HVigic3VzcGVuZC9kZWZlcnJlZCByZXBlYXRMYXRlc3RCdWZmZXJfbCBGQUlMVVJFIik7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC00MjIsMTUgKzUyNCw5IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBtTnVtQnVmZmVyQWNxdWlyZWQrKzsKICAgICBtTnVtRnJhbWVzQXZhaWxhYmxlLS07CiAKLSAgICAvLyBXYWl0IGZvciBpdCB0byBiZWNvbWUgYXZhaWxhYmxlLgotICAgIGVyciA9IGl0ZW0ubUZlbmNlLT53YWl0Rm9yZXZlcigiR3JhcGhpY0J1ZmZlclNvdXJjZTo6ZmlsbENvZGVjQnVmZmVyX2wiKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gd2FpdCBmb3IgYnVmZmVyIGZlbmNlOiAlZCIsIGVycik7Ci0gICAgICAgIC8vIGtlZXAgZ29pbmcKLSAgICB9Ci0KICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIHNlZWluZyB0aGlzIGJ1ZmZlciwgYWRkIGl0IHRvIG91cgogICAgIC8vIHNsb3QgdGFibGUuCiAgICAgaWYgKGl0ZW0ubUdyYXBoaWNCdWZmZXIgIT0gTlVMTCkgewpAQCAtNDQyLDYxICs1MzgsNzIgQEAKIAogICAgIC8vIG9ubHkgc3VibWl0IHNhbXBsZSBpZiBzdGFydCB0aW1lIGlzIHVuc3BlY2lmaWVkLCBvciBzYW1wbGUKICAgICAvLyBpcyBxdWV1ZWQgYWZ0ZXIgdGhlIHNwZWNpZmllZCBzdGFydCB0aW1lCisgICAgYm9vbCBkcm9wcGVkID0gZmFsc2U7CiAgICAgaWYgKG1Ta2lwRnJhbWVzQmVmb3JlTnMgPCAwbGwgfHwgaXRlbS5tVGltZXN0YW1wID49IG1Ta2lwRnJhbWVzQmVmb3JlTnMpIHsKICAgICAgICAgLy8gaWYgc3RhcnQgdGltZSBpcyBzZXQsIG9mZnNldCB0aW1lIHN0YW1wIGJ5IHN0YXJ0IHRpbWUKICAgICAgICAgaWYgKG1Ta2lwRnJhbWVzQmVmb3JlTnMgPiAwKSB7CiAgICAgICAgICAgICBpdGVtLm1UaW1lc3RhbXAgLT0gbVNraXBGcmFtZXNCZWZvcmVOczsKICAgICAgICAgfQotICAgICAgICBlcnIgPSBzdWJtaXRCdWZmZXJfbChpdGVtLCBjYmkpOworCisgICAgICAgIGludDY0X3QgdGltZVVzID0gaXRlbS5tVGltZXN0YW1wIC8gMTAwMDsKKyAgICAgICAgaWYgKG1GcmFtZURyb3BwZXIgIT0gTlVMTCAmJiBtRnJhbWVEcm9wcGVyLT5zaG91bGREcm9wKHRpbWVVcykpIHsKKyAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyBmcmFtZSAoJWxsZCkgdG8gbWVldCBtYXggZnJhbWVyYXRlIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKKyAgICAgICAgICAgIC8vIHNldCBlcnIgdG8gT0sgc28gdGhhdCB0aGUgc2tpcHBlZCBmcmFtZSBjYW4gc3RpbGwgYmUgc2F2ZWQgYXMgdGhlIGxhc3Rlc3QgZnJhbWUKKyAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgZHJvcHBlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBzdWJtaXRCdWZmZXJfbChpdGVtLCBjYmkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HVigic3VibWl0QnVmZmVyX2wgZmFpbGVkLCByZWxlYXNpbmcgYnEgYnVmICVkIiwgaXRlbS5tQnVmKTsKLSAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsCi0gICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgRmVuY2U6Ok5PX0ZFTkNFKTsKKyAgICAgICAgcmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLCBpdGVtLm1HcmFwaGljQnVmZmVyLCBpdGVtLm1GZW5jZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoImJ1ZmZlciBzdWJtaXR0ZWQgKGJxICVkLCBjYmkgJWQpIiwgaXRlbS5tQnVmLCBjYmkpOwotICAgICAgICBzZXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbChpdGVtKTsKKyAgICAgICAgc2V0TGF0ZXN0QnVmZmVyX2woaXRlbSwgZHJvcHBlZCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgR3JhcGhpY0J1ZmZlclNvdXJjZTo6cmVwZWF0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2woKSB7Citib29sIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnJlcGVhdExhdGVzdEJ1ZmZlcl9sKCkgewogICAgIENIRUNLKG1FeGVjdXRpbmcgJiYgbU51bUZyYW1lc0F2YWlsYWJsZSA9PSAwKTsKIAotICAgIGlmIChtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQgPCAwIHx8IG1TdXNwZW5kZWQpIHsKKyAgICBpZiAobUxhdGVzdEJ1ZmZlcklkIDwgMCB8fCBtU3VzcGVuZGVkKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgaWYgKG1CdWZmZXJTbG90W21MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZF0gPT0gTlVMTCkgeworICAgIGlmIChtQnVmZmVyU2xvdFttTGF0ZXN0QnVmZmVySWRdID09IE5VTEwpIHsKICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSByZW1vdGUgc2lkZSBkaXNjb25uZWN0cywgY2F1c2luZwogICAgICAgICAvLyBvbkJ1ZmZlcnNSZWxlYXNlZCgpIHRvIE5VTEwgb3V0IG91ciBjb3B5IG9mIHRoZSBzbG90cy4gIFRoZQogICAgICAgICAvLyBidWZmZXIgaXMgZ29uZSwgc28gd2UgaGF2ZSBub3RoaW5nIHRvIHNob3cuCiAgICAgICAgIC8vCiAgICAgICAgIC8vIFRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgd2UgdHJ5IHRvIHJlbGVhc2UgdGhlIGJ1ZmZlci4KLSAgICAgICAgQUxPR0QoInJlcGVhdExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sOiBzbG90IHdhcyBOVUxMIik7CisgICAgICAgIEFMT0dEKCJyZXBlYXRMYXRlc3RCdWZmZXJfbDogc2xvdCB3YXMgTlVMTCIpOwogICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoCi0gICAgICAgICAgICAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkLAotICAgICAgICAgICAgICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJGcmFtZU51bSwKKyAgICAgICAgICAgICAgICBtTGF0ZXN0QnVmZmVySWQsCisgICAgICAgICAgICAgICAgbUxhdGVzdEJ1ZmZlckZyYW1lTnVtLAogICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLAogICAgICAgICAgICAgICAgIEVHTF9OT19TWU5DX0tIUiwKLSAgICAgICAgICAgICAgICBGZW5jZTo6Tk9fRkVOQ0UpOwotICAgICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQgPSAtMTsKLSAgICAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlckZyYW1lTnVtID0gMDsKKyAgICAgICAgICAgICAgICBtTGF0ZXN0QnVmZmVyRmVuY2UpOworICAgICAgICBtTGF0ZXN0QnVmZmVySWQgPSAtMTsKKyAgICAgICAgbUxhdGVzdEJ1ZmZlckZyYW1lTnVtID0gMDsKKyAgICAgICAgbUxhdGVzdEJ1ZmZlckZlbmNlID0gRmVuY2U6Ok5PX0ZFTkNFOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgaW50IGNiaSA9IGZpbmRBdmFpbGFibGVDb2RlY0J1ZmZlcl9sKCk7CiAgICAgaWYgKGNiaSA8IDApIHsKICAgICAgICAgLy8gTm8gYnVmZmVycyBhdmFpbGFibGUsIGJhaWwuCi0gICAgICAgIEFMT0dWKCJyZXBlYXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbDogbm8gY29kZWMgYnVmZmVycy4iKTsKKyAgICAgICAgQUxPR1YoInJlcGVhdExhdGVzdEJ1ZmZlcl9sOiBubyBjb2RlYyBidWZmZXJzLiIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgQnVmZmVySXRlbSBpdGVtOwotICAgIGl0ZW0ubUJ1ZiA9IG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZDsKLSAgICBpdGVtLm1GcmFtZU51bWJlciA9IG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJGcmFtZU51bTsKKyAgICBpdGVtLm1CdWYgPSBtTGF0ZXN0QnVmZmVySWQ7CisgICAgaXRlbS5tRnJhbWVOdW1iZXIgPSBtTGF0ZXN0QnVmZmVyRnJhbWVOdW07CiAgICAgaXRlbS5tVGltZXN0YW1wID0gbVJlcGVhdExhc3RGcmFtZVRpbWVzdGFtcDsKKyAgICBpdGVtLm1GZW5jZSA9IG1MYXRlc3RCdWZmZXJGZW5jZTsKIAogICAgIHN0YXR1c190IGVyciA9IHN1Ym1pdEJ1ZmZlcl9sKGl0ZW0sIGNiaSk7CiAKQEAgLTUwNCw3ICs2MTEsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgKyttTGF0ZXN0U3VibWl0dGVkQnVmZmVyVXNlQ291bnQ7CisgICAgKyttTGF0ZXN0QnVmZmVyVXNlQ291bnQ7CiAKICAgICAvKiByZXBlYXQgbGFzdCBmcmFtZSB1cCB0byBrUmVwZWF0TGFzdEZyYW1lQ291bnQgdGltZXMuCiAgICAgICogaW4gY2FzZSBvZiBzdGF0aWMgc2NlbmUsIGEgc2luZ2xlIHJlcGVhdCBtaWdodCBub3QgZ2V0IHJpZCBvZiBlbmNvZGVyCkBAIC01MTQsNyArNjIxLDcgQEAKICAgICAgICAgbVJlcGVhdExhc3RGcmFtZVRpbWVzdGFtcCA9IGl0ZW0ubVRpbWVzdGFtcCArIG1SZXBlYXRBZnRlclVzICogMTAwMDsKIAogICAgICAgICBpZiAobVJlZmxlY3RvciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVwZWF0TGFzdEZyYW1lLCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXBlYXRMYXN0RnJhbWUsIG1SZWZsZWN0b3IpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsICsrbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb24pOwogICAgICAgICAgICAgbXNnLT5wb3N0KG1SZXBlYXRBZnRlclVzKTsKICAgICAgICAgfQpAQCAtNTIzLDMxICs2MzAsMjkgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbCgKLSAgICAgICAgY29uc3QgQnVmZmVySXRlbSAmaXRlbSkgewotICAgIEFMT0dWKCJzZXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbCIpOwordm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRMYXRlc3RCdWZmZXJfbCgKKyAgICAgICAgY29uc3QgQnVmZmVySXRlbSAmaXRlbSwgYm9vbCBkcm9wcGVkKSB7CisgICAgQUxPR1YoInNldExhdGVzdEJ1ZmZlcl9sIik7CiAKLSAgICBpZiAobUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkID49IDApIHsKLSAgICAgICAgaWYgKG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJVc2VDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCwKLSAgICAgICAgICAgICAgICAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlckZyYW1lTnVtLAotICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwKLSAgICAgICAgICAgICAgICAgICAgRUdMX05PX1NZTkNfS0hSLAotICAgICAgICAgICAgICAgICAgICBGZW5jZTo6Tk9fRkVOQ0UpOworICAgIGlmIChtTGF0ZXN0QnVmZmVySWQgPj0gMCkgeworICAgICAgICBpZiAobUxhdGVzdEJ1ZmZlclVzZUNvdW50ID09IDApIHsKKyAgICAgICAgICAgIHJlbGVhc2VCdWZmZXIobUxhdGVzdEJ1ZmZlcklkLCBtTGF0ZXN0QnVmZmVyRnJhbWVOdW0sCisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJTbG90W21MYXRlc3RCdWZmZXJJZF0sIG1MYXRlc3RCdWZmZXJGZW5jZSk7CisgICAgICAgICAgICAvLyBtTGF0ZXN0QnVmZmVyRmVuY2Ugd2lsbCBiZSBzZXQgdG8gbmV3IGZlbmNlIGp1c3QgYmVsb3cKICAgICAgICAgfQogICAgIH0KIAotICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCA9IGl0ZW0ubUJ1ZjsKLSAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyRnJhbWVOdW0gPSBpdGVtLm1GcmFtZU51bWJlcjsKKyAgICBtTGF0ZXN0QnVmZmVySWQgPSBpdGVtLm1CdWY7CisgICAgbUxhdGVzdEJ1ZmZlckZyYW1lTnVtID0gaXRlbS5tRnJhbWVOdW1iZXI7CiAgICAgbVJlcGVhdExhc3RGcmFtZVRpbWVzdGFtcCA9IGl0ZW0ubVRpbWVzdGFtcCArIG1SZXBlYXRBZnRlclVzICogMTAwMDsKIAotICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJVc2VDb3VudCA9IDE7CisgICAgbUxhdGVzdEJ1ZmZlclVzZUNvdW50ID0gZHJvcHBlZCA/IDAgOiAxOwogICAgIG1SZXBlYXRCdWZmZXJEZWZlcnJlZCA9IGZhbHNlOwogICAgIG1SZXBlYXRMYXN0RnJhbWVDb3VudCA9IGtSZXBlYXRMYXN0RnJhbWVDb3VudDsKKyAgICBtTGF0ZXN0QnVmZmVyRmVuY2UgPSBpdGVtLm1GZW5jZTsKIAogICAgIGlmIChtUmVmbGVjdG9yICE9IE5VTEwpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlcGVhdExhc3RGcmFtZSwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXBlYXRMYXN0RnJhbWUsIG1SZWZsZWN0b3IpOwogICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgKyttUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbik7CiAgICAgICAgIG1zZy0+cG9zdChtUmVwZWF0QWZ0ZXJVcyk7CiAgICAgfQpAQCAtNjQwLDggKzc0NSw3IEBACiAgICAgcmV0dXJuIHRpbWVVczsKIH0KIAotc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c3VibWl0QnVmZmVyX2woCi0gICAgICAgIGNvbnN0IEJ1ZmZlckl0ZW0gJml0ZW0sIGludCBjYmkpIHsKK3N0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnN1Ym1pdEJ1ZmZlcl9sKGNvbnN0IEJ1ZmZlckl0ZW0gJml0ZW0sIGludCBjYmkpIHsKICAgICBBTE9HVigic3VibWl0QnVmZmVyX2wgY2JpPSVkIiwgY2JpKTsKIAogICAgIGludDY0X3QgdGltZVVzID0gZ2V0VGltZXN0YW1wKGl0ZW0pOwpAQCAtNjU1LDM2ICs3NTksMTggQEAKICAgICBjb2RlY0J1ZmZlci5tRnJhbWVOdW1iZXIgPSBpdGVtLm1GcmFtZU51bWJlcjsKIAogICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBoZWFkZXIgPSBjb2RlY0J1ZmZlci5tSGVhZGVyOwotICAgIENIRUNLKGhlYWRlci0+bkFsbG9jTGVuID49IDQgKyBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7Ci0gICAgT01YX1U4KiBkYXRhID0gaGVhZGVyLT5wQnVmZmVyOwotICAgIGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGU7Ci0gICAgaWYgKCFtVXNlR3JhcGhpY0J1ZmZlckluTWV0YSkgewotICAgICAgICBjb25zdCBPTVhfVTMyIHR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZTsKLSAgICAgICAgaGFuZGxlID0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZTsKLSAgICAgICAgbWVtY3B5KGRhdGEsICZ0eXBlLCA0KTsKLSAgICAgICAgbWVtY3B5KGRhdGEgKyA0LCAmaGFuZGxlLCBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gY29kZWNCdWZmZXIgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIEdyYXBoaWNCdWZmZXIsIHNvCi0gICAgICAgIC8vIGl0IGlzIHZhbGlkIHdoaWxlIGl0IGlzIHdpdGggdGhlIE9NWCBjb21wb25lbnQKLSAgICAgICAgY29uc3QgT01YX1UzMiB0eXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYXBoaWNCdWZmZXI7Ci0gICAgICAgIG1lbWNweShkYXRhLCAmdHlwZSwgNCk7Ci0gICAgICAgIC8vIHBhc3NpbmcgYSBub24tcmVmZXJlbmNlLWNvdW50ZWQgZ3JhcGhpY0J1ZmZlcgotICAgICAgICBHcmFwaGljQnVmZmVyICpidWZmZXIgPSBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci5nZXQoKTsKLSAgICAgICAgaGFuZGxlID0gYnVmZmVyLT5oYW5kbGU7Ci0gICAgICAgIG1lbWNweShkYXRhICsgNCwgJmJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IG1Ob2RlSW5zdGFuY2UtPmVtcHR5RGlyZWN0QnVmZmVyKGhlYWRlciwgMCwKLSAgICAgICAgICAgIDQgKyBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSwgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSwKLSAgICAgICAgICAgIHRpbWVVcyk7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyID0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXI7CisgICAgc3RhdHVzX3QgZXJyID0gbU5vZGVJbnN0YW5jZS0+ZW1wdHlHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgaGVhZGVyLCBidWZmZXIsIE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUUsIHRpbWVVcywKKyAgICAgICAgICAgIGl0ZW0ubUZlbmNlLT5pc1ZhbGlkKCkgPyBpdGVtLm1GZW5jZS0+ZHVwKCkgOiAtMSk7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HVygiV0FSTklORzogZW1wdHlEaXJlY3RCdWZmZXIgZmFpbGVkOiAweCV4IiwgZXJyKTsKKyAgICAgICAgQUxPR1coIldBUk5JTkc6IGVtcHR5TmF0aXZlV2luZG93QnVmZmVyIGZhaWxlZDogMHgleCIsIGVycik7CiAgICAgICAgIGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyID0gTlVMTDsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBBTE9HVigiZW1wdHlEaXJlY3RCdWZmZXIgc3VjY2VlZGVkLCBoPSVwIHA9JXAgYnVmaGFuZGxlPSVwIiwKLSAgICAgICAgICAgIGhlYWRlciwgaGVhZGVyLT5wQnVmZmVyLCBoYW5kbGUpOworICAgIEFMT0dWKCJlbXB0eU5hdGl2ZVdpbmRvd0J1ZmZlciBzdWNjZWVkZWQsIGg9JXAgcD0lcCBidWY9JXAgYnVmaGFuZGxlPSVwIiwKKyAgICAgICAgICAgIGhlYWRlciwgaGVhZGVyLT5wQnVmZmVyLCBidWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpLCBidWZmZXItPmhhbmRsZSk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC03MDcsMTkgKzc5Myw5IEBACiAgICAgQ29kZWNCdWZmZXImIGNvZGVjQnVmZmVyKG1Db2RlY0J1ZmZlcnMuZWRpdEl0ZW1BdChjYmkpKTsKIAogICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBoZWFkZXIgPSBjb2RlY0J1ZmZlci5tSGVhZGVyOwotICAgIGlmIChFWFRSQV9DSEVDSykgewotICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IGltcGxlbWVudGF0aW9ucyB0aGF0IGRvbid0IGNoZWNrIG5GaWxsZWRMZW4uCi0gICAgICAgIHNpemVfdCBmaWxsTGVuID0gNCArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpOwotICAgICAgICBDSEVDSyhoZWFkZXItPm5BbGxvY0xlbiA+PSBmaWxsTGVuKTsKLSAgICAgICAgT01YX1U4KiBkYXRhID0gaGVhZGVyLT5wQnVmZmVyOwotICAgICAgICBtZW1zZXQoZGF0YSwgMHhjZCwgZmlsbExlbik7Ci0gICAgfQotCi0gICAgdWludDY0X3QgdGltZXN0YW1wID0gMDsgLy8gZG9lcyB0aGlzIG1hdHRlcj8KLQotICAgIHN0YXR1c190IGVyciA9IG1Ob2RlSW5zdGFuY2UtPmVtcHR5RGlyZWN0QnVmZmVyKGhlYWRlciwgLypvZmZzZXQqLyAwLAotICAgICAgICAgICAgLypsZW5ndGgqLyAwLCBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FIHwgT01YX0JVRkZFUkZMQUdfRU9TLAotICAgICAgICAgICAgdGltZXN0YW1wKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtTm9kZUluc3RhbmNlLT5lbXB0eUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBoZWFkZXIsIE5VTEwgLyogYnVmZmVyICovLCBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FIHwgT01YX0JVRkZFUkZMQUdfRU9TLAorICAgICAgICAgICAgMCAvKiB0aW1lc3RhbXAgKi8sIC0xIC8qIGZlbmNlRmQgKi8pOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR1coImVtcHR5RGlyZWN0QnVmZmVyIEVPUyBmYWlsZWQ6IDB4JXgiLCBlcnIpOwogICAgIH0gZWxzZSB7CkBAIC03NTAsNiArODI2LDM1IEBACiAgICAgcmV0dXJuIC0xOwogfQogCisvKgorICogUmVsZWFzZXMgYW4gYWNxdWlyZWQgYnVmZmVyIGJhY2sgdG8gdGhlIGNvbnN1bWVyIGZvciBlaXRoZXIgcGVyc2lzdGVudAorICogb3Igbm9uLXBlcnNpc3RlbnQgc3VyZmFjZXMuCisgKgorICogaWQ6IGJ1ZmZlciBzbG90IHRvIHJlbGVhc2UgKGluIHBlcnNpc3RlbnQgY2FzZSB0aGUgaWQgbWlnaHQgYmUgY2hhbmdlZCkKKyAqIGZyYW1lTnVtOiBmcmFtZSBudW1iZXIgb2YgdGhlIGZyYW1lIGJlaW5nIHJlbGVhc2VkCisgKiBidWZmZXI6IEdyYXBoaWNCdWZmZXIgcG9pbnRlciB0byByZWxlYXNlIChub3RlIHRoaXMgbXVzdCBub3QgYmUgJiBhcyB3ZQorICogICAgICAgICB3aWxsIGNsZWFyIHRoZSBvcmlnaW5hbCBtQnVmZmVyU2xvdCBpbiBwZXJzaXN0ZW50IGNhc2UpCisgKiBmZW5jZTogZmVuY2Ugb2YgdGhlIGZyYW1lIGJlaW5nIHJlbGVhc2VkCisgKi8KK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6cmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgaW50ICZpZCwgdWludDY0X3QgZnJhbWVOdW0sCisgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlciwgY29uc3Qgc3A8RmVuY2U+ICZmZW5jZSkgeworICAgIGlmIChtSXNQZXJzaXN0ZW50KSB7CisgICAgICAgIG1Db25zdW1lci0+ZGV0YWNoQnVmZmVyKGlkKTsKKyAgICAgICAgbUJ1ZmZlclNsb3RbaWRdID0gTlVMTDsKKworICAgICAgICBpZiAobUNvbnN1bWVyLT5hdHRhY2hCdWZmZXIoJmlkLCBidWZmZXIpID09IE9LKSB7CisgICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIGlkLCAwLCBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBmZW5jZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICAgICAgaWQsIGZyYW1lTnVtLCBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBmZW5jZSk7CisgICAgfQorICAgIGlkID0gLTE7IC8vIGludmFsaWRhdGUgaWQKKyAgICBtTnVtQnVmZmVyQWNxdWlyZWQtLTsKK30KKwogLy8gQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgY2FsbGJhY2sKIHZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiAvKml0ZW0qLykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwpAQCAtNzcwLDE0ICs4NzUsMTcgQEAKICAgICAgICAgQnVmZmVySXRlbSBpdGVtOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOwogICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBtTnVtQnVmZmVyQWNxdWlyZWQrKzsKKwogICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBzZWVpbmcgdGhpcyBidWZmZXIsIGFkZCBpdCB0byBvdXIKICAgICAgICAgICAgIC8vIHNsb3QgdGFibGUuCiAgICAgICAgICAgICBpZiAoaXRlbS5tR3JhcGhpY0J1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIm9uRnJhbWVBdmFpbGFibGU6IHNldHRpbmcgbUJ1ZmZlclNsb3QgJWQiLCBpdGVtLm1CdWYpOwogICAgICAgICAgICAgICAgIG1CdWZmZXJTbG90W2l0ZW0ubUJ1Zl0gPSBpdGVtLm1HcmFwaGljQnVmZmVyOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIGl0ZW0ubUZlbmNlKTsKKworICAgICAgICAgICAgcmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICBpdGVtLm1HcmFwaGljQnVmZmVyLCBpdGVtLm1GZW5jZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTg0Miw2ICs5NTAsMjMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldE1heEZwcyhmbG9hdCBtYXhGcHMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIGlmIChtRXhlY3V0aW5nKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBtRnJhbWVEcm9wcGVyID0gbmV3IEZyYW1lRHJvcHBlcigpOworICAgIHN0YXR1c190IGVyciA9IG1GcmFtZURyb3BwZXItPnNldE1heEZyYW1lUmF0ZShtYXhGcHMpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbUZyYW1lRHJvcHBlci5jbGVhcigpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwogdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRTa2lwRnJhbWVzQmVmb3JlVXMoaW50NjRfdCBza2lwRnJhbWVzQmVmb3JlVXMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKIApAQCAtODgwLDEyICsxMDA1LDEyIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IHJlcGVhdExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sKCk7CisgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSByZXBlYXRMYXRlc3RCdWZmZXJfbCgpOwogCiAgICAgICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgICAgIEFMT0dWKCJyZXBlYXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbCBTVUNDRVNTIik7CisgICAgICAgICAgICAgICAgQUxPR1YoInJlcGVhdExhdGVzdEJ1ZmZlcl9sIFNVQ0NFU1MiKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInJlcGVhdExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sIEZBSUxVUkUiKTsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVwZWF0TGF0ZXN0QnVmZmVyX2wgRkFJTFVSRSIpOwogICAgICAgICAgICAgICAgIG1SZXBlYXRCdWZmZXJEZWZlcnJlZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCmluZGV4IDQwMWJiYzMuLjJmOTI5ZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaApAQCAtMzAsNiArMzAsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBGcmFtZURyb3BwZXI7CisKIC8qCiAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZmVlZCBPTVggY29kZWNzIGZyb20gYSBTdXJmYWNlIHZpYSBCdWZmZXJRdWV1ZS4KICAqCkBAIC00OCw5ICs1MCwxNSBAQAogICovCiBjbGFzcyBHcmFwaGljQnVmZmVyU291cmNlIDogcHVibGljIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIHsKIHB1YmxpYzoKLSAgICBHcmFwaGljQnVmZmVyU291cmNlKE9NWE5vZGVJbnN0YW5jZSogbm9kZUluc3RhbmNlLAotICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyV2lkdGgsIHVpbnQzMl90IGJ1ZmZlckhlaWdodCwgdWludDMyX3QgYnVmZmVyQ291bnQsCi0gICAgICAgICAgICBib29sIHVzZUdyYXBoaWNCdWZmZXJJbk1ldGEgPSBmYWxzZSk7CisgICAgR3JhcGhpY0J1ZmZlclNvdXJjZSgKKyAgICAgICAgICAgIE9NWE5vZGVJbnN0YW5jZSogbm9kZUluc3RhbmNlLAorICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyV2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJIZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJDb3VudCwKKyAgICAgICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UsCisgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAmY29uc3VtZXIgPSBOVUxMCisgICAgKTsKKwogICAgIHZpcnR1YWwgfkdyYXBoaWNCdWZmZXJTb3VyY2UoKTsKIAogICAgIC8vIFdlIGNhbid0IHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29uc3RydWN0b3IgZmFpbHMsIHNvIHdlIGp1c3Qgc2V0CkBAIC04Niw3ICs5NCw3IEBACiAKICAgICAvLyBDYWxsZWQgZnJvbSBPbkVtcHR5QnVmZmVyRG9uZS4gIElmIHdlIGhhdmUgYSBCUSBidWZmZXIgYXZhaWxhYmxlLAogICAgIC8vIGZpbGwgaXQgd2l0aCBhIG5ldyBmcmFtZSBvZiBkYXRhOyBvdGhlcndpc2UsIGp1c3QgbWFyayBpdCBhcyBhdmFpbGFibGUuCi0gICAgdm9pZCBjb2RlY0J1ZmZlckVtcHRpZWQoT01YX0JVRkZFUkhFQURFUlRZUEUqIGhlYWRlcik7CisgICAgdm9pZCBjb2RlY0J1ZmZlckVtcHRpZWQoT01YX0JVRkZFUkhFQURFUlRZUEUqIGhlYWRlciwgaW50IGZlbmNlRmQpOwogCiAgICAgLy8gQ2FsbGVkIHdoZW4gb214X21lc3NhZ2U6OkZJTExfQlVGRkVSX0RPTkUgaXMgcmVjZWl2ZWQuIChDdXJyZW50bHkgdGhlCiAgICAgLy8gYnVmZmVyIHNvdXJjZSB3aWxsIGZpeCB0aW1lc3RhbXAgaW4gdGhlIGhlYWRlciBpZiBuZWVkZWQuKQpAQCAtMTE5LDYgKzEyNyw5IEBACiAgICAgLy8gb2Ygc3VzcGVuc2lvbiBvbiBpbnB1dC4KICAgICBzdGF0dXNfdCBzZXRNYXhUaW1lc3RhbXBHYXBVcyhpbnQ2NF90IG1heEdhcFVzKTsKIAorICAgIC8vIFdoZW4gc2V0LCB0aGUgbWF4IGZyYW1lIHJhdGUgZmVkIHRvIHRoZSBlbmNvZGVyIHdpbGwgYmUgY2FwcGVkIGF0IG1heEZwcy4KKyAgICBzdGF0dXNfdCBzZXRNYXhGcHMoZmxvYXQgbWF4RnBzKTsKKwogICAgIC8vIFNldHMgdGhlIHRpbWUgbGFwc2UgKG9yIHNsb3cgbW90aW9uKSBwYXJhbWV0ZXJzLgogICAgIC8vIGRhdGFbMF0gaXMgdGhlIHRpbWUgKHVzKSBiZXR3ZWVuIHR3byBmcmFtZXMgZm9yIHBsYXliYWNrCiAgICAgLy8gZGF0YVsxXSBpcyB0aGUgdGltZSAodXMpIGJldHdlZW4gdHdvIGZyYW1lcyBmb3IgY2FwdHVyZQpAQCAtMTUwLDYgKzE2MSwzMSBAQAogICAgIHZpcnR1YWwgdm9pZCBvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpOwogCiBwcml2YXRlOgorICAgIC8vIFBlcnNpc3RlbnRQcm94eUxpc3RlbmVyIGlzIHNpbWlsYXIgdG8gQnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcgorICAgIC8vIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgKGFjcXVpcmUvZGV0YWNoL3JlLWF0dGFjaGUvcmVsZWFzZSkgYnVmZmVycworICAgIC8vIGluIG9uRnJhbWVBdmFpbGFibGUoKSBpZiB0aGUgYWN0dWFsIGNvbnN1bWVyIG9iamVjdCBpcyBubyBsb25nZXIgdmFsaWQuCisgICAgLy8KKyAgICAvLyBUaGlzIGNsYXNzIGlzIHVzZWQgaW4gcGVyc2lzdGVudCBpbnB1dCBzdXJmYWNlIGNhc2UgdG8gcHJldmVudCBidWZmZXIKKyAgICAvLyBsb3NzIHdoZW4gb25GcmFtZUF2YWlsYWJsZSgpIGlzIHJlY2VpdmVkIHdoaWxlIHdlIGRvbid0IGhhdmUgYSB2YWxpZAorICAgIC8vIGNvbnN1bWVyIGFyb3VuZC4KKyAgICBjbGFzcyBQZXJzaXN0ZW50UHJveHlMaXN0ZW5lciA6IHB1YmxpYyBCbkNvbnN1bWVyTGlzdGVuZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBQZXJzaXN0ZW50UHJveHlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gJmNvbnN1bWVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxDb25zdW1lckxpc3RlbmVyPiYgY29uc3VtZXJMaXN0ZW5lcik7CisgICAgICAgICAgICB2aXJ0dWFsIH5QZXJzaXN0ZW50UHJveHlMaXN0ZW5lcigpOworICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgb3ZlcnJpZGU7CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZVJlcGxhY2VkKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCkgb3ZlcnJpZGU7CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKSBvdmVycmlkZTsKKyAgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAvLyBtQ29uc3VtZXJMaXN0ZW5lciBpcyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBJQ29uc3VtZXJMaXN0ZW5lci4KKyAgICAgICAgICAgIHdwPENvbnN1bWVyTGlzdGVuZXI+IG1Db25zdW1lckxpc3RlbmVyOworICAgICAgICAgICAgLy8gbUNvbnN1bWVyIGlzIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIElHcmFwaGljQnVmZmVyQ29uc3VtZXIsIHVzZQorICAgICAgICAgICAgLy8gYSB3ZWFrIHJlZiB0byBhdm9pZCBjaXJjdWxhciByZWYgYmV0d2VlbiBtQ29uc3VtZXIgYW5kIHRoaXMgY2xhc3MKKyAgICAgICAgICAgIHdwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IG1Db25zdW1lcjsKKyAgICB9OworCiAgICAgLy8gS2VlcCB0cmFjayBvZiBjb2RlYyBpbnB1dCBidWZmZXJzLiAgVGhleSBtYXkgZWl0aGVyIGJlIGF2YWlsYWJsZQogICAgIC8vIChtR3JhcGhpY0J1ZmZlciA9PSBOVUxMKSBvciBpbiB1c2UgYnkgdGhlIGNvZGVjLgogICAgIHN0cnVjdCBDb2RlY0J1ZmZlciB7CkBAIC0xOTMsOCArMjI5LDEzIEBACiAgICAgLy8gZG9pbmcgYW55dGhpbmcgaWYgd2UgZG9uJ3QgaGF2ZSBhIGNvZGVjIGJ1ZmZlciBhdmFpbGFibGUuCiAgICAgdm9pZCBzdWJtaXRFbmRPZklucHV0U3RyZWFtX2woKTsKIAotICAgIHZvaWQgc2V0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2woY29uc3QgQnVmZmVySXRlbSAmaXRlbSk7Ci0gICAgYm9vbCByZXBlYXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbCgpOworICAgIC8vIFJlbGVhc2UgYnVmZmVyIHRvIHRoZSBjb25zdW1lcgorICAgIHZvaWQgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGludCAmaWQsIHVpbnQ2NF90IGZyYW1lTnVtLAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyLCBjb25zdCBzcDxGZW5jZT4gJmZlbmNlKTsKKworICAgIHZvaWQgc2V0TGF0ZXN0QnVmZmVyX2woY29uc3QgQnVmZmVySXRlbSAmaXRlbSwgYm9vbCBkcm9wcGVkKTsKKyAgICBib29sIHJlcGVhdExhdGVzdEJ1ZmZlcl9sKCk7CiAgICAgaW50NjRfdCBnZXRUaW1lc3RhbXAoY29uc3QgQnVmZmVySXRlbSAmaXRlbSk7CiAKICAgICAvLyBMb2NrLCBjb3ZlcnMgYWxsIG1lbWJlciB2YXJpYWJsZXMuCkBAIC0yMTQsNiArMjU1LDcgQEAKICAgICAvLyBPdXIgQnVmZmVyUXVldWUgaW50ZXJmYWNlcy4gbVByb2R1Y2VyIGlzIHBhc3NlZCB0byB0aGUgcHJvZHVjZXIgdGhyb3VnaAogICAgIC8vIGdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIsIGFuZCBtQ29uc3VtZXIgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIHJldHJpZXZlCiAgICAgLy8gdGhlIGJ1ZmZlcnMgcXVldWVkIGJ5IHRoZSBwcm9kdWNlci4KKyAgICBib29sIG1Jc1BlcnNpc3RlbnQ7CiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOwogICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IG1Db25zdW1lcjsKIApAQCAtMjIxLDYgKzI2Myw5IEBACiAgICAgLy8gZm9yd2FyZGVkIHRvIHRoZSBjb2RlYy4KICAgICBzaXplX3QgbU51bUZyYW1lc0F2YWlsYWJsZTsKIAorICAgIC8vIE51bWJlciBvZiBmcmFtZXMgYWNxdWlyZWQgZnJvbSBjb25zdW1lciAoZGVidWcgb25seSkKKyAgICBpbnQzMl90IG1OdW1CdWZmZXJBY3F1aXJlZDsKKwogICAgIC8vIFNldCB0byB0cnVlIGlmIHdlIHdhbnQgdG8gc2VuZCBlbmQtb2Ytc3RyZWFtIGFmdGVyIHdlIHJ1biBvdXQgb2YKICAgICAvLyBmcmFtZXMgaW4gQnVmZmVyUXVldWUuCiAgICAgYm9vbCBtRW5kT2ZTdHJlYW07CkBAIC0yMzUsNyArMjgwLDcgQEAKICAgICBWZWN0b3I8Q29kZWNCdWZmZXI+IG1Db2RlY0J1ZmZlcnM7CiAKICAgICAvLy8vCi0gICAgZnJpZW5kIGNsYXNzIEFIYW5kbGVyUmVmbGVjdG9yPEdyYXBoaWNCdWZmZXJTb3VyY2U+OworICAgIGZyaWVuZCBzdHJ1Y3QgQUhhbmRsZXJSZWZsZWN0b3I8R3JhcGhpY0J1ZmZlclNvdXJjZT47CiAKICAgICBlbnVtIHsKICAgICAgICAga1doYXRSZXBlYXRMYXN0RnJhbWUsCkBAIC0yNTAsNiArMjk1LDggQEAKICAgICBpbnQ2NF90IG1QcmV2TW9kaWZpZWRUaW1lVXM7CiAgICAgaW50NjRfdCBtU2tpcEZyYW1lc0JlZm9yZU5zOwogCisgICAgc3A8RnJhbWVEcm9wcGVyPiBtRnJhbWVEcm9wcGVyOworCiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKICAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxHcmFwaGljQnVmZmVyU291cmNlPiA+IG1SZWZsZWN0b3I7CiAKQEAgLTI1OCwxMSArMzA1LDEyIEBACiAgICAgaW50NjRfdCBtUmVwZWF0TGFzdEZyYW1lVGltZXN0YW1wOwogICAgIGludDMyX3QgbVJlcGVhdExhc3RGcmFtZUNvdW50OwogCi0gICAgaW50IG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZDsKLSAgICB1aW50NjRfdCBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyRnJhbWVOdW07Ci0gICAgaW50MzJfdCBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyVXNlQ291bnQ7CisgICAgaW50IG1MYXRlc3RCdWZmZXJJZDsKKyAgICB1aW50NjRfdCBtTGF0ZXN0QnVmZmVyRnJhbWVOdW07CisgICAgaW50MzJfdCBtTGF0ZXN0QnVmZmVyVXNlQ291bnQ7CisgICAgc3A8RmVuY2U+IG1MYXRlc3RCdWZmZXJGZW5jZTsKIAotICAgIC8vIFRoZSBwcmV2aW91c2x5IHN1Ym1pdHRlZCBidWZmZXIgc2hvdWxkJ3ZlIGJlZW4gcmVwZWF0ZWQgYnV0CisgICAgLy8gVGhlIHByZXZpb3VzIGJ1ZmZlciBzaG91bGQndmUgYmVlbiByZXBlYXRlZCBidXQKICAgICAvLyBubyBjb2RlYyBidWZmZXIgd2FzIGF2YWlsYWJsZSBhdCB0aGUgdGltZS4KICAgICBib29sIG1SZXBlYXRCdWZmZXJEZWZlcnJlZDsKIApAQCAtMjcyLDcgKzMyMCw3IEBACiAgICAgaW50NjRfdCBtUHJldkNhcHR1cmVVczsKICAgICBpbnQ2NF90IG1QcmV2RnJhbWVVczsKIAotICAgIGJvb2wgbVVzZUdyYXBoaWNCdWZmZXJJbk1ldGE7CisgICAgTWV0YWRhdGFCdWZmZXJUeXBlIG1NZXRhZGF0YUJ1ZmZlclR5cGU7CiAKICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAppbmRleCAwMWRmYzhhLi41ODk4YjRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcApAQCAtMzIsNyArMzIsOSBAQAogCiAjaW5jbHVkZSAiT01YTWFzdGVyLmgiCiAKKyNpbmNsdWRlIDxPTVhfQXNTdHJpbmcuaD4KICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjAsNyArNjIsMTEgQEAKIHN0cnVjdCBPTVg6OkNhbGxiYWNrRGlzcGF0Y2hlciA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBDYWxsYmFja0Rpc3BhdGNoZXIoT01YTm9kZUluc3RhbmNlICpvd25lcik7CiAKLSAgICB2b2lkIHBvc3QoY29uc3Qgb214X21lc3NhZ2UgJm1zZyk7CisgICAgLy8gUG9zdHMgfG1zZ3wgdG8gdGhlIGxpc3RlbmVyJ3MgcXVldWUuIElmIHxyZWFsVGltZXwgaXMgdHJ1ZSwgdGhlIGxpc3RlbmVyIHRocmVhZCBpcyBub3RpZmllZAorICAgIC8vIHRoYXQgYSBuZXcgbWVzc2FnZSBpcyBhdmFpbGFibGUgb24gdGhlIHF1ZXVlLiBPdGhlcndpc2UsIHRoZSBtZXNzYWdlIHN0YXlzIG9uIHRoZSBxdWV1ZSwgYnV0CisgICAgLy8gdGhlIGxpc3RlbmVyIGlzIG5vdCBub3RpZmllZCBvZiBpdC4gSXQgd2lsbCBwcm9jZXNzIHRoaXMgbWVzc2FnZSB3aGVuIGEgc3Vic2VxdWVudCBtZXNzYWdlCisgICAgLy8gaXMgcG9zdGVkIHdpdGggfHJlYWxUaW1lfCBzZXQgdG8gdHJ1ZS4KKyAgICB2b2lkIHBvc3QoY29uc3Qgb214X21lc3NhZ2UgJm1zZywgYm9vbCByZWFsVGltZSA9IHRydWUpOwogCiAgICAgYm9vbCBsb29wKCk7CiAKQEAgLTczLDExICs3OSwxMSBAQAogICAgIE9NWE5vZGVJbnN0YW5jZSAqbU93bmVyOwogICAgIGJvb2wgbURvbmU7CiAgICAgQ29uZGl0aW9uIG1RdWV1ZUNoYW5nZWQ7Ci0gICAgTGlzdDxvbXhfbWVzc2FnZT4gbVF1ZXVlOworICAgIHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gbVF1ZXVlOwogCiAgICAgc3A8Q2FsbGJhY2tEaXNwYXRjaGVyVGhyZWFkPiBtVGhyZWFkOwogCi0gICAgdm9pZCBkaXNwYXRjaChjb25zdCBvbXhfbWVzc2FnZSAmbXNnKTsKKyAgICB2b2lkIGRpc3BhdGNoKHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKTsKIAogICAgIENhbGxiYWNrRGlzcGF0Y2hlcihjb25zdCBDYWxsYmFja0Rpc3BhdGNoZXIgJik7CiAgICAgQ2FsbGJhY2tEaXNwYXRjaGVyICZvcGVyYXRvcj0oY29uc3QgQ2FsbGJhY2tEaXNwYXRjaGVyICYpOwpAQCAtMTA4LDI0ICsxMTQsMjYgQEAKICAgICB9CiB9CiAKLXZvaWQgT01YOjpDYWxsYmFja0Rpc3BhdGNoZXI6OnBvc3QoY29uc3Qgb214X21lc3NhZ2UgJm1zZykgewordm9pZCBPTVg6OkNhbGxiYWNrRGlzcGF0Y2hlcjo6cG9zdChjb25zdCBvbXhfbWVzc2FnZSAmbXNnLCBib29sIHJlYWxUaW1lKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIG1RdWV1ZS5wdXNoX2JhY2sobXNnKTsKLSAgICBtUXVldWVDaGFuZ2VkLnNpZ25hbCgpOworICAgIGlmIChyZWFsVGltZSkgeworICAgICAgICBtUXVldWVDaGFuZ2VkLnNpZ25hbCgpOworICAgIH0KIH0KIAotdm9pZCBPTVg6OkNhbGxiYWNrRGlzcGF0Y2hlcjo6ZGlzcGF0Y2goY29uc3Qgb214X21lc3NhZ2UgJm1zZykgewordm9pZCBPTVg6OkNhbGxiYWNrRGlzcGF0Y2hlcjo6ZGlzcGF0Y2goc3RkOjpsaXN0PG9teF9tZXNzYWdlPiAmbWVzc2FnZXMpIHsKICAgICBpZiAobU93bmVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoIldvdWxkIGhhdmUgZGlzcGF0Y2hlZCBhIG1lc3NhZ2UgdG8gYSBub2RlIHRoYXQncyBhbHJlYWR5IGdvbmUuIik7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbU93bmVyLT5vbk1lc3NhZ2UobXNnKTsKKyAgICBtT3duZXItPm9uTWVzc2FnZXMobWVzc2FnZXMpOwogfQogCiBib29sIE9NWDo6Q2FsbGJhY2tEaXNwYXRjaGVyOjpsb29wKCkgewogICAgIGZvciAoOzspIHsKLSAgICAgICAgb214X21lc3NhZ2UgbXNnOworICAgICAgICBzdGQ6Omxpc3Q8b214X21lc3NhZ2U+IG1lc3NhZ2VzOwogCiAgICAgICAgIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CkBAIC0xMzcsMTEgKzE0NSwxMCBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtc2cgPSAqbVF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgICAgICBtUXVldWUuZXJhc2UobVF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgbWVzc2FnZXMuc3dhcChtUXVldWUpOwogICAgICAgICB9CiAKLSAgICAgICAgZGlzcGF0Y2gobXNnKTsKKyAgICAgICAgZGlzcGF0Y2gobWVzc2FnZXMpOwogICAgIH0KIAogICAgIHJldHVybiBmYWxzZTsKQEAgLTI0MywxMSArMjUwLDExIEBACiAgICAgICAgICAgICBpbnN0YW5jZSwgJmhhbmRsZSk7CiAKICAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgQUxPR0UoIkZBSUxFRCB0byBhbGxvY2F0ZSBvbXggY29tcG9uZW50ICclcyciLCBuYW1lKTsKKyAgICAgICAgQUxPR0UoIkZBSUxFRCB0byBhbGxvY2F0ZSBvbXggY29tcG9uZW50ICclcycgZXJyPSVzKCUjeCkiLCBuYW1lLCBhc1N0cmluZyhlcnIpLCBlcnIpOwogCiAgICAgICAgIGluc3RhbmNlLT5vbkdldEhhbmRsZUZhaWxlZCgpOwogCi0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7CiAgICAgfQogCiAgICAgKm5vZGUgPSBtYWtlTm9kZUlEKGluc3RhbmNlKTsKQEAgLTM0MSw4ICszNDgsOCBAQAogfQogCiBzdGF0dXNfdCBPTVg6OnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoCi0gICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpIHsKLSAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKHBvcnRfaW5kZXgsIGVuYWJsZSk7CisgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUsIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSkgeworICAgIHJldHVybiBmaW5kSW5zdGFuY2Uobm9kZSktPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMocG9ydF9pbmRleCwgZW5hYmxlLCB0eXBlKTsKIH0KIAogc3RhdHVzX3QgT01YOjpwcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKQEAgLTM2MSw5ICszNjgsOSBAQAogCiBzdGF0dXNfdCBPTVg6OnVzZUJ1ZmZlcigKICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCi0gICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfQk9PTCBjcm9zc1Byb2Nlc3MpIHsKKyAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9VMzIgYWxsb3R0ZWRTaXplLCBPTVhfQk9PTCBjcm9zc1Byb2Nlc3MpIHsKICAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT51c2VCdWZmZXIoCi0gICAgICAgICAgICBwb3J0X2luZGV4LCBwYXJhbXMsIGJ1ZmZlciwgY3Jvc3NQcm9jZXNzKTsKKyAgICAgICAgICAgIHBvcnRfaW5kZXgsIHBhcmFtcywgYnVmZmVyLCBhbGxvdHRlZFNpemUsIGNyb3NzUHJvY2Vzcyk7CiB9CiAKIHN0YXR1c190IE9NWDo6dXNlR3JhcGhpY0J1ZmZlcigKQEAgLTM4MiwxMSArMzg5LDI1IEBACiAKIHN0YXR1c190IE9NWDo6Y3JlYXRlSW5wdXRTdXJmYWNlKAogICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKLSAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyKSB7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKSB7CiAgICAgcmV0dXJuIGZpbmRJbnN0YW5jZShub2RlKS0+Y3JlYXRlSW5wdXRTdXJmYWNlKAotICAgICAgICAgICAgcG9ydF9pbmRleCwgYnVmZmVyUHJvZHVjZXIpOworICAgICAgICAgICAgcG9ydF9pbmRleCwgYnVmZmVyUHJvZHVjZXIsIHR5cGUpOwogfQogCitzdGF0dXNfdCBPTVg6OmNyZWF0ZVBlcnNpc3RlbnRJbnB1dFN1cmZhY2UoCisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gKmJ1ZmZlckNvbnN1bWVyKSB7CisgICAgcmV0dXJuIE9NWE5vZGVJbnN0YW5jZTo6Y3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGJ1ZmZlclByb2R1Y2VyLCBidWZmZXJDb25zdW1lcik7Cit9CisKK3N0YXR1c190IE9NWDo6c2V0SW5wdXRTdXJmYWNlKAorICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKKyAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gJmJ1ZmZlckNvbnN1bWVyLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpIHsKKyAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT5zZXRJbnB1dFN1cmZhY2UocG9ydF9pbmRleCwgYnVmZmVyQ29uc3VtZXIsIHR5cGUpOworfQorCisKIHN0YXR1c190IE9NWDo6c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShub2RlX2lkIG5vZGUpIHsKICAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CiB9CkBAIC00MDAsOSArNDIxLDkgQEAKIAogc3RhdHVzX3QgT01YOjphbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCiAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAotICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKSB7CisgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfVTMyIGFsbG90dGVkU2l6ZSwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKSB7CiAgICAgcmV0dXJuIGZpbmRJbnN0YW5jZShub2RlKS0+YWxsb2NhdGVCdWZmZXJXaXRoQmFja3VwKAotICAgICAgICAgICAgcG9ydF9pbmRleCwgcGFyYW1zLCBidWZmZXIsIGNyb3NzUHJvY2Vzcyk7CisgICAgICAgICAgICBwb3J0X2luZGV4LCBwYXJhbXMsIGJ1ZmZlciwgYWxsb3R0ZWRTaXplLCBjcm9zc1Byb2Nlc3MpOwogfQogCiBzdGF0dXNfdCBPTVg6OmZyZWVCdWZmZXIobm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIHsKQEAgLTQxMCwxNyArNDMxLDE3IEBACiAgICAgICAgICAgICBwb3J0X2luZGV4LCBidWZmZXIpOwogfQogCi1zdGF0dXNfdCBPTVg6OmZpbGxCdWZmZXIobm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyKSB7Ci0gICAgcmV0dXJuIGZpbmRJbnN0YW5jZShub2RlKS0+ZmlsbEJ1ZmZlcihidWZmZXIpOworc3RhdHVzX3QgT01YOjpmaWxsQnVmZmVyKG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgaW50IGZlbmNlRmQpIHsKKyAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT5maWxsQnVmZmVyKGJ1ZmZlciwgZmVuY2VGZCk7CiB9CiAKIHN0YXR1c190IE9NWDo6ZW1wdHlCdWZmZXIoCiAgICAgICAgIG5vZGVfaWQgbm9kZSwKICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciwKICAgICAgICAgT01YX1UzMiByYW5nZV9vZmZzZXQsIE9NWF9VMzIgcmFuZ2VfbGVuZ3RoLAotICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wKSB7CisgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXAsIGludCBmZW5jZUZkKSB7CiAgICAgcmV0dXJuIGZpbmRJbnN0YW5jZShub2RlKS0+ZW1wdHlCdWZmZXIoCi0gICAgICAgICAgICBidWZmZXIsIHJhbmdlX29mZnNldCwgcmFuZ2VfbGVuZ3RoLCBmbGFncywgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIGJ1ZmZlciwgcmFuZ2Vfb2Zmc2V0LCByYW5nZV9sZW5ndGgsIGZsYWdzLCB0aW1lc3RhbXAsIGZlbmNlRmQpOwogfQogCiBzdGF0dXNfdCBPTVg6OmdldEV4dGVuc2lvbkluZGV4KApAQCAtNDQ1LDMxICs0NjYsNTYgQEAKICAgICAgICAgT01YX0lOIE9NWF9FVkVOVFRZUEUgZUV2ZW50LAogICAgICAgICBPTVhfSU4gT01YX1UzMiBuRGF0YTEsCiAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5EYXRhMiwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgLyogcEV2ZW50RGF0YSAqLykgeworICAgICAgICBPTVhfSU4gT01YX1BUUiBwRXZlbnREYXRhKSB7CiAgICAgQUxPR1YoIk9uRXZlbnQoJWQsICUiIFBSSXUzMiIsICUiIFBSSXUzMiAiKSIsIGVFdmVudCwgbkRhdGExLCBuRGF0YTIpOwogCiAgICAgLy8gRm9yd2FyZCB0byBPTVhOb2RlSW5zdGFuY2UuCiAgICAgZmluZEluc3RhbmNlKG5vZGUpLT5vbkV2ZW50KGVFdmVudCwgbkRhdGExLCBuRGF0YTIpOwogCisgICAgc3A8T01YOjpDYWxsYmFja0Rpc3BhdGNoZXI+IGRpc3BhdGNoZXIgPSBmaW5kRGlzcGF0Y2hlcihub2RlKTsKKworICAgIC8vIG91dHB1dCByZW5kZXJlZCBldmVudHMgYXJlIG5vdCBwcm9jZXNzZWQgYXMgcmVndWxhciBldmVudHMgdW50aWwgdGhleSBoaXQgdGhlIG9ic2VydmVyCisgICAgaWYgKGVFdmVudCA9PSBPTVhfRXZlbnRPdXRwdXRSZW5kZXJlZCkgeworICAgICAgICBpZiAocEV2ZW50RGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJvY2VzcyBkYXRhIGZyb20gYXJyYXkKKyAgICAgICAgT01YX1ZJREVPX1JFTkRFUkVWRU5UVFlQRSAqcmVuZGVyRGF0YSA9IChPTVhfVklERU9fUkVOREVSRVZFTlRUWVBFICopcEV2ZW50RGF0YTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuRGF0YTE7ICsraSkgeworICAgICAgICAgICAgb214X21lc3NhZ2UgbXNnOworICAgICAgICAgICAgbXNnLnR5cGUgPSBvbXhfbWVzc2FnZTo6RlJBTUVfUkVOREVSRUQ7CisgICAgICAgICAgICBtc2cubm9kZSA9IG5vZGU7CisgICAgICAgICAgICBtc2cuZmVuY2VGZCA9IC0xOworICAgICAgICAgICAgbXNnLnUucmVuZGVyX2RhdGEudGltZXN0YW1wID0gcmVuZGVyRGF0YVtpXS5uTWVkaWFUaW1lVXM7CisgICAgICAgICAgICBtc2cudS5yZW5kZXJfZGF0YS5uYW5vVGltZSA9IHJlbmRlckRhdGFbaV0ublN5c3RlbVRpbWVOczsKKworICAgICAgICAgICAgZGlzcGF0Y2hlci0+cG9zdChtc2csIGZhbHNlIC8qIHJlYWxUaW1lICovKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICB9CisKICAgICBvbXhfbWVzc2FnZSBtc2c7CiAgICAgbXNnLnR5cGUgPSBvbXhfbWVzc2FnZTo6RVZFTlQ7CiAgICAgbXNnLm5vZGUgPSBub2RlOworICAgIG1zZy5mZW5jZUZkID0gLTE7CiAgICAgbXNnLnUuZXZlbnRfZGF0YS5ldmVudCA9IGVFdmVudDsKICAgICBtc2cudS5ldmVudF9kYXRhLmRhdGExID0gbkRhdGExOwogICAgIG1zZy51LmV2ZW50X2RhdGEuZGF0YTIgPSBuRGF0YTI7CiAKLSAgICBmaW5kRGlzcGF0Y2hlcihub2RlKS0+cG9zdChtc2cpOworICAgIGRpc3BhdGNoZXItPnBvc3QobXNnLCB0cnVlIC8qIHJlYWxUaW1lICovKTsKIAogICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogfQogCiBPTVhfRVJST1JUWVBFIE9NWDo6T25FbXB0eUJ1ZmZlckRvbmUoCi0gICAgICAgIG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKSB7CisgICAgICAgIG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyLCBpbnQgZmVuY2VGZCkgewogICAgIEFMT0dWKCJPbkVtcHR5QnVmZmVyRG9uZSBidWZmZXI9JXAiLCBwQnVmZmVyKTsKIAogICAgIG9teF9tZXNzYWdlIG1zZzsKICAgICBtc2cudHlwZSA9IG9teF9tZXNzYWdlOjpFTVBUWV9CVUZGRVJfRE9ORTsKICAgICBtc2cubm9kZSA9IG5vZGU7CisgICAgbXNnLmZlbmNlRmQgPSBmZW5jZUZkOwogICAgIG1zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlciA9IGJ1ZmZlcjsKIAogICAgIGZpbmREaXNwYXRjaGVyKG5vZGUpLT5wb3N0KG1zZyk7CkBAIC00NzgsMTIgKzUyNCwxMyBAQAogfQogCiBPTVhfRVJST1JUWVBFIE9NWDo6T25GaWxsQnVmZmVyRG9uZSgKLSAgICAgICAgbm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyLCBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIpIHsKKyAgICAgICAgbm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyLCBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIsIGludCBmZW5jZUZkKSB7CiAgICAgQUxPR1YoIk9uRmlsbEJ1ZmZlckRvbmUgYnVmZmVyPSVwIiwgcEJ1ZmZlcik7CiAKICAgICBvbXhfbWVzc2FnZSBtc2c7CiAgICAgbXNnLnR5cGUgPSBvbXhfbWVzc2FnZTo6RklMTF9CVUZGRVJfRE9ORTsKICAgICBtc2cubm9kZSA9IG5vZGU7CisgICAgbXNnLmZlbmNlRmQgPSBmZW5jZUZkOwogICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlciA9IGJ1ZmZlcjsKICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5yYW5nZV9vZmZzZXQgPSBwQnVmZmVyLT5uT2Zmc2V0OwogICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnJhbmdlX2xlbmd0aCA9IHBCdWZmZXItPm5GaWxsZWRMZW47CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCmluZGV4IDUxYWJjNzYuLjFlNzZlMDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8Z3VpL0J1ZmZlclF1ZXVlLmg+CiAjaW5jbHVkZSA8SGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKICNpbmNsdWRlIDx1dGlscy9taXNjLmg+CkBAIC03NSwxMSArNzYsMTEgQEAKICNkZWZpbmUgU0lNUExFX05FV19CVUZGRVIoYnVmZmVyX2lkLCBwb3J0LCBzaXplLCBkYXRhKSBcCiAgICAgTkVXX0JVRkZFUl9GTVQoYnVmZmVyX2lkLCBwb3J0LCAiJXp1QCVwIiwgKHNpemUpLCAoZGF0YSkpCiAKLSNkZWZpbmUgRU1QVFlfQlVGRkVSKGFkZHIsIGhlYWRlcikgIiUjeCBbJXVAJXBdIiwgXAotICAgIChhZGRyKSwgKGhlYWRlciktPm5BbGxvY0xlbiwgKGhlYWRlciktPnBCdWZmZXIKLSNkZWZpbmUgRlVMTF9CVUZGRVIoYWRkciwgaGVhZGVyKSAiJSMiIFBSSXhQVFIgIiBbJXVAJXAgKCV1Li4rJXUpIGY9JXggdHM9JWxsZF0iLCBcCisjZGVmaW5lIEVNUFRZX0JVRkZFUihhZGRyLCBoZWFkZXIsIGZlbmNlRmQpICIlI3ggWyV1QCVwIGZjPSVkXSIsIFwKKyAgICAoYWRkciksIChoZWFkZXIpLT5uQWxsb2NMZW4sIChoZWFkZXIpLT5wQnVmZmVyLCAoZmVuY2VGZCkKKyNkZWZpbmUgRlVMTF9CVUZGRVIoYWRkciwgaGVhZGVyLCBmZW5jZUZkKSAiJSMiIFBSSXhQVFIgIiBbJXVAJXAgKCV1Li4rJXUpIGY9JXggdHM9JWxsZCBmYz0lZF0iLCBcCiAgICAgKGludHB0cl90KShhZGRyKSwgKGhlYWRlciktPm5BbGxvY0xlbiwgKGhlYWRlciktPnBCdWZmZXIsIFwKLSAgICAoaGVhZGVyKS0+bk9mZnNldCwgKGhlYWRlciktPm5GaWxsZWRMZW4sIChoZWFkZXIpLT5uRmxhZ3MsIChoZWFkZXIpLT5uVGltZVN0YW1wCisgICAgKGhlYWRlciktPm5PZmZzZXQsIChoZWFkZXIpLT5uRmlsbGVkTGVuLCAoaGVhZGVyKS0+bkZsYWdzLCAoaGVhZGVyKS0+blRpbWVTdGFtcCwgKGZlbmNlRmQpCiAKICNkZWZpbmUgV0lUSF9TVEFUU19XUkFQUEVSKGZtdCwgLi4uKSBmbXQgIiB7IElOPSV6dS8lenUgT1VUPSV6dS8lenUgfSIsICMjX19WQV9BUkdTX18sIFwKICAgICBtSW5wdXRCdWZmZXJzV2l0aENvZGVjLnNpemUoKSwgbU51bVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0sIFwKQEAgLTEzMSw5ICsxMzIsMTAgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIG1lbWNweSgoT01YX1U4ICopbU1lbS0+cG9pbnRlcigpICsgaGVhZGVyLT5uT2Zmc2V0LAotICAgICAgICAgICAgICAgIGhlYWRlci0+cEJ1ZmZlciArIGhlYWRlci0+bk9mZnNldCwKLSAgICAgICAgICAgICAgICBoZWFkZXItPm5GaWxsZWRMZW4pOworICAgICAgICAvLyBjaGVjayBjb21wb25lbnQgcmV0dXJucyBwcm9wZXIgcmFuZ2UKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY29kZWMgPSBnZXRCdWZmZXIoaGVhZGVyLCBmYWxzZSAvKiBiYWNrdXAgKi8sIHRydWUgLyogbGltaXQgKi8pOworCisgICAgICAgIG1lbWNweSgoT01YX1U4ICopbU1lbS0+cG9pbnRlcigpICsgaGVhZGVyLT5uT2Zmc2V0LCBjb2RlYy0+ZGF0YSgpLCBjb2RlYy0+c2l6ZSgpKTsKICAgICB9CiAKICAgICB2b2lkIENvcHlUb09NWChjb25zdCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyKSB7CkBAIC0xNDYsNiArMTQ4LDI5IEBACiAgICAgICAgICAgICAgICAgaGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICB9CiAKKyAgICAvLyByZXR1cm4gZWl0aGVyIHRoZSBjb2RlYyBvciB0aGUgYmFja3VwIGJ1ZmZlcgorICAgIHNwPEFCdWZmZXI+IGdldEJ1ZmZlcihjb25zdCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyLCBib29sIGJhY2t1cCwgYm9vbCBsaW1pdCkgeworICAgICAgICBzcDxBQnVmZmVyPiBidWY7CisgICAgICAgIGlmIChiYWNrdXAgJiYgbU1lbSAhPSBOVUxMKSB7CisgICAgICAgICAgICBidWYgPSBuZXcgQUJ1ZmZlcihtTWVtLT5wb2ludGVyKCksIG1NZW0tPnNpemUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWYgPSBuZXcgQUJ1ZmZlcihoZWFkZXItPnBCdWZmZXIsIGhlYWRlci0+bkFsbG9jTGVuKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGltaXQpIHsKKyAgICAgICAgICAgIGlmIChoZWFkZXItPm5PZmZzZXQgKyBoZWFkZXItPm5GaWxsZWRMZW4gPiBoZWFkZXItPm5PZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgJiYgaGVhZGVyLT5uT2Zmc2V0ICsgaGVhZGVyLT5uRmlsbGVkTGVuIDw9IGhlYWRlci0+bkFsbG9jTGVuKSB7CisgICAgICAgICAgICAgICAgYnVmLT5zZXRSYW5nZShoZWFkZXItPm5PZmZzZXQsIGhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1Zi0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICBib29sIGNvcHlUb09teCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Db3B5VG9PbXg7CisgICAgfQorCiAgICAgdm9pZCBzZXRHcmFwaGljQnVmZmVyKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyKSB7CiAgICAgICAgIG1HcmFwaGljQnVmZmVyID0gZ3JhcGhpY0J1ZmZlcjsKICAgICB9CkBAIC0yMDQsOCArMjI5LDggQEAKICAgICBtTnVtUG9ydEJ1ZmZlcnNbMV0gPSAwOwogICAgIG1EZWJ1Z0xldmVsQnVtcFBlbmRpbmdCdWZmZXJzWzBdID0gMDsKICAgICBtRGVidWdMZXZlbEJ1bXBQZW5kaW5nQnVmZmVyc1sxXSA9IDA7Ci0gICAgbVVzaW5nTWV0YWRhdGFbMF0gPSBmYWxzZTsKLSAgICBtVXNpbmdNZXRhZGF0YVsxXSA9IGZhbHNlOworICAgIG1NZXRhZGF0YVR5cGVbMF0gPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZDsKKyAgICBtTWV0YWRhdGFUeXBlWzFdID0ga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQ7CiAgICAgbUlzU2VjdXJlID0gQVN0cmluZyhuYW1lKS5lbmRzV2l0aCgiLnNlY3VyZSIpOwogfQogCkBAIC0yNDUsMTMgKzI3MCwxNSBAQAogICAgIHJldHVybiBtTm9kZUlEOwogfQogCi1zdGF0aWMgc3RhdHVzX3QgU3RhdHVzRnJvbU9NWEVycm9yKE9NWF9FUlJPUlRZUEUgZXJyKSB7CitzdGF0dXNfdCBTdGF0dXNGcm9tT01YRXJyb3IoT01YX0VSUk9SVFlQRSBlcnIpIHsKICAgICBzd2l0Y2ggKGVycikgewogICAgICAgICBjYXNlIE9NWF9FcnJvck5vbmU6CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIGNhc2UgT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOgogICAgICAgICBjYXNlIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg6CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIGNhc2UgT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOgorICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KQEAgLTM2Myw5ICszOTAsOCBAQAogCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnNlbmRDb21tYW5kKAogICAgICAgICBPTVhfQ09NTUFORFRZUEUgY21kLCBPTVhfUzMyIHBhcmFtKSB7Ci0gICAgaWYgKGNtZCA9PSBPTVhfQ29tbWFuZFN0YXRlU2V0ICYmIHBhcmFtICE9IE9NWF9TdGF0ZUlkbGUpIHsKLSAgICAgICAgLy8gTm9ybWFsbHkgdGhlcmUgYXJlIG5vIGNvbmZpZ3VyYXRpb25zIHBhc3QgZmlyc3QgU3RhdGVTZXQ7IGhvd2V2ZXIsIE9NWENvZGVjIHN1cHBvcnRzCi0gICAgICAgIC8vIG1ldGEgY29uZmlndXJhdGlvbiBwYXN0IFN0YXRlc2V0OklkbGUuCisgICAgaWYgKGNtZCA9PSBPTVhfQ29tbWFuZFN0YXRlU2V0KSB7CisgICAgICAgIC8vIFRoZXJlIGFyZSBubyBjb25maWd1cmF0aW9ucyBwYXN0IGZpcnN0IFN0YXRlU2V0IGNvbW1hbmQuCiAgICAgICAgIG1TYWlsZWQgPSB0cnVlOwogICAgIH0KICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBidWZmZXJTb3VyY2UoZ2V0R3JhcGhpY0J1ZmZlclNvdXJjZSgpKTsKQEAgLTQwNSwxMSArNDMxLDEzIEBACiAgICAgLy8gdGhlc2UgZXh0ZW5zaW9ucyBjYW4gb25seSBiZSB1c2VkIGZyb20gT01YTm9kZUluc3RhbmNlLCBub3QgYnkgY2xpZW50cyBkaXJlY3RseS4KICAgICBzdGF0aWMgY29uc3QgY2hhciAqcmVzdHJpY3RlZF9leHRlbnNpb25zW10gPSB7CiAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVNZXRhRGF0YUluQnVmZmVycyIsCisgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVBTldCdWZmZXJJbk1ldGFkYXRhIiwKICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjayIsCiAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlIiwKICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC51c2VBbmRyb2lkTmF0aXZlQnVmZmVyMiIsCiAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXgudXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciIsCiAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnMiLAorICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmFsbG9jYXRlTmF0aXZlSGFuZGxlIiwKICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5nZXRBbmRyb2lkTmF0aXZlQnVmZmVyVXNhZ2UiLAogICAgIH07CiAKQEAgLTQyNCw3ICs0NTIsNyBAQAogICAgICAgICAgICAgfHwgKGluZGV4ID4gKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4RXh0VmlkZW9TdGFydFVudXNlZAogICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCA8PSAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbVNsaWNlU2VnbWVudHMpCiAgICAgICAgICAgICB8fCAoaW5kZXggPiAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhFeHRPdGhlclN0YXJ0VW51c2VkCi0gICAgICAgICAgICAgICAgICAgICYmIGluZGV4IDw9IChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ0F1dG9GcmFtZXJhdGVDb252ZXJzaW9uKSkgeworICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCA8PSAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC01NzYsMjAgKzYwNCwxNCBAQAogfQogCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoCi0gICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAotICAgICAgICBPTVhfQk9PTCBlbmFibGUpIHsKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKICAgICBDTE9HX0NPTkZJRyhzdG9yZU1ldGFEYXRhSW5CdWZmZXJzLCAiJXM6JXUgZW46JWQiLCBwb3J0U3RyaW5nKHBvcnRJbmRleCksIHBvcnRJbmRleCwgZW5hYmxlKTsKLSAgICByZXR1cm4gc3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKAotICAgICAgICAgICAgcG9ydEluZGV4LCBlbmFibGUsCi0gICAgICAgICAgICBPTVhfRkFMU0UgLyogdXNlR3JhcGhpY0J1ZmZlciAqLywgTlVMTCAvKiB1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhICovKTsKKyAgICByZXR1cm4gc3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKHBvcnRJbmRleCwgZW5hYmxlLCB0eXBlKTsKIH0KIAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2woCi0gICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAotICAgICAgICBPTVhfQk9PTCBlbmFibGUsCi0gICAgICAgIE9NWF9CT09MIHVzZUdyYXBoaWNCdWZmZXIsCi0gICAgICAgIE9NWF9CT09MICp1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhKSB7CisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUsIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSkgewogICAgIGlmIChtU2FpbGVkKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjk0MjIwMjAiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtNjAzLDUwICs2MjUsNTcgQEAKICAgICBPTVhfU1RSSU5HIG5hbWUgPSBjb25zdF9jYXN0PE9NWF9TVFJJTkc+KAogICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzIik7CiAKLSAgICBPTVhfU1RSSU5HIGdyYXBoaWNCdWZmZXJOYW1lID0gY29uc3RfY2FzdDxPTVhfU1RSSU5HPigKLSAgICAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVHcmFwaGljQnVmZmVySW5NZXRhRGF0YSIpOwotICAgIGlmICh1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhID09IE5VTEwpIHsKLSAgICAgICAgdXNpbmdHcmFwaGljQnVmZmVySW5NZXRhZGF0YSA9ICZ1c2VHcmFwaGljQnVmZmVyOwotICAgIH0KKyAgICBPTVhfU1RSSU5HIG5hdGl2ZUJ1ZmZlck5hbWUgPSBjb25zdF9jYXN0PE9NWF9TVFJJTkc+KAorICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZUFOV0J1ZmZlckluTWV0YWRhdGEiKTsKKyAgICBNZXRhZGF0YUJ1ZmZlclR5cGUgbmVnb3RpYXRlZFR5cGU7CiAKLSAgICBPTVhfRVJST1JUWVBFIGVyciA9Ci0gICAgICAgICh1c2VHcmFwaGljQnVmZmVyICYmIHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQpCi0gICAgICAgICAgICAgICAgPyBPTVhfR2V0RXh0ZW5zaW9uSW5kZXgobUhhbmRsZSwgZ3JhcGhpY0J1ZmZlck5hbWUsICZpbmRleCkKLSAgICAgICAgICAgICAgICA6IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICBpZiAoZXJyID09IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgKnVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEgPSBPTVhfVFJVRTsKLSAgICAgICAgbmFtZSA9IGdyYXBoaWNCdWZmZXJOYW1lOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IE9NWF9HZXRFeHRlbnNpb25JbmRleChtSGFuZGxlLCBuYW1lLCAmaW5kZXgpOwotICAgIH0KKyAgICBTdG9yZU1ldGFEYXRhSW5CdWZmZXJzUGFyYW1zIHBhcmFtczsKKyAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOworICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OworICAgIHBhcmFtcy5iU3RvcmVNZXRhRGF0YSA9IGVuYWJsZTsKIAorICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0dldEV4dGVuc2lvbkluZGV4KG1IYW5kbGUsIG5hdGl2ZUJ1ZmZlck5hbWUsICZpbmRleCk7CiAgICAgT01YX0VSUk9SVFlQRSB4ZXJyID0gZXJyOwogICAgIGlmIChlcnIgPT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICBTdG9yZU1ldGFEYXRhSW5CdWZmZXJzUGFyYW1zIHBhcmFtczsKLSAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKLSAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7Ci0gICAgICAgIHBhcmFtcy5iU3RvcmVNZXRhRGF0YSA9IGVuYWJsZTsKLQogICAgICAgICBlcnIgPSBPTVhfU2V0UGFyYW1ldGVyKG1IYW5kbGUsIGluZGV4LCAmcGFyYW1zKTsKKyAgICAgICAgaWYgKGVyciA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBuYW1lID0gbmF0aXZlQnVmZmVyTmFtZTsgLy8gc2V0IG5hbWUgZm9yIGRlYnVnZ2luZworICAgICAgICAgICAgbmVnb3RpYXRlZFR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBlcnIgPSBPTVhfR2V0RXh0ZW5zaW9uSW5kZXgobUhhbmRsZSwgbmFtZSwgJmluZGV4KTsKKyAgICAgICAgeGVyciA9IGVycjsKKyAgICAgICAgaWYgKGVyciA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBuZWdvdGlhdGVkVHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlOworICAgICAgICAgICAgZXJyID0gT01YX1NldFBhcmFtZXRlcihtSGFuZGxlLCBpbmRleCwgJnBhcmFtcyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBkb24ndCBsb2cgbG91ZCBlcnJvciBpZiBjb21wb25lbnQgZG9lcyBub3Qgc3VwcG9ydCBtZXRhZGF0YSBtb2RlIG9uIHRoZSBvdXRwdXQKICAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgKnVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEgPSBPTVhfRkFMU0U7Ci0gICAgICAgIGlmIChlbmFibGUpIHsKLSAgICAgICAgICAgIG1Vc2luZ01ldGFkYXRhW3BvcnRJbmRleF0gPSBmYWxzZTsKLSAgICAgICAgfQogICAgICAgICBpZiAoZXJyID09IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXggJiYgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpIHsKICAgICAgICAgICAgIENMT0dXKCJjb21wb25lbnQgZG9lcyBub3Qgc3VwcG9ydCBtZXRhZGF0YSBtb2RlOyB1c2luZyBmYWxsYmFjayIpOwogICAgICAgICB9IGVsc2UgaWYgKHhlcnIgIT0gT01YX0Vycm9yTm9uZSkgewogICAgICAgICAgICAgQ0xPR19FUlJPUihnZXRFeHRlbnNpb25JbmRleCwgeGVyciwgIiVzIiwgbmFtZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDTE9HX0VSUk9SKHNldFBhcmFtZXRlciwgZXJyLCAiJXMoJSN4KTogJXM6JXUgZW49JWQgR0I9JWQiLCBuYW1lLCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgcG9ydFN0cmluZyhwb3J0SW5kZXgpLCBwb3J0SW5kZXgsIGVuYWJsZSwgdXNlR3JhcGhpY0J1ZmZlcik7CisgICAgICAgICAgICBDTE9HX0VSUk9SKHNldFBhcmFtZXRlciwgZXJyLCAiJXMoJSN4KTogJXM6JXUgZW49JWQgdHlwZT0lZCIsIG5hbWUsIGluZGV4LAorICAgICAgICAgICAgICAgICAgICBwb3J0U3RyaW5nKHBvcnRJbmRleCksIHBvcnRJbmRleCwgZW5hYmxlLCBuZWdvdGlhdGVkVHlwZSk7CiAgICAgICAgIH0KKyAgICAgICAgbmVnb3RpYXRlZFR5cGUgPSBtTWV0YWRhdGFUeXBlW3BvcnRJbmRleF07CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbVVzaW5nTWV0YWRhdGFbcG9ydEluZGV4XSA9IGVuYWJsZTsKKyAgICAgICAgaWYgKCFlbmFibGUpIHsKKyAgICAgICAgICAgIG5lZ290aWF0ZWRUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQ7CisgICAgICAgIH0KKyAgICAgICAgbU1ldGFkYXRhVHlwZVtwb3J0SW5kZXhdID0gbmVnb3RpYXRlZFR5cGU7CiAgICAgfQorICAgIENMT0dfQ09ORklHKHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMsICIlczoldSBuZWdvdGlhdGVkICVzOiVkIiwKKyAgICAgICAgICAgIHBvcnRTdHJpbmcocG9ydEluZGV4KSwgcG9ydEluZGV4LCBhc1N0cmluZyhuZWdvdGlhdGVkVHlwZSksIG5lZ290aWF0ZWRUeXBlKTsKKworICAgIGlmICh0eXBlICE9IE5VTEwpIHsKKyAgICAgICAgKnR5cGUgPSBuZWdvdGlhdGVkVHlwZTsKKyAgICB9CisKICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7CiB9CiAKQEAgLTczMiwyNiArNzYxLDMxIEBACiAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6dXNlQnVmZmVyKAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKLSAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlciwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKSB7CisgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIsIE9NWF9VMzIgYWxsb3R0ZWRTaXplLCBPTVhfQk9PTCBjcm9zc1Byb2Nlc3MpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmIChwb3J0SW5kZXggPj0gTkVMRU0obVVzaW5nTWV0YWRhdGEpKSB7CisgICAgaWYgKGFsbG90dGVkU2l6ZSA+IHBhcmFtcy0+c2l6ZSgpIHx8IHBvcnRJbmRleCA+PSBORUxFTShtTnVtUG9ydEJ1ZmZlcnMpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIC8vIFdlIGRvIG5vdCBzdXBwb3J0IG1ldGFkYXRhIG1vZGUgY2hhbmdlcyBwYXN0IGJ1ZmZlciBhbGxvY2F0aW9uCi0gICAgbVNhaWxlZCA9IHRydWU7CiAKICAgICAvLyBtZXRhZGF0YSBidWZmZXJzIGFyZSBub3QgY29ubmVjdGVkIGNyb3NzIHByb2Nlc3MKICAgICBCdWZmZXJNZXRhICpidWZmZXJfbWV0YTsKLSAgICBib29sIGlzTWV0YSA9IG1Vc2luZ01ldGFkYXRhW3BvcnRJbmRleF07CisgICAgYm9vbCBpc01ldGEgPSBtTWV0YWRhdGFUeXBlW3BvcnRJbmRleF0gIT0ga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQ7CiAgICAgYm9vbCB1c2VCYWNrdXAgPSBjcm9zc1Byb2Nlc3MgJiYgaXNNZXRhOyAvLyB1c2UgYSBiYWNrdXAgYnVmZmVyIGluc3RlYWQgb2YgdGhlIGFjdHVhbCBidWZmZXIKICAgICBPTVhfVTggKmRhdGEgPSBzdGF0aWNfY2FzdDxPTVhfVTggKj4ocGFyYW1zLT5wb2ludGVyKCkpOwogICAgIC8vIGFsbG9jYXRlIGJhY2t1cCBidWZmZXIKICAgICBpZiAodXNlQmFja3VwKSB7Ci0gICAgICAgIGRhdGEgPSBuZXcgKHN0ZDo6bm90aHJvdykgT01YX1U4W3BhcmFtcy0+c2l6ZSgpXTsKKyAgICAgICAgZGF0YSA9IG5ldyAoc3RkOjpub3Rocm93KSBPTVhfVThbYWxsb3R0ZWRTaXplXTsKICAgICAgICAgaWYgKGRhdGEgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgfQotICAgICAgICBtZW1zZXQoZGF0YSwgMCwgcGFyYW1zLT5zaXplKCkpOworICAgICAgICBtZW1zZXQoZGF0YSwgMCwgYWxsb3R0ZWRTaXplKTsKKworICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IGNvbm5lY3RpbmcgdGhlIGJ1ZmZlcnMsIHRoZSBzaXplcyBtdXN0IG1hdGNoCisgICAgICAgIGlmIChhbGxvdHRlZFNpemUgIT0gcGFyYW1zLT5zaXplKCkpIHsKKyAgICAgICAgICAgIENMT0dfRVJST1IodXNlQnVmZmVyLCBCQURfVkFMVUUsIFNJTVBMRV9CVUZGRVIocG9ydEluZGV4LCAoc2l6ZV90KWFsbG90dGVkU2l6ZSwgZGF0YSkpOworICAgICAgICAgICAgZGVsZXRlW10gZGF0YTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KIAogICAgICAgICBidWZmZXJfbWV0YSA9IG5ldyBCdWZmZXJNZXRhKAogICAgICAgICAgICAgICAgIHBhcmFtcywgcG9ydEluZGV4LCBmYWxzZSAvKiBjb3B5VG9PbXggKi8sIGZhbHNlIC8qIGNvcHlGcm9tT214ICovLCBkYXRhKTsKQEAgLTc2NCwxMCArNzk4LDExIEBACiAKICAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9Vc2VCdWZmZXIoCiAgICAgICAgICAgICBtSGFuZGxlLCAmaGVhZGVyLCBwb3J0SW5kZXgsIGJ1ZmZlcl9tZXRhLAotICAgICAgICAgICAgcGFyYW1zLT5zaXplKCksIGRhdGEpOworICAgICAgICAgICAgYWxsb3R0ZWRTaXplLCBkYXRhKTsKIAogICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICBDTE9HX0VSUk9SKHVzZUJ1ZmZlciwgZXJyLCBTSU1QTEVfQlVGRkVSKHBvcnRJbmRleCwgcGFyYW1zLT5zaXplKCksIHBhcmFtcy0+cG9pbnRlcigpKSk7CisgICAgICAgIENMT0dfRVJST1IodXNlQnVmZmVyLCBlcnIsIFNJTVBMRV9CVUZGRVIoCisgICAgICAgICAgICAgICAgcG9ydEluZGV4LCAoc2l6ZV90KWFsbG90dGVkU2l6ZSwgZGF0YSkpOwogCiAgICAgICAgIGRlbGV0ZSBidWZmZXJfbWV0YTsKICAgICAgICAgYnVmZmVyX21ldGEgPSBOVUxMOwpAQCAtNzg5LDcgKzgyNCw3IEBACiAgICAgfQogCiAgICAgQ0xPR19CVUZGRVIodXNlQnVmZmVyLCBORVdfQlVGRkVSX0ZNVCgKLSAgICAgICAgICAgICpidWZmZXIsIHBvcnRJbmRleCwgIiV6dUAlcCIsIHBhcmFtcy0+c2l6ZSgpLCBwYXJhbXMtPnBvaW50ZXIoKSkpOworICAgICAgICAgICAgKmJ1ZmZlciwgcG9ydEluZGV4LCAiJXUoJXp1KUAlcCIsIGFsbG90dGVkU2l6ZSwgcGFyYW1zLT5zaXplKCksIHBhcmFtcy0+cG9pbnRlcigpKSk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC05MDUsMjkgKzk0MCw1MSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjp1cGRhdGVHcmFwaGljQnVmZmVySW5NZXRhX2woCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgZ3JhcGhpY0J1ZmZlciwKKyAgICAgICAgT01YOjpidWZmZXJfaWQgYnVmZmVyLCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyKSB7CisgICAgaWYgKGhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChwb3J0SW5kZXggIT0ga1BvcnRJbmRleElucHV0ICYmIHBvcnRJbmRleCAhPSBrUG9ydEluZGV4T3V0cHV0KSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQnVmZmVyTWV0YSAqYnVmZmVyTWV0YSA9IChCdWZmZXJNZXRhICopKGhlYWRlci0+cEFwcFByaXZhdGUpOworICAgIGJ1ZmZlck1ldGEtPnNldEdyYXBoaWNCdWZmZXIoZ3JhcGhpY0J1ZmZlcik7CisgICAgaWYgKG1NZXRhZGF0YVR5cGVbcG9ydEluZGV4XSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZQorICAgICAgICAgICAgJiYgaGVhZGVyLT5uQWxsb2NMZW4gPj0gc2l6ZW9mKFZpZGVvR3JhbGxvY01ldGFkYXRhKSkgeworICAgICAgICBWaWRlb0dyYWxsb2NNZXRhZGF0YSAmbWV0YWRhdGEgPSAqKFZpZGVvR3JhbGxvY01ldGFkYXRhICopKGhlYWRlci0+cEJ1ZmZlcik7CisgICAgICAgIG1ldGFkYXRhLmVUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2U7CisgICAgICAgIG1ldGFkYXRhLnBIYW5kbGUgPSBncmFwaGljQnVmZmVyID09IE5VTEwgPyBOVUxMIDogZ3JhcGhpY0J1ZmZlci0+aGFuZGxlOworICAgIH0gZWxzZSBpZiAobU1ldGFkYXRhVHlwZVtwb3J0SW5kZXhdID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIKKyAgICAgICAgICAgICYmIGhlYWRlci0+bkFsbG9jTGVuID49IHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKSkgeworICAgICAgICBWaWRlb05hdGl2ZU1ldGFkYXRhICZtZXRhZGF0YSA9ICooVmlkZW9OYXRpdmVNZXRhZGF0YSAqKShoZWFkZXItPnBCdWZmZXIpOworICAgICAgICBtZXRhZGF0YS5lVHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXI7CisgICAgICAgIG1ldGFkYXRhLnBCdWZmZXIgPSBncmFwaGljQnVmZmVyID09IE5VTEwgPyBOVUxMIDogZ3JhcGhpY0J1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCk7CisgICAgICAgIG1ldGFkYXRhLm5GZW5jZUZkID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0xPR19CVUZGRVIodXBkYXRlR3JhcGhpY0J1ZmZlckluTWV0YSwgIiVzOiV1LCAlI3ggYmFkIHR5cGUgKCVkKSBvciBzaXplICgldSkiLAorICAgICAgICAgICAgcG9ydFN0cmluZyhwb3J0SW5kZXgpLCBwb3J0SW5kZXgsIGJ1ZmZlciwgbU1ldGFkYXRhVHlwZVtwb3J0SW5kZXhdLCBoZWFkZXItPm5BbGxvY0xlbik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQ0xPR19CVUZGRVIodXBkYXRlR3JhcGhpY0J1ZmZlckluTWV0YSwgIiVzOiV1LCAlI3ggOj0gJXAiLAorICAgICAgICAgICAgcG9ydFN0cmluZyhwb3J0SW5kZXgpLCBwb3J0SW5kZXgsIGJ1ZmZlciwKKyAgICAgICAgICAgIGdyYXBoaWNCdWZmZXIgPT0gTlVMTCA/IE5VTEwgOiBncmFwaGljQnVmZmVyLT5oYW5kbGUpOworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjp1cGRhdGVHcmFwaGljQnVmZmVySW5NZXRhKAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGdyYXBoaWNCdWZmZXIsCiAgICAgICAgIE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gZmluZEJ1ZmZlckhlYWRlcihidWZmZXIsIHBvcnRJbmRleCk7Ci0gICAgaWYgKGhlYWRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIFZpZGVvRGVjb2Rlck91dHB1dE1ldGFEYXRhICptZXRhZGF0YSA9Ci0gICAgICAgIChWaWRlb0RlY29kZXJPdXRwdXRNZXRhRGF0YSAqKShoZWFkZXItPnBCdWZmZXIpOwotICAgIEJ1ZmZlck1ldGEgKmJ1ZmZlck1ldGEgPSAoQnVmZmVyTWV0YSAqKShoZWFkZXItPnBBcHBQcml2YXRlKTsKLSAgICBidWZmZXJNZXRhLT5zZXRHcmFwaGljQnVmZmVyKGdyYXBoaWNCdWZmZXIpOwotICAgIG1ldGFkYXRhLT5lVHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlOwotICAgIG1ldGFkYXRhLT5wSGFuZGxlID0gZ3JhcGhpY0J1ZmZlci0+aGFuZGxlOwotICAgIENMT0dfQlVGRkVSKHVwZGF0ZUdyYXBoaWNCdWZmZXJJbk1ldGEsICIlczoldSwgJSN4IDo9ICVwIiwKLSAgICAgICAgICAgIHBvcnRTdHJpbmcocG9ydEluZGV4KSwgcG9ydEluZGV4LCBidWZmZXIsIGdyYXBoaWNCdWZmZXItPmhhbmRsZSk7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiB1cGRhdGVHcmFwaGljQnVmZmVySW5NZXRhX2wocG9ydEluZGV4LCBncmFwaGljQnVmZmVyLCBidWZmZXIsIGhlYWRlcik7CiB9CiAKLXN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6Y3JlYXRlSW5wdXRTdXJmYWNlKAotICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKK3N0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6Y3JlYXRlR3JhcGhpY0J1ZmZlclNvdXJjZSgKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGJ1ZmZlckNvbnN1bWVyLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpIHsKICAgICBzdGF0dXNfdCBlcnI7CiAKICAgICAvLyBvbmx5IGFsbG93IGdyYXBoaWMgc291cmNlIG9uIGlucHV0IHBvcnQsIHdoZW4gdGhlcmUgYXJlIG5vIGFsbG9jYXRlZCBidWZmZXJzIHlldApAQCAtOTQxLDE0ICs5OTgsMTQgQEAKIAogICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IHN1cmZhY2VDaGVjayA9IGdldEdyYXBoaWNCdWZmZXJTb3VyY2UoKTsKICAgICBpZiAoc3VyZmFjZUNoZWNrICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHBvcnRJbmRleCA8IE5FTEVNKG1NZXRhZGF0YVR5cGUpICYmIHR5cGUgIT0gTlVMTCkgeworICAgICAgICAgICAgKnR5cGUgPSBtTWV0YWRhdGFUeXBlW3BvcnRJbmRleF07CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwogICAgIH0KIAotICAgIC8vIElucHV0IGJ1ZmZlcnMgd2lsbCBob2xkIG1ldGEtZGF0YSAoZ3JhbGxvYyByZWZlcmVuY2VzKS4KLSAgICBPTVhfQk9PTCB1c2luZ0dyYXBoaWNCdWZmZXIgPSBPTVhfRkFMU0U7Ci0gICAgZXJyID0gc3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKAotICAgICAgICAgICAgcG9ydEluZGV4LCBPTVhfVFJVRSwKLSAgICAgICAgICAgIE9NWF9UUlVFIC8qIHVzZUdyYXBoaWNCdWZmZXIgKi8sICZ1c2luZ0dyYXBoaWNCdWZmZXIpOworICAgIC8vIElucHV0IGJ1ZmZlcnMgd2lsbCBob2xkIG1ldGEtZGF0YSAoQU5hdGl2ZVdpbmRvd0J1ZmZlciByZWZlcmVuY2VzKS4KKyAgICBlcnIgPSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2wocG9ydEluZGV4LCBPTVhfVFJVRSwgdHlwZSk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTk3NCwxOSArMTAzMSw3NSBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgR3JhcGhpY0J1ZmZlclNvdXJjZSogYnVmZmVyU291cmNlID0gbmV3IEdyYXBoaWNCdWZmZXJTb3VyY2UoCi0gICAgICAgICAgICB0aGlzLCBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLCBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCwKLSAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsIHVzaW5nR3JhcGhpY0J1ZmZlcik7CisgICAgdWludDMyX3QgdXNhZ2VCaXRzOworICAgIG9lcnIgPSBPTVhfR2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbUhhbmRsZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0cywgJnVzYWdlQml0cyk7CisgICAgaWYgKG9lcnIgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICB1c2FnZUJpdHMgPSAwOworICAgIH0KKworICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IGJ1ZmZlclNvdXJjZSA9IG5ldyBHcmFwaGljQnVmZmVyU291cmNlKHRoaXMsCisgICAgICAgICAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLAorICAgICAgICAgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQsCisgICAgICAgICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsLAorICAgICAgICAgICAgdXNhZ2VCaXRzLAorICAgICAgICAgICAgYnVmZmVyQ29uc3VtZXIpOworCiAgICAgaWYgKChlcnIgPSBidWZmZXJTb3VyY2UtPmluaXRDaGVjaygpKSAhPSBPSykgewotICAgICAgICBkZWxldGUgYnVmZmVyU291cmNlOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KICAgICBzZXRHcmFwaGljQnVmZmVyU291cmNlKGJ1ZmZlclNvdXJjZSk7CiAKLSAgICAqYnVmZmVyUHJvZHVjZXIgPSBidWZmZXJTb3VyY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6Y3JlYXRlSW5wdXRTdXJmYWNlKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgIHN0YXR1c190IGVyciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXJTb3VyY2UocG9ydEluZGV4LCBOVUxMIC8qIGJ1ZmZlckNvbnN1bWVyICovLCB0eXBlKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAqYnVmZmVyUHJvZHVjZXIgPSBtR3JhcGhpY0J1ZmZlclNvdXJjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOworICAgIHJldHVybiBPSzsKK30KKworLy9zdGF0aWMKK3N0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6Y3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLAorICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAqYnVmZmVyQ29uc3VtZXIpIHsKKyAgICBTdHJpbmc4IG5hbWUoIkdyYXBoaWNCdWZmZXJTb3VyY2UiKTsKKworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgY29uc3VtZXItPnNldENvbnN1bWVyTmFtZShuYW1lKTsKKyAgICBjb25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSKTsKKworICAgIHNwPEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXI+IHByb3h5ID0KKyAgICAgICAgbmV3IEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXIoTlVMTCk7CisgICAgc3RhdHVzX3QgZXJyID0gY29uc3VtZXItPmNvbnN1bWVyQ29ubmVjdChwcm94eSwgZmFsc2UpOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGNvbm5lY3RpbmcgdG8gQnVmZmVyUXVldWU6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgICpidWZmZXJQcm9kdWNlciA9IHByb2R1Y2VyOworICAgICpidWZmZXJDb25zdW1lciA9IGNvbnN1bWVyOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnNldElucHV0U3VyZmFjZSgKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICZidWZmZXJDb25zdW1lciwKKyAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gY3JlYXRlR3JhcGhpY0J1ZmZlclNvdXJjZShwb3J0SW5kZXgsIGJ1ZmZlckNvbnN1bWVyLCB0eXBlKTsKK30KKwogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgewogICAgIC8vIEZvciBub24tU3VyZmFjZSBpbnB1dCwgdGhlIE1lZGlhQ29kZWMgc2hvdWxkIGNvbnZlcnQgdGhlIGNhbGwgdG8gYQogICAgIC8vIHBhaXIgb2YgcmVxdWVzdHMgKGRlcXVldWUgaW5wdXQgYnVmZmVyLCBxdWV1ZSBpbnB1dCBidWZmZXIgd2l0aCBFT1MKQEAgLTEwMDMsOCArMTExNiw2IEBACiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBzaXplX3Qgc2l6ZSwgT01YOjpidWZmZXJfaWQgKmJ1ZmZlciwKICAgICAgICAgdm9pZCAqKmJ1ZmZlcl9kYXRhKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAvLyBXZSBkbyBub3Qgc3VwcG9ydCBtZXRhZGF0YSBtb2RlIGNoYW5nZXMgcGFzdCBidWZmZXIgYWxsb2NhdGlvbgotICAgIG1TYWlsZWQgPSB0cnVlOwogCiAgICAgQnVmZmVyTWV0YSAqYnVmZmVyX21ldGEgPSBuZXcgQnVmZmVyTWV0YShzaXplLCBwb3J0SW5kZXgpOwogCkBAIC0xMDQxLDE2ICsxMTUyLDE0IEBACiAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6YWxsb2NhdGVCdWZmZXJXaXRoQmFja3VwKAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKLSAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlciwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKSB7CisgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIsIE9NWF9VMzIgYWxsb3R0ZWRTaXplLCBPTVhfQk9PTCBjcm9zc1Byb2Nlc3MpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmIChwb3J0SW5kZXggPj0gTkVMRU0obVVzaW5nTWV0YWRhdGEpKSB7CisgICAgaWYgKGFsbG90dGVkU2l6ZSA+IHBhcmFtcy0+c2l6ZSgpIHx8IHBvcnRJbmRleCA+PSBORUxFTShtTnVtUG9ydEJ1ZmZlcnMpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIC8vIFdlIGRvIG5vdCBzdXBwb3J0IG1ldGFkYXRhIG1vZGUgY2hhbmdlcyBwYXN0IGJ1ZmZlciBhbGxvY2F0aW9uCi0gICAgbVNhaWxlZCA9IHRydWU7CiAKICAgICAvLyBtZXRhZGF0YSBidWZmZXJzIGFyZSBub3QgY29ubmVjdGVkIGNyb3NzIHByb2Nlc3MKLSAgICBib29sIGlzTWV0YSA9IG1Vc2luZ01ldGFkYXRhW3BvcnRJbmRleF07CisgICAgYm9vbCBpc01ldGEgPSBtTWV0YWRhdGFUeXBlW3BvcnRJbmRleF0gIT0ga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQ7CiAgICAgYm9vbCBjb3B5ID0gIShjcm9zc1Byb2Nlc3MgJiYgaXNNZXRhKTsKIAogICAgIEJ1ZmZlck1ldGEgKmJ1ZmZlcl9tZXRhID0gbmV3IEJ1ZmZlck1ldGEoCkBAIC0xMDYyLDExICsxMTcxLDEwIEBACiAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcjsKIAogICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0FsbG9jYXRlQnVmZmVyKAotICAgICAgICAgICAgbUhhbmRsZSwgJmhlYWRlciwgcG9ydEluZGV4LCBidWZmZXJfbWV0YSwgcGFyYW1zLT5zaXplKCkpOwotCisgICAgICAgICAgICBtSGFuZGxlLCAmaGVhZGVyLCBwb3J0SW5kZXgsIGJ1ZmZlcl9tZXRhLCBhbGxvdHRlZFNpemUpOwogICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewogICAgICAgICBDTE9HX0VSUk9SKGFsbG9jYXRlQnVmZmVyV2l0aEJhY2t1cCwgZXJyLAotICAgICAgICAgICAgICAgIFNJTVBMRV9CVUZGRVIocG9ydEluZGV4LCBwYXJhbXMtPnNpemUoKSwgcGFyYW1zLT5wb2ludGVyKCkpKTsKKyAgICAgICAgICAgICAgICBTSU1QTEVfQlVGRkVSKHBvcnRJbmRleCwgKHNpemVfdClhbGxvdHRlZFNpemUsIHBhcmFtcy0+cG9pbnRlcigpKSk7CiAgICAgICAgIGRlbGV0ZSBidWZmZXJfbWV0YTsKICAgICAgICAgYnVmZmVyX21ldGEgPSBOVUxMOwogCkBAIC0xMDg2LDggKzExOTQsOCBAQAogICAgICAgICBidWZmZXJTb3VyY2UtPmFkZENvZGVjQnVmZmVyKGhlYWRlcik7CiAgICAgfQogCi0gICAgQ0xPR19CVUZGRVIoYWxsb2NhdGVCdWZmZXJXaXRoQmFja3VwLCBORVdfQlVGRkVSX0ZNVCgqYnVmZmVyLCBwb3J0SW5kZXgsICIlenVAJXAgOj4gJXAiLAotICAgICAgICAgICAgcGFyYW1zLT5zaXplKCksIHBhcmFtcy0+cG9pbnRlcigpLCBoZWFkZXItPnBCdWZmZXIpKTsKKyAgICBDTE9HX0JVRkZFUihhbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAsIE5FV19CVUZGRVJfRk1UKCpidWZmZXIsIHBvcnRJbmRleCwgIiV6dUAlcCA6PiAldUAlcCIsCisgICAgICAgICAgICBwYXJhbXMtPnNpemUoKSwgcGFyYW1zLT5wb2ludGVyKCksIGFsbG90dGVkU2l6ZSwgaGVhZGVyLT5wQnVmZmVyKSk7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xMTE1LDcgKzEyMjMsNyBAQAogICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKIH0KIAotc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpmaWxsQnVmZmVyKE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcikgeworc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpmaWxsQnVmZmVyKE9NWDo6YnVmZmVyX2lkIGJ1ZmZlciwgaW50IGZlbmNlRmQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IGZpbmRCdWZmZXJIZWFkZXIoYnVmZmVyLCBrUG9ydEluZGV4T3V0cHV0KTsKQEAgLTExMjYsMTUgKzEyMzQsMjIgQEAKICAgICBoZWFkZXItPm5PZmZzZXQgPSAwOwogICAgIGhlYWRlci0+bkZsYWdzID0gMDsKIAorICAgIC8vIG1ldGEgbm93IG93bnMgZmVuY2VGZAorICAgIHN0YXR1c190IHJlcyA9IHN0b3JlRmVuY2VJbk1ldGFfbChoZWFkZXIsIGZlbmNlRmQsIGtQb3J0SW5kZXhPdXRwdXQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQ0xPR19FUlJPUihmaWxsQnVmZmVyOjpzdG9yZUZlbmNlSW5NZXRhLCByZXMsIEVNUFRZX0JVRkZFUihidWZmZXIsIGhlYWRlciwgZmVuY2VGZCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWJ1Z0xvY2spOwogICAgICAgICBtT3V0cHV0QnVmZmVyc1dpdGhDb2RlYy5hZGQoaGVhZGVyKTsKLSAgICAgICAgQ0xPR19CVU1QRURfQlVGRkVSKGZpbGxCdWZmZXIsIFdJVEhfU1RBVFMoRU1QVFlfQlVGRkVSKGJ1ZmZlciwgaGVhZGVyKSkpOworICAgICAgICBDTE9HX0JVTVBFRF9CVUZGRVIoZmlsbEJ1ZmZlciwgV0lUSF9TVEFUUyhFTVBUWV9CVUZGRVIoYnVmZmVyLCBoZWFkZXIsIGZlbmNlRmQpKSk7CiAgICAgfQogCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfRmlsbFRoaXNCdWZmZXIobUhhbmRsZSwgaGVhZGVyKTsKICAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgQ0xPR19FUlJPUihmaWxsQnVmZmVyLCBlcnIsIEVNUFRZX0JVRkZFUihidWZmZXIsIGhlYWRlcikpOworICAgICAgICBDTE9HX0VSUk9SKGZpbGxCdWZmZXIsIGVyciwgRU1QVFlfQlVGRkVSKGJ1ZmZlciwgaGVhZGVyLCBmZW5jZUZkKSk7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVidWdMb2NrKTsKICAgICAgICAgbU91dHB1dEJ1ZmZlcnNXaXRoQ29kZWMucmVtb3ZlKGhlYWRlcik7CiAgICAgfQpAQCAtMTE0NCw3ICsxMjU5LDcgQEAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6ZW1wdHlCdWZmZXIoCiAgICAgICAgIE9NWDo6YnVmZmVyX2lkIGJ1ZmZlciwKICAgICAgICAgT01YX1UzMiByYW5nZU9mZnNldCwgT01YX1UzMiByYW5nZUxlbmd0aCwKLSAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCkgeworICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICAvLyBubyBlbXB0eWJ1ZmZlciBpZiB1c2luZyBpbnB1dCBzdXJmYWNlCkBAIC0xMTU0LDIxICsxMjY5LDQ4IEBACiAgICAgfQogCiAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IGZpbmRCdWZmZXJIZWFkZXIoYnVmZmVyLCBrUG9ydEluZGV4SW5wdXQpOwotICAgIC8vIHJhbmdlTGVuZ3RoIGFuZCByYW5nZU9mZnNldCBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBhbGxvY2F0ZWQgZGF0YSBpbiB0aGUgYnVmZmVyLgotICAgIC8vIGNvcm5lciBjYXNlOiB3ZSBwZXJtaXQgcmFuZ2VPZmZzZXQgPT0gZW5kLW9mLWJ1ZmZlciB3aXRoIHJhbmdlTGVuZ3RoID09IDAuCi0gICAgaWYgKGhlYWRlciA9PSBOVUxMCi0gICAgICAgICAgICB8fCByYW5nZU9mZnNldCA+IGhlYWRlci0+bkFsbG9jTGVuCi0gICAgICAgICAgICB8fCByYW5nZUxlbmd0aCA+IGhlYWRlci0+bkFsbG9jTGVuIC0gcmFuZ2VPZmZzZXQpIHsKKyAgICBpZiAoaGVhZGVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgaGVhZGVyLT5uRmlsbGVkTGVuID0gcmFuZ2VMZW5ndGg7Ci0gICAgaGVhZGVyLT5uT2Zmc2V0ID0gcmFuZ2VPZmZzZXQ7Ci0KICAgICBCdWZmZXJNZXRhICpidWZmZXJfbWV0YSA9CiAgICAgICAgIHN0YXRpY19jYXN0PEJ1ZmZlck1ldGEgKj4oaGVhZGVyLT5wQXBwUHJpdmF0ZSk7Ci0gICAgYnVmZmVyX21ldGEtPkNvcHlUb09NWChoZWFkZXIpOworICAgIHNwPEFCdWZmZXI+IGJhY2t1cCA9IGJ1ZmZlcl9tZXRhLT5nZXRCdWZmZXIoaGVhZGVyLCB0cnVlIC8qIGJhY2t1cCAqLywgZmFsc2UgLyogbGltaXQgKi8pOworICAgIHNwPEFCdWZmZXI+IGNvZGVjID0gYnVmZmVyX21ldGEtPmdldEJ1ZmZlcihoZWFkZXIsIGZhbHNlIC8qIGJhY2t1cCAqLywgZmFsc2UgLyogbGltaXQgKi8pOwogCi0gICAgcmV0dXJuIGVtcHR5QnVmZmVyX2woaGVhZGVyLCBmbGFncywgdGltZXN0YW1wLCAoaW50cHRyX3QpYnVmZmVyKTsKKyAgICAvLyBjb252ZXJ0IGluY29taW5nIEFOVyBtZXRhIGJ1ZmZlcnMgaWYgY29tcG9uZW50IGlzIGNvbmZpZ3VyZWQgZm9yIGdyYWxsb2MgbWV0YWRhdGEgbW9kZQorICAgIC8vIGlnbm9yZSByYW5nZU9mZnNldCBpbiB0aGlzIGNhc2UKKyAgICBpZiAoYnVmZmVyX21ldGEtPmNvcHlUb09teCgpCisgICAgICAgICAgICAmJiBtTWV0YWRhdGFUeXBlW2tQb3J0SW5kZXhJbnB1dF0gPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UKKyAgICAgICAgICAgICYmIGJhY2t1cC0+Y2FwYWNpdHkoKSA+PSBzaXplb2YoVmlkZW9OYXRpdmVNZXRhZGF0YSkKKyAgICAgICAgICAgICYmIGNvZGVjLT5jYXBhY2l0eSgpID49IHNpemVvZihWaWRlb0dyYWxsb2NNZXRhZGF0YSkKKyAgICAgICAgICAgICYmICgoVmlkZW9OYXRpdmVNZXRhZGF0YSAqKWJhY2t1cC0+YmFzZSgpKS0+ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlcikgeworICAgICAgICBWaWRlb05hdGl2ZU1ldGFkYXRhICZiYWNrdXBNZXRhID0gKihWaWRlb05hdGl2ZU1ldGFkYXRhICopYmFja3VwLT5iYXNlKCk7CisgICAgICAgIFZpZGVvR3JhbGxvY01ldGFkYXRhICZjb2RlY01ldGEgPSAqKFZpZGVvR3JhbGxvY01ldGFkYXRhICopY29kZWMtPmJhc2UoKTsKKyAgICAgICAgQ0xPR19CVUZGRVIoZW1wdHlCdWZmZXIsICJjb252ZXJ0aW5nIEFOV0IgJXAgdG8gaGFuZGxlICVwIiwKKyAgICAgICAgICAgICAgICBiYWNrdXBNZXRhLnBCdWZmZXIsIGJhY2t1cE1ldGEucEJ1ZmZlci0+aGFuZGxlKTsKKyAgICAgICAgY29kZWNNZXRhLnBIYW5kbGUgPSBiYWNrdXBNZXRhLnBCdWZmZXIgIT0gTlVMTCA/IGJhY2t1cE1ldGEucEJ1ZmZlci0+aGFuZGxlIDogTlVMTDsKKyAgICAgICAgY29kZWNNZXRhLmVUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2U7CisgICAgICAgIGhlYWRlci0+bkZpbGxlZExlbiA9IHJhbmdlTGVuZ3RoID8gc2l6ZW9mKGNvZGVjTWV0YSkgOiAwOworICAgICAgICBoZWFkZXItPm5PZmZzZXQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHJhbmdlTGVuZ3RoIGFuZCByYW5nZU9mZnNldCBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBhbGxvY2F0ZWQgZGF0YSBpbiB0aGUgYnVmZmVyLgorICAgICAgICAvLyBjb3JuZXIgY2FzZTogd2UgcGVybWl0IHJhbmdlT2Zmc2V0ID09IGVuZC1vZi1idWZmZXIgd2l0aCByYW5nZUxlbmd0aCA9PSAwLgorICAgICAgICBpZiAocmFuZ2VPZmZzZXQgPiBoZWFkZXItPm5BbGxvY0xlbgorICAgICAgICAgICAgICAgIHx8IHJhbmdlTGVuZ3RoID4gaGVhZGVyLT5uQWxsb2NMZW4gLSByYW5nZU9mZnNldCkgeworICAgICAgICAgICAgQ0xPR19FUlJPUihlbXB0eUJ1ZmZlciwgT01YX0Vycm9yQmFkUGFyYW1ldGVyLCBGVUxMX0JVRkZFUihOVUxMLCBoZWFkZXIsIGZlbmNlRmQpKTsKKyAgICAgICAgICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgICAgICAgICA6OmNsb3NlKGZlbmNlRmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBoZWFkZXItPm5GaWxsZWRMZW4gPSByYW5nZUxlbmd0aDsKKyAgICAgICAgaGVhZGVyLT5uT2Zmc2V0ID0gcmFuZ2VPZmZzZXQ7CisKKyAgICAgICAgYnVmZmVyX21ldGEtPkNvcHlUb09NWChoZWFkZXIpOworICAgIH0KKworICAgIHJldHVybiBlbXB0eUJ1ZmZlcl9sKGhlYWRlciwgZmxhZ3MsIHRpbWVzdGFtcCwgKGludHB0cl90KWJ1ZmZlciwgZmVuY2VGZCk7CiB9CiAKIC8vIGxvZyBxdWV1ZWQgYnVmZmVyIGFjdGl2aXR5IGZvciB0aGUgbmV4dCBmZXcgaW5wdXQgYW5kL29yIG91dHB1dCBmcmFtZXMKQEAgLTExOTUsMTEgKzEzMzcsNjIgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6c3RvcmVGZW5jZUluTWV0YV9sKAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyLCBpbnQgZmVuY2VGZCwgT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICAvLyBwcm9wYWdhdGUgZmVuY2UgaWYgY29tcG9uZW50IHN1cHBvcnRzIGl0OyB3YWl0IGZvciBpdCBvdGhlcndpc2UKKyAgICBPTVhfVTMyIG1ldGFTaXplID0gcG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCA/IGhlYWRlci0+bkZpbGxlZExlbiA6IGhlYWRlci0+bkFsbG9jTGVuOworICAgIGlmIChtTWV0YWRhdGFUeXBlW3BvcnRJbmRleF0gPT0ga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlcgorICAgICAgICAgICAgJiYgbWV0YVNpemUgPj0gc2l6ZW9mKFZpZGVvTmF0aXZlTWV0YWRhdGEpKSB7CisgICAgICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEgJm5hdGl2ZU1ldGEgPSAqKFZpZGVvTmF0aXZlTWV0YWRhdGEgKikoaGVhZGVyLT5wQnVmZmVyKTsKKyAgICAgICAgaWYgKG5hdGl2ZU1ldGEubkZlbmNlRmQgPj0gMCkgeworICAgICAgICAgICAgQUxPR0UoImZlbmNlICglZCkgYWxyZWFkeSBleGlzdHMgaW4gbWV0YSIsIG5hdGl2ZU1ldGEubkZlbmNlRmQpOworICAgICAgICAgICAgaWYgKGZlbmNlRmQgPj0gMCkgeworICAgICAgICAgICAgICAgIDo6Y2xvc2UoZmVuY2VGZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlTWV0YS5uRmVuY2VGZCA9IGZlbmNlRmQ7CisgICAgfSBlbHNlIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgQ0xPR19CVUZGRVIoc3RvcmVGZW5jZUluTWV0YSwgIndhaXRpbmcgZm9yIGZlbmNlICVkIiwgZmVuY2VGZCk7CisgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZShmZW5jZUZkKTsKKyAgICAgICAgcmV0dXJuIGZlbmNlLT53YWl0KElPTVg6OmtGZW5jZVRpbWVvdXRNcyk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworaW50IE9NWE5vZGVJbnN0YW5jZTo6cmV0cmlldmVGZW5jZUZyb21NZXRhX2woCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIsIE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgT01YX1UzMiBtZXRhU2l6ZSA9IHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgPyBoZWFkZXItPm5BbGxvY0xlbiA6IGhlYWRlci0+bkZpbGxlZExlbjsKKyAgICBpbnQgZmVuY2VGZCA9IC0xOworICAgIGlmIChtTWV0YWRhdGFUeXBlW3BvcnRJbmRleF0gPT0ga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlcgorICAgICAgICAgICAgJiYgaGVhZGVyLT5uQWxsb2NMZW4gPj0gc2l6ZW9mKFZpZGVvTmF0aXZlTWV0YWRhdGEpKSB7CisgICAgICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEgJm5hdGl2ZU1ldGEgPSAqKFZpZGVvTmF0aXZlTWV0YWRhdGEgKikoaGVhZGVyLT5wQnVmZmVyKTsKKyAgICAgICAgaWYgKG5hdGl2ZU1ldGEuZVR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlcikgeworICAgICAgICAgICAgZmVuY2VGZCA9IG5hdGl2ZU1ldGEubkZlbmNlRmQ7CisgICAgICAgICAgICBuYXRpdmVNZXRhLm5GZW5jZUZkID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGFTaXplIDwgc2l6ZW9mKG5hdGl2ZU1ldGEpICYmIGZlbmNlRmQgPj0gMCkgeworICAgICAgICAgICAgQ0xPR19FUlJPUihmb3VuZEZlbmNlSW5FbXB0eU1ldGEsIEJBRF9WQUxVRSwgRlVMTF9CVUZGRVIoCisgICAgICAgICAgICAgICAgICAgIE5VTEwsIGhlYWRlciwgbmF0aXZlTWV0YS5uRmVuY2VGZCkpOworICAgICAgICAgICAgZmVuY2VGZCA9IC0xOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmZW5jZUZkOworfQorCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmVtcHR5QnVmZmVyX2woCi0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIsIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXAsIGludHB0cl90IGRlYnVnQWRkcikgeworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyLCBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLAorICAgICAgICBpbnRwdHJfdCBkZWJ1Z0FkZHIsIGludCBmZW5jZUZkKSB7CiAgICAgaGVhZGVyLT5uRmxhZ3MgPSBmbGFnczsKICAgICBoZWFkZXItPm5UaW1lU3RhbXAgPSB0aW1lc3RhbXA7CiAKKyAgICBzdGF0dXNfdCByZXMgPSBzdG9yZUZlbmNlSW5NZXRhX2woaGVhZGVyLCBmZW5jZUZkLCBrUG9ydEluZGV4SW5wdXQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQ0xPR19FUlJPUihlbXB0eUJ1ZmZlcjo6c3RvcmVGZW5jZUluTWV0YSwgcmVzLCBXSVRIX1NUQVRTKAorICAgICAgICAgICAgICAgIEZVTExfQlVGRkVSKGRlYnVnQWRkciwgaGVhZGVyLCBmZW5jZUZkKSkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWJ1Z0xvY2spOwogICAgICAgICBtSW5wdXRCdWZmZXJzV2l0aENvZGVjLmFkZChoZWFkZXIpOwpAQCAtMTIwOSwxMSArMTQwMiwxMSBAQAogICAgICAgICAgICAgYnVtcERlYnVnTGV2ZWxfbCgyIC8qIG51bUlucHV0QnVmZmVycyAqLywgMCAvKiBudW1PdXRwdXRCdWZmZXJzICovKTsKICAgICAgICAgfQogCi0gICAgICAgIENMT0dfQlVNUEVEX0JVRkZFUihlbXB0eUJ1ZmZlciwgV0lUSF9TVEFUUyhGVUxMX0JVRkZFUihkZWJ1Z0FkZHIsIGhlYWRlcikpKTsKKyAgICAgICAgQ0xPR19CVU1QRURfQlVGRkVSKGVtcHR5QnVmZmVyLCBXSVRIX1NUQVRTKEZVTExfQlVGRkVSKGRlYnVnQWRkciwgaGVhZGVyLCBmZW5jZUZkKSkpOwogICAgIH0KIAogICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0VtcHR5VGhpc0J1ZmZlcihtSGFuZGxlLCBoZWFkZXIpOwotICAgIENMT0dfSUZfRVJST1IoZW1wdHlCdWZmZXIsIGVyciwgRlVMTF9CVUZGRVIoZGVidWdBZGRyLCBoZWFkZXIpKTsKKyAgICBDTE9HX0lGX0VSUk9SKGVtcHR5QnVmZmVyLCBlcnIsIEZVTExfQlVGRkVSKGRlYnVnQWRkciwgaGVhZGVyLCBmZW5jZUZkKSk7CiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVidWdMb2NrKTsKQEAgLTEyMjgsMTYgKzE0MjEsMjEgQEAKIH0KIAogLy8gbGlrZSBlbXB0eUJ1ZmZlciwgYnV0IHRoZSBkYXRhIGlzIGFscmVhZHkgaW4gaGVhZGVyLT5wQnVmZmVyCi1zdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmVtcHR5RGlyZWN0QnVmZmVyKAotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyLAotICAgICAgICBPTVhfVTMyIHJhbmdlT2Zmc2V0LCBPTVhfVTMyIHJhbmdlTGVuZ3RoLAotICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wKSB7CitzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmVtcHR5R3JhcGhpY0J1ZmZlcigKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciwgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsCisgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXAsIGludCBmZW5jZUZkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBPTVg6OmJ1ZmZlcl9pZCBidWZmZXIgPSBmaW5kQnVmZmVySUQoaGVhZGVyKTsKKyAgICBzdGF0dXNfdCBlcnIgPSB1cGRhdGVHcmFwaGljQnVmZmVySW5NZXRhX2woa1BvcnRJbmRleElucHV0LCBncmFwaGljQnVmZmVyLCBidWZmZXIsIGhlYWRlcik7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBDTE9HX0VSUk9SKGVtcHR5R3JhcGhpY0J1ZmZlciwgZXJyLCBGVUxMX0JVRkZFUigKKyAgICAgICAgICAgICAgICAoaW50cHRyX3QpaGVhZGVyLT5wQnVmZmVyLCBoZWFkZXIsIGZlbmNlRmQpKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CiAKLSAgICBoZWFkZXItPm5GaWxsZWRMZW4gPSByYW5nZUxlbmd0aDsKLSAgICBoZWFkZXItPm5PZmZzZXQgPSByYW5nZU9mZnNldDsKLQotICAgIHJldHVybiBlbXB0eUJ1ZmZlcl9sKGhlYWRlciwgZmxhZ3MsIHRpbWVzdGFtcCwgKGludHB0cl90KWhlYWRlci0+cEJ1ZmZlcik7CisgICAgaGVhZGVyLT5uT2Zmc2V0ID0gMDsKKyAgICBoZWFkZXItPm5GaWxsZWRMZW4gPSBncmFwaGljQnVmZmVyID09IE5VTEwgPyAwIDogaGVhZGVyLT5uQWxsb2NMZW47CisgICAgcmV0dXJuIGVtcHR5QnVmZmVyX2woaGVhZGVyLCBmbGFncywgdGltZXN0YW1wLCAoaW50cHRyX3QpaGVhZGVyLT5wQnVmZmVyLCBmZW5jZUZkKTsKIH0KIAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpnZXRFeHRlbnNpb25JbmRleCgKQEAgLTEyNTYsNiArMTQ1NCw3IEBACiAgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9ERUxBWToKICAgICAgICAgICAgIHJldHVybiAiUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0RFTEFZIjsKICAgICAgICAgY2FzZSBJT01YOjpJTlRFUk5BTF9PUFRJT05fTUFYX1RJTUVTVEFNUF9HQVA6IHJldHVybiAiTUFYX1RJTUVTVEFNUF9HQVAiOworICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9NQVhfRlBTOiAgICAgICAgICAgcmV0dXJuICJNQVhfRlBTIjsKICAgICAgICAgY2FzZSBJT01YOjpJTlRFUk5BTF9PUFRJT05fU1RBUlRfVElNRTogICAgICAgIHJldHVybiAiU1RBUlRfVElNRSI7CiAgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1RJTUVfTEFQU0U6ICAgICAgICByZXR1cm4gIlRJTUVfTEFQU0UiOwogICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKQEAgLTEyNzMsNiArMTQ3Miw3IEBACiAgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NVU1BFTkQ6CiAgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9ERUxBWToKICAgICAgICAgY2FzZSBJT01YOjpJTlRFUk5BTF9PUFRJT05fTUFYX1RJTUVTVEFNUF9HQVA6CisgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX01BWF9GUFM6CiAgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NUQVJUX1RJTUU6CiAgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1RJTUVfTEFQU0U6CiAgICAgICAgIHsKQEAgLTEzMTAsNiArMTUxMCwxNCBAQAogICAgICAgICAgICAgICAgIGludDY0X3QgbWF4R2FwVXMgPSAqKGludDY0X3QgKilkYXRhOwogICAgICAgICAgICAgICAgIENMT0dfQ09ORklHKHNldEludGVybmFsT3B0aW9uLCAiZ2FwVXM9JWxsZCIsIChsb25nIGxvbmcpbWF4R2FwVXMpOwogICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXJTb3VyY2UtPnNldE1heFRpbWVzdGFtcEdhcFVzKG1heEdhcFVzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBJT01YOjpJTlRFUk5BTF9PUFRJT05fTUFYX0ZQUykgeworICAgICAgICAgICAgICAgIGlmIChzaXplICE9IHNpemVvZihmbG9hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZsb2F0IG1heEZwcyA9ICooZmxvYXQgKilkYXRhOworICAgICAgICAgICAgICAgIENMT0dfQ09ORklHKHNldEludGVybmFsT3B0aW9uLCAibWF4RnBzPSVmIiwgbWF4RnBzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyU291cmNlLT5zZXRNYXhGcHMobWF4RnBzKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBJT01YOjpJTlRFUk5BTF9PUFRJT05fU1RBUlRfVElNRSkgewogICAgICAgICAgICAgICAgIGlmIChzaXplICE9IHNpemVvZihpbnQ2NF90KSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0xMzM5LDE0ICsxNTQ3LDE0IEBACiAgICAgfQogfQogCi12b2lkIE9NWE5vZGVJbnN0YW5jZTo6b25NZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpIHsKK2Jvb2wgT01YTm9kZUluc3RhbmNlOjpoYW5kbGVNZXNzYWdlKG9teF9tZXNzYWdlICZtc2cpIHsKICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgYnVmZmVyU291cmNlKGdldEdyYXBoaWNCdWZmZXJTb3VyY2UoKSk7CiAKICAgICBpZiAobXNnLnR5cGUgPT0gb214X21lc3NhZ2U6OkZJTExfQlVGRkVSX0RPTkUpIHsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlciA9CiAgICAgICAgICAgICBmaW5kQnVmZmVySGVhZGVyKG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlciwga1BvcnRJbmRleE91dHB1dCk7CiAgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgewpAQCAtMTM1NCw3ICsxNTYyLDggQEAKICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJzV2l0aENvZGVjLnJlbW92ZShidWZmZXIpOwogCiAgICAgICAgICAgICBDTE9HX0JVTVBFRF9CVUZGRVIoCi0gICAgICAgICAgICAgICAgICAgIEZCRCwgV0lUSF9TVEFUUyhGVUxMX0JVRkZFUihtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5idWZmZXIsIGJ1ZmZlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgRkJELCBXSVRIX1NUQVRTKEZVTExfQlVGRkVSKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlciwgYnVmZmVyLCBtc2cuZmVuY2VGZCkpKTsKIAogICAgICAgICAgICAgdW5idW1wRGVidWdMZXZlbF9sKGtQb3J0SW5kZXhPdXRwdXQpOwogICAgICAgICB9CkBAIC0xMzYyLDIyICsxNTcxLDI0IEBACiAgICAgICAgIEJ1ZmZlck1ldGEgKmJ1ZmZlcl9tZXRhID0KICAgICAgICAgICAgIHN0YXRpY19jYXN0PEJ1ZmZlck1ldGEgKj4oYnVmZmVyLT5wQXBwUHJpdmF0ZSk7CiAKKyAgICAgICAgaWYgKGJ1ZmZlci0+bk9mZnNldCArIGJ1ZmZlci0+bkZpbGxlZExlbiA8IGJ1ZmZlci0+bk9mZnNldAorICAgICAgICAgICAgICAgIHx8IGJ1ZmZlci0+bk9mZnNldCArIGJ1ZmZlci0+bkZpbGxlZExlbiA+IGJ1ZmZlci0+bkFsbG9jTGVuKSB7CisgICAgICAgICAgICBDTE9HX0VSUk9SKG9uRmlsbEJ1ZmZlckRvbmUsIE9NWF9FcnJvckJhZFBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgRlVMTF9CVUZGRVIoTlVMTCwgYnVmZmVyLCBtc2cuZmVuY2VGZCkpOworICAgICAgICB9CiAgICAgICAgIGJ1ZmZlcl9tZXRhLT5Db3B5RnJvbU9NWChidWZmZXIpOwogCiAgICAgICAgIGlmIChidWZmZXJTb3VyY2UgIT0gTlVMTCkgewogICAgICAgICAgICAgLy8gZml4IHVwIHRoZSBidWZmZXIgaW5mbyAoZXNwZWNpYWxseSB0aW1lc3RhbXApIGlmIG5lZWRlZAogICAgICAgICAgICAgYnVmZmVyU291cmNlLT5jb2RlY0J1ZmZlckZpbGxlZChidWZmZXIpOwogCi0gICAgICAgICAgICBvbXhfbWVzc2FnZSBuZXdNc2cgPSBtc2c7Ci0gICAgICAgICAgICBuZXdNc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS50aW1lc3RhbXAgPSBidWZmZXItPm5UaW1lU3RhbXA7Ci0gICAgICAgICAgICBtT2JzZXJ2ZXItPm9uTWVzc2FnZShuZXdNc2cpOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEudGltZXN0YW1wID0gYnVmZmVyLT5uVGltZVN0YW1wOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtc2cudHlwZSA9PSBvbXhfbWVzc2FnZTo6RU1QVFlfQlVGRkVSX0RPTkUpIHsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlciA9CiAgICAgICAgICAgICBmaW5kQnVmZmVySGVhZGVyKG1zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlciwga1BvcnRJbmRleElucHV0KTsKICAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICB7CkBAIC0xMzg1LDcgKzE1OTYsNyBAQAogICAgICAgICAgICAgbUlucHV0QnVmZmVyc1dpdGhDb2RlYy5yZW1vdmUoYnVmZmVyKTsKIAogICAgICAgICAgICAgQ0xPR19CVU1QRURfQlVGRkVSKAotICAgICAgICAgICAgICAgICAgICBFQkQsIFdJVEhfU1RBVFMoRU1QVFlfQlVGRkVSKG1zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlciwgYnVmZmVyKSkpOworICAgICAgICAgICAgICAgICAgICBFQkQsIFdJVEhfU1RBVFMoRU1QVFlfQlVGRkVSKG1zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlciwgYnVmZmVyLCBtc2cuZmVuY2VGZCkpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChidWZmZXJTb3VyY2UgIT0gTlVMTCkgewpAQCAtMTM5NCwxMiArMTYwNSwyNiBAQAogICAgICAgICAgICAgLy8gRG9uJ3QgZGlzcGF0Y2ggYSBtZXNzYWdlIGJhY2sgdG8gQUNvZGVjLCBzaW5jZSBpdCBkb2Vzbid0CiAgICAgICAgICAgICAvLyBrbm93IHRoYXQgYW55b25lIGFza2VkIHRvIGhhdmUgdGhlIGJ1ZmZlciBlbXB0aWVkIGFuZCB3aWxsCiAgICAgICAgICAgICAvLyBiZSB2ZXJ5IGNvbmZ1c2VkLgotICAgICAgICAgICAgYnVmZmVyU291cmNlLT5jb2RlY0J1ZmZlckVtcHRpZWQoYnVmZmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGJ1ZmZlclNvdXJjZS0+Y29kZWNCdWZmZXJFbXB0aWVkKGJ1ZmZlciwgbXNnLmZlbmNlRmQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtT2JzZXJ2ZXItPm9uTWVzc2FnZShtc2cpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBPTVhOb2RlSW5zdGFuY2U6Om9uTWVzc2FnZXMoc3RkOjpsaXN0PG9teF9tZXNzYWdlPiAmbWVzc2FnZXMpIHsKKyAgICBmb3IgKHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT46Oml0ZXJhdG9yIGl0ID0gbWVzc2FnZXMuYmVnaW4oKTsgaXQgIT0gbWVzc2FnZXMuZW5kKCk7ICkgeworICAgICAgICBpZiAoaGFuZGxlTWVzc2FnZSgqaXQpKSB7CisgICAgICAgICAgICBtZXNzYWdlcy5lcmFzZShpdCsrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW1lc3NhZ2VzLmVtcHR5KCkpIHsKKyAgICAgICAgbU9ic2VydmVyLT5vbk1lc3NhZ2VzKG1lc3NhZ2VzKTsKKyAgICB9CiB9CiAKIHZvaWQgT01YTm9kZUluc3RhbmNlOjpvbk9ic2VydmVyRGllZChPTVhNYXN0ZXIgKm1hc3RlcikgewpAQCAtMTQ5Niw4ICsxNzIxLDkgQEAKICAgICBpZiAoaW5zdGFuY2UtPm1EeWluZykgewogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9CisgICAgaW50IGZlbmNlRmQgPSBpbnN0YW5jZS0+cmV0cmlldmVGZW5jZUZyb21NZXRhX2wocEJ1ZmZlciwga1BvcnRJbmRleE91dHB1dCk7CiAgICAgcmV0dXJuIGluc3RhbmNlLT5vd25lcigpLT5PbkVtcHR5QnVmZmVyRG9uZShpbnN0YW5jZS0+bm9kZUlEKCksCi0gICAgICAgICAgICBpbnN0YW5jZS0+ZmluZEJ1ZmZlcklEKHBCdWZmZXIpLCBwQnVmZmVyKTsKKyAgICAgICAgICAgIGluc3RhbmNlLT5maW5kQnVmZmVySUQocEJ1ZmZlciksIHBCdWZmZXIsIGZlbmNlRmQpOwogfQogCiAvLyBzdGF0aWMKQEAgLTE1MDksOCArMTczNSw5IEBACiAgICAgaWYgKGluc3RhbmNlLT5tRHlpbmcpIHsKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfQorICAgIGludCBmZW5jZUZkID0gaW5zdGFuY2UtPnJldHJpZXZlRmVuY2VGcm9tTWV0YV9sKHBCdWZmZXIsIGtQb3J0SW5kZXhPdXRwdXQpOwogICAgIHJldHVybiBpbnN0YW5jZS0+b3duZXIoKS0+T25GaWxsQnVmZmVyRG9uZShpbnN0YW5jZS0+bm9kZUlEKCksCi0gICAgICAgICAgICBpbnN0YW5jZS0+ZmluZEJ1ZmZlcklEKHBCdWZmZXIpLCBwQnVmZmVyKTsKKyAgICAgICAgICAgIGluc3RhbmNlLT5maW5kQnVmZmVySUQocEJ1ZmZlciksIHBCdWZmZXIsIGZlbmNlRmQpOwogfQogCiB2b2lkIE9NWE5vZGVJbnN0YW5jZTo6YWRkQWN0aXZlQnVmZmVyKE9NWF9VMzIgcG9ydEluZGV4LCBPTVg6OmJ1ZmZlcl9pZCBpZCkgewpAQCAtMTU3NCwxNCArMTgwMSwxNCBAQAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQnVmZmVySURMb2NrKTsKICAgICBzc2l6ZV90IGluZGV4ID0gbUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXIuaW5kZXhPZktleShidWZmZXIpOwogICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coImZpbmRCdWZmZXJIZWFkZXI6IGJ1ZmZlciAldSBub3QgZm91bmQiLCBidWZmZXIpOworICAgICAgICBDTE9HVygiZmluZEJ1ZmZlckhlYWRlcjogYnVmZmVyICV1IG5vdCBmb3VuZCIsIGJ1ZmZlcik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXIudmFsdWVBdChpbmRleCk7CiAgICAgQnVmZmVyTWV0YSAqYnVmZmVyX21ldGEgPQogICAgICAgICBzdGF0aWNfY2FzdDxCdWZmZXJNZXRhICo+KGhlYWRlci0+cEFwcFByaXZhdGUpOwogICAgIGlmIChidWZmZXJfbWV0YS0+Z2V0UG9ydEluZGV4KCkgIT0gcG9ydEluZGV4KSB7Ci0gICAgICAgIEFMT0dXKCJmaW5kQnVmZmVySGVhZGVyOiBidWZmZXIgJXUgZm91bmQgYnV0IHdpdGggaW5jb3JyZWN0IHBvcnQgaW5kZXguIiwgYnVmZmVyKTsKKyAgICAgICAgQ0xPR1coImZpbmRCdWZmZXJIZWFkZXI6IGJ1ZmZlciAldSBmb3VuZCBidXQgd2l0aCBpbmNvcnJlY3QgcG9ydCBpbmRleC4iLCBidWZmZXIpOwogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI4ODE2ODI3Iik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTE1OTMsNyArMTgyMCwxMiBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1CdWZmZXJJRExvY2spOwotICAgIHJldHVybiBtQnVmZmVySGVhZGVyVG9CdWZmZXJJRC52YWx1ZUZvcihidWZmZXJIZWFkZXIpOworICAgIHNzaXplX3QgaW5kZXggPSBtQnVmZmVySGVhZGVyVG9CdWZmZXJJRC5pbmRleE9mS2V5KGJ1ZmZlckhlYWRlcik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBDTE9HVygiZmluZEJ1ZmZlcklEOiBidWZmZXJIZWFkZXIgJXAgbm90IGZvdW5kIiwgYnVmZmVySGVhZGVyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBtQnVmZmVySGVhZGVyVG9CdWZmZXJJRC52YWx1ZUF0KGluZGV4KTsKIH0KIAogdm9pZCBPTVhOb2RlSW5zdGFuY2U6OmludmFsaWRhdGVCdWZmZXJJRChPTVg6OmJ1ZmZlcl9pZCBidWZmZXIpIHsKQEAgLTE2MDEsOCArMTgzMywxMyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQnVmZmVySURMb2NrKTsKLSAgICBtQnVmZmVySGVhZGVyVG9CdWZmZXJJRC5yZW1vdmVJdGVtKG1CdWZmZXJJRFRvQnVmZmVySGVhZGVyLnZhbHVlRm9yKGJ1ZmZlcikpOwotICAgIG1CdWZmZXJJRFRvQnVmZmVySGVhZGVyLnJlbW92ZUl0ZW0oYnVmZmVyKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXIuaW5kZXhPZktleShidWZmZXIpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQ0xPR1coImludmFsaWRhdGVCdWZmZXJJRDogYnVmZmVyICV1IG5vdCBmb3VuZCIsIGJ1ZmZlcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUJ1ZmZlckhlYWRlclRvQnVmZmVySUQucmVtb3ZlSXRlbShtQnVmZmVySURUb0J1ZmZlckhlYWRlci52YWx1ZUF0KGluZGV4KSk7CisgICAgbUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXIucmVtb3ZlSXRlbXNBdChpbmRleCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKaW5kZXggYzEwNzAwMS4uMTNhZmQ0NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcApAQCAtNTgsNyArNTgsNyBAQAogICAgICAgICBPTVhfQ09NTUFORFRZUEUgY21kLCBPTVhfVTMyIHBhcmFtLCBPTVhfUFRSIGRhdGEpIHsKICAgICBDSEVDSyhkYXRhID09IE5VTEwpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRDb21tYW5kLCBtSGFuZGxlci0+aWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRDb21tYW5kLCBtSGFuZGxlcik7CiAgICAgbXNnLT5zZXRJbnQzMigiY21kIiwgY21kKTsKICAgICBtc2ctPnNldEludDMyKCJwYXJhbSIsIHBhcmFtKTsKICAgICBtc2ctPnBvc3QoKTsKQEAgLTMxNSw3ICszMTUsNyBAQAogCiBPTVhfRVJST1JUWVBFIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmVtcHR5VGhpc0J1ZmZlcigKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRFbXB0eVRoaXNCdWZmZXIsIG1IYW5kbGVyLT5pZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RW1wdHlUaGlzQnVmZmVyLCBtSGFuZGxlcik7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJoZWFkZXIiLCBidWZmZXIpOwogICAgIG1zZy0+cG9zdCgpOwogCkBAIC0zMjQsNyArMzI0LDcgQEAKIAogT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpmaWxsVGhpc0J1ZmZlcigKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGaWxsVGhpc0J1ZmZlciwgbUhhbmRsZXItPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGaWxsVGhpc0J1ZmZlciwgbUhhbmRsZXIpOwogICAgIG1zZy0+c2V0UG9pbnRlcigiaGVhZGVyIiwgYnVmZmVyKTsKICAgICBtc2ctPnBvc3QoKTsKIApAQCAtNTIwLDcgKzUyMCwxNSBAQAogICAgIENIRUNLX0xUKHBvcnRJbmRleCwgbVBvcnRzLnNpemUoKSk7CiAKICAgICBQb3J0SW5mbyAqcG9ydCA9ICZtUG9ydHMuZWRpdEl0ZW1BdChwb3J0SW5kZXgpOwotICAgIENIRUNLX0VRKChpbnQpcG9ydC0+bVRyYW5zaXRpb24sIChpbnQpUG9ydEluZm86Ok5PTkUpOworICAgIC8vIElkZWFsbHksIHRoZSBwb3J0IHNob3VsZCBub3QgaW4gdHJhbnNpdGlvbmluZyBzdGF0ZSB3aGVuIGZsdXNoaW5nLgorICAgIC8vIEhvd2V2ZXIsIGluIGVycm9yIGhhbmRsaW5nIGNhc2UsIGUuZy4sIHRoZSBjbGllbnQgY2FuJ3QgYWxsb2NhdGUgYnVmZmVycworICAgIC8vIHdoZW4gaXQgdHJpZXMgdG8gcmUtZW5hYmxlIHRoZSBwb3J0LCB0aGUgcG9ydCB3aWxsIGJlIHN0dWNrIGluIEVOQUJMSU5HLgorICAgIC8vIFRoZSBjbGllbnQgd2lsbCB0aGVuIHRyYW5zaXRpb24gdGhlIGNvbXBvbmVudCBmcm9tIEV4ZWN1dGluZyB0byBJZGxlLAorICAgIC8vIHdoaWNoIGxlYWRzIHRvIGZsdXNoaW5nIHBvcnRzLiBBdCB0aGlzIHRpbWUsIGl0IHNob3VsZCBiZSBvayB0byBub3RpZnkKKyAgICAvLyB0aGUgY2xpZW50IG9mIHRoZSBlcnJvciBhbmQgc3RpbGwgY2xlYXIgYWxsIGJ1ZmZlcnMgb24gdGhlIHBvcnQuCisgICAgaWYgKHBvcnQtPm1UcmFuc2l0aW9uICE9IFBvcnRJbmZvOjpOT05FKSB7CisgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKKyAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBvcnQtPm1CdWZmZXJzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIEJ1ZmZlckluZm8gKmJ1ZmZlciA9ICZwb3J0LT5tQnVmZmVycy5lZGl0SXRlbUF0KGkpOwpAQCAtNjEzLDcgKzYyMSw3IEBACiAKICAgICAgICAgaWYgKHBvcnQtPm1UcmFuc2l0aW9uID09IFBvcnRJbmZvOjpESVNBQkxJTkcpIHsKICAgICAgICAgICAgIGlmIChwb3J0LT5tQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlBvcnQgJWQgbm93IGRpc2FibGVkLiIsIGkpOworICAgICAgICAgICAgICAgIEFMT0dWKCJQb3J0ICV6dSBub3cgZGlzYWJsZWQuIiwgaSk7CiAKICAgICAgICAgICAgICAgICBwb3J0LT5tVHJhbnNpdGlvbiA9IFBvcnRJbmZvOjpOT05FOwogICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRDbWRDb21wbGV0ZSwgT01YX0NvbW1hbmRQb3J0RGlzYWJsZSwgaSwgTlVMTCk7CkBAIC02MjIsNyArNjMwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChwb3J0LT5tVHJhbnNpdGlvbiA9PSBQb3J0SW5mbzo6RU5BQkxJTkcpIHsKICAgICAgICAgICAgIGlmIChwb3J0LT5tRGVmLmJQb3B1bGF0ZWQgPT0gT01YX1RSVUUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiUG9ydCAlZCBub3cgZW5hYmxlZC4iLCBpKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiUG9ydCAlenUgbm93IGVuYWJsZWQuIiwgaSk7CiAKICAgICAgICAgICAgICAgICBwb3J0LT5tVHJhbnNpdGlvbiA9IFBvcnRJbmZvOjpOT05FOwogICAgICAgICAgICAgICAgIHBvcnQtPm1EZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKQEAgLTY0MywxNCArNjUxLDE0IEBACiAgICAgaW5mby0+bVRyYW5zaXRpb24gPSBQb3J0SW5mbzo6Tk9ORTsKIH0KIAotdm9pZCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit2b2lkIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXggX191bnVzZWQpIHsKIH0KIAotdm9pZCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCBfX3VudXNlZCkgewogfQogCiB2b2lkIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6Om9uUG9ydEVuYWJsZUNvbXBsZXRlZCgKLSAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCkgeworICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCBfX3VudXNlZCwgYm9vbCBlbmFibGVkIF9fdW51c2VkKSB7CiB9CiAKIExpc3Q8U2ltcGxlU29mdE9NWENvbXBvbmVudDo6QnVmZmVySW5mbyAqPiAmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKaW5kZXggOWExMGViYy4uNTIzOWJjOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcApAQCAtMzQsNiArMzQsOCBAQAogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyTWFwcGVyLmg+CiAKKyNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjb25zdCBzdGF0aWMgT01YX0NPTE9SX0ZPUk1BVFRZUEUga1N1cHBvcnRlZENvbG9yRm9ybWF0c1tdID0gewpAQCAtMTU1LDcgKzE1Nyw3IEBACiAgICAgdWludDMyX3QgcmF3QnVmZmVyU2l6ZSA9CiAgICAgICAgIGluRGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSAqIGluRGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ICogMyAvIDI7CiAgICAgaWYgKGluRGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlKSB7Ci0gICAgICAgIGluRGVmLT5uQnVmZmVyU2l6ZSA9IDQgKyBtYXgoc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCksIHNpemVvZihHcmFwaGljQnVmZmVyICopKTsKKyAgICAgICAgaW5EZWYtPm5CdWZmZXJTaXplID0gbWF4KHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKSwgc2l6ZW9mKFZpZGVvR3JhbGxvY01ldGFkYXRhKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaW5EZWYtPm5CdWZmZXJTaXplID0gcmF3QnVmZmVyU2l6ZTsKICAgICB9CkBAIC0zMTAsNyArMzEyLDcgQEAKIAogT01YX0VSUk9SVFlQRSBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbSkgewotICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvRXJyb3JDb3JyZWN0aW9uOgogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQ7CkBAIC0zNjgsNiArMzcwLDEzIEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0czoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1UzMiAqdXNhZ2VCaXRzID0gKE9NWF9VMzIgKilwYXJhbTsKKyAgICAgICAgICAgICp1c2FnZUJpdHMgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU47CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtKTsKICAgICB9CkBAIC01MDcsOCArNTE2LDggQEAKICAgICBzaXplX3QgZHN0VlN0cmlkZSA9IGhlaWdodDsKIAogICAgIE1ldGFkYXRhQnVmZmVyVHlwZSBidWZmZXJUeXBlID0gKihNZXRhZGF0YUJ1ZmZlclR5cGUgKilzcmM7Ci0gICAgYm9vbCB1c2luZ0dyYXBoaWNCdWZmZXIgPSBidWZmZXJUeXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFwaGljQnVmZmVyOwotICAgIGlmICghdXNpbmdHcmFwaGljQnVmZmVyICYmIGJ1ZmZlclR5cGUgIT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKKyAgICBib29sIHVzaW5nQU5XQnVmZmVyID0gYnVmZmVyVHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyOworICAgIGlmICghdXNpbmdBTldCdWZmZXIgJiYgYnVmZmVyVHlwZSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgewogICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbWV0YWRhdGEgdHlwZSAoJWQpIiwgYnVmZmVyVHlwZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTUyNCwxMyArNTMzLDE0IEBACiAgICAgaW50IGZvcm1hdDsKICAgICBzaXplX3Qgc3JjU3RyaWRlOwogICAgIHNpemVfdCBzcmNWU3RyaWRlOwotICAgIGlmICh1c2luZ0dyYXBoaWNCdWZmZXIpIHsKLSAgICAgICAgaWYgKHNyY1NpemUgPCBzaXplb2YoT01YX1UzMikgKyBzaXplb2YoR3JhcGhpY0J1ZmZlciAqKSkgewotICAgICAgICAgICAgQUxPR0UoIk1ldGFkYXRhIGlzIHRvbyBzbWFsbCAoJXp1IHZzICV6dSkiLCBzcmNTaXplLCBzaXplb2YoT01YX1UzMikgKyBzaXplb2YoR3JhcGhpY0J1ZmZlciAqKSk7CisgICAgaWYgKHVzaW5nQU5XQnVmZmVyKSB7CisgICAgICAgIGlmIChzcmNTaXplIDwgc2l6ZW9mKFZpZGVvTmF0aXZlTWV0YWRhdGEpKSB7CisgICAgICAgICAgICBBTE9HRSgiTWV0YWRhdGEgaXMgdG9vIHNtYWxsICglenUgdnMgJXp1KSIsIHNyY1NpemUsIHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIEdyYXBoaWNCdWZmZXIgKmJ1ZmZlciA9ICooR3JhcGhpY0J1ZmZlciAqKikoc3JjICsgc2l6ZW9mKE9NWF9VMzIpKTsKKyAgICAgICAgVmlkZW9OYXRpdmVNZXRhZGF0YSAmbmF0aXZlTWV0YSA9ICooVmlkZW9OYXRpdmVNZXRhZGF0YSAqKXNyYzsKKyAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYnVmZmVyID0gbmF0aXZlTWV0YS5wQnVmZmVyOwogICAgICAgICBoYW5kbGUgPSBidWZmZXItPmhhbmRsZTsKICAgICAgICAgZm9ybWF0ID0gYnVmZmVyLT5mb3JtYXQ7CiAgICAgICAgIHNyY1N0cmlkZSA9IGJ1ZmZlci0+c3RyaWRlOwpAQCAtNTQxLDE1ICs1NTEsMjYgQEAKICAgICAgICAgICAgIC8vIFRPRE8gZG8gd2UgbmVlZCB0byBzdXBwb3J0IG90aGVyIGZvcm1hdHM/CiAgICAgICAgICAgICBzcmNTdHJpZGUgKj0gNDsKICAgICAgICAgfQorCisgICAgICAgIGlmIChuYXRpdmVNZXRhLm5GZW5jZUZkID49IDApIHsKKyAgICAgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZShuYXRpdmVNZXRhLm5GZW5jZUZkKTsKKyAgICAgICAgICAgIG5hdGl2ZU1ldGEubkZlbmNlRmQgPSAtMTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGZlbmNlLT53YWl0KElPTVg6OmtGZW5jZVRpbWVvdXRNcyk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlRpbWVkIG91dCB3YWl0aW5nIG9uIGlucHV0IGZlbmNlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBwYXJ0LiAgQ2hlY2sgaWYgYW55b25lIHVzZXMgdGhpcy4KIAotICAgICAgICBpZiAoc3JjU2l6ZSA8IHNpemVvZihPTVhfVTMyKSArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiTWV0YWRhdGEgaXMgdG9vIHNtYWxsICglenUgdnMgJXp1KSIsIHNyY1NpemUsIHNpemVvZihPTVhfVTMyKSArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKKyAgICAgICAgaWYgKHNyY1NpemUgPCBzaXplb2YoVmlkZW9HcmFsbG9jTWV0YWRhdGEpKSB7CisgICAgICAgICAgICBBTE9HRSgiTWV0YWRhdGEgaXMgdG9vIHNtYWxsICglenUgdnMgJXp1KSIsIHNyY1NpemUsIHNpemVvZihWaWRlb0dyYWxsb2NNZXRhZGF0YSkpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIAotICAgICAgICBoYW5kbGUgPSAqKGJ1ZmZlcl9oYW5kbGVfdCAqKShzcmMgKyBzaXplb2YoT01YX1UzMikpOworICAgICAgICBWaWRlb0dyYWxsb2NNZXRhZGF0YSAmZ3JhbGxvY01ldGEgPSAqKFZpZGVvR3JhbGxvY01ldGFkYXRhICopKHNyYyk7CisgICAgICAgIGhhbmRsZSA9IGdyYWxsb2NNZXRhLnBIYW5kbGU7CiAgICAgICAgIC8vIGFzc3VtZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OAogICAgICAgICAvLyB0aGVyZSBpcyBubyB3YXkgdG8gZ2V0IHRoZSBzcmMgc3RyaWRlIHdpdGhvdXQgdGhlIGdyYXBoaWMgYnVmZmVyCiAgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OwpAQCAtNjMxLDcgKzY1Miw3IEBACiBPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgewogICAgIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVNZXRhRGF0YUluQnVmZmVycyIpIHx8Ci0gICAgICAgICFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZUdyYXBoaWNCdWZmZXJJbk1ldGFEYXRhIikpIHsKKyAgICAgICAgIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlQU5XQnVmZmVySW5NZXRhZGF0YSIpKSB7CiAgICAgICAgICooaW50MzJfdCopaW5kZXggPSBrU3RvcmVNZXRhRGF0YUV4dGVuc2lvbkluZGV4OwogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDQ0N2IyOWUuLjAyZTk3ZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rCkBAIC0xMSw3ICsxMSw4IEBACiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAotTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIExPQ0FMX01PRFVMRSA6PSBvbXhfdGVzdHMKIApAQCAtMjAsMyArMjEsMjQgQEAKIExPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gRnJhbWVEcm9wcGVyX3Rlc3QKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwlGcmFtZURyb3BwZXJfdGVzdC5jcHAgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJzdGFnZWZyaWdodF9vbXggXAorCWxpYnV0aWxzIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXggXAorCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorCitpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvRnJhbWVEcm9wcGVyX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0ZyYW1lRHJvcHBlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTY2YjVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0ZyYW1lRHJvcHBlcl90ZXN0LmNwcApAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRnJhbWVEcm9wcGVyX3Rlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiRnJhbWVEcm9wcGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgVGVzdEZyYW1lIHsKKyAgaW50NjRfdCB0aW1lVXM7CisgIGJvb2wgc2hvdWxkRHJvcDsKK307CisKK3N0YXRpYyBjb25zdCBUZXN0RnJhbWUgdGVzdEZyYW1lczIwRnBzW10gPSB7CisgICAgezEwMDAwMDAsIGZhbHNlfSwgezEwNTAwMDAsIGZhbHNlfSwgezExMDAwMDAsIGZhbHNlfSwgezExNTAwMDAsIGZhbHNlfSwKKyAgICB7MTIwMDAwMCwgZmFsc2V9LCB7MTI1MDAwMCwgZmFsc2V9LCB7MTMwMDAwMCwgZmFsc2V9LCB7MTM1MDAwMCwgZmFsc2V9LAorICAgIHsxNDAwMDAwLCBmYWxzZX0sIHsxNDUwMDAwLCBmYWxzZX0sIHsxNTAwMDAwLCBmYWxzZX0sIHsxNTUwMDAwLCBmYWxzZX0sCisgICAgezE2MDAwMDAsIGZhbHNlfSwgezE2NTAwMDAsIGZhbHNlfSwgezE3MDAwMDAsIGZhbHNlfSwgezE3NTAwMDAsIGZhbHNlfSwKKyAgICB7MTgwMDAwMCwgZmFsc2V9LCB7MTg1MDAwMCwgZmFsc2V9LCB7MTkwMDAwMCwgZmFsc2V9LCB7MTk1MDAwMCwgZmFsc2V9LAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RGcmFtZSB0ZXN0RnJhbWVzMzBGcHNbXSA9IHsKKyAgICB7MTAwMDAwMCwgZmFsc2V9LCB7MTAzMzMzMywgZmFsc2V9LCB7MTA2NjY2NywgZmFsc2V9LCB7MTEwMDAwMCwgZmFsc2V9LAorICAgIHsxMTMzMzMzLCBmYWxzZX0sIHsxMTY2NjY3LCBmYWxzZX0sIHsxMjAwMDAwLCBmYWxzZX0sIHsxMjMzMzMzLCBmYWxzZX0sCisgICAgezEyNjY2NjcsIGZhbHNlfSwgezEzMDAwMDAsIGZhbHNlfSwgezEzMzMzMzMsIGZhbHNlfSwgezEzNjY2NjcsIGZhbHNlfSwKKyAgICB7MTQwMDAwMCwgZmFsc2V9LCB7MTQzMzMzMywgZmFsc2V9LCB7MTQ2NjY2NywgZmFsc2V9LCB7MTUwMDAwMCwgZmFsc2V9LAorICAgIHsxNTMzMzMzLCBmYWxzZX0sIHsxNTY2NjY3LCBmYWxzZX0sIHsxNjAwMDAwLCBmYWxzZX0sIHsxNjMzMzMzLCBmYWxzZX0sCit9OworCitzdGF0aWMgY29uc3QgVGVzdEZyYW1lIHRlc3RGcmFtZXM0MEZwc1tdID0geworICAgIHsxMDAwMDAwLCBmYWxzZX0sIHsxMDI1MDAwLCB0cnVlfSwgezEwNTAwMDAsIGZhbHNlfSwgezEwNzUwMDAsIGZhbHNlfSwKKyAgICB7MTEwMDAwMCwgZmFsc2V9LCB7MTEyNTAwMCwgdHJ1ZX0sIHsxMTUwMDAwLCBmYWxzZX0sIHsxMTc1MDAwLCBmYWxzZX0sCisgICAgezEyMDAwMDAsIGZhbHNlfSwgezEyMjUwMDAsIHRydWV9LCB7MTI1MDAwMCwgZmFsc2V9LCB7MTI3NTAwMCwgZmFsc2V9LAorICAgIHsxMzAwMDAwLCBmYWxzZX0sIHsxMzI1MDAwLCB0cnVlfSwgezEzNTAwMDAsIGZhbHNlfSwgezEzNzUwMDAsIGZhbHNlfSwKKyAgICB7MTQwMDAwMCwgZmFsc2V9LCB7MTQyNTAwMCwgdHJ1ZX0sIHsxNDUwMDAwLCBmYWxzZX0sIHsxNDc1MDAwLCBmYWxzZX0sCit9OworCitzdGF0aWMgY29uc3QgVGVzdEZyYW1lIHRlc3RGcmFtZXM2MEZwc1tdID0geworICAgIHsxMDAwMDAwLCBmYWxzZX0sIHsxMDE2NjY3LCB0cnVlfSwgezEwMzMzMzMsIGZhbHNlfSwgezEwNTAwMDAsIHRydWV9LAorICAgIHsxMDY2NjY3LCBmYWxzZX0sIHsxMDgzMzMzLCB0cnVlfSwgezExMDAwMDAsIGZhbHNlfSwgezExMTY2NjcsIHRydWV9LAorICAgIHsxMTMzMzMzLCBmYWxzZX0sIHsxMTUwMDAwLCB0cnVlfSwgezExNjY2NjcsIGZhbHNlfSwgezExODMzMzMsIHRydWV9LAorICAgIHsxMjAwMDAwLCBmYWxzZX0sIHsxMjE2NjY3LCB0cnVlfSwgezEyMzMzMzMsIGZhbHNlfSwgezEyNTAwMDAsIHRydWV9LAorICAgIHsxMjY2NjY3LCBmYWxzZX0sIHsxMjgzMzMzLCB0cnVlfSwgezEzMDAwMDAsIGZhbHNlfSwgezEzMTY2NjcsIHRydWV9LAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RGcmFtZSB0ZXN0RnJhbWVzVmFyaWFibGVGcHNbXSA9IHsKKyAgICAvLyA0MGZwcworICAgIHsxMDAwMDAwLCBmYWxzZX0sIHsxMDI1MDAwLCB0cnVlfSwgezEwNTAwMDAsIGZhbHNlfSwgezEwNzUwMDAsIGZhbHNlfSwKKyAgICB7MTEwMDAwMCwgZmFsc2V9LCB7MTEyNTAwMCwgdHJ1ZX0sIHsxMTUwMDAwLCBmYWxzZX0sIHsxMTc1MDAwLCBmYWxzZX0sCisgICAgezEyMDAwMDAsIGZhbHNlfSwgezEyMjUwMDAsIHRydWV9LCB7MTI1MDAwMCwgZmFsc2V9LCB7MTI3NTAwMCwgZmFsc2V9LAorICAgIHsxMzAwMDAwLCBmYWxzZX0sIHsxMzI1MDAwLCB0cnVlfSwgezEzNTAwMDAsIGZhbHNlfSwgezEzNzUwMDAsIGZhbHNlfSwKKyAgICB7MTQwMDAwMCwgZmFsc2V9LCB7MTQyNTAwMCwgdHJ1ZX0sIHsxNDUwMDAwLCBmYWxzZX0sIHsxNDc1MDAwLCBmYWxzZX0sCisgICAgLy8gYSB0aW1lc3RhbXAganVtcCBwbHVzIHN3aXRjaCB0byAyMGZwcworICAgIHsyMDAwMDAwLCBmYWxzZX0sIHsyMDUwMDAwLCBmYWxzZX0sIHsyMTAwMDAwLCBmYWxzZX0sIHsyMTUwMDAwLCBmYWxzZX0sCisgICAgezIyMDAwMDAsIGZhbHNlfSwgezIyNTAwMDAsIGZhbHNlfSwgezIzMDAwMDAsIGZhbHNlfSwgezIzNTAwMDAsIGZhbHNlfSwKKyAgICB7MjQwMDAwMCwgZmFsc2V9LCB7MjQ1MDAwMCwgZmFsc2V9LCB7MjUwMDAwMCwgZmFsc2V9LCB7MjU1MDAwMCwgZmFsc2V9LAorICAgIHsyNjAwMDAwLCBmYWxzZX0sIHsyNjUwMDAwLCBmYWxzZX0sIHsyNzAwMDAwLCBmYWxzZX0sIHsyNzUwMDAwLCBmYWxzZX0sCisgICAgezI4MDAwMDAsIGZhbHNlfSwgezI4NTAwMDAsIGZhbHNlfSwgezI5MDAwMDAsIGZhbHNlfSwgezI5NTAwMDAsIGZhbHNlfSwKKyAgICAvLyA2MGZwcworICAgIHsyOTY2NjY3LCBmYWxzZX0sIHsyOTgzMzMzLCB0cnVlfSwgezMwMDAwMDAsIGZhbHNlfSwgezMwMTY2NjcsIHRydWV9LAorICAgIHszMDMzMzMzLCBmYWxzZX0sIHszMDUwMDAwLCB0cnVlfSwgezMwNjY2NjcsIGZhbHNlfSwgezMwODMzMzMsIHRydWV9LAorICAgIHszMTAwMDAwLCBmYWxzZX0sIHszMTE2NjY3LCB0cnVlfSwgezMxMzMzMzMsIGZhbHNlfSwgezMxNTAwMDAsIHRydWV9LAorICAgIHszMTY2NjY3LCBmYWxzZX0sIHszMTgzMzMzLCB0cnVlfSwgezMyMDAwMDAsIGZhbHNlfSwgezMyMTY2NjcsIHRydWV9LAorICAgIHszMjMzMzMzLCBmYWxzZX0sIHszMjUwMDAwLCB0cnVlfSwgezMyNjY2NjcsIGZhbHNlfSwgezMyODMzMzMsIHRydWV9LAorfTsKKworc3RhdGljIGNvbnN0IGludCBrTWF4VGVzdEppdHRlclVzID0gMjAwMDsKKy8vIHJldHVybiBvbmUgb2YgMTAwMCwgMCwgLTEwMDAgYXMgaml0dGVyLgorc3RhdGljIGludCBHZXRKaXR0ZXIoc2l6ZV90IGkpIHsKKyAgICByZXR1cm4gKDEgLSAoaSAlIDMpKSAqIChrTWF4VGVzdEppdHRlclVzIC8gMik7Cit9CisKK2NsYXNzIEZyYW1lRHJvcHBlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBGcmFtZURyb3BwZXJUZXN0KCkgOiBtRnJhbWVEcm9wcGVyKG5ldyBGcmFtZURyb3BwZXIoKSkgeworICAgICAgICBFWFBFQ1RfRVEoT0ssIG1GcmFtZURyb3BwZXItPnNldE1heEZyYW1lUmF0ZSgzMC4wKSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBSdW5UZXN0KGNvbnN0IFRlc3RGcmFtZSogZnJhbWVzLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgaW50IGppdHRlciA9IEdldEppdHRlcihpKTsKKyAgICAgICAgICAgIGludDY0X3QgdGVzdFRpbWVVcyA9IGZyYW1lc1tpXS50aW1lVXMgKyBqaXR0ZXI7CisgICAgICAgICAgICBwcmludGYoInRpbWUgJWxsZCwgdGVzdFRpbWUgJWxsZCwgaml0dGVyICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWZyYW1lc1tpXS50aW1lVXMsIChsb25nIGxvbmcpdGVzdFRpbWVVcywgaml0dGVyKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmcmFtZXNbaV0uc2hvdWxkRHJvcCwgbUZyYW1lRHJvcHBlci0+c2hvdWxkRHJvcCh0ZXN0VGltZVVzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxGcmFtZURyb3BwZXI+IG1GcmFtZURyb3BwZXI7Cit9OworCitURVNUX0YoRnJhbWVEcm9wcGVyVGVzdCwgVGVzdEludmFsaWRNYXhGcmFtZVJhdGUpIHsKKyAgICBFWFBFQ1RfTkUoT0ssIG1GcmFtZURyb3BwZXItPnNldE1heEZyYW1lUmF0ZSgtMS4wKSk7CisgICAgRVhQRUNUX05FKE9LLCBtRnJhbWVEcm9wcGVyLT5zZXRNYXhGcmFtZVJhdGUoMCkpOworfQorCitURVNUX0YoRnJhbWVEcm9wcGVyVGVzdCwgVGVzdDIwRnBzKSB7CisgICAgUnVuVGVzdCh0ZXN0RnJhbWVzMjBGcHMsIEFSUkFZX1NJWkUodGVzdEZyYW1lczIwRnBzKSk7Cit9CisKK1RFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0MzBGcHMpIHsKKyAgICBSdW5UZXN0KHRlc3RGcmFtZXMzMEZwcywgQVJSQVlfU0laRSh0ZXN0RnJhbWVzMzBGcHMpKTsKK30KKworVEVTVF9GKEZyYW1lRHJvcHBlclRlc3QsIFRlc3Q0MEZwcykgeworICAgIFJ1blRlc3QodGVzdEZyYW1lczQwRnBzLCBBUlJBWV9TSVpFKHRlc3RGcmFtZXM0MEZwcykpOworfQorCitURVNUX0YoRnJhbWVEcm9wcGVyVGVzdCwgVGVzdDYwRnBzKSB7CisgICAgUnVuVGVzdCh0ZXN0RnJhbWVzNjBGcHMsIEFSUkFZX1NJWkUodGVzdEZyYW1lczYwRnBzKSk7Cit9CisKK1RFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0VmFyaWFibGVGcHMpIHsKKyAgICBSdW5UZXN0KHRlc3RGcmFtZXNWYXJpYWJsZUZwcywgQVJSQVlfU0laRSh0ZXN0RnJhbWVzVmFyaWFibGVGcHMpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCmluZGV4IDY3ZmYxNDUuLjY0NGI2ZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKQEAgLTY0LDkgKzY0LDExIEBACiAgICAgcmV0dXJuIG1PTVggIT0gMCA/IE9LIDogTk9fSU5JVDsKIH0KIAotdm9pZCBIYXJuZXNzOjpvbk1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZykgewordm9pZCBIYXJuZXNzOjpvbk1lc3NhZ2VzKGNvbnN0IHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtTWVzc2FnZVF1ZXVlLnB1c2hfYmFjayhtc2cpOworICAgIGZvciAoc3RkOjpsaXN0PG9teF9tZXNzYWdlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtZXNzYWdlcy5jYmVnaW4oKTsgaXQgIT0gbWVzc2FnZXMuY2VuZCgpOyApIHsKKyAgICAgICAgbU1lc3NhZ2VRdWV1ZS5wdXNoX2JhY2soKml0KyspOworICAgIH0KICAgICBtTWVzc2FnZUFkZGVkQ29uZGl0aW9uLnNpZ25hbCgpOwogfQogCkBAIC0xOTMsNyArMTk1LDcgQEAKICAgICAgICAgQ0hFQ0soYnVmZmVyLm1NZW1vcnkgIT0gTlVMTCk7CiAKICAgICAgICAgZXJyID0gbU9NWC0+YWxsb2NhdGVCdWZmZXJXaXRoQmFja3VwKAotICAgICAgICAgICAgICAgIG5vZGUsIHBvcnRJbmRleCwgYnVmZmVyLm1NZW1vcnksICZidWZmZXIubUlEKTsKKyAgICAgICAgICAgICAgICBub2RlLCBwb3J0SW5kZXgsIGJ1ZmZlci5tTWVtb3J5LCAmYnVmZmVyLm1JRCwgYnVmZmVyLm1NZW1vcnktPnNpemUoKSk7CiAgICAgICAgIEVYUEVDVF9TVUNDRVNTKGVyciwgImFsbG9jYXRlQnVmZmVyIik7CiAKICAgICAgICAgYnVmZmVycy0+cHVzaChidWZmZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmgKaW5kZXggYmI4ZmQwYy4uMWViZjNhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5oCkBAIC03NCw3ICs3NCw3IEBACiAKICAgICBzdGF0dXNfdCB0ZXN0QWxsKCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpOworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VzKGNvbnN0IHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkhhcm5lc3MoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKaW5kZXggYTZiZDgyNC4uYTg2YWI3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKQEAgLTgyLDcgKzgyLDcgQEAKICAgICAgICAgc2l6ZV90IGluZGV4LAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgYm9vbCBpbmplY3RlZCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBZGRTdHJlYW0sIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBZGRTdHJlYW0sIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoInJ0cC1zb2NrZXQiLCBydHBTb2NrZXQpOwogICAgIG1zZy0+c2V0SW50MzIoInJ0Y3Atc29ja2V0IiwgcnRjcFNvY2tldCk7CiAgICAgbXNnLT5zZXRPYmplY3QoInNlc3Npb24tZGVzYyIsIHNlc3Npb25EZXNjKTsKQEAgLTkzLDcgKzkzLDcgQEAKIH0KIAogdm9pZCBBUlRQQ29ubmVjdGlvbjo6cmVtb3ZlU3RyZWFtKGludCBydHBTb2NrZXQsIGludCBydGNwU29ja2V0KSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbW92ZVN0cmVhbSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbW92ZVN0cmVhbSwgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigicnRwLXNvY2tldCIsIHJ0cFNvY2tldCk7CiAgICAgbXNnLT5zZXRJbnQzMigicnRjcC1zb2NrZXQiLCBydGNwU29ja2V0KTsKICAgICBtc2ctPnBvc3QoKTsKQEAgLTIzMyw3ICsyMzMsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxTdHJlYW1zLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbFN0cmVhbXMsIHRoaXMpOwogICAgIG1zZy0+cG9zdCgpOwogCiAgICAgbVBvbGxFdmVudFBlbmRpbmcgPSB0cnVlOwpAQCAtNjM5LDcgKzYzOSw3IEBACiB9CiAKIHZvaWQgQVJUUENvbm5lY3Rpb246OmluamVjdFBhY2tldChpbnQgaW5kZXgsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0SW5qZWN0UGFja2V0LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0SW5qZWN0UGFja2V0LCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJpbmRleCIsIGluZGV4KTsKICAgICBtc2ctPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKICAgICBtc2ctPnBvc3QoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5jcHAKaW5kZXggYmE0ZTMzYy4uZTVhY2IwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5jcHAKQEAgLTgyLDcgKzgyLDcgQEAKICAgICAgICAgaW5mby0+bVJUUFNvY2tldCA9IHJ0cFNvY2tldDsKICAgICAgICAgaW5mby0+bVJUQ1BTb2NrZXQgPSBydGNwU29ja2V0OwogCi0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBY2Nlc3NVbml0Q29tcGxldGUsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0QWNjZXNzVW5pdENvbXBsZXRlLCB0aGlzKTsKICAgICAgICAgbm90aWZ5LT5zZXRTaXplKCJ0cmFjay1pbmRleCIsIG1UcmFja3Muc2l6ZSgpIC0gMSk7CiAKICAgICAgICAgbVJUUENvbm4tPmFkZFN0cmVhbSgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCmluZGV4IGUxNjA3YmYuLjU2YzRhYTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcApAQCAtMTQ2LDcgKzE0Niw3IEBACiAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgfQogCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBtUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIG1SZWZsZWN0b3IpKS0+cG9zdCgpOwogCiAgICAgd2hpbGUgKCEobUZsYWdzICYga0ZsYWdTdGFydGVkKSkgewogICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgbVJlZmxlY3Rvci0+aWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIG1SZWZsZWN0b3IpKS0+cG9zdCgpOwogCiAgICAgd2hpbGUgKG1GbGFncyAmIGtGbGFnU3RhcnRlZCkgewogICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwpAQCAtMjEzLDggKzIxMyw4IEBACiAgICAgICAgICAgICAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlYWQsIG1SZWZsZWN0b3ItPmlkKCkpKS0+cG9zdCgpOwotICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFNlbmRTUiwgbVJlZmxlY3Rvci0+aWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVhZCwgbVJlZmxlY3RvcikpLT5wb3N0KCk7CisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U2VuZFNSLCBtUmVmbGVjdG9yKSktPnBvc3QoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmgKaW5kZXggZmRjOGQyMy4uYmU4YmMxMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmgKQEAgLTMyLDcgKzMyLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7Ci1zdHJ1Y3QgTWVkaWFCdWZmZXI7CitjbGFzcyBNZWRpYUJ1ZmZlcjsKIAogc3RydWN0IEFSVFBXcml0ZXIgOiBwdWJsaWMgTWVkaWFXcml0ZXIgewogICAgIEFSVFBXcml0ZXIoaW50IGZkKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAppbmRleCA2MGIzYWFmLi44NTVmZmRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCkBAIC02OCwyOCArNjgsMjggQEAKIH0KIAogdm9pZCBBUlRTUENvbm5lY3Rpb246OmNvbm5lY3QoY29uc3QgY2hhciAqdXJsLCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbm5lY3QsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25uZWN0LCB0aGlzKTsKICAgICBtc2ctPnNldFN0cmluZygidXJsIiwgdXJsKTsKICAgICBtc2ctPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIEFSVFNQQ29ubmVjdGlvbjo6ZGlzY29ubmVjdChjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERpc2Nvbm5lY3QsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREaXNjb25uZWN0LCB0aGlzKTsKICAgICBtc2ctPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIEFSVFNQQ29ubmVjdGlvbjo6c2VuZFJlcXVlc3QoCiAgICAgICAgIGNvbnN0IGNoYXIgKnJlcXVlc3QsIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZFJlcXVlc3QsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kUmVxdWVzdCwgdGhpcyk7CiAgICAgbXNnLT5zZXRTdHJpbmcoInJlcXVlc3QiLCByZXF1ZXN0KTsKICAgICBtc2ctPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIEFSVFNQQ29ubmVjdGlvbjo6b2JzZXJ2ZUJpbmFyeURhdGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPYnNlcnZlQmluYXJ5RGF0YSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9ic2VydmVCaW5hcnlEYXRhLCB0aGlzKTsKICAgICBtc2ctPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOwogICAgIG1zZy0+cG9zdCgpOwogfQpAQCAtMjg2LDcgKzI4Niw3IEBACiAKICAgICBpZiAoZXJyIDwgMCkgewogICAgICAgICBpZiAoZXJybm8gPT0gRUlOUFJPR1JFU1MpIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb21wbGV0ZUNvbm5lY3Rpb24sIGlkKCkpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbXBsZXRlQ29ubmVjdGlvbiwgdGhpcyk7CiAgICAgICAgICAgICBtc2ctPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiY29ubmVjdGlvbi1pZCIsIG1Db25uZWN0aW9uSUQpOwogICAgICAgICAgICAgbXNnLT5wb3N0KCk7CkBAIC01MjMsNyArNTIzLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWNlaXZlUmVzcG9uc2UsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWNlaXZlUmVzcG9uc2UsIHRoaXMpOwogICAgIG1zZy0+cG9zdCgpOwogCiAgICAgbVJlY2VpdmVSZXNwb25zZUV2ZW50UGVuZGluZyA9IHRydWU7CkBAIC03NDYsNyArNzQ2LDcgQEAKICAgICAgICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKICAgICAgICAgICAgIENIRUNLKHJlcGx5LT5maW5kU3RyaW5nKCJvcmlnaW5hbC1yZXF1ZXN0IiwgJnJlcXVlc3QpKTsKIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRSZXF1ZXN0LCBpZCgpKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kUmVxdWVzdCwgdGhpcyk7CiAgICAgICAgICAgICBtc2ctPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOwogICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoInJlcXVlc3QiLCByZXF1ZXN0LmNfc3RyKCksIHJlcXVlc3Quc2l6ZSgpKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rCmluZGV4IDlmZWRiNzEuLmM1ZThjMzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsKQEAgLTMxLDcgKzMxLDggQEAKICAgICBMT0NBTF9DRkxBR1MgKz0gLVduby1wc2FiaQogZW5kaWYKIAotTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoTE9DQUxfUEFUSCkvQW5kcm9pZC5tawogCkBAIC01NCw3ICs1NSw4IEBACiAJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCmluZGV4IDNiZjQ4OWIuLjBkMGJhZjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApAQCAtOTgsNiArOTgsNyBAQAogICAgIGVudW0gewogICAgICAgICBrV2hhdENvbm5lY3RlZCAgICAgICAgICAgICAgICAgID0gJ2Nvbm4nLAogICAgICAgICBrV2hhdERpc2Nvbm5lY3RlZCAgICAgICAgICAgICAgID0gJ2Rpc2MnLAorICAgICAgICBrV2hhdFNlZWtQYXVzZWQgICAgICAgICAgICAgICAgID0gJ3NwYXUnLAogICAgICAgICBrV2hhdFNlZWtEb25lICAgICAgICAgICAgICAgICAgID0gJ3Nkb24nLAogCiAgICAgICAgIGtXaGF0QWNjZXNzVW5pdCAgICAgICAgICAgICAgICAgPSAnYWNjVScsCkBAIC0xNjksMTAgKzE3MCwxMCBAQAogICAgICAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKG1Db25uKTsKICAgICAgICAgKDEgPyBtTmV0TG9vcGVyIDogbG9vcGVyKCkpLT5yZWdpc3RlckhhbmRsZXIobVJUUENvbm4pOwogCi0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2UoJ2JpbnknLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZSgnYmlueScsIHRoaXMpOwogICAgICAgICBtQ29ubi0+b2JzZXJ2ZUJpbmFyeURhdGEobm90aWZ5KTsKIAotICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Nvbm4nLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdjb25uJywgdGhpcyk7CiAgICAgICAgIG1Db25uLT5jb25uZWN0KG1PcmlnaW5hbFNlc3Npb25VUkwuY19zdHIoKSwgcmVwbHkpOwogICAgIH0KIApAQCAtMTgwLDEwICsxODEsMTAgQEAKICAgICAgICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcihtQ29ubik7CiAgICAgICAgICgxID8gbU5ldExvb3BlciA6IGxvb3BlcigpKS0+cmVnaXN0ZXJIYW5kbGVyKG1SVFBDb25uKTsKIAotICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKCdiaW55JywgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2UoJ2JpbnknLCB0aGlzKTsKICAgICAgICAgbUNvbm4tPm9ic2VydmVCaW5hcnlEYXRhKG5vdGlmeSk7CiAKLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZHBsJywgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnc2RwbCcsIHRoaXMpOwogICAgICAgICByZXBseS0+c2V0T2JqZWN0KCJkZXNjcmlwdGlvbiIsIGRlc2MpOwogICAgICAgICBtQ29ubi0+Y29ubmVjdChtT3JpZ2luYWxTZXNzaW9uVVJMLmNfc3RyKCksIHJlcGx5KTsKICAgICB9CkBAIC0yMTAsMjkgKzIxMSwzNSBAQAogICAgIH0KIAogICAgIHZvaWQgZGlzY29ubmVjdCgpIHsKLSAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWJvcicsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAobmV3IEFNZXNzYWdlKCdhYm9yJywgdGhpcykpLT5wb3N0KCk7CiAgICAgfQogCiAgICAgdm9pZCBzZWVrKGludDY0X3QgdGltZVVzKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoJ3NlZWsnLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgnc2VlaycsIHRoaXMpOwogICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lIiwgdGltZVVzKTsKICAgICAgICAgbVBhdXNlR2VuZXJhdGlvbisrOwogICAgICAgICBtc2ctPnBvc3QoKTsKICAgICB9CiAKKyAgICB2b2lkIGNvbnRpbnVlU2Vla0FmdGVyUGF1c2UoaW50NjRfdCB0aW1lVXMpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgnc2VlMScsIHRoaXMpOworICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lIiwgdGltZVVzKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorCiAgICAgYm9vbCBpc1NlZWthYmxlKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVNlZWthYmxlOwogICAgIH0KIAogICAgIHZvaWQgcGF1c2UoKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoJ3BhdXMnLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgncGF1cycsIHRoaXMpOwogICAgICAgICBtUGF1c2VHZW5lcmF0aW9uKys7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoInBhdXNlY2hlY2siLCBtUGF1c2VHZW5lcmF0aW9uKTsKICAgICAgICAgbXNnLT5wb3N0KGtQYXVzZURlbGF5VXMpOwogICAgIH0KIAogICAgIHZvaWQgcmVzdW1lKCkgewotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCdyZXN1JywgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoJ3Jlc3UnLCB0aGlzKTsKICAgICAgICAgbVBhdXNlR2VuZXJhdGlvbisrOwogICAgICAgICBtc2ctPnBvc3QoKTsKICAgICB9CkBAIC00NTQsMTAgKzQ2MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiQWNjZXB0OiBhcHBsaWNhdGlvbi9zZHBcclxuIik7CiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdkZXNjJywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnZGVzYycsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnZGlzYycsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdkaXNjJywgdGhpcykpLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDY4LDEwICs0NzUsMTAgQEAKIAogICAgICAgICAgICAgICAgIGludDMyX3QgcmVjb25uZWN0OwogICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigicmVjb25uZWN0IiwgJnJlY29ubmVjdCkgJiYgcmVjb25uZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnY29ubicsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Nvbm4nLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgbUNvbm4tPmNvbm5lY3QobU9yaWdpbmFsU2Vzc2lvblVSTC5jX3N0cigpLCByZXBseSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgdGhpcykpLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNTE0LDcgKzUyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koInJld3JpdHRlbiBzZXNzaW9uIHVybDogJyVzJyIsIG1TZXNzaW9uVVJMLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Nvbm4nLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnY29ubicsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm4tPmNvbm5lY3QobU9yaWdpbmFsU2Vzc2lvblVSTC5jX3N0cigpLCByZXBseSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTg2LDcgKzU5Myw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdkaXNjJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgIG1Db25uLT5kaXNjb25uZWN0KHJlcGx5KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02MzEsNyArNjM4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnZGlzYycsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgbUNvbm4tPmRpc2Nvbm5lY3QocmVwbHkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTY1MSw3ICs2NTgsNyBAQAogICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OwogICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7CiAKLSAgICAgICAgICAgICAgICBBTE9HSSgiU0VUVVAoJWQpIGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAlZCAoJXMpIiwKKyAgICAgICAgICAgICAgICBBTE9HSSgiU0VUVVAoJXp1KSBjb21wbGV0ZWQgd2l0aCByZXN1bHQgJWQgKCVzKSIsCiAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgcmVzdWx0LCBzdHJlcnJvcigtcmVzdWx0KSk7CiAKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7CkBAIC03MDMsNyArNzEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklELmVyYXNlKGksIG1TZXNzaW9uSUQuc2l6ZSgpIC0gaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2UoJ2FjY3UnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2UoJ2FjY3UnLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U2l6ZSgidHJhY2staW5kZXgiLCB0cmFja0luZGV4KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHJlc3BvbnNlLT5tSGVhZGVycy5pbmRleE9mS2V5KCJ0cmFuc3BvcnQiKTsKQEAgLTc2OSwxMCArNzc2LDEwIEBACiAKICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKIAotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3BsYXknLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdwbGF5JywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdkaXNjJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgIG1Db25uLT5kaXNjb25uZWN0KHJlcGx5KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC03OTcsNyArODA0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlUGxheVJlc3BvbnNlKHJlc3BvbnNlKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHRpbWVvdXQgPSBuZXcgQU1lc3NhZ2UoJ3Rpb3UnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiB0aW1lb3V0ID0gbmV3IEFNZXNzYWdlKCd0aW91JywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tUaW1lb3V0R2VuZXJhdGlvbisrOwogICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dC0+c2V0SW50MzIoInRpb3VjaGVjayIsIG1DaGVja1RpbWVvdXRHZW5lcmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQtPnBvc3Qoa1N0YXJ0dXBUaW1lb3V0VXMpOwpAQCAtODA1LDcgKzgxMiw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdkaXNjJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgIG1Db25uLT5kaXNjb25uZWN0KHJlcGx5KTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTgzMSw3ICs4MzgsNyBAQAogICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKIAotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnb3B0cycsIGlkKCkpOworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnb3B0cycsIHRoaXMpOwogICAgICAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1LZWVwQWxpdmVHZW5lcmF0aW9uKTsKICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC04OTQsNyArOTAxLDcgQEAKICAgICAgICAgICAgICAgICBtUGF1c2luZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIG1TZWVrYWJsZSA9IHRydWU7CiAKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3RlYXInLCBpZCgpKTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3RlYXInLCB0aGlzKTsKIAogICAgICAgICAgICAgICAgIGludDMyX3QgcmVjb25uZWN0OwogICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigicmVjb25uZWN0IiwgJnJlY29ubmVjdCkgJiYgcmVjb25uZWN0KSB7CkBAIC05MjYsNyArOTMzLDcgQEAKICAgICAgICAgICAgICAgICBBTE9HSSgiVEVBUkRPV04gY29tcGxldGVkIHdpdGggcmVzdWx0ICVkICglcykiLAogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBzdHJlcnJvcigtcmVzdWx0KSk7CiAKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCB0aGlzKTsKIAogICAgICAgICAgICAgICAgIGludDMyX3QgcmVjb25uZWN0OwogICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigicmVjb25uZWN0IiwgJnJlY29ubmVjdCkgJiYgcmVjb25uZWN0KSB7CkBAIC05NTgsNyArOTY1LDcgQEAKICAgICAgICAgICAgICAgICBpZiAobU51bUFjY2Vzc1VuaXRzUmVjZWl2ZWQgPT0gMCkgewogI2lmIDEKICAgICAgICAgICAgICAgICAgICAgQUxPR0koInN0cmVhbSBlbmRlZD8gYWJvcnRpbmcuIik7Ci0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ2Fib3InLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWJvcicsIHRoaXMpKS0+cG9zdCgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICNlbHNlCiAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJoYXZlbid0IHNlZW4gYW4gQVUgaW4gYSBsb29vbmcgdGltZS4iKTsKQEAgLTEwMTIsNyArMTAxOSw3IEBACiAKICAgICAgICAgICAgICAgICBpbnQzMl90IGVvczsKICAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImVvcyIsICZlb3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dJKCJyZWNlaXZlZCBCWUUgb24gdHJhY2sgaW5kZXggJWQiLCB0cmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koInJlY2VpdmVkIEJZRSBvbiB0cmFjayBpbmRleCAlenUiLCB0cmFja0luZGV4KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtQWxsVHJhY2tzSGF2ZVRpbWUgJiYgZGF0YVJlY2VpdmVkT25BbGxDaGFubmVscygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiTm8gdGltZSBlc3RhYmxpc2hlZCA9PiBmYWtlIGV4aXN0aW5nIGRhdGEiKTsKIApAQCAtMTA3Nyw3ICsxMDg0LDcgQEAKIAogICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3BhdTInLCBpZCgpKTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3BhdTInLCB0aGlzKTsKICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xMTE0LDcgKzExMjEsNyBAQAogCiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKIAotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncmVzMicsIGlkKCkpOworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncmVzMicsIHRoaXMpOwogICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTExNDMsNyArMTE1MCw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvc3QgbmV3IHRpbWVvdXQgaW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRvIHVzZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFrZSB0aW1lc3RhbXBzIGlmIG5vIG5ldyBTZW5kZXIgUmVwb3J0cyBhcnJpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiB0aW1lb3V0ID0gbmV3IEFNZXNzYWdlKCd0aW91JywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdGltZW91dCA9IG5ldyBBTWVzc2FnZSgndGlvdScsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrVGltZW91dEdlbmVyYXRpb24rKzsKICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQtPnNldEludDMyKCJ0aW91Y2hlY2siLCBtQ2hlY2tUaW1lb3V0R2VuZXJhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LT5wb3N0KGtTdGFydHVwVGltZW91dFVzKTsKQEAgLTExNTIsNyArMTE1OSw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJyZXN1bWUgZmFpbGVkLCBhYm9ydGluZy4iKTsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWJvcicsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhYm9yJywgdGhpcykpLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgbVBhdXNpbmcgPSBmYWxzZTsKQEAgLTExODAsNyArMTE4Nyw3IEBACiAgICAgICAgICAgICAgICAgbUNoZWNrUGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgKyttQ2hlY2tHZW5lcmF0aW9uOwogCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZWUxJywgaWQoKSk7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZWUwJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgcmVwbHktPnNldEludDY0KCJ0aW1lIiwgdGltZVVzKTsKIAogICAgICAgICAgICAgICAgIGlmIChtUGF1c2luZykgewpAQCAtMTIwMyw5ICsxMjEwLDI2IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNhc2UgJ3NlZTEnOgorICAgICAgICAgICAgY2FzZSAnc2VlMCc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gU2Vzc2lvbiBpcyBwYXVzZWQgbm93LgorICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmZXJyKTsKKworICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lIiwgJnRpbWVVcykpOworCisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFNlZWtQYXVzZWQpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQ2NCgidGltZSIsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAnc2VlMSc6CisgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CiAKQEAgLTEyMjEsNyArMTI0NSw3IEBACiAKICAgICAgICAgICAgICAgICAvLyBTdGFydCBuZXcgdGltZW91dGdlbmVyYXRpb24gdG8gYXZvaWQgZ2V0dGluZyB0aW1lb3V0CiAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIFBMQVkgcmVzcG9uc2UgYXJyaXZlCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHRpbWVvdXQgPSBuZXcgQU1lc3NhZ2UoJ3Rpb3UnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdGltZW91dCA9IG5ldyBBTWVzc2FnZSgndGlvdScsIHRoaXMpOwogICAgICAgICAgICAgICAgIG1DaGVja1RpbWVvdXRHZW5lcmF0aW9uKys7CiAgICAgICAgICAgICAgICAgdGltZW91dC0+c2V0SW50MzIoInRpb3VjaGVjayIsIG1DaGVja1RpbWVvdXRHZW5lcmF0aW9uKTsKICAgICAgICAgICAgICAgICB0aW1lb3V0LT5wb3N0KGtTdGFydHVwVGltZW91dFVzKTsKQEAgLTEyNDMsNyArMTI2Nyw3IEBACiAKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZWUyJywgaWQoKSk7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZWUyJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTI3Nyw3ICsxMzAxLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9zdCBuZXcgdGltZW91dCBpbiBvcmRlciB0byBtYWtlIHN1cmUgdG8gdXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWtlIHRpbWVzdGFtcHMgaWYgbm8gbmV3IFNlbmRlciBSZXBvcnRzIGFycml2ZQotICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHRpbWVvdXQgPSBuZXcgQU1lc3NhZ2UoJ3Rpb3UnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiB0aW1lb3V0ID0gbmV3IEFNZXNzYWdlKCd0aW91JywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tUaW1lb3V0R2VuZXJhdGlvbisrOwogICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dC0+c2V0SW50MzIoInRpb3VjaGVjayIsIG1DaGVja1RpbWVvdXRHZW5lcmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQtPnBvc3Qoa1N0YXJ0dXBUaW1lb3V0VXMpOwpAQCAtMTI5Myw3ICsxMzE3LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInNlZWsgZmFpbGVkLCBhYm9ydGluZy4iKTsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWJvcicsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhYm9yJywgdGhpcykpLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgbVBhdXNpbmcgPSBmYWxzZTsKQEAgLTEzNDMsMTIgKzEzNjcsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgbVRyeVRDUEludGVybGVhdmluZyA9IHRydWU7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoJ2Fib3InLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoJ2Fib3InLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInJlY29ubmVjdCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiTmV2ZXIgcmVjZWl2ZWQgYW55IGRhdGEsIGRpc2Nvbm5lY3RpbmcuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhYm9yJywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhYm9yJywgdGhpcykpLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoIW1BbGxUcmFja3NIYXZlVGltZSkgewpAQCAtMTM2OSw3ICsxMzkzLDcgQEAKICAgICB9CiAKICAgICB2b2lkIHBvc3RLZWVwQWxpdmUoKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoJ2FsaXYnLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgnYWxpdicsIHRoaXMpOwogICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUtlZXBBbGl2ZUdlbmVyYXRpb24pOwogICAgICAgICBtc2ctPnBvc3QoKG1LZWVwQWxpdmVUaW1lb3V0VXMgKiA5KSAvIDEwKTsKICAgICB9CkBAIC0xMzgwLDcgKzE0MDQsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgbUNoZWNrUGVuZGluZyA9IHRydWU7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBjaGVjayA9IG5ldyBBTWVzc2FnZSgnY2hlaycsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gY2hlY2sgPSBuZXcgQU1lc3NhZ2UoJ2NoZWsnLCB0aGlzKTsKICAgICAgICAgY2hlY2stPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNoZWNrR2VuZXJhdGlvbik7CiAgICAgICAgIGNoZWNrLT5wb3N0KGtBY2Nlc3NVbml0VGltZW91dFVzKTsKICAgICB9CkBAIC0xNTY0LDkgKzE1ODgsOSBAQAogICAgICAgICAgICAgbmV3IEFQYWNrZXRTb3VyY2UobVNlc3Npb25EZXNjLCBpbmRleCk7CiAKICAgICAgICAgaWYgKHNvdXJjZS0+aW5pdENoZWNrKCkgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dXKCJVbnN1cHBvcnRlZCBmb3JtYXQuIElnbm9yaW5nIHRyYWNrICMlZC4iLCBpbmRleCk7CisgICAgICAgICAgICBBTE9HVygiVW5zdXBwb3J0ZWQgZm9ybWF0LiBJZ25vcmluZyB0cmFjayAjJXp1LiIsIGluZGV4KTsKIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZXR1JywgaWQoKSk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3NldHUnLCB0aGlzKTsKICAgICAgICAgICAgIHJlcGx5LT5zZXRTaXplKCJpbmRleCIsIGluZGV4KTsKICAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVzdWx0IiwgRVJST1JfVU5TVVBQT1JURUQpOwogICAgICAgICAgICAgcmVwbHktPnBvc3QoKTsKQEAgLTE2MDYsNyArMTYzMCw3IEBACiAgICAgICAgIGluZm8tPm1UaW1lU2NhbGUgPSB0aW1lc2NhbGU7CiAgICAgICAgIGluZm8tPm1FT1NSZWNlaXZlZCA9IGZhbHNlOwogCi0gICAgICAgIEFMT0dWKCJ0cmFjayAjJWQgVVJMPSVzIiwgbVRyYWNrcy5zaXplKCksIHRyYWNrVVJMLmNfc3RyKCkpOworICAgICAgICBBTE9HVigidHJhY2sgIyV6dSBVUkw9JXMiLCBtVHJhY2tzLnNpemUoKSwgdHJhY2tVUkwuY19zdHIoKSk7CiAKICAgICAgICAgQVN0cmluZyByZXF1ZXN0ID0gIlNFVFVQICI7CiAgICAgICAgIHJlcXVlc3QuYXBwZW5kKHRyYWNrVVJMKTsKQEAgLTE2NTIsNyArMTY3Niw3IEBACiAKICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKIAotICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3NldHUnLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZXR1JywgdGhpcyk7CiAgICAgICAgIHJlcGx5LT5zZXRTaXplKCJpbmRleCIsIGluZGV4KTsKICAgICAgICAgcmVwbHktPnNldFNpemUoInRyYWNrLWluZGV4IiwgbVRyYWNrcy5zaXplKCkgLSAxKTsKICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwpAQCAtMTY3MywyMSArMTY5NywxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgc2l6ZV90IG4gPSBzdHJsZW4oYmFzZVVSTCk7Ci0gICAgICAgIGlmIChiYXNlVVJMW24gLSAxXSA9PSAnLycpIHsKLSAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7Ci0gICAgICAgICAgICBvdXQtPmFwcGVuZCh1cmwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uc3QgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7Ci0KLSAgICAgICAgICAgIGlmIChzbGFzaFBvcyA+ICZiYXNlVVJMWzZdKSB7Ci0gICAgICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMLCBzbGFzaFBvcyAtIGJhc2VVUkwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwpOwotICAgICAgICAgICAgfQotCisgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7CisgICAgICAgIGlmIChiYXNlVVJMW24gLSAxXSAhPSAnLycpIHsKICAgICAgICAgICAgIG91dC0+YXBwZW5kKCIvIik7Ci0gICAgICAgICAgICBvdXQtPmFwcGVuZCh1cmwpOwogICAgICAgICB9CisgICAgICAgIG91dC0+YXBwZW5kKHVybCk7CiAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMTczMSw4ICsxNzQ1LDggQEAKICAgICB9CiAKICAgICB2b2lkIG9uVGltZVVwZGF0ZShpbnQzMl90IHRyYWNrSW5kZXgsIHVpbnQzMl90IHJ0cFRpbWUsIHVpbnQ2NF90IG50cFRpbWUpIHsKLSAgICAgICAgQUxPR1YoIm9uVGltZVVwZGF0ZSB0cmFjayAlZCwgcnRwVGltZSA9IDB4JTA4eCwgbnRwVGltZSA9IDB4JTAxNmxseCIsCi0gICAgICAgICAgICAgdHJhY2tJbmRleCwgcnRwVGltZSwgbnRwVGltZSk7CisgICAgICAgIEFMT0dWKCJvblRpbWVVcGRhdGUgdHJhY2sgJWQsIHJ0cFRpbWUgPSAweCUwOHgsIG50cFRpbWUgPSAlIzAxNmxseCIsCisgICAgICAgICAgICAgdHJhY2tJbmRleCwgcnRwVGltZSwgKGxvbmcgbG9uZyludHBUaW1lKTsKIAogICAgICAgICBpbnQ2NF90IG50cFRpbWVVcyA9IChpbnQ2NF90KShudHBUaW1lICogMUU2IC8gKDFsbCA8PCAzMikpOwogCkBAIC0xNzQ3LDcgKzE3NjEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtQWxsVHJhY2tzSGF2ZVRpbWUpIHsKLSAgICAgICAgICAgIGJvb2wgYWxsVHJhY2tzSGF2ZVRpbWUgPSB0cnVlOworICAgICAgICAgICAgYm9vbCBhbGxUcmFja3NIYXZlVGltZSA9IChtVHJhY2tzLnNpemUoKSA+IDApOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICAgICAgVHJhY2tJbmZvICp0cmFjayA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CiAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tTlRQQW5jaG9yVXMgPCAwKSB7CkBAIC0xODUxLDggKzE4NjUsOCBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR1YoInRyYWNrICVkIHJ0cFRpbWU9JWQgbWVkaWFUaW1lVXMgPSAlbGxkIHVzICglLjJmIHNlY3MpIiwKLSAgICAgICAgICAgICB0cmFja0luZGV4LCBydHBUaW1lLCBtZWRpYVRpbWVVcywgbWVkaWFUaW1lVXMgLyAxRTYpOworICAgICAgICBBTE9HVigidHJhY2sgJWQgcnRwVGltZT0ldSBtZWRpYVRpbWVVcyA9ICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgIHRyYWNrSW5kZXgsIHJ0cFRpbWUsIChsb25nIGxvbmcpbWVkaWFUaW1lVXMsIG1lZGlhVGltZVVzIC8gMUU2KTsKIAogICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCBtZWRpYVRpbWVVcyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlUcmFuc21pdHRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeVRyYW5zbWl0dGVyLmgKaW5kZXggMDA5YTNiMS4uMzY5ZjI3NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeVRyYW5zbWl0dGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeVRyYW5zbWl0dGVyLmgKQEAgLTEwMCw3ICsxMDAsNyBAQAogICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CiAgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtQ29ubik7CiAKLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdjb25uJywgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnY29ubicsIHRoaXMpOwogICAgICAgICBtQ29ubi0+Y29ubmVjdChtU2VydmVyVVJMLmNfc3RyKCksIHJlcGx5KTsKIAogI2lmZGVmIEFORFJPSUQKQEAgLTIyOSw3ICsyMjksNyBAQAogICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogICAgICAgICByZXF1ZXN0LmFwcGVuZChzZHApOwogCi0gICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnYW5ubycsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Fubm8nLCB0aGlzKTsKICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwogICAgIH0KIApAQCAtMzUwLDcgKzM1MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQgPDwgIiAoIiA8PCBzdHJlcnJvcigtcmVzdWx0KSA8PCAiKSI7CiAKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIHRoaXMpKS0+cG9zdCgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTM4MSw3ICszODEsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UtPm1TdGF0dXNDb2RlID09IDQwMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdXRoVHlwZSAhPSBOT05FKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJGQUlMRUQgdG8gYXV0aGVudGljYXRlIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIHRoaXMpKS0+cG9zdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0zOTEsMTQgKzM5MSwxNCBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0sgfHwgcmVzcG9uc2UtPm1TdGF0dXNDb2RlICE9IDIwMCkgewotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCB0aGlzKSktPnBvc3QoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgdW5zaWduZWQgcnRwUG9ydDsKICAgICAgICAgICAgICAgICBBUlRQQ29ubmVjdGlvbjo6TWFrZVBvcnRQYWlyKCZtUlRQU29ja2V0LCAmbVJUQ1BTb2NrZXQsICZydHBQb3J0KTsKIAotICAgICAgICAgICAgICAgIC8vIChuZXcgQU1lc3NhZ2UoJ3BvbGwnLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAvLyAobmV3IEFNZXNzYWdlKCdwb2xsJywgdGhpcykpLT5wb3N0KCk7CiAKICAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlNFVFVQICIpOwpAQCAtNDE0LDcgKzQxNCw3IEBACiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIjttb2RlPXJlY29yZFxyXG4iKTsKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZXR1JywgaWQoKSk7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZXR1JywgdGhpcyk7CiAgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDY4LDcgKzQ2OCw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSyB8fCByZXNwb25zZS0+bVN0YXR1c0NvZGUgIT0gMjAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIHRoaXMpKS0+cG9zdCgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTUzNSw3ICs1MzUsNyBAQAogICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKIAotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncmVjbycsIGlkKCkpOworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncmVjbycsIHRoaXMpOwogICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTU1OCwxMyArNTU4LDEzIEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCB0aGlzKSktPnBvc3QoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnbW9yZScsIGlkKCkpKS0+cG9zdCgpOwotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3NyICAnLCBpZCgpKSktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhbGl2JywgaWQoKSkpLT5wb3N0KDMwMDAwMDAwbGwpOworICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ21vcmUnLCB0aGlzKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdzciAgJywgdGhpcykpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWxpdicsIHRoaXMpKS0+cG9zdCgzMDAwMDAwMGxsKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtNTg2LDcgKzU4Niw3IEBACiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdvcHRzJywgaWQoKSk7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdvcHRzJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNjAzLDcgKzYwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ2FsaXYnLCBpZCgpKSktPnBvc3QoMzAwMDAwMDBsbCk7CisgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWxpdicsIHRoaXMpKS0+cG9zdCgzMDAwMDAwMGxsKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtNzAyLDcgKzcwMiw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdwYXVzJywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncGF1cycsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzUzLDcgKzc1Myw3IEBACiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCd0ZWFyJywgaWQoKSk7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCd0ZWFyJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNzc1LDcgKzc3NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3BvbnNlICE9IE5VTEwpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgdGhpcykpLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTc4NCwxNCArNzg0LDE0IEBACiAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJkaXNjb25uZWN0IGNvbXBsZXRlZCI7CiAKICAgICAgICAgICAgICAgICBtQ29ubmVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCB0aGlzKSktPnBvc3QoKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY2FzZSAncXVpdCc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm4tPmRpc2Nvbm5lY3QobmV3IEFNZXNzYWdlKCdkaXNjJywgaWQoKSkpOworICAgICAgICAgICAgICAgICAgICBtQ29ubi0+ZGlzY29ubmVjdChuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCB0aGlzKSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCmluZGV4IGEyNGViNjkuLjBmNDZjODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKQEAgLTUxLDcgKzUxLDcgQEAKIHZvaWQgU0RQTG9hZGVyOjpsb2FkKGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBtTmV0TG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0TG9hZCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdExvYWQsIHRoaXMpOwogICAgIG1zZy0+c2V0U3RyaW5nKCJ1cmwiLCB1cmwpOwogCiAgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9VRFBQdXNoZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9VRFBQdXNoZXIuY3BwCmluZGV4IDQ3ZWE2ZjEuLjVjNjg1YTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVURQUHVzaGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5jcHAKQEAgLTY1LDcgKzY1LDcgQEAKICAgICBtRmlyc3RUaW1lTXMgPSBmcm9tbGVsKHRpbWVNcyk7CiAgICAgbUZpcnN0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKIAotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQdXNoLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UHVzaCwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIGJvb2wgVURQUHVzaGVyOjpvblB1c2goKSB7CkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICB0aW1lTXMgLT0gbUZpcnN0VGltZU1zOwogICAgIGludDY0X3Qgd2hlblVzID0gbUZpcnN0VGltZVVzICsgdGltZU1zICogMTAwMGxsOwogICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQdXNoLCBpZCgpKSktPnBvc3Qod2hlblVzIC0gbm93VXMpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQdXNoLCB0aGlzKSktPnBvc3Qod2hlblVzIC0gbm93VXMpOwogCiAgICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5tawppbmRleCA4ZDZmZjViLi4xMTFlNmM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTMxLDYgKzMxLDkgQEAKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorCiBMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCiAKIGluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKQEAgLTYwLDYgKzYzLDM5IEBACiAJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKKworaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoTE9DQUxfUEFUSCkvQW5kcm9pZC5taworCitMT0NBTF9NT0RVTEUgOj0gTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNfdGVzdAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCU1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QuY3BwIFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGlibWVkaWEgXAorCWxpYnN0YWdlZnJpZ2h0IFwKKwlsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKKwlsaWJzdGFnZWZyaWdodF9vbXggXAorCWxpYnV0aWxzIFwKKwlsaWJsb2cKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCisJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKwlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAorCitMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCisKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCisKIGluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKIAogIyBJbmNsdWRlIHN1YmRpcmVjdG9yeSBtYWtlZmlsZXMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuaAppbmRleCAxY2JlYTFiLi5jZDRkMGVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9EdW1teVJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRHVtbXlSZWNvcmRlci5oCkBAIC0yNCw3ICsyNCw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgTWVkaWFTb3VyY2U7CitzdHJ1Y3QgTWVkaWFTb3VyY2U7CiBjbGFzcyBNZWRpYUJ1ZmZlcjsKIAogY2xhc3MgRHVtbXlSZWNvcmRlciB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlc190ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNTQ3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlc190ZXN0LmNwcApAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNfdGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJNZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oIgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgY2hhciBrVGVzdE92ZXJyaWRlc1N0cltdID0KKyI8TWVkaWFDb2RlY3M+XG4iCisiICAgIDxTZXR0aW5ncz5cbiIKKyIgICAgICAgIDxTZXR0aW5nIG5hbWU9XCJzdXBwb3J0cy1tdWx0aXBsZS1zZWN1cmUtY29kZWNzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4iCisiICAgICAgICA8U2V0dGluZyBuYW1lPVwic3VwcG9ydHMtc2VjdXJlLXdpdGgtbm9uLXNlY3VyZS1jb2RlY1wiIHZhbHVlPVwidHJ1ZVwiIC8+XG4iCisiICAgIDwvU2V0dGluZ3M+XG4iCisiICAgIDxFbmNvZGVycz5cbiIKKyIgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9XCJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2Y1wiIHR5cGU9XCJ2aWRlby9hdmNcIiB1cGRhdGU9XCJ0cnVlXCIgPlxuIgorIiAgICAgICAgICAgIDxMaW1pdCBuYW1lPVwibWF4LXN1cHBvcnRlZC1pbnN0YW5jZXNcIiB2YWx1ZT1cIjRcIiAvPlxuIgorIiAgICAgICAgPC9NZWRpYUNvZGVjPlxuIgorIiAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT1cIk9NWC5xY29tLnZpZGVvLmVuY29kZXIubXBlZzRcIiB0eXBlPVwidmlkZW8vbXA0di1lc1wiIHVwZGF0ZT1cInRydWVcIiA+XG4iCisiICAgICAgICAgICAgPExpbWl0IG5hbWU9XCJtYXgtc3VwcG9ydGVkLWluc3RhbmNlc1wiIHZhbHVlPVwiNFwiIC8+XG4iCisiICAgICAgICA8L01lZGlhQ29kZWM+XG4iCisiICAgIDwvRW5jb2RlcnM+XG4iCisiICAgIDxEZWNvZGVycz5cbiIKKyIgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9XCJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2Yy5zZWN1cmVcIiB0eXBlPVwidmlkZW8vYXZjXCIgdXBkYXRlPVwidHJ1ZVwiID5cbiIKKyIgICAgICAgICAgICA8TGltaXQgbmFtZT1cIm1heC1zdXBwb3J0ZWQtaW5zdGFuY2VzXCIgdmFsdWU9XCIxXCIgLz5cbiIKKyIgICAgICAgIDwvTWVkaWFDb2RlYz5cbiIKKyIgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9XCJPTVgucWNvbS52aWRlby5kZWNvZGVyLmgyNjNcIiB0eXBlPVwidmlkZW8vM2dwcFwiIHVwZGF0ZT1cInRydWVcIiA+XG4iCisiICAgICAgICAgICAgPExpbWl0IG5hbWU9XCJtYXgtc3VwcG9ydGVkLWluc3RhbmNlc1wiIHZhbHVlPVwiNFwiIC8+XG4iCisiICAgICAgICA8L01lZGlhQ29kZWM+XG4iCisiICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPVwiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnMlwiIHR5cGU9XCJ2aWRlby9tcGVnMlwiIHVwZGF0ZT1cInRydWVcIiA+XG4iCisiICAgICAgICAgICAgPExpbWl0IG5hbWU9XCJtYXgtc3VwcG9ydGVkLWluc3RhbmNlc1wiIHZhbHVlPVwiM1wiIC8+XG4iCisiICAgICAgICA8L01lZGlhQ29kZWM+XG4iCisiICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPVwiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnNFwiIHR5cGU9XCJ2aWRlby9tcDR2LWVzXCIgdXBkYXRlPVwidHJ1ZVwiID5cbiIKKyIgICAgICAgICAgICA8TGltaXQgbmFtZT1cIm1heC1zdXBwb3J0ZWQtaW5zdGFuY2VzXCIgdmFsdWU9XCIzXCIgLz5cbiIKKyIgICAgICAgIDwvTWVkaWFDb2RlYz5cbiIKKyIgICAgPC9EZWNvZGVycz5cbiIKKyI8L01lZGlhQ29kZWNzPlxuIjsKKworY2xhc3MgTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNUZXN0KCkge30KKworICAgIHZvaWQgYWRkTWF4SW5zdGFuY2VzU2V0dGluZygKKyAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJmtleSwKKyAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJnZhbHVlLAorICAgICAgICAgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4gKnJlc3VsdHMpIHsKKyAgICAgICAgQ29kZWNTZXR0aW5ncyBzZXR0aW5nczsKKyAgICAgICAgc2V0dGluZ3MuYWRkKCJtYXgtc3VwcG9ydGVkLWluc3RhbmNlcyIsIHZhbHVlKTsKKyAgICAgICAgcmVzdWx0cy0+YWRkKGtleSwgc2V0dGluZ3MpOworICAgIH0KKworICAgIHZvaWQgdmVyaWZ5UHJvZmlsZVJlc3VsdHMoY29uc3QgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4gJnJlc3VsdHMpIHsKKyAgICAgICAgRVhQRUNUX0xUKDB1LCByZXN1bHRzLnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgQVN0cmluZyBrZXkgPSByZXN1bHRzLmtleUF0KGkpOworICAgICAgICAgICAgQ29kZWNTZXR0aW5ncyBzZXR0aW5ncyA9IHJlc3VsdHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgc2V0dGluZ3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHNldHRpbmdzLmtleUF0KDApID09ICJtYXgtc3VwcG9ydGVkLWluc3RhbmNlcyIpOworICAgICAgICAgICAgQVN0cmluZyB2YWx1ZVMgPSBzZXR0aW5ncy52YWx1ZUF0KDApOworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSA9IHN0cnRvbCh2YWx1ZVMuY19zdHIoKSwgTlVMTCwgMTApOworICAgICAgICAgICAgRVhQRUNUX0xUKDAsIHZhbHVlKTsKKyAgICAgICAgICAgIEFMT0dWKCJwcm9maWxlQ29kZWNzIHJlc3VsdHMgJXMgJXMiLCBrZXkuY19zdHIoKSwgdmFsdWVTLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBleHBvcnRUZXN0UmVzdWx0c1RvWE1MKGNvbnN0IGNoYXIgKmZpbGVOYW1lKSB7CisgICAgICAgIENvZGVjU2V0dGluZ3MgZ1I7CisgICAgICAgIGdSLmFkZCgic3VwcG9ydHMtbXVsdGlwbGUtc2VjdXJlLWNvZGVjcyIsICJmYWxzZSIpOworICAgICAgICBnUi5hZGQoInN1cHBvcnRzLXNlY3VyZS13aXRoLW5vbi1zZWN1cmUtY29kZWMiLCAidHJ1ZSIpOworICAgICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiBlUjsKKyAgICAgICAgYWRkTWF4SW5zdGFuY2VzU2V0dGluZygiT01YLnFjb20udmlkZW8uZW5jb2Rlci5hdmMgdmlkZW8vYXZjIiwgIjQiLCAmZVIpOworICAgICAgICBhZGRNYXhJbnN0YW5jZXNTZXR0aW5nKCJPTVgucWNvbS52aWRlby5lbmNvZGVyLm1wZWc0IHZpZGVvL21wNHYtZXMiLCAiNCIsICZlUik7CisgICAgICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+IGRSOworICAgICAgICBhZGRNYXhJbnN0YW5jZXNTZXR0aW5nKCJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2Yy5zZWN1cmUgdmlkZW8vYXZjIiwgIjEiLCAmZFIpOworICAgICAgICBhZGRNYXhJbnN0YW5jZXNTZXR0aW5nKCJPTVgucWNvbS52aWRlby5kZWNvZGVyLmgyNjMgdmlkZW8vM2dwcCIsICI0IiwgJmRSKTsKKyAgICAgICAgYWRkTWF4SW5zdGFuY2VzU2V0dGluZygiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnMiB2aWRlby9tcGVnMiIsICIzIiwgJmRSKTsKKyAgICAgICAgYWRkTWF4SW5zdGFuY2VzU2V0dGluZygiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnNCB2aWRlby9tcDR2LWVzIiwgIjMiLCAmZFIpOworCisgICAgICAgIGV4cG9ydFJlc3VsdHNUb1hNTChmaWxlTmFtZSwgZ1IsIGVSLCBkUik7CisgICAgfQorfTsKKworVEVTVF9GKE1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzVGVzdCwgc3BsaXRTdHJpbmcpIHsKKyAgICBBU3RyaW5nIHMgPSAiYWJjMTIzIjsKKyAgICBBU3RyaW5nIGRlbGltaXRlciA9ICIgIjsKKyAgICBBU3RyaW5nIHMxOworICAgIEFTdHJpbmcgczI7CisgICAgRVhQRUNUX0ZBTFNFKHNwbGl0U3RyaW5nKHMsIGRlbGltaXRlciwgJnMxLCAmczIpKTsKKyAgICBzID0gImFiYyAxMjMiOworICAgIEVYUEVDVF9UUlVFKHNwbGl0U3RyaW5nKHMsIGRlbGltaXRlciwgJnMxLCAmczIpKTsKKyAgICBFWFBFQ1RfVFJVRShzMSA9PSAiYWJjIik7CisgICAgRVhQRUNUX1RSVUUoczIgPT0gIjEyMyIpOworfQorCisvLyBUT0RPOiB0aGUgY29kZWMgY29tcG9uZW50IG5ldmVyIHJldHVybnMgT01YX0V2ZW50Q21kQ29tcGxldGUgaW4gdW5pdCB0ZXN0LgorVEVTVF9GKE1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzVGVzdCwgRElTQUJMRURfcHJvZmlsZUNvZGVjcykgeworICAgIHNwPElNZWRpYUNvZGVjTGlzdD4gbGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOworICAgIFZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+IGluZm9zOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdC0+Y291bnRDb2RlY3MoKTsgKytpKSB7CisgICAgICAgIGluZm9zLnB1c2hfYmFjayhsaXN0LT5nZXRDb2RlY0luZm8oaSkpOworICAgIH0KKyAgICBDb2RlY1NldHRpbmdzIGdsb2JhbF9yZXN1bHRzOworICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+IGVuY29kZXJfcmVzdWx0czsKKyAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiBkZWNvZGVyX3Jlc3VsdHM7CisgICAgcHJvZmlsZUNvZGVjcygKKyAgICAgICAgICAgIGluZm9zLCAmZ2xvYmFsX3Jlc3VsdHMsICZlbmNvZGVyX3Jlc3VsdHMsICZkZWNvZGVyX3Jlc3VsdHMsIHRydWUgLyogZm9yY2VUb01lYXN1cmUgKi8pOworICAgIHZlcmlmeVByb2ZpbGVSZXN1bHRzKGVuY29kZXJfcmVzdWx0cyk7CisgICAgdmVyaWZ5UHJvZmlsZVJlc3VsdHMoZGVjb2Rlcl9yZXN1bHRzKTsKK30KKworVEVTVF9GKE1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzVGVzdCwgZXhwb3J0VGVzdFJlc3VsdHNUb1hNTCkgeworICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lID0gIi9zZGNhcmQvbWVkaWFjb2RlY19saXN0X292ZXJyaWRlc190ZXN0LnhtbCI7CisgICAgcmVtb3ZlKGZpbGVOYW1lKTsKKworICAgIGV4cG9ydFRlc3RSZXN1bHRzVG9YTUwoZmlsZU5hbWUpOworCisgICAgLy8gdmVyaWZ5CisgICAgQVN0cmluZyBvdmVycmlkZXM7CisgICAgRklMRSAqZiA9IGZvcGVuKGZpbGVOYW1lLCAicmIiKTsKKyAgICBBU1NFUlRfVFJVRShmICE9IE5VTEwpOworICAgIGZzZWVrKGYsIDAsIFNFRUtfRU5EKTsKKyAgICBsb25nIHNpemUgPSBmdGVsbChmKTsKKyAgICByZXdpbmQoZik7CisKKyAgICBjaGFyICpidWYgPSAoY2hhciAqKW1hbGxvYyhzaXplKTsKKyAgICBFWFBFQ1RfRVEoKHNpemVfdCkxLCBmcmVhZChidWYsIHNpemUsIDEsIGYpKTsKKyAgICBvdmVycmlkZXMuc2V0VG8oYnVmLCBzaXplKTsKKyAgICBmY2xvc2UoZik7CisgICAgZnJlZShidWYpOworCisgICAgQVN0cmluZyBleHBlY3RlZDsKKyAgICBleHBlY3RlZC5hcHBlbmQoZ2V0UHJvZmlsaW5nVmVyc2lvblN0cmluZygpKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoIlxuIik7CisgICAgZXhwZWN0ZWQuYXBwZW5kKGtUZXN0T3ZlcnJpZGVzU3RyKTsKKyAgICBFWFBFQ1RfVFJVRShvdmVycmlkZXMgPT0gZXhwZWN0ZWQpOworCisgICAgcmVtb3ZlKGZpbGVOYW1lKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwCmluZGV4IGZkODg5ZjkuLjM4NjBlOWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1N1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTQ2Niw3ICs0NjcsNyBAQAogLy8gU2V0IHVwIHRoZSBNZWRpYVJlY29yZGVyIHdoaWNoIHJ1bnMgaW4gdGhlIHNhbWUgcHJvY2VzcyBhcyBtZWRpYXNlcnZlcgogc3A8TWVkaWFSZWNvcmRlcj4gU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0OjpzZXRVcE1lZGlhUmVjb3JkZXIoaW50IGZkLCBpbnQgdmlkZW9Tb3VyY2UsCiAgICAgICAgIGludCBvdXRwdXRGb3JtYXQsIGludCB2aWRlb0VuY29kZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZwcykgewotICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gbmV3IE1lZGlhUmVjb3JkZXIoKTsKKyAgICBzcDxNZWRpYVJlY29yZGVyPiBtciA9IG5ldyBNZWRpYVJlY29yZGVyKFN0cmluZzE2KCkpOwogICAgIG1yLT5zZXRWaWRlb1NvdXJjZSh2aWRlb1NvdXJjZSk7CiAgICAgbXItPnNldE91dHB1dEZvcm1hdChvdXRwdXRGb3JtYXQpOwogICAgIG1yLT5zZXRWaWRlb0VuY29kZXIodmlkZW9FbmNvZGVyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1V0aWxzX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvVXRpbHNfdGVzdC5jcHAKaW5kZXggYzFlNjYzYy4uZDczNjUwMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvVXRpbHNfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvVXRpbHNfdGVzdC5jcHAKQEAgLTEwOSwyMSArMTA5LDIxIEBACiAKIFRFU1RfRihVdGlsc1Rlc3QsIFRlc3REZWJ1ZykgewogI2RlZmluZSBMVkwoeCkgKEFEZWJ1Zzo6TGV2ZWwpKHgpCi0gICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0RGVidWdMZXZlbEZyb21TdHJpbmcoInZpZGVvIiwgIiIsIExWTCg1KSksIExWTCg1KSk7Ci0gICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0RGVidWdMZXZlbEZyb21TdHJpbmcoInZpZGVvIiwgIiAgIFx0ICBcbiAiLCBMVkwoMikpLCBMVkwoMikpOwotICAgIEFTU0VSVF9FUShBRGVidWc6OkdldERlYnVnTGV2ZWxGcm9tU3RyaW5nKCJ2aWRlbyIsICIzIiwgTFZMKDUpKSwgTFZMKDMpKTsKLSAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXREZWJ1Z0xldmVsRnJvbVN0cmluZygidmlkZW8iLCAiMzoqZGVvIiwgTFZMKDUpKSwgTFZMKDMpKTsKLSAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXREZWJ1Z0xldmVsRnJvbVN0cmluZygKKyAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXRMZXZlbEZyb21TZXR0aW5nc1N0cmluZygidmlkZW8iLCAiIiwgTFZMKDUpKSwgTFZMKDUpKTsKKyAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXRMZXZlbEZyb21TZXR0aW5nc1N0cmluZygidmlkZW8iLCAiICAgXHQgIFxuICIsIExWTCgyKSksIExWTCgyKSk7CisgICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0TGV2ZWxGcm9tU2V0dGluZ3NTdHJpbmcoInZpZGVvIiwgIjMiLCBMVkwoNSkpLCBMVkwoMykpOworICAgIEFTU0VSVF9FUShBRGVidWc6OkdldExldmVsRnJvbVNldHRpbmdzU3RyaW5nKCJ2aWRlbyIsICIzOipkZW8iLCBMVkwoNSkpLCBMVkwoMykpOworICAgIEFTU0VSVF9FUShBRGVidWc6OkdldExldmVsRnJvbVNldHRpbmdzU3RyaW5nKAogICAgICAgICAgICAgInZpZGVvIiwgIlx0XG4gMyBcdFxuOlx0XG4gdmlkZW8gXHRcbiIsIExWTCg1KSksIExWTCgzKSk7Ci0gICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0RGVidWdMZXZlbEZyb21TdHJpbmcoInZpZGVvIiwgIjM6KmRlbywyOnZpZCoiLCBMVkwoNSkpLCBMVkwoMikpOwotICAgIEFTU0VSVF9FUShBRGVidWc6OkdldERlYnVnTGV2ZWxGcm9tU3RyaW5nKAorICAgIEFTU0VSVF9FUShBRGVidWc6OkdldExldmVsRnJvbVNldHRpbmdzU3RyaW5nKCJ2aWRlbyIsICIzOipkZW8sMjp2aWQqIiwgTFZMKDUpKSwgTFZMKDIpKTsKKyAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXRMZXZlbEZyb21TZXR0aW5nc1N0cmluZygKICAgICAgICAgICAgICJhdmlkZW8iLCAiXHRcbiAzIFx0XG46XHRcbiBhdmlkZW8gXHRcbixcdFxuIDIgXHRcbjpcdFxuIHZpZGVvIFx0XG4iLCBMVkwoNSkpLCBMVkwoMykpOwotICAgIEFTU0VSVF9FUShBRGVidWc6OkdldERlYnVnTGV2ZWxGcm9tU3RyaW5nKAorICAgIEFTU0VSVF9FUShBRGVidWc6OkdldExldmVsRnJvbVNldHRpbmdzU3RyaW5nKAogICAgICAgICAgICAgImF1ZGlvLm9teCIsICI0OipvbXgsMzoqZCpvKiwyOmF1ZGlvKiIsIExWTCg1KSksIExWTCgyKSk7Ci0gICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0RGVidWdMZXZlbEZyb21TdHJpbmcoCisgICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0TGV2ZWxGcm9tU2V0dGluZ3NTdHJpbmcoCiAgICAgICAgICAgICAidmlkZW8ub214IiwgIjQ6Km9teCwzOipkKm8qLDI6YXVkaW8qIiwgTFZMKDUpKSwgTFZMKDMpKTsKLSAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXREZWJ1Z0xldmVsRnJvbVN0cmluZygidmlkZW8iLCAiNDoqb214LDM6KmQqbyosMjphdWRpbyoiLCBMVkwoNSkpLCBMVkwoMykpOwotICAgIEFTU0VSVF9FUShBRGVidWc6OkdldERlYnVnTGV2ZWxGcm9tU3RyaW5nKCJvbXgiLCAiNDoqb214LDM6KmQqbyosMjphdWRpbyoiLCBMVkwoNSkpLCBMVkwoNCkpOworICAgIEFTU0VSVF9FUShBRGVidWc6OkdldExldmVsRnJvbVNldHRpbmdzU3RyaW5nKCJ2aWRlbyIsICI0OipvbXgsMzoqZCpvKiwyOmF1ZGlvKiIsIExWTCg1KSksIExWTCgzKSk7CisgICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0TGV2ZWxGcm9tU2V0dGluZ3NTdHJpbmcoIm9teCIsICI0OipvbXgsMzoqZCpvKiwyOmF1ZGlvKiIsIExWTCg1KSksIExWTCg0KSk7CiAjdW5kZWYgTFZMCiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQubWsKaW5kZXggNmE4YjlmYy4uNThmYjEyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQubWsKQEAgLTksNyArOSw4IEBACiAgICAgICAgIFRpbWVkVGV4dFNSVFNvdXJjZS5jcHAgICAgXAogICAgICAgICBUaW1lZFRleHRQbGF5ZXIuY3BwCiAKLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3RpbWVkdGV4dCBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuY3BwCmluZGV4IGEwNzA0ODcuLmFlY2Y2NjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuY3BwCkBAIC01NiwyNSArNTYsMjUgQEAKIH0KIAogdm9pZCBUaW1lZFRleHRQbGF5ZXI6OnN0YXJ0KCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBUaW1lZFRleHRQbGF5ZXI6OnBhdXNlKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBUaW1lZFRleHRQbGF5ZXI6OnJlc3VtZSgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBUaW1lZFRleHRQbGF5ZXI6OnNlZWtUb0FzeW5jKGludDY0X3QgdGltZVVzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCB0aGlzKTsKICAgICBtc2ctPnNldEludDY0KCJzZWVrVGltZVVzIiwgdGltZVVzKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIAogdm9pZCBUaW1lZFRleHRQbGF5ZXI6OnNldERhdGFTb3VyY2Uoc3A8VGltZWRUZXh0U291cmNlPiBzb3VyY2UpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0U291cmNlLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0U291cmNlLCB0aGlzKTsKICAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgc291cmNlKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KQEAgLTIzMSw3ICsyMzEsNyBAQAogICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoJnN0YXJ0VGltZVVzLCAmZW5kVGltZVVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwYXJjZWxFdmVudC0+cGFyY2VsKSwgb3B0aW9ucyk7CiAgICAgaWYgKGVyciA9PSBXT1VMRF9CTE9DSykgewotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmV0cnlSZWFkLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJldHJ5UmVhZCwgdGhpcyk7CiAgICAgICAgIGlmIChvcHRpb25zICE9IE5VTEwpIHsKICAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IGtJbnZhbGlkVGltZVVzOwogICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZSA9CkBAIC0yNTksNyArMjU5LDcgQEAKIAogdm9pZCBUaW1lZFRleHRQbGF5ZXI6OnBvc3RUZXh0RXZlbnQoY29uc3Qgc3A8UGFyY2VsRXZlbnQ+JiBwYXJjZWwsIGludDY0X3QgdGltZVVzKSB7CiAgICAgaW50NjRfdCBkZWxheVVzID0gZGVsYXlVc0Zyb21DdXJyZW50VGltZSh0aW1lVXMpOwotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kU3VidGl0bGUsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kU3VidGl0bGUsIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtU2VuZFN1YnRpdGxlR2VuZXJhdGlvbik7CiAgICAgaWYgKHBhcmNlbCAhPSBOVUxMKSB7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KCJzdWJ0aXRsZSIsIHBhcmNlbCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5tawppbmRleCA5YTlmZGUyLi5lMGUwZTBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQubWsKQEAgLTI2LDQgKzI2LDcgQEAKICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKICAgICBsaWJ1dGlscwogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorCiBpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRTUlRTb3VyY2VfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRTUlRTb3VyY2VfdGVzdC5jcHAKaW5kZXggM2EwNmQ2MS4uMjExZTczMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0U1JUU291cmNlX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFNSVFNvdXJjZV90ZXN0LmNwcApAQCAtNjMsMTAgKzYzLDEwIEBACiAgICAgfQogCiAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgaWYgKG9mZnNldCA+PSBtU2l6ZSkgcmV0dXJuIDA7CisgICAgICAgIGlmICgoc2l6ZV90KW9mZnNldCA+PSBtU2l6ZSkgcmV0dXJuIDA7CiAKICAgICAgICAgc3NpemVfdCBhdmFpbCA9IG1TaXplIC0gb2Zmc2V0OwotICAgICAgICBpZiAoYXZhaWwgPiBzaXplKSB7CisgICAgICAgIGlmICgoc2l6ZV90KWF2YWlsID4gc2l6ZSkgewogICAgICAgICAgICAgYXZhaWwgPSBzaXplOwogICAgICAgICB9CiAgICAgICAgIG1lbWNweShkYXRhLCBtRGF0YSArIG9mZnNldCwgYXZhaWwpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLm1rCmluZGV4IDcwODE0NjMuLmJjNTNjNTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQubWsKQEAgLTEsOCArMSwxMCBAQAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotTE9DQUxfQ1BQRkxBR1MgKz0gLURfX1NURElOVF9MSU1JVFMgXAotICAgICAgICAgICAgICAgICAgLVdlcnJvcgorTE9DQUxfQ1BQRkxBR1MgKz0gLURfX1NURElOVF9MSU1JVFMKKworTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogTE9DQUxfU1JDX0ZJTEVTOj0gRWJtbFV0aWwuY3BwICAgICAgICBcCiAgICAgICAgICAgICAgICAgICBXZWJtRWxlbWVudC5jcHAgICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCmluZGV4IDA2OTk2MWIuLjczN2YxNDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcApAQCAtODAsMzggKzgwLDYgQEAKICAgICAgICAgICAgIG1DdWVQb2ludHMpOwogfQogCi1XZWJtV3JpdGVyOjpXZWJtV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKLSAgICAgIG1UaW1lQ29kZVNjYWxlKDEwMDAwMDApLAotICAgICAgbVN0YXJ0VGltZXN0YW1wVXMoMCksCi0gICAgICBtU3RhcnRUaW1lT2Zmc2V0TXMoMCksCi0gICAgICBtU2VnbWVudE9mZnNldCgwKSwKLSAgICAgIG1TZWdtZW50RGF0YVN0YXJ0KDApLAotICAgICAgbUluZm9PZmZzZXQoMCksCi0gICAgICBtSW5mb1NpemUoMCksCi0gICAgICBtVHJhY2tzT2Zmc2V0KDApLAotICAgICAgbUN1ZXNPZmZzZXQoMCksCi0gICAgICBtUGF1c2VkKGZhbHNlKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1Jc0ZpbGVTaXplTGltaXRFeHBsaWNpdGx5UmVxdWVzdGVkKGZhbHNlKSwKLSAgICAgIG1Jc1JlYWxUaW1lUmVjb3JkaW5nKGZhbHNlKSwKLSAgICAgIG1TdHJlYW1hYmxlRmlsZSh0cnVlKSwKLSAgICAgIG1Fc3RpbWF0ZWRDdWVzU2l6ZSgwKSB7Ci0gICAgbUZkID0gb3BlbihmaWxlbmFtZSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOwotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICBBTE9HVigiZmQgJWQ7IGZsYWdzOiAlbyIsIG1GZCwgZmNudGwobUZkLCBGX0dFVEZMLCAwKSk7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKLSAgICB9Ci0gICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdID0gV2VibVN0cmVhbShrQXVkaW9UeXBlLCAiQXVkaW8iLCAmV2VibVdyaXRlcjo6YXVkaW9UcmFjayk7Ci0gICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdID0gV2VibVN0cmVhbShrVmlkZW9UeXBlLCAiVmlkZW8iLCAmV2VibVdyaXRlcjo6dmlkZW9UcmFjayk7Ci0gICAgbVNpbmtUaHJlYWQgPSBuZXcgV2VibUZyYW1lU2lua1RocmVhZCgKLSAgICAgICAgICAgIG1GZCwKLSAgICAgICAgICAgIG1TZWdtZW50RGF0YVN0YXJ0LAotICAgICAgICAgICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdLm1TaW5rLAotICAgICAgICAgICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdLm1TaW5rLAotICAgICAgICAgICAgbUN1ZVBvaW50cyk7Ci19Ci0KIC8vIHN0YXRpYwogc3A8V2VibUVsZW1lbnQ+IFdlYm1Xcml0ZXI6OnZpZGVvVHJhY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZCkgewogICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmgKaW5kZXggMzZiNjk2NS4uNGFkNzcwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmgKQEAgLTM3LDcgKzM3LDYgQEAKIGNsYXNzIFdlYm1Xcml0ZXIgOiBwdWJsaWMgTWVkaWFXcml0ZXIgewogcHVibGljOgogICAgIFdlYm1Xcml0ZXIoaW50IGZkKTsKLSAgICBXZWJtV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKICAgICB+V2VibVdyaXRlcigpIHsgcmVzZXQoKTsgfQogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L0FuZHJvaWQubWsKaW5kZXggZjcwNDU0YS4uZmIyODYyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L0FuZHJvaWQubWsKQEAgLTMwLDYgKzMwLDkgQEAKICAgICAgICAgbGlidWkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGxpYnV0aWxzICAgICAgICAgICAgICAgICAgICAgICAgXAogCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF93ZmQKIAogTE9DQUxfTU9EVUxFX1RBR1M6PSBvcHRpb25hbApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L01lZGlhU2VuZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9NZWRpYVNlbmRlci5jcHAKaW5kZXggYjFjZGVjMC4uNmYwMDg3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L01lZGlhU2VuZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvTWVkaWFTZW5kZXIuY3BwCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kZXJOb3RpZnksIGlkKCkpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRlck5vdGlmeSwgdGhpcyk7CiAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUdlbmVyYXRpb24pOwogICAgICAgICAgICAgbVRTU2VuZGVyID0gbmV3IFJUUFNlbmRlcihtTmV0U2Vzc2lvbiwgbm90aWZ5KTsKICAgICAgICAgICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIobVRTU2VuZGVyKTsKQEAgLTE3MCw3ICsxNzAsNyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRlck5vdGlmeSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRlck5vdGlmeSwgdGhpcyk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1HZW5lcmF0aW9uKTsKICAgICBub3RpZnktPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L1ZpZGVvRm9ybWF0cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvVmlkZW9Gb3JtYXRzLmNwcAppbmRleCAyZjRhZjViLi5kYmM1MTFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvVmlkZW9Gb3JtYXRzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvVmlkZW9Gb3JtYXRzLmNwcApAQCAtMjQ4LDggKzI0OCw4IEBACiAgICAgfQogCiAgICAgaWYgKGJlc3RQcm9maWxlID09IC0xIHx8IGJlc3RMZXZlbCA9PSAtMSkgewotICAgICAgICBBTE9HRSgiUHJvZmlsZSBvciBsZXZlbCBub3Qgc2V0IGZvciByZXNvbHV0aW9uIHR5cGUgJWQsIGluZGV4ICVkIiwKLSAgICAgICAgICAgICAgdHlwZSwgaW5kZXgpOworICAgICAgICBBTE9HRSgiUHJvZmlsZSBvciBsZXZlbCBub3Qgc2V0IGZvciByZXNvbHV0aW9uIHR5cGUgJWQsIGluZGV4ICV6dSIsCisgICAgICAgICAgICAgICAgdHlwZSwgaW5kZXgpOwogICAgICAgICBiZXN0UHJvZmlsZSA9IFBST0ZJTEVfQ0JQOwogICAgICAgICBiZXN0TGV2ZWwgPSBMRVZFTF8zMTsKICAgICB9CkBAIC0zODIsNyArMzgyLDYgQEAKICAgICBkaXNhYmxlQWxsKCk7CiAKICAgICB1bnNpZ25lZCBuYXRpdmUsIGR1bW15OwotICAgIHVuc2lnbmVkIHJlc1szXTsKICAgICBzaXplX3Qgc2l6ZSA9IHN0cmxlbihzcGVjKTsKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKIApAQCAtNTA3LDcgKzUwNiw3IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEFMT0dWKCJ0eXBlICV1LCBpbmRleCAldSwgJXUgeCAldSAlYyV1IHN1cHBvcnRlZCIsCisgICAgICAgICAgICBBTE9HVigidHlwZSAlenUsIGluZGV4ICV6dSwgJXp1IHggJXp1ICVjJXp1IHN1cHBvcnRlZCIsCiAgICAgICAgICAgICAgICAgICBpLCBqLCB3aWR0aCwgaGVpZ2h0LCBpbnRlcmxhY2VkID8gJ2knIDogJ3AnLCBmcmFtZXNQZXJTZWNvbmQpOwogCiAgICAgICAgICAgICB1aW50MzJfdCBzY29yZSA9IHdpZHRoICogaGVpZ2h0ICogZnJhbWVzUGVyU2Vjb25kOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3J0cC9SVFBTZW5kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3J0cC9SVFBTZW5kZXIuY3BwCmluZGV4IGU4OGEzYmQuLmM2NmE4OTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9ydHAvUlRQU2VuZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvcnRwL1JUUFNlbmRlci5jcHAKQEAgLTk1LDExICs5NSwxMSBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IHJ0cE5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFJUUE5vdGlmeSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IHJ0cE5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFJUUE5vdGlmeSwgdGhpcyk7CiAKICAgICBzcDxBTWVzc2FnZT4gcnRjcE5vdGlmeTsKICAgICBpZiAocmVtb3RlUlRDUFBvcnQgPj0gMCkgewotICAgICAgICBydGNwTm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UlRDUE5vdGlmeSwgaWQoKSk7CisgICAgICAgIHJ0Y3BOb3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSVENQTm90aWZ5LCB0aGlzKTsKICAgICB9CiAKICAgICBDSEVDS19FUShtUlRQU2Vzc2lvbklELCAwKTsKQEAgLTI1Miw4ICsyNTIsNiBAQAogICAgIGludDY0X3QgdGltZVVzOwogICAgIENIRUNLKHRzUGFja2V0cy0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKIAotICAgIGNvbnN0IHNpemVfdCBudW1UU1BhY2tldHMgPSB0c1BhY2tldHMtPnNpemUoKSAvIDE4ODsKLQogICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOwogICAgIHdoaWxlIChzcmNPZmZzZXQgPCB0c1BhY2tldHMtPnNpemUoKSkgewogICAgICAgICBzcDxBQnVmZmVyPiB1ZHBQYWNrZXQgPQpAQCAtNjcyLDggKzY3MCw4IEBACiAKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIlVua25vd24gUlRDUCBwYWNrZXQgdHlwZSAldSBvZiBzaXplICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClkYXRhWzFdLCBoZWFkZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIEFMT0dXKCJVbmtub3duIFJUQ1AgcGFja2V0IHR5cGUgJXUgb2Ygc2l6ZSAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWRhdGFbMV0sIGhlYWRlckxlbmd0aCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTc2NCw3ICs3NjIsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgUlRQU2VuZGVyOjpwYXJzZUFQUChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworc3RhdHVzX3QgUlRQU2VuZGVyOjpwYXJzZUFQUChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSBfX3VudXNlZCkgewogICAgIGlmICghbWVtY21wKCJsYXRlIiwgJmRhdGFbOF0sIDQpKSB7CiAgICAgICAgIGludDY0X3QgYXZnTGF0ZW5jeVVzID0gKGludDY0X3QpVTY0X0FUKCZkYXRhWzEyXSk7CiAgICAgICAgIGludDY0X3QgbWF4TGF0ZW5jeVVzID0gKGludDY0X3QpVTY0X0FUKCZkYXRhWzIwXSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL0NvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL0NvbnZlcnRlci5jcHAKaW5kZXggMjgzNGE2Ni4uNDcxMTUyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvQ29udmVydGVyLmNwcApAQCAtOTMsNyArOTMsNyBAQAogCiB2b2lkIENvbnZlcnRlcjo6c2h1dGRvd25Bc3luYygpIHsKICAgICBBTE9HVigic2h1dGRvd24iKTsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0U2h1dGRvd24sIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTaHV0ZG93biwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHN0YXR1c190IENvbnZlcnRlcjo6aW5pdCgpIHsKQEAgLTQ4MiwxMSArNDgyLDExIEBACiAKICNpZiAxCiAgICAgaWYgKG1FbmNvZGVyQWN0aXZpdHlOb3RpZnkgPT0gTlVMTCkgewotICAgICAgICBtRW5jb2RlckFjdGl2aXR5Tm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0RW5jb2RlckFjdGl2aXR5LCBpZCgpKTsKKyAgICAgICAgbUVuY29kZXJBY3Rpdml0eU5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEVuY29kZXJBY3Rpdml0eSwgdGhpcyk7CiAgICAgfQogICAgIG1FbmNvZGVyLT5yZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24obUVuY29kZXJBY3Rpdml0eU5vdGlmeS0+ZHVwKCkpOwogI2Vsc2UKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0RW5jb2RlckFjdGl2aXR5LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0RW5jb2RlckFjdGl2aXR5LCB0aGlzKTsKICAgICBub3RpZnktPnNldEludDY0KCJ3aGVuVXMiLCBBTG9vcGVyOjpHZXROb3dVcygpKTsKICAgICBtRW5jb2Rlci0+cmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9uKG5vdGlmeSk7CiAjZW5kaWYKQEAgLTczMSw4ICs3MzEsNyBAQAogCiAgICAgICAgICAgICAgICAgLy8gTWVkaWFTZW5kZXIgd2lsbCBwb3N0IHRoZSBmb2xsb3dpbmcgbWVzc2FnZSB3aGVuIEhEQ1AKICAgICAgICAgICAgICAgICAvLyBpcyBkb25lLCB0byByZWxlYXNlIHRoZSBvdXRwdXQgYnVmZmVyIGJhY2sgdG8gZW5jb2Rlci4KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5KG5ldyBBTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGtXaGF0UmVsZWFzZU91dHB1dEJ1ZmZlciwgaWQoKSkpOworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkobmV3IEFNZXNzYWdlKGtXaGF0UmVsZWFzZU91dHB1dEJ1ZmZlciwgdGhpcykpOwogICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImJ1ZmZlckluZGV4IiwgYnVmZmVySW5kZXgpOwogCiAgICAgICAgICAgICAgICAgYnVmZmVyID0gbmV3IEFCdWZmZXIoCkBAIC03NDgsNyArNzQ3LDcgQEAKICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKIAogICAgICAgICAgICAgQUxPR1YoIlslc10gdGltZSAlbGxkIHVzICglLjJmIHNlY3MpIiwKLSAgICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIsIHRpbWVVcywgdGltZVVzIC8gMUU2KTsKKyAgICAgICAgICAgICAgICAgICAgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIiwgKGxvbmcgbG9uZyl0aW1lVXMsIHRpbWVVcyAvIDFFNik7CiAKICAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgb3V0YnVmLT5iYXNlKCkgKyBvZmZzZXQsIHNpemUpOwogCkBAIC03ODcsMTggKzc4NiwxOCBAQAogfQogCiB2b2lkIENvbnZlcnRlcjo6cmVxdWVzdElEUkZyYW1lKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXF1ZXN0SURSRnJhbWUsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXF1ZXN0SURSRnJhbWUsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIENvbnZlcnRlcjo6ZHJvcEFGcmFtZSgpIHsKICAgICAvLyBVbnN1cHBvcnRlZCBpbiBzdXJmYWNlIGlucHV0IG1vZGUuCiAgICAgQ0hFQ0soIShtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSk7CiAKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0RHJvcEFGcmFtZSwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdERyb3BBRnJhbWUsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIENvbnZlcnRlcjo6c3VzcGVuZEVuY29kaW5nKGJvb2wgc3VzcGVuZCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdXNwZW5kRW5jb2RpbmcsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdXNwZW5kRW5jb2RpbmcsIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoInN1c3BlbmQiLCBzdXNwZW5kKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvQ29udmVydGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL0NvbnZlcnRlci5oCmluZGV4IDU4NzZlMDcuLmIxODI5OTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvQ29udmVydGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuaApAQCAtMjMsNyArMjMsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKLXN0cnVjdCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKIHN0cnVjdCBNZWRpYUNvZGVjOwogCiAjZGVmaW5lIEVOQUJMRV9TSUxFTkNFX0RFVEVDVElPTiAgICAgICAgMApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9NZWRpYVB1bGxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL01lZGlhUHVsbGVyLmNwcAppbmRleCA4NmI5MThmLi5jZTA3YTRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL01lZGlhUHVsbGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL01lZGlhUHVsbGVyLmNwcApAQCAtNjMsMjEgKzYzLDIxIEBACiB9CiAKIHN0YXR1c190IE1lZGlhUHVsbGVyOjpzdGFydCgpIHsKLSAgICByZXR1cm4gcG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcihuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSkpOworICAgIHJldHVybiBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKSk7CiB9CiAKIHZvaWQgTWVkaWFQdWxsZXI6OnN0b3BBc3luYyhjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgdGhpcyk7CiAgICAgbXNnLT5zZXRNZXNzYWdlKCJub3RpZnkiLCBub3RpZnkpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIE1lZGlhUHVsbGVyOjpwYXVzZSgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTWVkaWFQdWxsZXI6OnJlc3VtZSgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBNZWRpYVB1bGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogCi0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yMTUsNyArMjE1LDcgQEAKIH0KIAogdm9pZCBNZWRpYVB1bGxlcjo6c2NoZWR1bGVQdWxsKCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQdWxsLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHVsbCwgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1QdWxsR2VuZXJhdGlvbik7CiAgICAgbXNnLT5wb3N0KCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5jcHAKaW5kZXggMmNiNDc4Ni4uZWQ1YTQwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmNwcApAQCAtMjE0LDcgKzIxNCw3IEBACiAgICAgICAgIG1Db252ZXJ0ZXItPnNodXRkb3duQXN5bmMoKTsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0TWVkaWFQdWxsZXJTdG9wcGVkLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0TWVkaWFQdWxsZXJTdG9wcGVkLCB0aGlzKTsKIAogICAgIGlmIChtU3RhcnRlZCAmJiBtTWVkaWFQdWxsZXIgIT0gTlVMTCkgewogICAgICAgICBpZiAobVJlcGVhdGVyU291cmNlICE9IE5VTEwpIHsKQEAgLTM0NSwxMiArMzQ1LDE0IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpQbGF5YmFja1Nlc3Npb24oCisgICAgICAgIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAogICAgICAgICBjb25zdCBzcDxBTmV0d29ya1Nlc3Npb24+ICZuZXRTZXNzaW9uLAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgY29uc3QgaW5fYWRkciAmaW50ZXJmYWNlQWRkciwKICAgICAgICAgY29uc3Qgc3A8SUhEQ1A+ICZoZGNwLAogICAgICAgICBjb25zdCBjaGFyICpwYXRoKQotICAgIDogbU5ldFNlc3Npb24obmV0U2Vzc2lvbiksCisgICAgOiBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwKKyAgICAgIG1OZXRTZXNzaW9uKG5ldFNlc3Npb24pLAogICAgICAgbU5vdGlmeShub3RpZnkpLAogICAgICAgbUludGVyZmFjZUFkZHIoaW50ZXJmYWNlQWRkciksCiAgICAgICBtSERDUChoZGNwKSwKQEAgLTM4Miw3ICszODQsNyBAQAogICAgICAgICBzaXplX3QgdmlkZW9SZXNvbHV0aW9uSW5kZXgsCiAgICAgICAgIFZpZGVvRm9ybWF0czo6UHJvZmlsZVR5cGUgdmlkZW9Qcm9maWxlVHlwZSwKICAgICAgICAgVmlkZW9Gb3JtYXRzOjpMZXZlbFR5cGUgdmlkZW9MZXZlbFR5cGUpIHsKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0TWVkaWFTZW5kZXJOb3RpZnksIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRNZWRpYVNlbmRlck5vdGlmeSwgdGhpcyk7CiAgICAgbU1lZGlhU2VuZGVyID0gbmV3IE1lZGlhU2VuZGVyKG1OZXRTZXNzaW9uLCBub3RpZnkpOwogICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIobU1lZGlhU2VuZGVyKTsKIApAQCAtNDQwLDcgKzQ0Miw3IEBACiBzdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpwbGF5KCkgewogICAgIHVwZGF0ZUxpdmVuZXNzKCk7CiAKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKSktPnBvc3QoKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTQ2MCw3ICs0NjIsNyBAQAogc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6cGF1c2UoKSB7CiAgICAgdXBkYXRlTGl2ZW5lc3MoKTsKIAotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCB0aGlzKSktPnBvc3QoKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTUwOCw3ICs1MTAsNyBAQAogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvbnZlcnRlcjo6a1doYXRFT1MpIHsKICAgICAgICAgICAgICAgICBDSEVDS19FUSh3aGF0LCBDb252ZXJ0ZXI6OmtXaGF0RU9TKTsKIAotICAgICAgICAgICAgICAgIEFMT0dJKCJvdXRwdXQgRU9TIG9uIHRyYWNrICVkIiwgdHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgQUxPR0koIm91dHB1dCBFT1Mgb24gdHJhY2sgJXp1IiwgdHJhY2tJbmRleCk7CiAKICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVRyYWNrcy5pbmRleE9mS2V5KHRyYWNrSW5kZXgpOwogICAgICAgICAgICAgICAgIENIRUNLX0dFKGluZGV4LCAwKTsKQEAgLTU4MSw3ICs1ODMsNyBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CiAKICAgICAgICAgICAgIGlmICh3aGF0ID09IFRyYWNrOjprV2hhdFN0b3BwZWQpIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiVHJhY2sgJWQgc3RvcHBlZCIsIHRyYWNrSW5kZXgpOworICAgICAgICAgICAgICAgIEFMT0dJKCJUcmFjayAlenUgc3RvcHBlZCIsIHRyYWNrSW5kZXgpOwogCiAgICAgICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrcy52YWx1ZUZvcih0cmFja0luZGV4KTsKICAgICAgICAgICAgICAgICBsb29wZXIoKS0+dW5yZWdpc3RlckhhbmRsZXIodHJhY2stPmlkKCkpOwpAQCAtNzg2LDcgKzc4OCw3IEBACiAKICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXggPSBtVHJhY2tzLnNpemUoKTsKIAotICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0VHJhY2tOb3RpZnksIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0VHJhY2tOb3RpZnksIHRoaXMpOwogICAgICAgICBub3RpZnktPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKIAogICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBuZXcgVHJhY2sobm90aWZ5LCBmb3JtYXQpOwpAQCAtODIxLDIxICs4MjMsMjcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGludDY0X3QgZGVsYXlVcyA9IDEwMDAwMDA7IC8vIGRlZmF1bHQgZGVsYXkgaXMgMSBzZWMKICAgICBpbnQ2NF90IHNhbXBsZVRpbWVVczsKICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5nZXRTYW1wbGVUaW1lKCZzYW1wbGVUaW1lVXMpOwogCi0gICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKIAotICAgIGlmIChtRmlyc3RTYW1wbGVUaW1lUmVhbFVzIDwgMGxsKSB7Ci0gICAgICAgIG1GaXJzdFNhbXBsZVRpbWVSZWFsVXMgPSBub3dVczsKLSAgICAgICAgbUZpcnN0U2FtcGxlVGltZVVzID0gc2FtcGxlVGltZVVzOworICAgICAgICBpZiAobUZpcnN0U2FtcGxlVGltZVJlYWxVcyA8IDBsbCkgeworICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVJlYWxVcyA9IG5vd1VzOworICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVVzID0gc2FtcGxlVGltZVVzOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCB3aGVuVXMgPSBzYW1wbGVUaW1lVXMgLSBtRmlyc3RTYW1wbGVUaW1lVXMgKyBtRmlyc3RTYW1wbGVUaW1lUmVhbFVzOworICAgICAgICBkZWxheVVzID0gd2hlblVzIC0gbm93VXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coImNvdWxkIG5vdCBnZXQgc2FtcGxlIHRpbWUgKCVkKSIsIGVycik7CiAgICAgfQogCi0gICAgaW50NjRfdCB3aGVuVXMgPSBzYW1wbGVUaW1lVXMgLSBtRmlyc3RTYW1wbGVUaW1lVXMgKyBtRmlyc3RTYW1wbGVUaW1lUmVhbFVzOwotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFB1bGxFeHRyYWN0b3JTYW1wbGUsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQdWxsRXh0cmFjdG9yU2FtcGxlLCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVB1bGxFeHRyYWN0b3JHZW5lcmF0aW9uKTsKLSAgICBtc2ctPnBvc3Qod2hlblVzIC0gbm93VXMpOworICAgIG1zZy0+cG9zdChkZWxheVVzKTsKIAogICAgIG1QdWxsRXh0cmFjdG9yUGVuZGluZyA9IHRydWU7CiB9CkBAIC04NTcsNyArODY1LDcgQEAKICAgICBzaXplX3QgdHJhY2tJbmRleDsKICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1FeHRyYWN0b3ItPmdldFNhbXBsZVRyYWNrSW5kZXgoJnRyYWNrSW5kZXgpKTsKIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb252ZXJ0ZXJOb3RpZnksIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb252ZXJ0ZXJOb3RpZnksIHRoaXMpOwogCiAgICAgbXNnLT5zZXRTaXplKAogICAgICAgICAgICAgInRyYWNrSW5kZXgiLCBtRXh0cmFjdG9yVHJhY2tUb0ludGVybmFsVHJhY2sudmFsdWVGb3IodHJhY2tJbmRleCkpOwpAQCAtOTU1LDcgKzk2Myw3IEBACiAgICAgICAgICAgICAgICAgICAgID8gTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXIDogTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKICAgICB9CiAKLSAgICBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb252ZXJ0ZXJOb3RpZnksIGlkKCkpOworICAgIG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdENvbnZlcnRlck5vdGlmeSwgdGhpcyk7CiAgICAgbm90aWZ5LT5zZXRTaXplKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7CiAKICAgICBzcDxDb252ZXJ0ZXI+IGNvbnZlcnRlciA9IG5ldyBDb252ZXJ0ZXIobm90aWZ5LCBjb2RlY0xvb3BlciwgZm9ybWF0KTsKQEAgLTk3MCw3ICs5NzgsNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIG5vdGlmeSA9IG5ldyBBTWVzc2FnZShDb252ZXJ0ZXI6OmtXaGF0TWVkaWFQdWxsZXJOb3RpZnksIGNvbnZlcnRlci0+aWQoKSk7CisgICAgbm90aWZ5ID0gbmV3IEFNZXNzYWdlKENvbnZlcnRlcjo6a1doYXRNZWRpYVB1bGxlck5vdGlmeSwgY29udmVydGVyKTsKICAgICBub3RpZnktPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKIAogICAgIHNwPE1lZGlhUHVsbGVyPiBwdWxsZXIgPSBuZXcgTWVkaWFQdWxsZXIoc291cmNlLCBub3RpZnkpOwpAQCAtOTgwLDcgKzk4OCw3IEBACiAgICAgICAgICpudW1JbnB1dEJ1ZmZlcnMgPSBjb252ZXJ0ZXItPmdldElucHV0QnVmZmVyQ291bnQoKTsKICAgICB9CiAKLSAgICBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRUcmFja05vdGlmeSwgaWQoKSk7CisgICAgbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0VHJhY2tOb3RpZnksIHRoaXMpOwogICAgIG5vdGlmeS0+c2V0U2l6ZSgidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOwogCiAgICAgc3A8VHJhY2s+IHRyYWNrID0gbmV3IFRyYWNrKApAQCAtMTA2Myw2ICsxMDcxLDcgQEAKIHN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OmFkZEF1ZGlvU291cmNlKGJvb2wgdXNlUENNQXVkaW8pIHsKICAgICBzcDxBdWRpb1NvdXJjZT4gYXVkaW9Tb3VyY2UgPSBuZXcgQXVkaW9Tb3VyY2UoCiAgICAgICAgICAgICBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlUmF0ZSAqLywKICAgICAgICAgICAgIDIgLyogY2hhbm5lbENvdW50ICovKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmgKaW5kZXggMjgyNDE0My4uZjY2NzNkZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5oCkBAIC0yMiwxMSArMjIsMTMgQEAKICNpbmNsdWRlICJWaWRlb0Zvcm1hdHMuaCIKICNpbmNsdWRlICJXaWZpRGlzcGxheVNvdXJjZS5oIgogCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBJSERDUDsKLXN0cnVjdCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKIHN0cnVjdCBNZWRpYVB1bGxlcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIHN0cnVjdCBNZWRpYVNlbmRlcjsKQEAgLTM2LDYgKzM4LDcgQEAKIC8vIGRpc3BsYXkuCiBzdHJ1Y3QgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbiA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgUGxheWJhY2tTZXNzaW9uKAorICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUsCiAgICAgICAgICAgICBjb25zdCBzcDxBTmV0d29ya1Nlc3Npb24+ICZuZXRTZXNzaW9uLAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAmaW50ZXJmYWNlQWRkciwKQEAgLTk2LDYgKzk5LDggQEAKICAgICAgICAga1doYXRQdWxsRXh0cmFjdG9yU2FtcGxlLAogICAgIH07CiAKKyAgICBTdHJpbmcxNiBtT3BQYWNrYWdlTmFtZTsKKwogICAgIHNwPEFOZXR3b3JrU2Vzc2lvbj4gbU5ldFNlc3Npb247CiAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CiAgICAgaW5fYWRkciBtSW50ZXJmYWNlQWRkcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUmVwZWF0ZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAKaW5kZXggNTlkN2U2ZS4uYWY2YjY2MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAKQEAgLTE3Myw3ICsxNzMsNyBAQAogfQogCiB2b2lkIFJlcGVhdGVyU291cmNlOjpwb3N0UmVhZCgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVhZCwgbVJlZmxlY3Rvci0+aWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlYWQsIG1SZWZsZWN0b3IpKS0+cG9zdCgpOwogfQogCiB2b2lkIFJlcGVhdGVyU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmNwcAppbmRleCA3ZWI4YjczLi5lMjYxNjVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmNwcApAQCAtNTAsMTQgKzUwLDE2IEBACiBjb25zdCBBU3RyaW5nIFdpZmlEaXNwbGF5U291cmNlOjpzVXNlckFnZW50ID0gTWFrZVVzZXJBZ2VudCgpOwogCiBXaWZpRGlzcGxheVNvdXJjZTo6V2lmaURpc3BsYXlTb3VyY2UoCisgICAgICAgIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAogICAgICAgICBjb25zdCBzcDxBTmV0d29ya1Nlc3Npb24+ICZuZXRTZXNzaW9uLAogICAgICAgICBjb25zdCBzcDxJUmVtb3RlRGlzcGxheUNsaWVudD4gJmNsaWVudCwKICAgICAgICAgY29uc3QgY2hhciAqcGF0aCkKLSAgICA6IG1TdGF0ZShJTklUSUFMSVpFRCksCisgICAgOiBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwKKyAgICAgIG1TdGF0ZShJTklUSUFMSVpFRCksCiAgICAgICBtTmV0U2Vzc2lvbihuZXRTZXNzaW9uKSwKICAgICAgIG1DbGllbnQoY2xpZW50KSwKICAgICAgIG1TZXNzaW9uSUQoMCksCi0gICAgICBtU3RvcFJlcGx5SUQoMCksCisgICAgICBtU3RvcFJlcGx5SUQoTlVMTCksCiAgICAgICBtQ2hvc2VuUlRQUG9ydCgtMSksCiAgICAgICBtVXNpbmdQQ01BdWRpbyhmYWxzZSksCiAgICAgICBtQ2xpZW50U2Vzc2lvbklEKDApLApAQCAtMTA2LDcgKzEwOCw3IEBACiBzdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6c3RhcnQoY29uc3QgY2hhciAqaWZhY2UpIHsKICAgICBDSEVDS19FUShtU3RhdGUsIElOSVRJQUxJWkVEKTsKIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKTsKICAgICBtc2ctPnNldFN0cmluZygiaWZhY2UiLCBpZmFjZSk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC0xMTQsMjEgKzExNiwyMSBAQAogfQogCiBzdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6c3RvcCgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIHRoaXMpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CiB9CiAKIHN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpwYXVzZSgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgdGhpcyk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKIH0KIAogc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OnJlc3VtZSgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOwpAQCAtMTM4LDcgKzE0MCw3IEBACiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewogICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgQVN0cmluZyBpZmFjZTsKQEAgLTE2Nyw3ICsxNjksNyBAQAogCiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgaWYgKGluZXRfYXRvbihpZmFjZS5jX3N0cigpLCAmbUludGVyZmFjZUFkZHIpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFJUU1BOb3RpZnksIGlkKCkpOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UlRTUE5vdGlmeSwgdGhpcyk7CiAKICAgICAgICAgICAgICAgICAgICAgZXJyID0gbU5ldFNlc3Npb24tPmNyZWF0ZVJUU1BTZXJ2ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZUFkZHIsIHBvcnQsIG5vdGlmeSwgJm1TZXNzaW9uSUQpOwpAQCAtMzEwLDcgKzMxMiw3IEBACiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBBV0FJVElOR19DTElFTlRfVEVBUkRPV047CiAKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFRlYXJkb3duVHJpZ2dlclRpbWVkT3V0LCBpZCgpKSktPnBvc3QoCisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRUZWFyZG93blRyaWdnZXJUaW1lZE91dCwgdGhpcykpLT5wb3N0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZWFyZG93blRyaWdnZXJUaW1lb3VTZWNzICogMTAwMDAwMGxsKTsKIAogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTMyNSw3ICszMjcsNyBAQAogCiAgICAgICAgIGNhc2Uga1doYXRQYXVzZToKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKQEAgLTM0NSw3ICszNDcsNyBAQAogCiAgICAgICAgIGNhc2Uga1doYXRSZXN1bWU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CkBAIC00OTIsNyArNDk0LDcgQEAKICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gQVdBSVRJTkdfQ0xJRU5UX1RFQVJET1dOKSB7CiAgICAgICAgICAgICAgICAgQUxPR0koIlRFQVJET1dOIHRyaWdnZXIgdGltZWQgb3V0LCBmb3JjaW5nIGRpc2Nvbm5lY3Rpb24uIik7CiAKLSAgICAgICAgICAgICAgICBDSEVDS19ORShtU3RvcFJlcGx5SUQsIDApOworICAgICAgICAgICAgICAgIENIRUNLKG1TdG9wUmVwbHlJRCAhPSBOVUxMKTsKICAgICAgICAgICAgICAgICBmaW5pc2hTdG9wKCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC01MjksNyArNTMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gSERDUE9ic2VydmVyOjpub3RpZnkgaXMgY29tcGxldGVseSBoYW5kbGVkIGJlZm9yZQogICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjbGVhciB0aGUgSERDUCBpbnN0YW5jZSBhbmQgdW5sb2FkIHRoZSBzaGFyZWQKICAgICAgICAgICAgICAgICAgICAgLy8gbGlicmFyeSA6KAotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0RmluaXNoU3RvcDIsIGlkKCkpKS0+cG9zdCgzMDAwMDBsbCk7CisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGaW5pc2hTdG9wMiwgdGhpcykpLT5wb3N0KDMwMDAwMGxsKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCkBAIC04ODEsNyArODgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgJmZyYW1lc1BlclNlY29uZCwKICAgICAgICAgICAgICAgICAgICAgJmludGVybGFjZWQpKTsKIAotICAgICAgICBBTE9HSSgiUGlja2VkIHZpZGVvIHJlc29sdXRpb24gJXUgeCAldSAlYyV1IiwKKyAgICAgICAgQUxPR0koIlBpY2tlZCB2aWRlbyByZXNvbHV0aW9uICV6dSB4ICV6dSAlYyV6dSIsCiAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGludGVybGFjZWQgPyAnaScgOiAncCcsIGZyYW1lc1BlclNlY29uZCk7CiAKICAgICAgICAgQUxPR0koIlBpY2tlZCBBVkMgcHJvZmlsZSAlZCwgbGV2ZWwgJWQiLApAQCAtMTAyNyw3ICsxMDI5LDcgQEAKICAgICB9CiAKICAgICBtUmVhcGVyUGVuZGluZyA9IHRydWU7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlYXBEZWFkQ2xpZW50cywgaWQoKSkpLT5wb3N0KGtSZWFwZXJJbnRlcnZhbFVzKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVhcERlYWRDbGllbnRzLCB0aGlzKSktPnBvc3Qoa1JlYXBlckludGVydmFsVXMpOwogfQogCiB2b2lkIFdpZmlEaXNwbGF5U291cmNlOjpzY2hlZHVsZUtlZXBBbGl2ZShpbnQzMl90IHNlc3Npb25JRCkgewpAQCAtMTAzNSw3ICsxMDM3LDcgQEAKICAgICAvLyBleHBpcmUsIG1ha2Ugc3VyZSB0aGUgdGltZW91dCBpcyBncmVhdGVyIHRoYW4gNSBzZWNzIHRvIGJlZ2luIHdpdGguCiAgICAgQ0hFQ0tfR1Qoa1BsYXliYWNrU2Vzc2lvblRpbWVvdXRVcywgNTAwMDAwMGxsKTsKIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRLZWVwQWxpdmUsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRLZWVwQWxpdmUsIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoInNlc3Npb25JRCIsIHNlc3Npb25JRCk7CiAgICAgbXNnLT5wb3N0KGtQbGF5YmFja1Nlc3Npb25UaW1lb3V0VXMgLSA1MDAwMDAwbGwpOwogfQpAQCAtMTIzOSwxMyArMTI0MSwxMyBAQAogCiAgICAgaW50MzJfdCBwbGF5YmFja1Nlc3Npb25JRCA9IG1ha2VVbmlxdWVQbGF5YmFja1Nlc3Npb25JRCgpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFBsYXliYWNrU2Vzc2lvbk5vdGlmeSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFBsYXliYWNrU2Vzc2lvbk5vdGlmeSwgdGhpcyk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigicGxheWJhY2tTZXNzaW9uSUQiLCBwbGF5YmFja1Nlc3Npb25JRCk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgc2Vzc2lvbklEKTsKIAogICAgIHNwPFBsYXliYWNrU2Vzc2lvbj4gcGxheWJhY2tTZXNzaW9uID0KICAgICAgICAgbmV3IFBsYXliYWNrU2Vzc2lvbigKLSAgICAgICAgICAgICAgICBtTmV0U2Vzc2lvbiwgbm90aWZ5LCBtSW50ZXJmYWNlQWRkciwgbUhEQ1AsIG1NZWRpYVBhdGguY19zdHIoKSk7CisgICAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWUsIG1OZXRTZXNzaW9uLCBub3RpZnksIG1JbnRlcmZhY2VBZGRyLCBtSERDUCwgbU1lZGlhUGF0aC5jX3N0cigpKTsKIAogICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIocGxheWJhY2tTZXNzaW9uKTsKIApAQCAtMTQ3MCw3ICsxNDcyLDcgQEAKICAgICBtTmV0U2Vzc2lvbi0+c2VuZFJlcXVlc3Qoc2Vzc2lvbklELCByZXNwb25zZS5jX3N0cigpKTsKIAogICAgIGlmIChtU3RhdGUgPT0gQVdBSVRJTkdfQ0xJRU5UX1RFQVJET1dOKSB7Ci0gICAgICAgIENIRUNLX05FKG1TdG9wUmVwbHlJRCwgMCk7CisgICAgICAgIENIRUNLKG1TdG9wUmVwbHlJRCAhPSBOVUxMKTsKICAgICAgICAgZmluaXNoU3RvcCgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1DbGllbnQtPm9uRGlzcGxheUVycm9yKElSZW1vdGVEaXNwbGF5Q2xpZW50OjprRGlzcGxheUVycm9yVW5rbm93bik7CkBAIC0xNzA3LDcgKzE3MDksNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEhEQ1BOb3RpZnksIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRIRENQTm90aWZ5LCB0aGlzKTsKICAgICBtSERDUE9ic2VydmVyID0gbmV3IEhEQ1BPYnNlcnZlcihub3RpZnkpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gbUhEQ1AtPnNldE9ic2VydmVyKG1IRENQT2JzZXJ2ZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5oCmluZGV4IDc1MDI2NWYuLmMyNWE2NzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvV2lmaURpc3BsYXlTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmgKQEAgLTI1LDEwICsyNSwxMyBAQAogCiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQVJlcGx5VG9rZW47CiBzdHJ1Y3QgSUhEQ1A7Ci1zdHJ1Y3QgSVJlbW90ZURpc3BsYXlDbGllbnQ7CitjbGFzcyBJUmVtb3RlRGlzcGxheUNsaWVudDsKIHN0cnVjdCBQYXJzZWRNZXNzYWdlOwogCiAvLyBSZXByZXNlbnRzIHRoZSBSVFNQIHNlcnZlciBhY3RpbmcgYXMgYSB3aWZpIGRpc3BsYXkgc291cmNlLgpAQCAtMzcsNiArNDAsNyBAQAogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrV2lmaURpc3BsYXlEZWZhdWx0UG9ydCA9IDcyMzY7CiAKICAgICBXaWZpRGlzcGxheVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgY29uc3Qgc3A8QU5ldHdvcmtTZXNzaW9uPiAmbmV0U2Vzc2lvbiwKICAgICAgICAgICAgIGNvbnN0IHNwPElSZW1vdGVEaXNwbGF5Q2xpZW50PiAmY2xpZW50LAogICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCA9IE5VTEwpOwpAQCAtMTEzLDYgKzExNyw4IEBACiAKICAgICBzdGF0aWMgY29uc3QgQVN0cmluZyBzVXNlckFnZW50OwogCisgICAgU3RyaW5nMTYgbU9wUGFja2FnZU5hbWU7CisKICAgICBTdGF0ZSBtU3RhdGU7CiAgICAgVmlkZW9Gb3JtYXRzIG1TdXBwb3J0ZWRTb3VyY2VWaWRlb0Zvcm1hdHM7CiAgICAgc3A8QU5ldHdvcmtTZXNzaW9uPiBtTmV0U2Vzc2lvbjsKQEAgLTEyMSw3ICsxMjcsNyBAQAogICAgIHN0cnVjdCBpbl9hZGRyIG1JbnRlcmZhY2VBZGRyOwogICAgIGludDMyX3QgbVNlc3Npb25JRDsKIAotICAgIHVpbnQzMl90IG1TdG9wUmVwbHlJRDsKKyAgICBzcDxBUmVwbHlUb2tlbj4gbVN0b3BSZXBseUlEOwogCiAgICAgQVN0cmluZyBtV2ZkQ2xpZW50UnRwUG9ydHM7CiAgICAgaW50MzJfdCBtQ2hvc2VuUlRQUG9ydDsgIC8vIGV4dHJhY3RlZCBmcm9tICJ3ZmRfY2xpZW50X3J0cF9wb3J0cyIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsKaW5kZXggYmI4NmRmYy4uZGM2NzI4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsKQEAgLTEyLDcgKzEyLDcgQEAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X3l1dgogCiAKLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCi0KK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWSW1hZ2UuY3BwCmluZGV4IGJiM2UyZmQuLmMwOTgxMzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkltYWdlLmNwcApAQCAtMzc0LDEzICszNzQsMTMgQEAKIAogdm9pZCBZVVZJbWFnZTo6eXV2MnJnYih1aW50OF90IHlWYWx1ZSwgdWludDhfdCB1VmFsdWUsIHVpbnQ4X3QgdlZhbHVlLAogICAgICAgICB1aW50OF90ICpyLCB1aW50OF90ICpnLCB1aW50OF90ICpiKSBjb25zdCB7Ci0gICAgKnIgPSB5VmFsdWUgKyAoMS4zNzA3MDUgKiAodlZhbHVlLTEyOCkpOwotICAgICpnID0geVZhbHVlIC0gKDAuNjk4MDAxICogKHZWYWx1ZS0xMjgpKSAtICgwLjMzNzYzMyAqICh1VmFsdWUtMTI4KSk7Ci0gICAgKmIgPSB5VmFsdWUgKyAoMS43MzI0NDYgKiAodVZhbHVlLTEyOCkpOworICAgIGludCByVG1wID0geVZhbHVlICsgKDEuMzcwNzA1ICogKHZWYWx1ZS0xMjgpKTsKKyAgICBpbnQgZ1RtcCA9IHlWYWx1ZSAtICgwLjY5ODAwMSAqICh2VmFsdWUtMTI4KSkgLSAoMC4zMzc2MzMgKiAodVZhbHVlLTEyOCkpOworICAgIGludCBiVG1wID0geVZhbHVlICsgKDEuNzMyNDQ2ICogKHVWYWx1ZS0xMjgpKTsKIAotICAgICpyID0gY2xhbXAoKnIsIDAsIDI1NSk7Ci0gICAgKmcgPSBjbGFtcCgqZywgMCwgMjU1KTsKLSAgICAqYiA9IGNsYW1wKCpiLCAwLCAyNTUpOworICAgICpyID0gY2xhbXAoclRtcCwgMCwgMjU1KTsKKyAgICAqZyA9IGNsYW1wKGdUbXAsIDAsIDI1NSk7CisgICAgKmIgPSBjbGFtcChiVG1wLCAwLCAyNTUpOwogfQogCiBib29sIFlVVkltYWdlOjp3cml0ZVRvUFBNKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSBjb25zdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLm1rIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5tawppbmRleCBiMDIwYzk4Li43ZTAxN2I5IDEwMDY0NAotLS0gYS9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQubWsKQEAgLTExLDE0ICsxMSwxNiBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKLQltYWluX21lZGlhc2VydmVyLmNwcCAKKwltYWluX21lZGlhc2VydmVyLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJhdWRpb2ZsaW5nZXIgXAogCWxpYmF1ZGlvcG9saWN5c2VydmljZSBcCiAJbGliY2FtZXJhX21ldGFkYXRhXAogCWxpYmNhbWVyYXNlcnZpY2UgXAorCWxpYmljdXVjIFwKIAlsaWJtZWRpYWxvZ3NlcnZpY2UgXAorCWxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UgXAogCWxpYmN1dGlscyBcCiAJbGlibmJhaW8gXAogCWxpYm1lZGlhIFwKQEAgLTI2LDEwICsyOCwxMiBAQAogCWxpYnV0aWxzIFwKIAlsaWJsb2cgXAogCWxpYmJpbmRlciBcCi0JbGlic291bmR0cmlnZ2Vyc2VydmljZQorCWxpYnNvdW5kdHJpZ2dlcnNlcnZpY2UgXAorCWxpYnJhZGlvc2VydmljZQogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLQlsaWJyZWdpc3Rlcm1zZXh0CisgICAgICAgIGxpYmljdWFuZHJvaWRfdXRpbHMgXAorICAgICAgICBsaWJyZWdpc3Rlcm1zZXh0CiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIFwKQEAgLTM3LDkgKzQxLDE1IEBACiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYWxvZyBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlIFwKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UgXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvc291bmR0cmlnZ2VyCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvcmFkaW8gXAorICAgIGV4dGVybmFsL3NvbmljCiAKIExPQ0FMX01PRFVMRTo9IG1lZGlhc2VydmVyCiBMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcCBiL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCmluZGV4IGEyODlmYzcuLjhjYzk1MDggMTAwNjQ0Ci0tLSBhL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCisrKyBiL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCkBAIC0zMSwxMSArMzEsMTQgQEAKIC8vIGZyb20gTE9DQUxfQ19JTkNMVURFUwogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJJY3VVdGlscy5oIgogI2luY2x1ZGUgIk1lZGlhTG9nU2VydmljZS5oIgogI2luY2x1ZGUgIk1lZGlhUGxheWVyU2VydmljZS5oIgorI2luY2x1ZGUgIlJlc291cmNlTWFuYWdlclNlcnZpY2UuaCIKKyNpbmNsdWRlICJzZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oIgogI2luY2x1ZGUgIk1lZGlhVXRpbHMuaCIKLSNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKICNpbmNsdWRlICJTb3VuZFRyaWdnZXJId1NlcnZpY2UuaCIKKyNpbmNsdWRlICJSYWRpb1NlcnZpY2UuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTEyOCwxNCArMTMxLDE3IEBACiAgICAgICAgICAgICBwcmN0bChQUl9TRVRfUERFQVRIU0lHLCBTSUdLSUxMKTsgICAvLyBpZiBwYXJlbnQgbWVkaWEubG9nIGRpZXMgYmVmb3JlIG1lLCBraWxsIG1lIGFsc28KICAgICAgICAgICAgIHNldHBnaWQoMCwgMCk7ICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBpZiBJIGRpZSBmaXJzdCwgZG9uJ3Qga2lsbCBteSBwYXJlbnQKICAgICAgICAgfQorICAgICAgICBJbml0aWFsaXplSWN1T3JEaWUoKTsKICAgICAgICAgc3A8UHJvY2Vzc1N0YXRlPiBwcm9jKFByb2Nlc3NTdGF0ZTo6c2VsZigpKTsKICAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgICAgICBBTE9HSSgiU2VydmljZU1hbmFnZXI6ICVwIiwgc20uZ2V0KCkpOwogICAgICAgICBBdWRpb0ZsaW5nZXI6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIE1lZGlhUGxheWVyU2VydmljZTo6aW5zdGFudGlhdGUoKTsKKyAgICAgICAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgQ2FtZXJhU2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgICAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisgICAgICAgIFJhZGlvU2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgcmVnaXN0ZXJFeHRlbnNpb25zKCk7CiAgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcAppbmRleCBlZDAwYjcyLi5jZDBjNDYyIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCkBAIC0xMTYsNyArMTE2LDcgQEAKIAogICAgICAgICBjYXNlIGtXaGF0U3RvcEFjdGl2aXR5Tm90aWZpY2F0aW9uczoKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgbXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCk7CiAKICAgICAgICAgICAgIG1Db2RlYy0+bUdlbmVyYXRpb24rKzsKQEAgLTEzNiw3ICsxMzYsNyBAQAogCiAKIHN0YXRpYyB2b2lkIHJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihBTWVkaWFDb2RlYyAqY29kZWMpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9ucywgY29kZWMtPm1IYW5kbGVyLT5pZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9ucywgY29kZWMtPm1IYW5kbGVyKSktPnBvc3QoKTsKIH0KIAogZXh0ZXJuICJDIiB7CkBAIC0xNTQsNiArMTU0LDEwIEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbURhdGEtPm1Db2RlYyA9IGFuZHJvaWQ6Ok1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShtRGF0YS0+bUxvb3BlciwgbmFtZSk7CiAgICAgfQorICAgIGlmIChtRGF0YS0+bUNvZGVjID09IE5VTEwpIHsgIC8vIGZhaWxlZCB0byBjcmVhdGUgY29kZWMKKyAgICAgICAgQU1lZGlhQ29kZWNfZGVsZXRlKG1EYXRhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIG1EYXRhLT5tSGFuZGxlciA9IG5ldyBDb2RlY0hhbmRsZXIobURhdGEpOwogICAgIG1EYXRhLT5tTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobURhdGEtPm1IYW5kbGVyKTsKICAgICBtRGF0YS0+bUdlbmVyYXRpb24gPSAxOwpAQCAtMTgwLDE3ICsxODQsMjEgQEAKIAogRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19kZWxldGUoQU1lZGlhQ29kZWMgKm1EYXRhKSB7Ci0gICAgaWYgKG1EYXRhLT5tQ29kZWMgIT0gTlVMTCkgewotICAgICAgICBtRGF0YS0+bUNvZGVjLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1EYXRhLT5tQ29kZWMuY2xlYXIoKTsKLSAgICB9CisgICAgaWYgKG1EYXRhICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1EYXRhLT5tQ29kZWMgIT0gTlVMTCkgeworICAgICAgICAgICAgbURhdGEtPm1Db2RlYy0+cmVsZWFzZSgpOworICAgICAgICAgICAgbURhdGEtPm1Db2RlYy5jbGVhcigpOworICAgICAgICB9CiAKLSAgICBpZiAobURhdGEtPm1Mb29wZXIgIT0gTlVMTCkgewotICAgICAgICBtRGF0YS0+bUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobURhdGEtPm1IYW5kbGVyLT5pZCgpKTsKLSAgICAgICAgbURhdGEtPm1Mb29wZXItPnN0b3AoKTsKLSAgICAgICAgbURhdGEtPm1Mb29wZXIuY2xlYXIoKTsKKyAgICAgICAgaWYgKG1EYXRhLT5tTG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChtRGF0YS0+bUhhbmRsZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1EYXRhLT5tTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtRGF0YS0+bUhhbmRsZXItPmlkKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGEtPm1Mb29wZXItPnN0b3AoKTsKKyAgICAgICAgICAgIG1EYXRhLT5tTG9vcGVyLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIG1EYXRhOwogICAgIH0KLSAgICBkZWxldGUgbURhdGE7CiAgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIApAQCAtMjE5LDcgKzIyNyw3IEBACiAgICAgaWYgKHJldCAhPSBPSykgewogICAgICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKHJldCk7CiAgICAgfQotICAgIG1EYXRhLT5tQWN0aXZpdHlOb3RpZmljYXRpb24gPSBuZXcgQU1lc3NhZ2Uoa1doYXRBY3Rpdml0eU5vdGlmeSwgbURhdGEtPm1IYW5kbGVyLT5pZCgpKTsKKyAgICBtRGF0YS0+bUFjdGl2aXR5Tm90aWZpY2F0aW9uID0gbmV3IEFNZXNzYWdlKGtXaGF0QWN0aXZpdHlOb3RpZnksIG1EYXRhLT5tSGFuZGxlcik7CiAgICAgbURhdGEtPm1BY3Rpdml0eU5vdGlmaWNhdGlvbi0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtRGF0YS0+bUdlbmVyYXRpb24pOwogICAgIHJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihtRGF0YSk7CiAgICAgcmV0dXJuIEFNRURJQV9PSzsKQEAgLTIyOSw3ICsyMzcsNyBAQAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc3RvcChBTWVkaWFDb2RlYyAqbURhdGEpIHsKICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1Db2RlYy0+c3RvcCgpKTsKIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wQWN0aXZpdHlOb3RpZmljYXRpb25zLCBtRGF0YS0+bUhhbmRsZXItPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wQWN0aXZpdHlOb3RpZmljYXRpb25zLCBtRGF0YS0+bUhhbmRsZXIpOwogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CiAgICAgbURhdGEtPm1BY3Rpdml0eU5vdGlmaWNhdGlvbi5jbGVhcigpOwpAQCAtMzUyLDcgKzM2MCw4IEBACiB9CiAKIC8vRVhQT1JUCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zZXROb3RpZmljYXRpb25DYWxsYmFjayhBTWVkaWFDb2RlYyAqbURhdGEsIE9uQ29kZWNFdmVudCBjYWxsYmFjaywgdm9pZCAqdXNlcmRhdGEpIHsKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3NldE5vdGlmaWNhdGlvbkNhbGxiYWNrKEFNZWRpYUNvZGVjICptRGF0YSwgT25Db2RlY0V2ZW50IGNhbGxiYWNrLAorICAgICAgICB2b2lkICp1c2VyZGF0YSkgewogICAgIG1EYXRhLT5tQ2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICBtRGF0YS0+bUNhbGxiYWNrVXNlckRhdGEgPSB1c2VyZGF0YTsKICAgICByZXR1cm4gQU1FRElBX09LOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKaW5kZXggN2ExMDQ4Yy4uODNhNWJhMSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCkBAIC0zMTIsOCArMzEyLDEwIEBACiAgICAgICAgICAgICAgICAgU3RyaW5nOChvcHRpb25hbFBhcmFtZXRlcnNbaV0ubVZhbHVlKSk7CiAgICAgfQogICAgIFN0cmluZzggZGVmYXVsdFVybDsKKyAgICBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPmdldEtleVJlcXVlc3QoKml0ZXIsIG1kSW5pdCwgU3RyaW5nOChtaW1lVHlwZSksCi0gICAgICAgICAgICBtZEtleVR5cGUsIG1kT3B0aW9uYWxQYXJhbWV0ZXJzLCBtT2JqLT5tS2V5UmVxdWVzdCwgZGVmYXVsdFVybCk7CisgICAgICAgICAgICBtZEtleVR5cGUsIG1kT3B0aW9uYWxQYXJhbWV0ZXJzLCBtT2JqLT5tS2V5UmVxdWVzdCwgZGVmYXVsdFVybCwKKyAgICAgICAgICAgICZrZXlSZXF1ZXN0VHlwZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKQEAgLTcyNSw0ICs3MjcsMyBAQAogfQogCiB9IC8vIGV4dGVybiAiQyIKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggZGI1N2QwYi4uMGVjZDY0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC03MCw3ICs3MCw4IEBACiB9CiAKIEVYUE9SVAotbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZChBTWVkaWFFeHRyYWN0b3IgKm1EYXRhLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCkgeworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZChBTWVkaWFFeHRyYWN0b3IgKm1EYXRhLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LAorICAgICAgICBvZmY2NF90IGxlbmd0aCkgewogICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVkLCAlbGxkLCAlbGxkKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUltcGwtPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKSk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9BbmRyb2lkLm1rIGIvbWVkaWEvdXRpbHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmFkYmM4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzOSBAQAorIyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICBCYXR0ZXJ5Tm90aWZpZXIuY3BwIFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgIGxpYmJpbmRlciBcCisgIGxpYmN1dGlscyBcCisgIGxpYmxvZyBcCisgIGxpYnV0aWxzIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKKworTE9DQUxfQ0ZMQUdTICs9IFwKKyAgLVdhbGwgXAorICAtV2V4dHJhIFwKKyAgLVdlcnJvciBcCisKK0xPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKKworTE9DQUxfTU9EVUxFIDo9IGxpYm1lZGlhdXRpbHMKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmNwcCBiL21lZGlhL3V0aWxzL0JhdHRlcnlOb3RpZmllci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y5Y2Q3YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL0JhdHRlcnlOb3RpZmllci5jcHAKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlL21lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmgiCisKKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCBCYXR0ZXJ5Tm90aWZpZXI6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIC8qd2hvKi8pIHsKKyAgICBCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkub25CYXR0ZXJ5U3RhdFNlcnZpY2VEaWVkKCk7Cit9CisKK0JhdHRlcnlOb3RpZmllcjo6QmF0dGVyeU5vdGlmaWVyKCkgOiBtVmlkZW9SZWZDb3VudCgwKSwgbUF1ZGlvUmVmQ291bnQoMCkge30KKworQmF0dGVyeU5vdGlmaWVyOjp+QmF0dGVyeU5vdGlmaWVyKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1EZWF0aE5vdGlmaWVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUJhdHRlcnlTdGF0U2VydmljZSktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpOworICAgIH0KK30KKwordm9pZCBCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdGFydFZpZGVvKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVNlcnZpY2UgPSBnZXRCYXR0ZXJ5U2VydmljZV9sKCk7CisgICAgaWYgKG1WaWRlb1JlZkNvdW50ID09IDAgJiYgYmF0dGVyeVNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBiYXR0ZXJ5U2VydmljZS0+bm90ZVN0YXJ0VmlkZW8oQUlEX01FRElBKTsKKyAgICB9CisgICAgbVZpZGVvUmVmQ291bnQrKzsKK30KKwordm9pZCBCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdG9wVmlkZW8oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVZpZGVvUmVmQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IHZpZGVvIHJlZmNvdW50IGlzIGJyb2tlbi4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVNlcnZpY2UgPSBnZXRCYXR0ZXJ5U2VydmljZV9sKCk7CisKKyAgICBtVmlkZW9SZWZDb3VudC0tOworICAgIGlmIChtVmlkZW9SZWZDb3VudCA9PSAwICYmIGJhdHRlcnlTZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgYmF0dGVyeVNlcnZpY2UtPm5vdGVTdG9wVmlkZW8oQUlEX01FRElBKTsKKyAgICB9Cit9CisKK3ZvaWQgQmF0dGVyeU5vdGlmaWVyOjpub3RlUmVzZXRWaWRlbygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTZXJ2aWNlID0gZ2V0QmF0dGVyeVNlcnZpY2VfbCgpOworICAgIG1WaWRlb1JlZkNvdW50ID0gMDsKKyAgICBpZiAoYmF0dGVyeVNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBiYXR0ZXJ5U2VydmljZS0+bm90ZVJlc2V0QXVkaW8oKTsKKyAgICB9Cit9CisKK3ZvaWQgQmF0dGVyeU5vdGlmaWVyOjpub3RlU3RhcnRBdWRpbygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTZXJ2aWNlID0gZ2V0QmF0dGVyeVNlcnZpY2VfbCgpOworICAgIGlmIChtQXVkaW9SZWZDb3VudCA9PSAwICYmIGJhdHRlcnlTZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgYmF0dGVyeVNlcnZpY2UtPm5vdGVTdGFydEF1ZGlvKEFJRF9NRURJQSk7CisgICAgfQorICAgIG1BdWRpb1JlZkNvdW50Kys7Cit9CisKK3ZvaWQgQmF0dGVyeU5vdGlmaWVyOjpub3RlU3RvcEF1ZGlvKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1BdWRpb1JlZkNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBhdWRpbyByZWZjb3VudCBpcyBicm9rZW4uIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTZXJ2aWNlID0gZ2V0QmF0dGVyeVNlcnZpY2VfbCgpOworCisgICAgbUF1ZGlvUmVmQ291bnQtLTsKKyAgICBpZiAobUF1ZGlvUmVmQ291bnQgPT0gMCAmJiBiYXR0ZXJ5U2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIGJhdHRlcnlTZXJ2aWNlLT5ub3RlU3RvcEF1ZGlvKEFJRF9NRURJQSk7CisgICAgfQorfQorCit2b2lkIEJhdHRlcnlOb3RpZmllcjo6bm90ZVJlc2V0QXVkaW8oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzcDxJQmF0dGVyeVN0YXRzPiBiYXR0ZXJ5U2VydmljZSA9IGdldEJhdHRlcnlTZXJ2aWNlX2woKTsKKyAgICBtQXVkaW9SZWZDb3VudCA9IDA7CisgICAgaWYgKGJhdHRlcnlTZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgYmF0dGVyeVNlcnZpY2UtPm5vdGVSZXNldEF1ZGlvKCk7CisgICAgfQorfQorCit2b2lkIEJhdHRlcnlOb3RpZmllcjo6bm90ZUZsYXNobGlnaHRPbihjb25zdCBTdHJpbmc4JiBpZCwgaW50IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVNlcnZpY2UgPSBnZXRCYXR0ZXJ5U2VydmljZV9sKCk7CisKKyAgICBzdGQ6OnBhaXI8U3RyaW5nOCwgaW50PiBrID0gc3RkOjptYWtlX3BhaXIoaWQsIHVpZCk7CisgICAgaWYgKCFtRmxhc2hsaWdodFN0YXRlW2tdKSB7CisgICAgICAgIG1GbGFzaGxpZ2h0U3RhdGVba10gPSB0cnVlOworICAgICAgICBpZiAoYmF0dGVyeVNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYmF0dGVyeVNlcnZpY2UtPm5vdGVGbGFzaGxpZ2h0T24odWlkKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVGbGFzaGxpZ2h0T2ZmKGNvbnN0IFN0cmluZzgmIGlkLCBpbnQgdWlkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzcDxJQmF0dGVyeVN0YXRzPiBiYXR0ZXJ5U2VydmljZSA9IGdldEJhdHRlcnlTZXJ2aWNlX2woKTsKKworICAgIHN0ZDo6cGFpcjxTdHJpbmc4LCBpbnQ+IGsgPSBzdGQ6Om1ha2VfcGFpcihpZCwgdWlkKTsKKyAgICBpZiAobUZsYXNobGlnaHRTdGF0ZVtrXSkgeworICAgICAgICBtRmxhc2hsaWdodFN0YXRlW2tdID0gZmFsc2U7CisgICAgICAgIGlmIChiYXR0ZXJ5U2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBiYXR0ZXJ5U2VydmljZS0+bm90ZUZsYXNobGlnaHRPZmYodWlkKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVSZXNldEZsYXNobGlnaHQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzcDxJQmF0dGVyeVN0YXRzPiBiYXR0ZXJ5U2VydmljZSA9IGdldEJhdHRlcnlTZXJ2aWNlX2woKTsKKyAgICBtRmxhc2hsaWdodFN0YXRlLmNsZWFyKCk7CisgICAgaWYgKGJhdHRlcnlTZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgYmF0dGVyeVNlcnZpY2UtPm5vdGVSZXNldEZsYXNobGlnaHQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQmF0dGVyeU5vdGlmaWVyOjpub3RlU3RhcnRDYW1lcmEoY29uc3QgU3RyaW5nOCYgaWQsIGludCB1aWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTZXJ2aWNlID0gZ2V0QmF0dGVyeVNlcnZpY2VfbCgpOworICAgIHN0ZDo6cGFpcjxTdHJpbmc4LCBpbnQ+IGsgPSBzdGQ6Om1ha2VfcGFpcihpZCwgdWlkKTsKKyAgICBpZiAoIW1DYW1lcmFTdGF0ZVtrXSkgeworICAgICAgICBtQ2FtZXJhU3RhdGVba10gPSB0cnVlOworICAgICAgICBpZiAoYmF0dGVyeVNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYmF0dGVyeVNlcnZpY2UtPm5vdGVTdGFydENhbWVyYSh1aWQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEJhdHRlcnlOb3RpZmllcjo6bm90ZVN0b3BDYW1lcmEoY29uc3QgU3RyaW5nOCYgaWQsIGludCB1aWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTZXJ2aWNlID0gZ2V0QmF0dGVyeVNlcnZpY2VfbCgpOworICAgIHN0ZDo6cGFpcjxTdHJpbmc4LCBpbnQ+IGsgPSBzdGQ6Om1ha2VfcGFpcihpZCwgdWlkKTsKKyAgICBpZiAobUNhbWVyYVN0YXRlW2tdKSB7CisgICAgICAgIG1DYW1lcmFTdGF0ZVtrXSA9IGZhbHNlOworICAgICAgICBpZiAoYmF0dGVyeVNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYmF0dGVyeVNlcnZpY2UtPm5vdGVTdG9wQ2FtZXJhKHVpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQmF0dGVyeU5vdGlmaWVyOjpub3RlUmVzZXRDYW1lcmEoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzcDxJQmF0dGVyeVN0YXRzPiBiYXR0ZXJ5U2VydmljZSA9IGdldEJhdHRlcnlTZXJ2aWNlX2woKTsKKyAgICBtQ2FtZXJhU3RhdGUuY2xlYXIoKTsKKyAgICBpZiAoYmF0dGVyeVNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBiYXR0ZXJ5U2VydmljZS0+bm90ZVJlc2V0Q2FtZXJhKCk7CisgICAgfQorfQorCit2b2lkIEJhdHRlcnlOb3RpZmllcjo6b25CYXR0ZXJ5U3RhdFNlcnZpY2VEaWVkKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUJhdHRlcnlTdGF0U2VydmljZS5jbGVhcigpOworICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CisgICAgLy8gRG8gbm90IHJlc2V0IG1WaWRlb1JlZkNvdW50IGFuZCBtQXVkaW9SZWZDb3VudCBoZXJlLiBUaGUgcmVmCisgICAgLy8gY291bnRpbmcgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIGJhdHRlcnkgc2VydmljZSBhdmFpbGFiaWxpdHkuCisgICAgLy8gV2UgbmVlZCB0aGlzIGlmIGJhdHRlcnkgc2VydmljZSBiZWNvbWVzIGF2YWlsYWJsZSBhZnRlciBtZWRpYQorICAgIC8vIHN0YXJ0ZWQuCisKK30KKworc3A8SUJhdHRlcnlTdGF0cz4gQmF0dGVyeU5vdGlmaWVyOjpnZXRCYXR0ZXJ5U2VydmljZV9sKCkgeworICAgIGlmIChtQmF0dGVyeVN0YXRTZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1CYXR0ZXJ5U3RhdFNlcnZpY2U7CisgICAgfQorICAgIC8vIEdldCBiYXR0ZXJ5IHNlcnZpY2UgZnJvbSBzZXJ2aWNlIG1hbmFnZXIKKyAgICBjb25zdCBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKKyAgICBpZiAoc20gIT0gbnVsbHB0cikgeworICAgICAgICBjb25zdCBTdHJpbmcxNiBuYW1lKCJiYXR0ZXJ5c3RhdHMiKTsKKyAgICAgICAgbUJhdHRlcnlTdGF0U2VydmljZSA9IGludGVyZmFjZV9jYXN0PElCYXR0ZXJ5U3RhdHM+KHNtLT5jaGVja1NlcnZpY2UobmFtZSkpOworICAgICAgICBpZiAobUJhdHRlcnlTdGF0U2VydmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiYmF0dGVyeXN0YXRzIHNlcnZpY2UgdW5hdmFpbGFibGUhIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIoKTsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUJhdHRlcnlTdGF0U2VydmljZSktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKKworICAgICAgICAvLyBOb3RpZnkgc3RhcnQgbm93IGlmIG1lZGlhIGFscmVhZHkgc3RhcnRlZAorICAgICAgICBpZiAobVZpZGVvUmVmQ291bnQgPiAwKSB7CisgICAgICAgICAgICBtQmF0dGVyeVN0YXRTZXJ2aWNlLT5ub3RlU3RhcnRWaWRlbyhBSURfTUVESUEpOworICAgICAgICB9CisgICAgICAgIGlmIChtQXVkaW9SZWZDb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdFNlcnZpY2UtPm5vdGVTdGFydEF1ZGlvKEFJRF9NRURJQSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1CYXR0ZXJ5U3RhdFNlcnZpY2U7Cit9CisKK0FORFJPSURfU0lOR0xFVE9OX1NUQVRJQ19JTlNUQU5DRShCYXR0ZXJ5Tm90aWZpZXIpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvUkVBRE1FIGIvbWVkaWEvdXRpbHMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YWIwYjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9SRUFETUUKQEAgLTAsMCArMSw0IEBACitUaGlzIGlzIGEgY29tbW9uIHNoYXJlZCBsaWJyYXJ5IGZvciBtZWRpYSB1dGlsaXR5IGNsYXNzZXMuCisKK0NvbnNpZGVyIGFkZGluZyB5b3VyIHV0aWxpdHkgY2xhc3MvZnVuY3Rpb24gaGVyZSBpZiBpdCB3aWxsCitiZSB1c2VkIGFjcm9zcyBzZXZlcmFsIG9mIHRoZSBtZWRpYSBsaWJyYXJpZXMuCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwNDgwNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CQVRURVJZX05PVElGSUVSX0gKKyNkZWZpbmUgTUVESUFfQkFUVEVSWV9OT1RJRklFUl9ICisKKyNpbmNsdWRlIDxiaW5kZXIvSUJhdHRlcnlTdGF0cy5oPgorI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ2xhc3MgdXNlZCBmb3IgbG9nZ2luZyBiYXR0ZXJ5IGxpZmUgZXZlbnRzIGluIG1lZGlhc2VydmVyLgorICovCitjbGFzcyBCYXR0ZXJ5Tm90aWZpZXIgOiBwdWJsaWMgU2luZ2xldG9uPEJhdHRlcnlOb3RpZmllcj4geworCisgICAgZnJpZW5kIGNsYXNzIFNpbmdsZXRvbjxCYXR0ZXJ5Tm90aWZpZXI+OworICAgIEJhdHRlcnlOb3RpZmllcigpOworCitwdWJsaWM6CisgICAgfkJhdHRlcnlOb3RpZmllcigpOworCisgICAgdm9pZCBub3RlU3RhcnRWaWRlbygpOworICAgIHZvaWQgbm90ZVN0b3BWaWRlbygpOworICAgIHZvaWQgbm90ZVJlc2V0VmlkZW8oKTsKKyAgICB2b2lkIG5vdGVTdGFydEF1ZGlvKCk7CisgICAgdm9pZCBub3RlU3RvcEF1ZGlvKCk7CisgICAgdm9pZCBub3RlUmVzZXRBdWRpbygpOworICAgIHZvaWQgbm90ZUZsYXNobGlnaHRPbihjb25zdCBTdHJpbmc4JiBpZCwgaW50IHVpZCk7CisgICAgdm9pZCBub3RlRmxhc2hsaWdodE9mZihjb25zdCBTdHJpbmc4JiBpZCwgaW50IHVpZCk7CisgICAgdm9pZCBub3RlUmVzZXRGbGFzaGxpZ2h0KCk7CisgICAgdm9pZCBub3RlU3RhcnRDYW1lcmEoY29uc3QgU3RyaW5nOCYgaWQsIGludCB1aWQpOworICAgIHZvaWQgbm90ZVN0b3BDYW1lcmEoY29uc3QgU3RyaW5nOCYgaWQsIGludCB1aWQpOworICAgIHZvaWQgbm90ZVJlc2V0Q2FtZXJhKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBvbkJhdHRlcnlTdGF0U2VydmljZURpZWQoKTsKKworICAgIGNsYXNzIERlYXRoTm90aWZpZXIgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgeworICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgLyp3aG8qLyk7CisgICAgfTsKKworICAgIE11dGV4IG1Mb2NrOworICAgIGludCBtVmlkZW9SZWZDb3VudDsKKyAgICBpbnQgbUF1ZGlvUmVmQ291bnQ7CisgICAgc3RkOjptYXA8c3RkOjpwYWlyPFN0cmluZzgsIGludD4sIGJvb2w+IG1GbGFzaGxpZ2h0U3RhdGU7CisgICAgc3RkOjptYXA8c3RkOjpwYWlyPFN0cmluZzgsIGludD4sIGJvb2w+IG1DYW1lcmFTdGF0ZTsKKyAgICBzcDxJQmF0dGVyeVN0YXRzPiBtQmF0dGVyeVN0YXRTZXJ2aWNlOworICAgIHNwPERlYXRoTm90aWZpZXI+IG1EZWF0aE5vdGlmaWVyOworCisgICAgc3A8SUJhdHRlcnlTdGF0cz4gZ2V0QmF0dGVyeVNlcnZpY2VfbCgpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIE1FRElBX0JBVFRFUllfTk9USUZJRVJfSApkaWZmIC0tZ2l0IGEvcmFkaW8vQW5kcm9pZC5tayBiL3JhZGlvL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiYjhmZAotLS0gL2Rldi9udWxsCisrKyBiL3JhZGlvL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzOSBAQAorIyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwlSYWRpby5jcHAgXAorCUlSYWRpby5jcHAgXAorCUlSYWRpb0NsaWVudC5jcHAgXAorCUlSYWRpb1NlcnZpY2UuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmN1dGlscyBcCisJbGlidXRpbHMgXAorCWxpYmxvZyBcCisJbGliYmluZGVyIFwKKwlsaWJoYXJkd2FyZSBcCisJbGlicmFkaW9fbWV0YWRhdGEKKworI0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorCXN5c3RlbS9tZWRpYS9jYW1lcmEvaW5jbHVkZSBcCisJc3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUKKworTE9DQUxfTU9EVUxFOj0gbGlicmFkaW8KKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvcmFkaW8vSVJhZGlvLmNwcCBiL3JhZGlvL0lSYWRpby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyZGY3NwotLS0gL2Rldi9udWxsCisrKyBiL3JhZGlvL0lSYWRpby5jcHAKQEAgLTAsMCArMSwzNDQgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiSVJhZGlvIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8cmFkaW8vSVJhZGlvLmg+CisjaW5jbHVkZSA8cmFkaW8vSVJhZGlvU2VydmljZS5oPgorI2luY2x1ZGUgPHJhZGlvL0lSYWRpb0NsaWVudC5oPgorI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9yYWRpb19tZXRhZGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIERFVEFDSCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgU0VUX0NPTkZJR1VSQVRJT04sCisgICAgR0VUX0NPTkZJR1VSQVRJT04sCisgICAgU0VUX01VVEUsCisgICAgR0VUX01VVEUsCisgICAgU0NBTiwKKyAgICBTVEVQLAorICAgIFRVTkUsCisgICAgQ0FOQ0VMLAorICAgIEdFVF9QUk9HUkFNX0lORk9STUFUSU9OLAorICAgIEhBU19DT05UUk9MCit9OworCitjbGFzcyBCcFJhZGlvOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVJhZGlvPgoreworcHVibGljOgorICAgIEJwUmFkaW8oY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SVJhZGlvPihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGRldGFjaCgpCisgICAgeworICAgICAgICBBTE9HVigiZGV0YWNoIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERFVEFDSCwgZGF0YSwgJnJlcGx5KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENvbmZpZ3VyYXRpb24oY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGlmIChjb25maWcgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKGNvbmZpZywgc2l6ZW9mKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZykpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0NPTkZJR1VSQVRJT04sIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q29uZmlndXJhdGlvbihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ09ORklHVVJBVElPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQoY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE11dGUoYm9vbCBtdXRlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIobXV0ZSA/IDEgOiAwKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9NVVRFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE11dGUoYm9vbCAqbXV0ZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgaWYgKG11dGUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01VVEUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpbnQgbXV0ZXJlYWQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgICAgICAqbXV0ZSA9IG11dGVyZWFkICE9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZGlyZWN0aW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNraXBTdWJDaGFubmVsID8gMSA6IDApOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0NBTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGRpcmVjdGlvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihza2lwU3ViQ2hhbm5lbCA/IDEgOiAwKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNURVAsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN1YkNoYW5uZWwpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoVFVORSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBjYW5jZWwoKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ0FOQ0VMLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJhZGlvX21ldGFkYXRhX3QgKm1ldGFkYXRhID0gaW5mby0+bWV0YWRhdGE7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUFJPR1JBTV9JTkZPUk1BVElPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQoaW5mbywgc2l6ZW9mKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8pKTsKKyAgICAgICAgICAgICAgICBpbmZvLT5tZXRhZGF0YSA9IG1ldGFkYXRhOworICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpemVfdCBzaXplID0gKHNpemVfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1ldGFkYXRhID0KKyAgICAgICAgICAgICAgICAgICAgKHJhZGlvX21ldGFkYXRhX3QgKiljYWxsb2Moc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBpbnQpLCBzaXplb2YodW5zaWduZWQgaW50KSk7CisgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbHkucmVhZChtZXRhZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcmFkaW9fbWV0YWRhdGFfYWRkX21ldGFkYXRhKCZpbmZvLT5tZXRhZGF0YSwgbWV0YWRhdGEpOworICAgICAgICAgICAgICAgIGZyZWUobWV0YWRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGlmIChoYXNDb250cm9sID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEhBU19DT05UUk9MLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgKmhhc0NvbnRyb2wgPSByZXBseS5yZWFkSW50MzIoKSAhPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFJhZGlvLCAiYW5kcm9pZC5oYXJkd2FyZS5JUmFkaW8iKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBCblJhZGlvOjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgY2FzZSBERVRBQ0g6IHsKKyAgICAgICAgICAgIEFMT0dWKCJERVRBQ0giKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGRldGFjaCgpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFVF9DT05GSUdVUkFUSU9OOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgY29uZmlnOworICAgICAgICAgICAgZGF0YS5yZWFkKCZjb25maWcsIHNpemVvZihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcpKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldENvbmZpZ3VyYXRpb24oJmNvbmZpZyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgR0VUX0NPTkZJR1VSQVRJT046IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyBjb25maWc7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRDb25maWd1cmF0aW9uKCZjb25maWcpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmNvbmZpZywgc2l6ZW9mKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgU0VUX01VVEU6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGJvb2wgbXV0ZSA9IGRhdGEucmVhZEludDMyKCkgIT0gMDsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldE11dGUobXV0ZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgR0VUX01VVEU6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGJvb2wgbXV0ZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldE11dGUoJm11dGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihtdXRlID8gMSA6IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgU0NBTjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gKHJhZGlvX2RpcmVjdGlvbl90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBib29sIHNraXBTdWJDaGFubmVsID0gZGF0YS5yZWFkSW50MzIoKSA9PSAxOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2NhbihkaXJlY3Rpb24sIHNraXBTdWJDaGFubmVsKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTVEVQOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSAocmFkaW9fZGlyZWN0aW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGJvb2wgc2tpcFN1YkNoYW5uZWwgPSBkYXRhLnJlYWRJbnQzMigpID09IDE7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGVwKGRpcmVjdGlvbiwgc2tpcFN1YkNoYW5uZWwpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRVTkU6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsID0gKHVuc2lnbmVkIGludClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwgPSAodW5zaWduZWQgaW50KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSB0dW5lKGNoYW5uZWwsIHN1YkNoYW5uZWwpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIENBTkNFTDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2FuY2VsKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgR0VUX1BST0dSQU1fSU5GT1JNQVRJT046IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gaW5mbzsKKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmFkaW9fbWV0YWRhdGFfYWxsb2NhdGUoJmluZm8ubWV0YWRhdGEsIDAsIDApOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBnZXRQcm9ncmFtSW5mb3JtYXRpb24oJmluZm8pOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmluZm8sIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvKSk7CisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gcmFkaW9fbWV0YWRhdGFfZ2V0X2NvdW50KGluZm8ubWV0YWRhdGEpOworICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUgPSByYWRpb19tZXRhZGF0YV9nZXRfc2l6ZShpbmZvLm1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShpbmZvLm1ldGFkYXRhLCBzaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByYWRpb19tZXRhZGF0YV9kZWFsbG9jYXRlKGluZm8ubWV0YWRhdGEpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgSEFTX0NPTlRST0w6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGJvb2wgY29udHJvbDsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGhhc0NvbnRyb2woJmNvbnRyb2wpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjb250cm9sID8gMSA6IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvcmFkaW8vSVJhZGlvQ2xpZW50LmNwcCBiL3JhZGlvL0lSYWRpb0NsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMzY2E0OQotLS0gL2Rldi9udWxsCisrKyBiL3JhZGlvL0lSYWRpb0NsaWVudC5jcHAKQEAgLTAsMCArMSw3NSBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBPTl9FVkVOVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCit9OworCitjbGFzcyBCcFJhZGlvQ2xpZW50OiBwdWJsaWMgQnBJbnRlcmZhY2U8SVJhZGlvQ2xpZW50PgoreworCitwdWJsaWM6CisgICAgQnBSYWRpb0NsaWVudChjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJUmFkaW9DbGllbnQ+KGltcGwpCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpb0NsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihldmVudE1lbW9yeSkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT05fRVZFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKKyAgICB9Cit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoUmFkaW9DbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuSVJhZGlvQ2xpZW50Iik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQm5SYWRpb0NsaWVudDo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQoreworICAgIHN3aXRjaChjb2RlKSB7CisgICAgICAgIGNhc2UgT05fRVZFTlQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW9DbGllbnQsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oCisgICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgb25FdmVudChldmVudE1lbW9yeSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0gICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3JhZGlvL0lSYWRpb1NlcnZpY2UuY3BwIGIvcmFkaW8vSVJhZGlvU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyYjNlZgotLS0gL2Rldi9udWxsCisrKyBiL3JhZGlvL0lSYWRpb1NlcnZpY2UuY3BwCkBAIC0wLDAgKzEsMTgxIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIExPR19UQUcgIkJwUmFkaW9TZXJ2aWNlIgorLy8KKyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKworI2luY2x1ZGUgPHJhZGlvL0lSYWRpb1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KKyNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBMSVNUX01PRFVMRVMgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIEFUVEFDSCwKK307CisKKyNkZWZpbmUgTUFYX0lURU1TX1BFUl9MSVNUIDEwMjQKKworY2xhc3MgQnBSYWRpb1NlcnZpY2U6IHB1YmxpYyBCcEludGVyZmFjZTxJUmFkaW9TZXJ2aWNlPgoreworcHVibGljOgorICAgIEJwUmFkaW9TZXJ2aWNlKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElSYWRpb1NlcnZpY2U+KGltcGwpCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdE1vZHVsZXMoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKKyAgICB7CisgICAgICAgIGlmIChudW1Nb2R1bGVzID09IE5VTEwgfHwgKCpudW1Nb2R1bGVzICE9IDAgJiYgcHJvcGVydGllcyA9PSBOVUxMKSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW9TZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTW9kdWxlc1JlcSA9IChwcm9wZXJ0aWVzID09IE5VTEwpID8gMCA6ICpudW1Nb2R1bGVzOworICAgICAgICBkYXRhLndyaXRlSW50MzIobnVtTW9kdWxlc1JlcSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX01PRFVMRVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgICpudW1Nb2R1bGVzID0gKHVuc2lnbmVkIGludClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigibGlzdE1vZHVsZXMoKSBzdGF0dXMgJWQgZ290ICpudW1Nb2R1bGVzICVkIiwgc3RhdHVzLCAqbnVtTW9kdWxlcyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gKm51bU1vZHVsZXMpIHsKKyAgICAgICAgICAgICAgICBudW1Nb2R1bGVzUmVxID0gKm51bU1vZHVsZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+IDApIHsKKyAgICAgICAgICAgICAgICByZXBseS5yZWFkKHByb3BlcnRpZXMsIG51bU1vZHVsZXNSZXEgKiBzaXplb2Yoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVJhZGlvPiYgcmFkaW8pCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW9TZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaGFuZGxlKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpKTsKKyAgICAgICAgQUxPR1YoImF0dGFjaCgpIGNvbmZpZyAlcCB3aXRoQXVkaW8gJWQgcmVnaW9uICVkIHR5cGUgJWQiLCBjb25maWcsIHdpdGhBdWRpbywgY29uZmlnLT5yZWdpb24sIGNvbmZpZy0+YmFuZC50eXBlKTsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICBkYXRhLndyaXRlKGNvbmZpZywgc2l6ZW9mKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZykpOworICAgICAgICB9CisgICAgICAgIGRhdGEud3JpdGVJbnQzMih3aXRoQXVkaW8gPyAxIDogMCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBVFRBQ0gsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChyZXBseS5yZWFkSW50MzIoKSAhPSAwKSB7CisgICAgICAgICAgICByYWRpbyA9IGludGVyZmFjZV9jYXN0PElSYWRpbz4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShSYWRpb1NlcnZpY2UsICJhbmRyb2lkLmhhcmR3YXJlLklSYWRpb1NlcnZpY2UiKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBCblJhZGlvU2VydmljZTo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQoreworICAgIHN3aXRjaChjb2RlKSB7CisgICAgICAgIGNhc2UgTElTVF9NT0RVTEVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bU1vZHVsZXNSZXEgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKG51bU1vZHVsZXNSZXEgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKKyAgICAgICAgICAgICAgICBudW1Nb2R1bGVzUmVxID0gTUFYX0lURU1TX1BFUl9MSVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bU1vZHVsZXMgPSBudW1Nb2R1bGVzUmVxOworICAgICAgICAgICAgc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMgPQorICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKiljYWxsb2MobnVtTW9kdWxlc1JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcykpOworICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX01FTU9SWSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0TW9kdWxlcyhwcm9wZXJ0aWVzLCAmbnVtTW9kdWxlcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtTW9kdWxlcyk7CisgICAgICAgICAgICBBTE9HVigiTElTVF9NT0RVTEVTIHN0YXR1cyAlZCBnb3QgbnVtTW9kdWxlcyAlZCIsIHN0YXR1cywgbnVtTW9kdWxlcyk7CisKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+IG51bU1vZHVsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSA9IG51bU1vZHVsZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Nb2R1bGVzUmVxICogc2l6ZW9mKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKHByb3BlcnRpZXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgQVRUQUNIOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmFkaW9faGFuZGxlX3QgaGFuZGxlID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNwPElSYWRpb0NsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SVJhZGlvQ2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgY29uZmlnOworICAgICAgICAgICAgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWdQdHIgPSBOVUxMOworICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7CisgICAgICAgICAgICAgICAgY29uZmlnUHRyID0gJmNvbmZpZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvID0gZGF0YS5yZWFkSW50MzIoKSAhPSAwOworICAgICAgICAgICAgQUxPR1YoIkFUVEFDSCBjb25maWdQdHIgJXAgd2l0aEF1ZGlvICVkIiwgY29uZmlnUHRyLCB3aXRoQXVkaW8pOworICAgICAgICAgICAgc3A8SVJhZGlvPiByYWRpbzsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dGFjaChoYW5kbGUsIGNsaWVudCwgY29uZmlnUHRyLCB3aXRoQXVkaW8sIHJhZGlvKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAocmFkaW8gIT0gMCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihyYWRpbykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9yYWRpby9SYWRpby5jcHAgYi9yYWRpby9SYWRpby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MwNGZiMAotLS0gL2Rldi9udWxsCisrKyBiL3JhZGlvL1JhZGlvLmNwcApAQCAtMCwwICsxLDI4MyBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgKEMpIDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiUmFkaW8iCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisKKyNpbmNsdWRlIDxyYWRpby9SYWRpby5oPgorI2luY2x1ZGUgPHJhZGlvL0lSYWRpby5oPgorI2luY2x1ZGUgPHJhZGlvL0lSYWRpb1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KKyNpbmNsdWRlIDxyYWRpby9SYWRpb0NhbGxiYWNrLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKyAgICBzcDxJUmFkaW9TZXJ2aWNlPiAgICAgICAgICBnUmFkaW9TZXJ2aWNlOworICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgIGtSYWRpb1NlcnZpY2VQb2xsRGVsYXkgPSA1MDAwMDA7IC8vIDAuNXMKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICBrUmFkaW9TZXJ2aWNlTmFtZSAgICAgID0gIm1lZGlhLnJhZGlvIjsKKyAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICBnTG9jazsKKworICAgIGNsYXNzIERlYXRoTm90aWZpZXIgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBEZWF0aE5vdGlmaWVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgeworICAgICAgICAgICAgQUxPR1YoImJpbmRlckRpZWQiKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgICAgICAgICBnUmFkaW9TZXJ2aWNlLmNsZWFyKCk7CisgICAgICAgICAgICBBTE9HVygiUmFkaW8gc2VydmljZSBkaWVkISIpOworICAgICAgICB9CisgICAgfTsKKworICAgIHNwPERlYXRoTm90aWZpZXI+ICAgICAgICAgZ0RlYXRoTm90aWZpZXI7Cit9OyAvLyBuYW1lc3BhY2UgYW5vbnltb3VzCisKK2NvbnN0IHNwPElSYWRpb1NlcnZpY2U+IFJhZGlvOjpnZXRSYWRpb1NlcnZpY2UoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgaWYgKGdSYWRpb1NlcnZpY2UuZ2V0KCkgPT0gMCkgeworICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlcjsKKyAgICAgICAgZG8geworICAgICAgICAgICAgYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoa1JhZGlvU2VydmljZU5hbWUpKTsKKyAgICAgICAgICAgIGlmIChiaW5kZXIgIT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1coIlJhZGlvU2VydmljZSBub3QgcHVibGlzaGVkLCB3YWl0aW5nLi4uIik7CisgICAgICAgICAgICB1c2xlZXAoa1JhZGlvU2VydmljZVBvbGxEZWxheSk7CisgICAgICAgIH0gd2hpbGUodHJ1ZSk7CisgICAgICAgIGlmIChnRGVhdGhOb3RpZmllciA9PSBOVUxMKSB7CisgICAgICAgICAgICBnRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKCk7CisgICAgICAgIH0KKyAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChnRGVhdGhOb3RpZmllcik7CisgICAgICAgIGdSYWRpb1NlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJUmFkaW9TZXJ2aWNlPihiaW5kZXIpOworICAgIH0KKyAgICBBTE9HRV9JRihnUmFkaW9TZXJ2aWNlID09IDAsICJubyBSYWRpb1NlcnZpY2UhPyIpOworICAgIHJldHVybiBnUmFkaW9TZXJ2aWNlOworfQorCisvLyBTdGF0aWMgbWV0aG9kcworc3RhdHVzX3QgUmFkaW86Omxpc3RNb2R1bGVzKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQoreworICAgIEFMT0dWKCJsaXN0TW9kdWxlcygpIik7CisgICAgY29uc3Qgc3A8SVJhZGlvU2VydmljZT4gc2VydmljZSA9IGdldFJhZGlvU2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBzZXJ2aWNlLT5saXN0TW9kdWxlcyhwcm9wZXJ0aWVzLCBudW1Nb2R1bGVzKTsKK30KKworc3A8UmFkaW8+IFJhZGlvOjphdHRhY2gocmFkaW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdpdGhBdWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFJhZGlvQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBBTE9HVigiYXR0YWNoKCkiKTsKKyAgICBzcDxSYWRpbz4gcmFkaW87CisgICAgY29uc3Qgc3A8SVJhZGlvU2VydmljZT4gc2VydmljZSA9IGdldFJhZGlvU2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuIHJhZGlvOworICAgIH0KKyAgICByYWRpbyA9IG5ldyBSYWRpbyhoYW5kbGUsIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXJ2aWNlLT5hdHRhY2goaGFuZGxlLCByYWRpbywgY29uZmlnLCB3aXRoQXVkaW8sIHJhZGlvLT5tSVJhZGlvKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcmFkaW8tPm1JUmFkaW8gIT0gMCkgeworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihyYWRpby0+bUlSYWRpbyktPmxpbmtUb0RlYXRoKHJhZGlvKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiRXJyb3IgJWQgY29ubmVjdGluZyB0byByYWRpbyBzZXJ2aWNlIiwgc3RhdHVzKTsKKyAgICAgICAgcmFkaW8uY2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHJhZGlvOworfQorCisKKworLy8gUmFkaW8KK1JhZGlvOjpSYWRpbyhyYWRpb19oYW5kbGVfdCBoYW5kbGUsIGNvbnN0IHNwPFJhZGlvQ2FsbGJhY2s+JiBjYWxsYmFjaykKKyAgICA6IG1IYW5kbGUoaGFuZGxlKSwgbUNhbGxiYWNrKGNhbGxiYWNrKQoreworfQorCitSYWRpbzo6flJhZGlvKCkKK3sKKyAgICBpZiAobUlSYWRpbyAhPSAwKSB7CisgICAgICAgIG1JUmFkaW8tPmRldGFjaCgpOworICAgIH0KK30KKworCit2b2lkIFJhZGlvOjpkZXRhY2goKSB7CisgICAgQUxPR1YoImRldGFjaCgpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQ2FsbGJhY2suY2xlYXIoKTsKKyAgICBpZiAobUlSYWRpbyAhPSAwKSB7CisgICAgICAgIG1JUmFkaW8tPmRldGFjaCgpOworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtSVJhZGlvKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgbUlSYWRpbyA9IDA7CisgICAgfQorfQorCitzdGF0dXNfdCBSYWRpbzo6c2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVJhZGlvID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVJhZGlvLT5zZXRDb25maWd1cmF0aW9uKGNvbmZpZyk7Cit9CisKK3N0YXR1c190IFJhZGlvOjpnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JUmFkaW8gPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JUmFkaW8tPmdldENvbmZpZ3VyYXRpb24oY29uZmlnKTsKK30KKworc3RhdHVzX3QgUmFkaW86OnNldE11dGUoYm9vbCBtdXRlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JUmFkaW8gPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JUmFkaW8tPnNldE11dGUobXV0ZSk7Cit9CisKK3N0YXR1c190IFJhZGlvOjpnZXRNdXRlKGJvb2wgKm11dGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlSYWRpbyA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUlSYWRpby0+Z2V0TXV0ZShtdXRlKTsKK30KKworc3RhdHVzX3QgUmFkaW86OnNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJjaGFubmVsKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JUmFkaW8gPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JUmFkaW8tPnNjYW4oZGlyZWN0aW9uLCBza2lwU3ViY2hhbm5lbCk7Cit9CisKK3N0YXR1c190IFJhZGlvOjpzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViY2hhbm5lbCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVJhZGlvID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVJhZGlvLT5zdGVwKGRpcmVjdGlvbiwgc2tpcFN1YmNoYW5uZWwpOworfQorCitzdGF0dXNfdCBSYWRpbzo6dHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlSYWRpbyA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUlSYWRpby0+dHVuZShjaGFubmVsLCBzdWJDaGFubmVsKTsKK30KKworc3RhdHVzX3QgUmFkaW86OmNhbmNlbCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlSYWRpbyA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUlSYWRpby0+Y2FuY2VsKCk7Cit9CisKK3N0YXR1c190IFJhZGlvOjpnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVJhZGlvID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVJhZGlvLT5nZXRQcm9ncmFtSW5mb3JtYXRpb24oaW5mbyk7Cit9CisKK3N0YXR1c190IFJhZGlvOjpoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlSYWRpbyA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUlSYWRpby0+aGFzQ29udHJvbChoYXNDb250cm9sKTsKK30KKworCisvLyBCcFJhZGlvQ2xpZW50Cit2b2lkIFJhZGlvOjpvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RydWN0IHJhZGlvX2V2ZW50ICpldmVudCA9IChzdHJ1Y3QgcmFkaW9fZXZlbnQgKilldmVudE1lbW9yeS0+cG9pbnRlcigpOworICAgIC8vIHJlc3RvcmUgbG9jYWwgbWV0YWRhdGEgcG9pbnRlciBmcm9tIG9mZnNldAorICAgIHN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKKyAgICBjYXNlIFJBRElPX0VWRU5UX1RVTkVEOgorICAgIGNhc2UgUkFESU9fRVZFTlRfQUZfU1dJVENIOgorICAgICAgICBpZiAoZXZlbnQtPmluZm8ubWV0YWRhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgZXZlbnQtPmluZm8ubWV0YWRhdGEgPQorICAgICAgICAgICAgICAgICAgICAocmFkaW9fbWV0YWRhdGFfdCAqKSgoY2hhciAqKWV2ZW50ICsgKHNpemVfdClldmVudC0+aW5mby5tZXRhZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQURJT19FVkVOVF9NRVRBREFUQToKKyAgICAgICAgaWYgKGV2ZW50LT5tZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICBldmVudC0+bWV0YWRhdGEgPQorICAgICAgICAgICAgICAgICAgICAocmFkaW9fbWV0YWRhdGFfdCAqKSgoY2hhciAqKWV2ZW50ICsgKHNpemVfdClldmVudC0+bWV0YWRhdGEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgeworICAgICAgICBtQ2FsbGJhY2stPm9uRXZlbnQoZXZlbnQpOworICAgIH0KK30KKworCisvL0lCaW5kZXI6OkRlYXRoUmVjaXBpZW50Cit2b2lkIFJhZGlvOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEFMT0dXKCJSYWRpbyBzZXJ2ZXIgYmluZGVyIERpZWQgIik7CisgICAgbUlSYWRpbyA9IDA7CisgICAgc3RydWN0IHJhZGlvX2V2ZW50IGV2ZW50OworICAgIG1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihzdHJ1Y3QgcmFkaW9fZXZlbnQpKTsKKyAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfU0VSVkVSX0RJRUQ7CisgICAgZXZlbnQuc3RhdHVzID0gREVBRF9PQkpFQ1Q7CisgICAgaWYgKG1DYWxsYmFjayAhPSAwKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FdmVudCgmZXZlbnQpOworICAgIH0KK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKaW5kZXggNDRkMjU1My4uZGViY2RmOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKQEAgLTI5LDI5ICsyOSwyOCBAQAogCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotIyBDbGFuZysrIGFib3J0cyBvbiBBdWRpb01peGVyLmNwcCwKLSMgYi8xODM3Mzg2NiwgImRvIG5vdCBrbm93IGhvdyB0byBzcGxpdCB0aGlzIG9wZXJhdG9yLiIKLWlmZXEgKCQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLGFybSBhcm02NCksJChUQVJHRVRfQVJDSCkpCi0gICAgTE9DQUxfQ0xBTkcgOj0gZmFsc2UKLWVuZGlmCi0KIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAogICAgIEF1ZGlvRmxpbmdlci5jcHAgICAgICAgICAgICBcCiAgICAgVGhyZWFkcy5jcHAgICAgICAgICAgICAgICAgIFwKICAgICBUcmFja3MuY3BwICAgICAgICAgICAgICAgICAgXAorICAgIEF1ZGlvSHdEZXZpY2UuY3BwICAgICAgICAgICBcCisgICAgQXVkaW9TdHJlYW1PdXQuY3BwICAgICAgICAgIFwKKyAgICBTcGRpZlN0cmVhbU91dC5jcHAgICAgICAgICAgXAogICAgIEVmZmVjdHMuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgQXVkaW9NaXhlci5jcHAuYXJtICAgICAgICAgIFwKLSAgICBQYXRjaFBhbmVsLmNwcAotCi1MT0NBTF9TUkNfRklMRVMgKz0gU3RhdGVRdWV1ZS5jcHAKKyAgICBCdWZmZXJQcm92aWRlcnMuY3BwICAgICAgICAgXAorICAgIFBhdGNoUGFuZWwuY3BwICAgICAgICAgICAgICBcCisgICAgU3RhdGVRdWV1ZS5jcHAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSBcCisgICAgJChUT1BESVIpZXh0ZXJuYWwvc29uaWMgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJhdWRpb3Jlc2FtcGxlciBcCisgICAgbGliYXVkaW9zcGRpZiBcCiAgICAgbGliYXVkaW91dGlscyBcCiAgICAgbGliY29tbW9uX3RpbWVfY2xpZW50IFwKICAgICBsaWJjdXRpbHMgXApAQCAtNjQsNyArNjMsOCBAQAogICAgIGxpYmhhcmR3YXJlX2xlZ2FjeSBcCiAgICAgbGliZWZmZWN0cyBcCiAgICAgbGlicG93ZXJtYW5hZ2VyIFwKLSAgICBsaWJzZXJ2aWNldXRpbGl0eQorICAgIGxpYnNlcnZpY2V1dGlsaXR5IFwKKyAgICBsaWJzb25pYwogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICBsaWJzY2hlZHVsaW5nX3BvbGljeSBcCkBAIC03NCw5ICs3NCwxNyBAQAogTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9mbGluZ2VyCiBMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCiAKLUxPQ0FMX1NSQ19GSUxFUyArPSBGYXN0TWl4ZXIuY3BwIEZhc3RNaXhlclN0YXRlLmNwcCBBdWRpb1dhdGNoZG9nLmNwcAotTE9DQUxfU1JDX0ZJTEVTICs9IEZhc3RUaHJlYWQuY3BwIEZhc3RUaHJlYWRTdGF0ZS5jcHAKLUxPQ0FMX1NSQ19GSUxFUyArPSBGYXN0Q2FwdHVyZS5jcHAgRmFzdENhcHR1cmVTdGF0ZS5jcHAKK0xPQ0FMX1NSQ19GSUxFUyArPSBcCisgICAgQXVkaW9XYXRjaGRvZy5jcHAgICAgICAgIFwKKyAgICBGYXN0Q2FwdHVyZS5jcHAgICAgICAgICAgXAorICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlLmNwcCBcCisgICAgRmFzdENhcHR1cmVTdGF0ZS5jcHAgICAgIFwKKyAgICBGYXN0TWl4ZXIuY3BwICAgICAgICAgICAgXAorICAgIEZhc3RNaXhlckR1bXBTdGF0ZS5jcHAgICBcCisgICAgRmFzdE1peGVyU3RhdGUuY3BwICAgICAgIFwKKyAgICBGYXN0VGhyZWFkLmNwcCAgICAgICAgICAgXAorICAgIEZhc3RUaHJlYWREdW1wU3RhdGUuY3BwICBcCisgICAgRmFzdFRocmVhZFN0YXRlLmNwcAogCiBMT0NBTF9DRkxBR1MgKz0gLURTVEFURV9RVUVVRV9JTlNUQU5USUFUSU9OUz0nIlN0YXRlUXVldWVJbnN0YW50aWF0aW9ucy5jcHAiJwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDE4YmExYWUuLjllYzU4MDIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCkBAIC00NSw2ICs0NSw4IEBACiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCiAjaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KKwogI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfdmlzdWFsaXplci5oPgogI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X25zLmg+CkBAIC0xNzksMTMgKzE4MSwxNCBAQAogICAgICAgbUlzTG93UmFtRGV2aWNlKHRydWUpLAogICAgICAgbUlzRGV2aWNlVHlwZUtub3duKGZhbHNlKSwKICAgICAgIG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lKDApLAotICAgICAgbVByaW1hcnlPdXRwdXRTYW1wbGVSYXRlKDApCisgICAgICBtU3lzdGVtUmVhZHkoZmFsc2UpCiB7CiAgICAgZ2V0cGlkX2NhY2hlZCA9IGdldHBpZCgpOwogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKICAgICBib29sIGRvTG9nID0gKHByb3BlcnR5X2dldCgicm8udGVzdF9oYXJuZXNzIiwgdmFsdWUsICIwIikgPiAwKSAmJiAoYXRvaSh2YWx1ZSkgPT0gMSk7CiAgICAgaWYgKGRvTG9nKSB7Ci0gICAgICAgIG1Mb2dNZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKGtMb2dNZW1vcnlTaXplLCAiTG9nV3JpdGVycyIsIE1lbW9yeUhlYXBCYXNlOjpSRUFEX09OTFkpOworICAgICAgICBtTG9nTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrTG9nTWVtb3J5U2l6ZSwgIkxvZ1dyaXRlcnMiLAorICAgICAgICAgICAgICAgIE1lbW9yeUhlYXBCYXNlOjpSRUFEX09OTFkpOwogICAgIH0KIAogI2lmZGVmIFRFRV9TSU5LCkBAIC0yNzEsNyArMjc0LDcgQEAKIH07CiAjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZigoeCkpL3NpemVvZigoKHgpWzBdKSkpCiAKLUF1ZGlvRmxpbmdlcjo6QXVkaW9Id0RldmljZSogQXVkaW9GbGluZ2VyOjpmaW5kU3VpdGFibGVId0Rldl9sKAorQXVkaW9Id0RldmljZSogQXVkaW9GbGluZ2VyOjpmaW5kU3VpdGFibGVId0Rldl9sKAogICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAogICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKIHsKQEAgLTQwMSw2ICs0MDQsOSBAQAogICAgICAgICAgICAgU3RyaW5nOCByZXN1bHQoa0NsaWVudExvY2tlZFN0cmluZyk7CiAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICAgICAgfQorCisgICAgICAgIEVmZmVjdER1bXBFZmZlY3RzKGZkKTsKKwogICAgICAgICBkdW1wQ2xpZW50cyhmZCwgYXJncyk7CiAgICAgICAgIGlmIChjbGllbnRMb2NrZWQpIHsKICAgICAgICAgICAgIG1DbGllbnRMb2NrLnVubG9jaygpOwpAQCAtODI2LDE0ICs4MzIsMjAgQEAKICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0KKyAgICBib29sIG11dGUgPSB0cnVlOwogICAgIGJvb2wgc3RhdGUgPSBBVURJT19NT0RFX0lOVkFMSUQ7CiAgICAgQXV0b011dGV4IGxvY2sobUhhcmR3YXJlTG9jayk7Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldiA9IG1QcmltYXJ5SGFyZHdhcmVEZXYtPmh3RGV2aWNlKCk7CiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfR0VUX01JQ19NVVRFOwotICAgIGRldi0+Z2V0X21pY19tdXRlKGRldiwgJnN0YXRlKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0h3RGV2cy5zaXplKCk7IGkrKykgeworICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2ID0gbUF1ZGlvSHdEZXZzLnZhbHVlQXQoaSktPmh3RGV2aWNlKCk7CisgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGRldi0+Z2V0X21pY19tdXRlKGRldiwgJnN0YXRlKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbXV0ZSA9IG11dGUgJiYgc3RhdGU7CisgICAgICAgIH0KKyAgICB9CiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKLSAgICByZXR1cm4gc3RhdGU7CisKKyAgICByZXR1cm4gbXV0ZTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRNYXN0ZXJNdXRlKGJvb2wgbXV0ZWQpCkBAIC0xMDA5LDYgKzEwMjEsMTQgQEAKICAgICByZXR1cm4gc3RyZWFtTXV0ZV9sKHN0cmVhbSk7CiB9CiAKKwordm9pZCBBdWRpb0ZsaW5nZXI6OmJyb2FjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOworICAgIH0KK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQogewogICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXJzKCk6IGlvICVkLCBrZXl2YWx1ZSAlcywgY2FsbGluZyBwaWQgJWQiLApAQCAtMTA4Myw5ICsxMTAzLDcgQEAKICAgICAgICAgICAgIGludCB2YWx1ZTsKICAgICAgICAgICAgIGlmICgocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpICYmCiAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSAhPSAwKSkgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlY29yZFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbVJlY29yZFRocmVhZHMudmFsdWVBdChpKS0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2woa2V5VmFsdWVQYWlycyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTM4LDE5ICsxMTU2LDQ2IEBACiAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSB8fCAhYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAogICAgIEF1dG9NdXRleCBsb2NrKG1IYXJkd2FyZUxvY2spOwogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0dFVF9JTlBVVF9CVUZGRVJfU0laRTsKLSAgICBhdWRpb19jb25maWdfdCBjb25maWc7Ci0gICAgbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKLSAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlOwotICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzazsKLSAgICBjb25maWcuZm9ybWF0ID0gZm9ybWF0OworICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZywgcHJvcG9zZWQ7CisgICAgbWVtc2V0KCZwcm9wb3NlZCwgMCwgc2l6ZW9mKHByb3Bvc2VkKSk7CisgICAgcHJvcG9zZWQuc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlOworICAgIHByb3Bvc2VkLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOworICAgIHByb3Bvc2VkLmZvcm1hdCA9IGZvcm1hdDsKIAogICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXYgPSBtUHJpbWFyeUhhcmR3YXJlRGV2LT5od0RldmljZSgpOwotICAgIHNpemVfdCBzaXplID0gZGV2LT5nZXRfaW5wdXRfYnVmZmVyX3NpemUoZGV2LCAmY29uZmlnKTsKKyAgICBzaXplX3QgZnJhbWVzOworICAgIGZvciAoOzspIHsKKyAgICAgICAgLy8gTm90ZTogY29uZmlnIGlzIGN1cnJlbnRseSBhIGNvbnN0IHBhcmFtZXRlciBmb3IgZ2V0X2lucHV0X2J1ZmZlcl9zaXplKCkKKyAgICAgICAgLy8gYnV0IHdlIHVzZSBhIGNvcHkgZnJvbSBwcm9wb3NlZCBpbiBjYXNlIGNvbmZpZyBjaGFuZ2VzIGZyb20gdGhlIGNhbGwuCisgICAgICAgIGNvbmZpZyA9IHByb3Bvc2VkOworICAgICAgICBmcmFtZXMgPSBkZXYtPmdldF9pbnB1dF9idWZmZXJfc2l6ZShkZXYsICZjb25maWcpOworICAgICAgICBpZiAoZnJhbWVzICE9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOyAvLyBoYWwgc3VjY2VzcywgY29uZmlnIGlzIHRoZSByZXN1bHQKKyAgICAgICAgfQorICAgICAgICAvLyBjaGFuZ2Ugb25lIHBhcmFtZXRlciBvZiB0aGUgY29uZmlndXJhdGlvbiBlYWNoIGl0ZXJhdGlvbiB0byBhIG1vcmUgImNvbW1vbiIgdmFsdWUKKyAgICAgICAgLy8gdG8gc2VlIGlmIHRoZSBkZXZpY2Ugd2lsbCBzdXBwb3J0IGl0LgorICAgICAgICBpZiAocHJvcG9zZWQuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgICAgICBwcm9wb3NlZC5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAgICAgfSBlbHNlIGlmIChwcm9wb3NlZC5zYW1wbGVfcmF0ZSAhPSA0NDEwMCkgeyAvLyA0NC4xIGlzIGNsYWltZWQgYXMgbXVzdCBpbiBDREQgYXMgd2VsbCBhcworICAgICAgICAgICAgcHJvcG9zZWQuc2FtcGxlX3JhdGUgPSA0NDEwMDsgICAgICAgICAgIC8vIGxlZ2FjeSBBdWRpb1JlY29yZC5qYXZhLiBUT0RPOiBRdWVyeSBodz8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEJ1ZmZlclNpemUgZmFpbGVkIHdpdGggbWluaW11bSBidWZmZXIgc2l6ZSBzYW1wbGVSYXRlICV1LCAiCisgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAweCVYIiwKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CisgICAgICAgICAgICBicmVhazsgLy8gcmV0cmllcyBmYWlsZWQsIGJyZWFrIG91dCBvZiBsb29wIHdpdGggZnJhbWVzID09IDAuCisgICAgICAgIH0KKyAgICB9CiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKLSAgICByZXR1cm4gc2l6ZTsKKyAgICBpZiAoZnJhbWVzID4gMCAmJiBjb25maWcuc2FtcGxlX3JhdGUgIT0gc2FtcGxlUmF0ZSkgeworICAgICAgICBmcmFtZXMgPSBkZXN0aW5hdGlvbkZyYW1lc1Bvc3NpYmxlKGZyYW1lcywgc2FtcGxlUmF0ZSwgY29uZmlnLnNhbXBsZV9yYXRlKTsKKyAgICB9CisgICAgcmV0dXJuIGZyYW1lczsgLy8gbWF5IGJlIGNvbnZlcnRlZCB0byBieXRlcyBhdCB0aGUgSmF2YSBsZXZlbC4KIH0KIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0CkBAIC0xMjA2LDExICsxMjUxLDkgQEAKICAgICBpZiAoY2xpZW50ID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBib29sIGNsaWVudEFkZGVkID0gZmFsc2U7CisgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9jbChtQ2xpZW50TG9jayk7Ci0KLSAgICAgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleShwaWQpIDwgMCkgewogICAgICAgICAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBub3RpZmljYXRpb25DbGllbnQgPSBuZXcgTm90aWZpY2F0aW9uQ2xpZW50KHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwKQEAgLTEyMjEsMjIgKzEyNjQsMTkgQEAKIAogICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KTsKICAgICAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobm90aWZpY2F0aW9uQ2xpZW50KTsKLSAgICAgICAgICAgIGNsaWVudEFkZGVkID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8vIG1DbGllbnRMb2NrIHNob3VsZCBub3QgYmUgaGVsZCBoZXJlIGJlY2F1c2UgVGhyZWFkQmFzZTo6c2VuZElvQ29uZmlnRXZlbnQoKSB3aWxsIGxvY2sgdGhlCiAgICAgLy8gVGhyZWFkQmFzZSBtdXRleCBhbmQgdGhlIGxvY2tpbmcgb3JkZXIgaXMgVGhyZWFkQmFzZTo6bUxvY2sgdGhlbiBBdWRpb0ZsaW5nZXI6Om1DbGllbnRMb2NrLgotICAgIGlmIChjbGllbnRBZGRlZCkgewotICAgICAgICAvLyB0aGUgY29uZmlnIGNoYW5nZSBpcyBhbHdheXMgc2VudCBmcm9tIHBsYXliYWNrIG9yIHJlY29yZCB0aHJlYWRzIHRvIGF2b2lkIGRlYWRsb2NrCi0gICAgICAgIC8vIHdpdGggQXVkaW9TeXN0ZW06OmdMb2NrCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5zZW5kSW9Db25maWdFdmVudChBdWRpb1N5c3RlbTo6T1VUUFVUX09QRU5FRCk7Ci0gICAgICAgIH0KKyAgICAvLyB0aGUgY29uZmlnIGNoYW5nZSBpcyBhbHdheXMgc2VudCBmcm9tIHBsYXliYWNrIG9yIHJlY29yZCB0aHJlYWRzIHRvIGF2b2lkIGRlYWRsb2NrCisgICAgLy8gd2l0aCBBdWRpb1N5c3RlbTo6Z0xvY2sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5zZW5kSW9Db25maWdFdmVudChBVURJT19PVVRQVVRfT1BFTkVELCBwaWQpOworICAgIH0KIAotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWNvcmRUaHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5zZW5kSW9Db25maWdFdmVudChBdWRpb1N5c3RlbTo6SU5QVVRfT1BFTkVEKTsKLSAgICAgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlY29yZFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbVJlY29yZFRocmVhZHMudmFsdWVBdChpKS0+c2VuZElvQ29uZmlnRXZlbnQoQVVESU9fSU5QVVRfT1BFTkVELCBwaWQpOwogICAgIH0KIH0KIApAQCAtMTI2OSwxNCArMTMwOSwxNiBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCB2b2lkICpwYXJhbTIpCit2b2lkIEF1ZGlvRmxpbmdlcjo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+JiBpb0Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNsaWVudExvY2spOwogICAgIHNpemVfdCBzaXplID0gbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPmF1ZGlvRmxpbmdlckNsaWVudCgpLT5pb0NvbmZpZ0NoYW5nZWQoZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtMik7CisgICAgICAgIGlmICgocGlkID09IDApIHx8IChtTm90aWZpY2F0aW9uQ2xpZW50cy5rZXlBdChpKSA9PSBwaWQpKSB7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5hdWRpb0ZsaW5nZXJDbGllbnQoKS0+aW9Db25maWdDaGFuZ2VkKGV2ZW50LCBpb0Rlc2MpOworICAgICAgICB9CiAgICAgfQogfQogCkBAIC0xMzg1LDkgKzE0MjcsMTEgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCiAgICAgICAgIHNpemVfdCAqZnJhbWVDb3VudCwKICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgIHBpZF90IHRpZCwKKyAgICAgICAgaW50IGNsaWVudFVpZCwKICAgICAgICAgaW50ICpzZXNzaW9uSWQsCiAgICAgICAgIHNpemVfdCAqbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICBzcDxJTWVtb3J5PiYgY2JsaywKQEAgLTE0MDQsNyArMTQ0OCw3IEBACiAgICAgYnVmZmVycy5jbGVhcigpOwogCiAgICAgLy8gY2hlY2sgY2FsbGluZyBwZXJtaXNzaW9ucwotICAgIGlmICghcmVjb3JkaW5nQWxsb3dlZCgpKSB7CisgICAgaWYgKCFyZWNvcmRpbmdBbGxvd2VkKG9wUGFja2FnZU5hbWUpKSB7CiAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkKCkgcGVybWlzc2lvbiBkZW5pZWQ6IHJlY29yZGluZyBub3QgYWxsb3dlZCIpOwogICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgIGdvdG8gRXhpdDsKQEAgLTE0MTcsOSArMTQ2MSw4IEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICAvLyB3ZSBkb24ndCB5ZXQgc3VwcG9ydCBhbnl0aGluZyBvdGhlciB0aGFuIDE2LWJpdCBQQ00KLSAgICBpZiAoIShhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSAmJgotICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkpIHsKKyAgICAvLyB3ZSBkb24ndCB5ZXQgc3VwcG9ydCBhbnl0aGluZyBvdGhlciB0aGFuIGxpbmVhciBQQ00KKyAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpIHx8ICFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQoKSBpbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOwogICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIEV4aXQ7CkBAIC0xNDU4LDggKzE1MDEsNyBAQAogICAgICAgICAvLyBUT0RPOiB0aGUgdWlkIHNob3VsZCBiZSBwYXNzZWQgaW4gYXMgYSBwYXJhbWV0ZXIgdG8gb3BlblJlY29yZAogICAgICAgICByZWNvcmRUcmFjayA9IHRocmVhZC0+Y3JlYXRlUmVjb3JkVHJhY2tfbChjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGxTZXNzaW9uSWQsIG5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgdGlkLCAmbFN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgZmxhZ3MsIHRpZCwgJmxTdGF0dXMpOwogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChsU3RhdHVzID09IE5PX0VSUk9SKSAmJiAocmVjb3JkVHJhY2sgPT0gMCkpOwogCiAgICAgICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKSB7CkBAIC0xNjc4LDYgKzE3MjAsMjYgQEAKICAgICByZXR1cm4gKGF1ZGlvX2h3X3N5bmNfdCl2YWx1ZTsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzeXN0ZW1SZWFkeSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBTE9HSSgiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIGlmIChtU3lzdGVtUmVhZHkpIHsKKyAgICAgICAgQUxPR1coIiVzIGNhbGxlZCB0d2ljZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgbVN5c3RlbVJlYWR5ID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgVGhyZWFkQmFzZSAqdGhyZWFkID0gKFRocmVhZEJhc2UgKiltUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSkuZ2V0KCk7CisgICAgICAgIHRocmVhZC0+c3lzdGVtUmVhZHkoKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICBUaHJlYWRCYXNlICp0aHJlYWQgPSAoVGhyZWFkQmFzZSAqKW1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSkuZ2V0KCk7CisgICAgICAgIHRocmVhZC0+c3lzdGVtUmVhZHkoKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiAvLyBzZXRBdWRpb0h3U3luY0ZvclNlc3Npb25fbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6c2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uX2woUGxheWJhY2tUaHJlYWQgKnRocmVhZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKIHsKQEAgLTE3MTQsOCArMTc3Niw2IEBACiAKICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19PVVRQVVRfT1BFTjsKIAotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqb3V0U3RyZWFtID0gTlVMTDsKLQogICAgIC8vIEZPUiBURVNUSU5HIE9OTFk6CiAgICAgLy8gVGhpcyBpZiBzdGF0ZW1lbnQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIGF1ZGlvIHBvbGljeSBzZXR0aW5ncwogICAgIC8vIGFuZCBmb3JjaW5nIGEgc3BlY2lmaWMgZm9ybWF0IG9yIGNoYW5uZWwgbWFzayB0byB0aGUgSEFML1NpbmsgZGV2aWNlIGZvciB0ZXN0aW5nLgpAQCAtMTczNywzNyArMTc5NywzMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gaHdEZXZIYWwtPm9wZW5fb3V0cHV0X3N0cmVhbShod0RldkhhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgQXVkaW9TdHJlYW1PdXQgKm91dHB1dFN0cmVhbSA9IE5VTEw7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0SHdEZXYtPm9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgICAgICAmb3V0cHV0U3RyZWFtLAorICAgICAgICAgICAgKm91dHB1dCwKKyAgICAgICAgICAgIGRldmljZXMsCisgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgIGNvbmZpZywKKyAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCkpOwogCiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKLSAgICBBTE9HVigib3Blbk91dHB1dF9sKCkgb3Blbk91dHB1dFN0cmVhbSByZXR1cm5lZCBvdXRwdXQgJXAsIHNhbXBsZVJhdGUgJWQsIEZvcm1hdCAlI3gsICIKLSAgICAgICAgICAgICJjaGFubmVsTWFzayAlI3gsIHN0YXR1cyAlZCIsCi0gICAgICAgICAgICBvdXRTdHJlYW0sCi0gICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsCi0gICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIHN0YXR1cyk7CiAKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG91dFN0cmVhbSAhPSBOVUxMKSB7Ci0gICAgICAgIEF1ZGlvU3RyZWFtT3V0ICpvdXRwdXRTdHJlYW0gPSBuZXcgQXVkaW9TdHJlYW1PdXQob3V0SHdEZXYsIG91dFN0cmVhbSwgZmxhZ3MpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKIAogICAgICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkOwogICAgICAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSB7Ci0gICAgICAgICAgICB0aHJlYWQgPSBuZXcgT2ZmbG9hZFRocmVhZCh0aGlzLCBvdXRwdXRTdHJlYW0sICpvdXRwdXQsIGRldmljZXMpOworICAgICAgICAgICAgdGhyZWFkID0gbmV3IE9mZmxvYWRUaHJlYWQodGhpcywgb3V0cHV0U3RyZWFtLCAqb3V0cHV0LCBkZXZpY2VzLCBtU3lzdGVtUmVhZHkpOwogICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXRfbCgpIGNyZWF0ZWQgb2ZmbG9hZCBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsICpvdXRwdXQsIHRocmVhZCk7CiAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKQogICAgICAgICAgICAgICAgIHx8ICFpc1ZhbGlkUGNtU2lua0Zvcm1hdChjb25maWctPmZvcm1hdCkKICAgICAgICAgICAgICAgICB8fCAhaXNWYWxpZFBjbVNpbmtDaGFubmVsTWFzayhjb25maWctPmNoYW5uZWxfbWFzaykpIHsKLSAgICAgICAgICAgIHRocmVhZCA9IG5ldyBEaXJlY3RPdXRwdXRUaHJlYWQodGhpcywgb3V0cHV0U3RyZWFtLCAqb3V0cHV0LCBkZXZpY2VzKTsKKyAgICAgICAgICAgIHRocmVhZCA9IG5ldyBEaXJlY3RPdXRwdXRUaHJlYWQodGhpcywgb3V0cHV0U3RyZWFtLCAqb3V0cHV0LCBkZXZpY2VzLCBtU3lzdGVtUmVhZHkpOwogICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXRfbCgpIGNyZWF0ZWQgZGlyZWN0IG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwgKm91dHB1dCwgdGhyZWFkKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocmVhZCA9IG5ldyBNaXhlclRocmVhZCh0aGlzLCBvdXRwdXRTdHJlYW0sICpvdXRwdXQsIGRldmljZXMpOworICAgICAgICAgICAgdGhyZWFkID0gbmV3IE1peGVyVGhyZWFkKHRoaXMsIG91dHB1dFN0cmVhbSwgKm91dHB1dCwgZGV2aWNlcywgbVN5c3RlbVJlYWR5KTsKICAgICAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0X2woKSBjcmVhdGVkIG1peGVyIG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwgKm91dHB1dCwgdGhyZWFkKTsKICAgICAgICAgfQogICAgICAgICBtUGxheWJhY2tUaHJlYWRzLmFkZCgqb3V0cHV0LCB0aHJlYWQpOwpAQCAtMTc4NSw3ICsxODM4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQogewotICAgIEFMT0dWKCJvcGVuT3V0cHV0KCksIG1vZHVsZSAlZCBEZXZpY2UgJXgsIFNhbXBsaW5nUmF0ZSAlZCwgRm9ybWF0ICUjMDh4LCBDaGFubmVscyAleCwgZmxhZ3MgJXgiLAorICAgIEFMT0dJKCJvcGVuT3V0cHV0KCksIG1vZHVsZSAlZCBEZXZpY2UgJXgsIFNhbXBsaW5nUmF0ZSAlZCwgRm9ybWF0ICUjMDh4LCBDaGFubmVscyAleCwgZmxhZ3MgJXgiLAogICAgICAgICAgICAgICBtb2R1bGUsCiAgICAgICAgICAgICAgIChkZXZpY2VzICE9IE5VTEwpID8gKmRldmljZXMgOiAwLAogICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLApAQCAtMTgwNCw3ICsxODU3LDcgQEAKICAgICAgICAgKmxhdGVuY3lNcyA9IHRocmVhZC0+bGF0ZW5jeSgpOwogCiAgICAgICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgb3V0cHV0IGNyZWF0aW9uCi0gICAgICAgIHRocmVhZC0+YXVkaW9Db25maWdDaGFuZ2VkKEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEKTsKKyAgICAgICAgdGhyZWFkLT5pb0NvbmZpZ0NoYW5nZWQoQVVESU9fT1VUUFVUX09QRU5FRCk7CiAKICAgICAgICAgLy8gdGhlIGZpcnN0IHByaW1hcnkgb3V0cHV0IG9wZW5lZCBkZXNpZ25hdGVzIHRoZSBwcmltYXJ5IGh3IGRldmljZQogICAgICAgICBpZiAoKG1QcmltYXJ5SGFyZHdhcmVEZXYgPT0gTlVMTCkgJiYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkpIHsKQEAgLTE4MTUsOCArMTg2OCw2IEBACiAgICAgICAgICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19TRVRfTU9ERTsKICAgICAgICAgICAgIG1QcmltYXJ5SGFyZHdhcmVEZXYtPmh3RGV2aWNlKCktPnNldF9tb2RlKG1QcmltYXJ5SGFyZHdhcmVEZXYtPmh3RGV2aWNlKCksIG1Nb2RlKTsKICAgICAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7Ci0KLSAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSA9IGNvbmZpZy0+c2FtcGxlX3JhdGU7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KQEAgLTE4MzgsMTEgKzE4ODksMTEgQEAKICAgICB9CiAKICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCA9IG5leHRVbmlxdWVJZCgpOwotICAgIER1cGxpY2F0aW5nVGhyZWFkICp0aHJlYWQgPSBuZXcgRHVwbGljYXRpbmdUaHJlYWQodGhpcywgdGhyZWFkMSwgaWQpOworICAgIER1cGxpY2F0aW5nVGhyZWFkICp0aHJlYWQgPSBuZXcgRHVwbGljYXRpbmdUaHJlYWQodGhpcywgdGhyZWFkMSwgaWQsIG1TeXN0ZW1SZWFkeSk7CiAgICAgdGhyZWFkLT5hZGRPdXRwdXRUcmFjayh0aHJlYWQyKTsKICAgICBtUGxheWJhY2tUaHJlYWRzLmFkZChpZCwgdGhyZWFkKTsKICAgICAvLyBub3RpZnkgY2xpZW50IHByb2Nlc3NlcyBvZiB0aGUgbmV3IG91dHB1dCBjcmVhdGlvbgotICAgIHRocmVhZC0+YXVkaW9Db25maWdDaGFuZ2VkKEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEKTsKKyAgICB0aHJlYWQtPmlvQ29uZmlnQ2hhbmdlZChBVURJT19PVVRQVVRfT1BFTkVEKTsKICAgICByZXR1cm4gaWQ7CiB9CiAKQEAgLTE4OTEsNyArMTk0Miw5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChBdWRpb1N5c3RlbTo6T1VUUFVUX0NMT1NFRCwgb3V0cHV0LCBOVUxMKTsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGlvRGVzYyA9IG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpOworICAgICAgICBpb0Rlc2MtPm1Jb0hhbmRsZSA9IG91dHB1dDsKKyAgICAgICAgaW9Db25maWdDaGFuZ2VkKEFVRElPX09VVFBVVF9DTE9TRUQsIGlvRGVzYyk7CiAgICAgfQogICAgIHRocmVhZC0+ZXhpdCgpOwogICAgIC8vIFRoZSB0aHJlYWQgZW50aXR5IChhY3RpdmUgdW5pdCBvZiBleGVjdXRpb24pIGlzIG5vIGxvbmdlciBydW5uaW5nIGhlcmUsCkBAIC0xOTU0LDIyICsyMDA3LDIyIEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIGlmICgqZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgaWYgKCpkZXZpY2VzID09IEFVRElPX0RFVklDRV9OT05FKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3A8UmVjb3JkVGhyZWFkPiB0aHJlYWQgPSBvcGVuSW5wdXRfbChtb2R1bGUsIGlucHV0LCBjb25maWcsICpkZXZpY2UsIGFkZHJlc3MsIHNvdXJjZSwgZmxhZ3MpOworICAgIHNwPFJlY29yZFRocmVhZD4gdGhyZWFkID0gb3BlbklucHV0X2wobW9kdWxlLCBpbnB1dCwgY29uZmlnLCAqZGV2aWNlcywgYWRkcmVzcywgc291cmNlLCBmbGFncyk7CiAKICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgLy8gbm90aWZ5IGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIG5ldyBpbnB1dCBjcmVhdGlvbgotICAgICAgICB0aHJlYWQtPmF1ZGlvQ29uZmlnQ2hhbmdlZChBdWRpb1N5c3RlbTo6SU5QVVRfT1BFTkVEKTsKKyAgICAgICAgdGhyZWFkLT5pb0NvbmZpZ0NoYW5nZWQoQVVESU9fSU5QVVRfT1BFTkVEKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTE5NzgsMTIgKzIwMzEsMTIgQEAKIHNwPEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkPiBBdWRpb0ZsaW5nZXI6Om9wZW5JbnB1dF9sKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCiB7Ci0gICAgQXVkaW9Id0RldmljZSAqaW5Id0RldiA9IGZpbmRTdWl0YWJsZUh3RGV2X2wobW9kdWxlLCBkZXZpY2UpOworICAgIEF1ZGlvSHdEZXZpY2UgKmluSHdEZXYgPSBmaW5kU3VpdGFibGVId0Rldl9sKG1vZHVsZSwgZGV2aWNlcyk7CiAgICAgaWYgKGluSHdEZXYgPT0gTlVMTCkgewogICAgICAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xOTk2LDcgKzIwNDksNyBAQAogICAgIGF1ZGlvX2NvbmZpZ190IGhhbGNvbmZpZyA9ICpjb25maWc7CiAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmluSHdIYWwgPSBpbkh3RGV2LT5od0RldmljZSgpOwogICAgIGF1ZGlvX3N0cmVhbV9pbl90ICppblN0cmVhbSA9IE5VTEw7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5Id0hhbC0+b3Blbl9pbnB1dF9zdHJlYW0oaW5Id0hhbCwgKmlucHV0LCBkZXZpY2UsICZoYWxjb25maWcsCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5Id0hhbC0+b3Blbl9pbnB1dF9zdHJlYW0oaW5Id0hhbCwgKmlucHV0LCBkZXZpY2VzLCAmaGFsY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0cmVhbSwgZmxhZ3MsIGFkZHJlc3Muc3RyaW5nKCksIHNvdXJjZSk7CiAgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgb3BlbklucHV0U3RyZWFtIHJldHVybmVkIGlucHV0ICVwLCBTYW1wbGluZ1JhdGUgJWQiCiAgICAgICAgICAgICIsIEZvcm1hdCAlI3gsIENoYW5uZWxzICV4LCBmbGFncyAlI3gsIHN0YXR1cyAlZCBhZGRyICVzIiwKQEAgLTIwMDgsMTcgKzIwNjEsMTcgQEAKICAgICAgICAgICAgIHN0YXR1cywgYWRkcmVzcy5zdHJpbmcoKSk7CiAKICAgICAvLyBJZiB0aGUgaW5wdXQgY291bGQgbm90IGJlIG9wZW5lZCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycyBhbmQgd2UgY2FuIGhhbmRsZSB0aGUKLSAgICAvLyBjb252ZXJzaW9uIGludGVybmFsbHksIHRyeSB0byBvcGVuIGFnYWluIHdpdGggdGhlIHByb3Bvc2VkIHBhcmFtZXRlcnMuIFRoZSBBdWRpb0ZsaW5nZXIgY2FuCi0gICAgLy8gcmVzYW1wbGUgdGhlIGlucHV0IGFuZCBkbyBtb25vIHRvIHN0ZXJlbyBvciBzdGVyZW8gdG8gbW9ubyBjb252ZXJzaW9ucyBvbiAxNiBiaXQgUENNIGlucHV0cy4KKyAgICAvLyBjb252ZXJzaW9uIGludGVybmFsbHksIHRyeSB0byBvcGVuIGFnYWluIHdpdGggdGhlIHByb3Bvc2VkIHBhcmFtZXRlcnMuCiAgICAgaWYgKHN0YXR1cyA9PSBCQURfVkFMVUUgJiYKLSAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0ID09IGhhbGNvbmZpZy5mb3JtYXQgJiYgaGFsY29uZmlnLmZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAmJgotICAgICAgICAoaGFsY29uZmlnLnNhbXBsZV9yYXRlIDw9IDIgKiBjb25maWctPnNhbXBsZV9yYXRlKSAmJgorICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSAmJgorICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGhhbGNvbmZpZy5mb3JtYXQpICYmCisgICAgICAgIChoYWxjb25maWcuc2FtcGxlX3JhdGUgPD0gQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYICogY29uZmlnLT5zYW1wbGVfcmF0ZSkgJiYKICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGhhbGNvbmZpZy5jaGFubmVsX21hc2spIDw9IEZDQ18yKSAmJgogICAgICAgICAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY29uZmlnLT5jaGFubmVsX21hc2spIDw9IEZDQ18yKSkgewogICAgICAgICAvLyBGSVhNRSBkZXNjcmliZSB0aGUgY2hhbmdlIHByb3Bvc2VkIGJ5IEhBTCAoc2F2ZSBvbGQgdmFsdWVzIHNvIHdlIGNhbiBsb2cgdGhlbSBoZXJlKQogICAgICAgICBBTE9HVigib3BlbklucHV0X2woKSByZW9wZW5pbmcgd2l0aCBwcm9wb3NlZCBzYW1wbGluZyByYXRlIGFuZCBjaGFubmVsIG1hc2siKTsKICAgICAgICAgaW5TdHJlYW0gPSBOVUxMOwotICAgICAgICBzdGF0dXMgPSBpbkh3SGFsLT5vcGVuX2lucHV0X3N0cmVhbShpbkh3SGFsLCAqaW5wdXQsIGRldmljZSwgJmhhbGNvbmZpZywKKyAgICAgICAgc3RhdHVzID0gaW5Id0hhbC0+b3Blbl9pbnB1dF9zdHJlYW0oaW5Id0hhbCwgKmlucHV0LCBkZXZpY2VzLCAmaGFsY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdHJlYW0sIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UpOwogICAgICAgICAvLyBGSVhNRSBsb2cgdGhpcyBuZXcgc3RhdHVzOyBIQUwgc2hvdWxkIG5vdCBwcm9wb3NlIGFueSBmdXJ0aGVyIGNoYW5nZXMKICAgICB9CkBAIC0yMDgzLDcgKzIxMzYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5T3V0cHV0RGV2aWNlX2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeQogI2lmZGVmIFRFRV9TSU5LCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB0ZWVTaW5rCiAjZW5kaWYKQEAgLTIxNTIsNyArMjIwNiw5IEBACiAgICAgICAgICAgICAgICAgcHV0T3JwaGFuRWZmZWN0Q2hhaW5fbChjaGFpbik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKEF1ZGlvU3lzdGVtOjpJTlBVVF9DTE9TRUQsIGlucHV0LCBOVUxMKTsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGlvRGVzYyA9IG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpOworICAgICAgICBpb0Rlc2MtPm1Jb0hhbmRsZSA9IGlucHV0OworICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoQVVESU9fSU5QVVRfQ0xPU0VELCBpb0Rlc2MpOwogICAgICAgICBtUmVjb3JkVGhyZWFkcy5yZW1vdmVJdGVtKGlucHV0KTsKICAgICB9CiAgICAgLy8gRklYTUU6IGNhbGxpbmcgdGhyZWFkLT5leGl0KCkgd2l0aG91dCBtTG9jayBoZWxkIHNob3VsZCBub3QgYmUgbmVlZGVkIGFueW1vcmUgbm93IHRoYXQKQEAgLTI0MjgsNiArMjQ4NCw3IEBACiAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAogICAgICAgICBpbnQgc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKICAgICAgICAgaW50ICppZCwKICAgICAgICAgaW50ICplbmFibGVkKQpAQCAtMjUyNCw3ICsyNTgxLDcgQEAKIAogICAgICAgICAvLyBjaGVjayByZWNvcmRpbmcgcGVybWlzc2lvbiBmb3IgdmlzdWFsaXplcgogICAgICAgICBpZiAoKG1lbWNtcCgmZGVzYy50eXBlLCBTTF9JSURfVklTVUFMSVpBVElPTiwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSAmJgotICAgICAgICAgICAgIXJlY29yZGluZ0FsbG93ZWQoKSkgeworICAgICAgICAgICAgIXJlY29yZGluZ0FsbG93ZWQob3BQYWNrYWdlTmFtZSkpIHsKICAgICAgICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQpAQCAtMjgwOSwxMyArMjg2NiwxMyBAQAogCiAKIHN0cnVjdCBFbnRyeSB7Ci0jZGVmaW5lIE1BWF9OQU1FIDMyICAgICAvLyAlWSVtJWQlSCVNJVNfJWQud2F2Ci0gICAgY2hhciBtTmFtZVtNQVhfTkFNRV07CisjZGVmaW5lIFRFRV9NQVhfRklMRU5BTUUgMzIgLy8gJVklbSVkJUglTSVTXyVkLndhdiA9IDQrMisyKzIrMisyKzErMSs0KzEgPSAyMQorICAgIGNoYXIgbUZpbGVOYW1lW1RFRV9NQVhfRklMRU5BTUVdOwogfTsKIAogaW50IGNvbXBhckVudHJ5KGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKIHsKLSAgICByZXR1cm4gc3RyY21wKCgoY29uc3QgRW50cnkgKikgcDEpLT5tTmFtZSwgKChjb25zdCBFbnRyeSAqKSBwMiktPm1OYW1lKTsKKyAgICByZXR1cm4gc3RyY21wKCgoY29uc3QgRW50cnkgKikgcDEpLT5tRmlsZU5hbWUsICgoY29uc3QgRW50cnkgKikgcDIpLT5tRmlsZU5hbWUpOwogfQogCiAjaWZkZWYgVEVFX1NJTksKQEAgLTI4MzQsMTEgKzI4OTEsMTEgQEAKICAgICAgICAgRElSICpkaXIgPSBvcGVuZGlyKHRlZVBhdGgpOwogICAgICAgICB0ZWVQYXRoW3RlZVBhdGhMZW4rK10gPSAnLyc7CiAgICAgICAgIGlmIChkaXIgIT0gTlVMTCkgewotI2RlZmluZSBNQVhfU09SVCAyMCAvLyBudW1iZXIgb2YgZW50cmllcyB0byBzb3J0Ci0jZGVmaW5lIE1BWF9LRUVQIDEwIC8vIG51bWJlciBvZiBlbnRyaWVzIHRvIGtlZXAKLSAgICAgICAgICAgIHN0cnVjdCBFbnRyeSBlbnRyaWVzW01BWF9TT1JUXTsKKyNkZWZpbmUgVEVFX01BWF9TT1JUIDIwIC8vIG51bWJlciBvZiBlbnRyaWVzIHRvIHNvcnQKKyNkZWZpbmUgVEVFX01BWF9LRUVQIDEwIC8vIG51bWJlciBvZiBlbnRyaWVzIHRvIGtlZXAKKyAgICAgICAgICAgIHN0cnVjdCBFbnRyeSBlbnRyaWVzW1RFRV9NQVhfU09SVF07CiAgICAgICAgICAgICBzaXplX3QgZW50cnlDb3VudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoZW50cnlDb3VudCA8IE1BWF9TT1JUKSB7CisgICAgICAgICAgICB3aGlsZSAoZW50cnlDb3VudCA8IFRFRV9NQVhfU09SVCkgewogICAgICAgICAgICAgICAgIHN0cnVjdCBkaXJlbnQgZGU7CiAgICAgICAgICAgICAgICAgc3RydWN0IGRpcmVudCAqcmVzdWx0ID0gTlVMTDsKICAgICAgICAgICAgICAgICBpbnQgcmMgPSByZWFkZGlyX3IoZGlyLCAmZGUsICZyZXN1bHQpOwpAQCAtMjg1NSwxNyArMjkxMiwxNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgbm9uIC53YXYgZmlsZSBlbnRyaWVzCiAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVMZW4gPSBzdHJsZW4oZGUuZF9uYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZUxlbiA8PSA0IHx8IG5hbWVMZW4gPj0gTUFYX05BTUUgfHwKKyAgICAgICAgICAgICAgICBpZiAobmFtZUxlbiA8PSA0IHx8IG5hbWVMZW4gPj0gVEVFX01BWF9GSUxFTkFNRSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKCZkZS5kX25hbWVbbmFtZUxlbiAtIDRdLCAiLndhdiIpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdHJjcHkoZW50cmllc1tlbnRyeUNvdW50KytdLm1OYW1lLCBkZS5kX25hbWUpOworICAgICAgICAgICAgICAgIHN0cmNweShlbnRyaWVzW2VudHJ5Q291bnQrK10ubUZpbGVOYW1lLCBkZS5kX25hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKHZvaWQpIGNsb3NlZGlyKGRpcik7Ci0gICAgICAgICAgICBpZiAoZW50cnlDb3VudCA+IE1BWF9LRUVQKSB7CisgICAgICAgICAgICBpZiAoZW50cnlDb3VudCA+IFRFRV9NQVhfS0VFUCkgewogICAgICAgICAgICAgICAgIHFzb3J0KGVudHJpZXMsIGVudHJ5Q291bnQsIHNpemVvZihFbnRyeSksIGNvbXBhckVudHJ5KTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5Q291bnQgLSBNQVhfS0VFUDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmNweSgmdGVlUGF0aFt0ZWVQYXRoTGVuXSwgZW50cmllc1tpXS5tTmFtZSk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUNvdW50IC0gVEVFX01BWF9LRUVQOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZ0ZWVQYXRoW3RlZVBhdGhMZW5dLCBlbnRyaWVzW2ldLm1GaWxlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICh2b2lkKSB1bmxpbmsodGVlUGF0aCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjk0OSw0ICszMDA2LDQgQEAKICAgICByZXR1cm4gQm5BdWRpb0ZsaW5nZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAppbmRleCBhYTBhZjFmLi4yMGMzNGVmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCkBAIC01Niw2ICs1Niw5IEBACiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KICNpbmNsdWRlICJBdWRpb1dhdGNoZG9nLmgiCiAjaW5jbHVkZSAiQXVkaW9NaXhlci5oIgorI2luY2x1ZGUgIkF1ZGlvU3RyZWFtT3V0LmgiCisjaW5jbHVkZSAiU3BkaWZTdHJlYW1PdXQuaCIKKyNpbmNsdWRlICJBdWRpb0h3RGV2aWNlLmgiCiAKICNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvSVBvd2VyTWFuYWdlci5oPgogCkBAIC03MCwxOCArNzMsMTggQEAKIGNsYXNzIEF1ZGlvQnVmZmVyOwogY2xhc3MgQXVkaW9SZXNhbXBsZXI7CiBjbGFzcyBGYXN0TWl4ZXI7CitjbGFzcyBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyOwogY2xhc3MgU2VydmVyUHJveHk7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gQXVkaW9GbGluZ2VyIGhhcyBhIGhhcmQtY29kZWQgdXBwZXIgbGltaXQgb2YgMiBjaGFubmVscyBmb3IgY2FwdHVyZSBhbmQgcGxheWJhY2suCi0vLyBUaGVyZSBpcyBzdXBwb3J0IGZvciA+IDIgY2hhbm5lbCB0cmFja3MgZG93bi1taXhlZCB0byAyIGNoYW5uZWwgb3V0cHV0IHZpYSBhIGRvd24tbWl4IGVmZmVjdC4KLS8vIEFkZGluZyBmdWxsIHN1cHBvcnQgZm9yID4gMiBjaGFubmVsIGNhcHR1cmUgb3IgcGxheWJhY2sgd291bGQgcmVxdWlyZSBtb3JlIHRoYW4gc2ltcGx5IGNoYW5naW5nCi0vLyB0aGlzICNkZWZpbmUuICBUaGVyZSBpcyBhbiBpbmRlcGVuZGVudCBoYXJkLWNvZGVkIHVwcGVyIGxpbWl0IGluIEF1ZGlvTWl4ZXI7Ci0vLyByZW1vdmluZyB0aGF0IEF1ZGlvTWl4ZXIgbGltaXQgd291bGQgYmUgbmVjZXNzYXJ5IGJ1dCBpbnN1ZmZpY2llbnQgdG8gc3VwcG9ydCA+IDIgY2hhbm5lbHMuCi0vLyBUaGUgbWFjcm8gRkNDXzIgaGlnaGxpZ2h0cyBzb21lIChidXQgbm90IGFsbCkgcGxhY2VzIHdoZXJlIHRoZXJlIGlzIGFyZSAyLWNoYW5uZWwgYXNzdW1wdGlvbnMuCisvLyBUaGUgbWFjcm8gRkNDXzIgaGlnaGxpZ2h0cyBzb21lIChidXQgbm90IGFsbCkgcGxhY2VzIHdoZXJlIHRoZXJlIGFyZSBhcmUgMi1jaGFubmVsIGFzc3VtcHRpb25zLgorLy8gVGhpcyBpcyB0eXBpY2FsbHkgZHVlIHRvIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiBvZiBzdGVyZW8gaW5wdXQgb3Igb3V0cHV0LgogLy8gU2VhcmNoIGFsc28gZm9yICIyIiwgImxlZnQiLCAicmlnaHQiLCAiWzBdIiwgIlsxXSIsICI+PiAxNiIsICI8PCAxNiIsIGV0Yy4KICNkZWZpbmUgRkNDXzIgMiAgICAgLy8gRkNDXzIgPSBGaXhlZCBDaGFubmVsIENvdW50IDIKKy8vIFRoZSBtYWNybyBGQ0NfOCBoaWdobGlnaHRzIHBsYWNlcyB3aGVyZSB0aGVyZSBhcmUgOC1jaGFubmVsIGFzc3VtcHRpb25zLgorLy8gVGhpcyBpcyB0eXBpY2FsbHkgZHVlIHRvIGF1ZGlvIG1peGVyIGFuZCByZXNhbXBsZXIgbGltaXRhdGlvbnMuCisjZGVmaW5lIEZDQ184IDggICAgIC8vIEZDQ184ID0gRml4ZWQgQ2hhbm5lbCBDb3VudCA4CiAKIHN0YXRpYyBjb25zdCBuc2Vjc190IGtEZWZhdWx0U3RhbmRieVRpbWVJbk5zZWNzID0gc2Vjb25kcygzKTsKIApAQCAtMTE3LDkgKzEyMCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiYgY2JsaywKQEAgLTIxMyw2ICsyMTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkKTsKQEAgLTI1MSw2ICsyNTcsOSBAQAogICAgIC8qIEdldCB0aGUgSFcgc3luY2hyb25pemF0aW9uIHNvdXJjZSB1c2VkIGZvciBhbiBhdWRpbyBzZXNzaW9uICovCiAgICAgdmlydHVhbCBhdWRpb19od19zeW5jX3QgZ2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwogCisgICAgLyogSW5kaWNhdGUgSkFWQSBzZXJ2aWNlcyBhcmUgcmVhZHkgKHNjaGVkdWxpbmcsIHBvd2VyIG1hbmFnZW1lbnQgLi4uKSAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3lzdGVtUmVhZHkoKTsKKwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKQEAgLTMxMSw3ICszMjAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwPFJlZkJhc2U+IGNvb2tpZSk7CiAKIHByaXZhdGU6Ci0gICAgY2xhc3MgQXVkaW9Id0RldmljZTsgICAgLy8gZndkIGRlY2xhcmF0aW9uIGZvciBmaW5kU3VpdGFibGVId0Rldl9sCiAKICAgICAgICAgICAgICAgIGF1ZGlvX21vZGVfdCBnZXRNb2RlKCkgY29uc3QgeyByZXR1cm4gbU1vZGU7IH0KIApAQCAtMzUxLDYgKzM1OSwxNSBAQAogICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBjaGFubmVsTWFzayBpcyB0aGUgImNhbm9uaWNhbCIgb25lIHdlIGV4cGVjdCBmb3IgdGhlIGNoYW5uZWxDb3VudC4KICAgICAgICAgICAgIHJldHVybiBjaGFubmVsTWFzayA9PSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KTsKICAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYOgorICAgICAgICAgICAgaWYgKGtFbmFibGVFeHRlbmRlZENoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbENvdW50ID49IEZDQ18yIC8vIG1vbm8gaXMgbm90IHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGNoYW5uZWxDb3VudCA8PSBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtNDQ5LDcgKzQ2Niw3IEBACiAgICAgY2xhc3MgRWZmZWN0TW9kdWxlOwogICAgIGNsYXNzIEVmZmVjdEhhbmRsZTsKICAgICBjbGFzcyBFZmZlY3RDaGFpbjsKLSAgICBzdHJ1Y3QgQXVkaW9TdHJlYW1PdXQ7CisKICAgICBzdHJ1Y3QgQXVkaW9TdHJlYW1JbjsKIAogICAgIHN0cnVjdCAgc3RyZWFtX3R5cGVfdCB7CkBAIC01NDEsNyArNTU4LDkgQEAKICAgICAgICAgICAgICAgLy8gbm8gcmFuZ2UgY2hlY2ssIGRvZXNuJ3QgY2hlY2sgcGVyLXRocmVhZCBzdHJlYW0gdm9sdW1lLCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKICAgICAgICAgICAgICAgZmxvYXQgc3RyZWFtVm9sdW1lX2woYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1TdHJlYW1UeXBlc1tzdHJlYW1dLnZvbHVtZTsgfQotICAgICAgICAgICAgICB2b2lkIGF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCB2b2lkICpwYXJhbTIpOworICAgICAgICAgICAgICB2b2lkIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiYgaW9EZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAwKTsKIAogICAgICAgICAgICAgICAvLyBBbGxvY2F0ZSBhbiBhdWRpb19pb19oYW5kbGVfdCwgc2Vzc2lvbiBJRCwgZWZmZWN0IElELCBvciBhdWRpb19tb2R1bGVfaGFuZGxlX3QuCiAgICAgICAgICAgICAgIC8vIFRoZXkgYWxsIHNoYXJlIHRoZSBzYW1lIElEIHNwYWNlLCBidXQgdGhlIG5hbWVzcGFjZXMgYXJlIGFjdHVhbGx5IGluZGVwZW5kZW50CkBAIC01ODYsNTcgKzYwNSwxMiBAQAogICAgICAgICAgICAgICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBlZmZlY3Qgd2FzIGZvdW5kIGluIG1PcnBoYW5FZmZlY3RDaGFpbnMsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgdXBkYXRlT3JwaGFuRWZmZWN0Q2hhaW5zKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CiAKLSAgICBjbGFzcyBBdWRpb0h3RGV2aWNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGVudW0gRmxhZ3MgewotICAgICAgICAgICAgQUhXRF9DQU5fU0VUX01BU1RFUl9WT0xVTUUgID0gMHgxLAotICAgICAgICAgICAgQUhXRF9DQU5fU0VUX01BU1RFUl9NVVRFICAgID0gMHgyLAotICAgICAgICB9OworICAgICAgICAgICAgICAgIHZvaWQgYnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CiAKLSAgICAgICAgQXVkaW9Id0RldmljZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZsYWdzIGZsYWdzKQotICAgICAgICAgICAgOiBtSGFuZGxlKGhhbmRsZSksIG1Nb2R1bGVOYW1lKHN0cmR1cChtb2R1bGVOYW1lKSkKLSAgICAgICAgICAgICwgbUh3RGV2aWNlKGh3RGV2aWNlKQotICAgICAgICAgICAgLCBtRmxhZ3MoZmxhZ3MpIHsgfQotICAgICAgICAvKnZpcnR1YWwqLyB+QXVkaW9Id0RldmljZSgpIHsgZnJlZSgodm9pZCAqKW1Nb2R1bGVOYW1lKTsgfQotCi0gICAgICAgIGJvb2wgY2FuU2V0TWFzdGVyVm9sdW1lKCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuICgwICE9IChtRmxhZ3MgJiBBSFdEX0NBTl9TRVRfTUFTVEVSX1ZPTFVNRSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBjYW5TZXRNYXN0ZXJNdXRlKCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuICgwICE9IChtRmxhZ3MgJiBBSFdEX0NBTl9TRVRfTUFTVEVSX01VVEUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9Ci0gICAgICAgIGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUoKSBjb25zdCB7IHJldHVybiBtTW9kdWxlTmFtZTsgfQotICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSHdEZXZpY2U7IH0KLSAgICAgICAgdWludDMyX3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb247IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGNvbnN0IGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtSGFuZGxlOwotICAgICAgICBjb25zdCBjaGFyICogY29uc3QgbU1vZHVsZU5hbWU7Ci0gICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICogY29uc3QgbUh3RGV2aWNlOwotICAgICAgICBjb25zdCBGbGFncyBtRmxhZ3M7Ci0gICAgfTsKLQotICAgIC8vIEF1ZGlvU3RyZWFtT3V0IGFuZCBBdWRpb1N0cmVhbUluIGFyZSBpbW11dGFibGUsIHNvIHRoZWlyIGZpZWxkcyBhcmUgY29uc3QuCisgICAgLy8gQXVkaW9TdHJlYW1JbiBpcyBpbW11dGFibGUsIHNvIHRoZWlyIGZpZWxkcyBhcmUgY29uc3QuCiAgICAgLy8gRm9yIGVtcGhhc2lzLCB3ZSBjb3VsZCBhbHNvIG1ha2UgYWxsIHBvaW50ZXJzIHRvIHRoZW0gYmUgImNvbnN0ICoiLAogICAgIC8vIGJ1dCB0aGF0IHdvdWxkIGNsdXR0ZXIgdGhlIGNvZGUgdW5uZWNlc3NhcmlseS4KIAotICAgIHN0cnVjdCBBdWRpb1N0cmVhbU91dCB7Ci0gICAgICAgIEF1ZGlvSHdEZXZpY2UqIGNvbnN0IGF1ZGlvSHdEZXY7Ci0gICAgICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCogY29uc3Qgc3RyZWFtOwotICAgICAgICBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnczsKLQotICAgICAgICBhdWRpb19od19kZXZpY2VfdCogaHdEZXYoKSBjb25zdCB7IHJldHVybiBhdWRpb0h3RGV2LT5od0RldmljZSgpOyB9Ci0KLSAgICAgICAgQXVkaW9TdHJlYW1PdXQoQXVkaW9Id0RldmljZSAqZGV2LCBhdWRpb19zdHJlYW1fb3V0X3QgKm91dCwgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpIDoKLSAgICAgICAgICAgIGF1ZGlvSHdEZXYoZGV2KSwgc3RyZWFtKG91dCksIGZsYWdzKGZsYWdzKSB7fQotICAgIH07Ci0KICAgICBzdHJ1Y3QgQXVkaW9TdHJlYW1JbiB7CiAgICAgICAgIEF1ZGlvSHdEZXZpY2UqIGNvbnN0IGF1ZGlvSHdEZXY7CiAgICAgICAgIGF1ZGlvX3N0cmVhbV9pbl90KiBjb25zdCBzdHJlYW07CkBAIC03ODksMTYgKzc2MywxOSBAQAogCiAgICAgc3A8UGF0Y2hQYW5lbD4gbVBhdGNoUGFuZWw7CiAKLSAgICB1aW50MzJfdCAgICBtUHJpbWFyeU91dHB1dFNhbXBsZVJhdGU7ICAgLy8gc2FtcGxlIHJhdGUgb2YgdGhlIHByaW1hcnkgb3V0cHV0LCBvciB6ZXJvIGlmIG5vbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IG1IYXJkd2FyZUxvY2sKKyAgICBib29sICAgICAgICBtU3lzdGVtUmVhZHk7CiB9OwogCiAjdW5kZWYgSU5DTFVESU5HX0ZST01fQVVESU9GTElOR0VSX0gKIAogY29uc3QgY2hhciAqZm9ybWF0VG9TdHJpbmcoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKK1N0cmluZzggaW5wdXRGbGFnc1RvU3RyaW5nKGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworU3RyaW5nOCBvdXRwdXRGbGFnc1RvU3RyaW5nKGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKK1N0cmluZzggZGV2aWNlc1RvU3RyaW5nKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKTsKK2NvbnN0IGNoYXIgKnNvdXJjZVRvU3RyaW5nKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfQVVESU9fRkxJTkdFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE5MTU5OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmNwcApAQCAtMCwwICsxLDk3IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvSHdEZXZpY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc3BkaWYvU1BESUZFbmNvZGVyLmg+CisKKyNpbmNsdWRlICJBdWRpb0h3RGV2aWNlLmgiCisjaW5jbHVkZSAiQXVkaW9TdHJlYW1PdXQuaCIKKyNpbmNsdWRlICJTcGRpZlN0cmVhbU91dC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQXVkaW9Id0RldmljZTo6b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgQXVkaW9TdHJlYW1PdXQgKipwcFN0cmVhbU91dCwKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcykKK3sKKworICAgIHN0cnVjdCBhdWRpb19jb25maWcgb3JpZ2luYWxDb25maWcgPSAqY29uZmlnOworICAgIEF1ZGlvU3RyZWFtT3V0ICpvdXRwdXRTdHJlYW0gPSBuZXcgQXVkaW9TdHJlYW1PdXQodGhpcywgZmxhZ3MpOworCisgICAgLy8gVHJ5IHRvIG9wZW4gdGhlIEhBTCBmaXJzdCB1c2luZyB0aGUgY3VycmVudCBmb3JtYXQuCisgICAgQUxPR1YoIm9wZW5PdXRwdXRTdHJlYW0oKSwgdHJ5ICIKKyAgICAgICAgICAgICIgc2FtcGxlUmF0ZSAlZCwgRm9ybWF0ICUjeCwgIgorICAgICAgICAgICAgImNoYW5uZWxNYXNrICUjeCIsCisgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsCisgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzayk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0U3RyZWFtLT5vcGVuKGhhbmRsZSwgZGV2aWNlcywgY29uZmlnLCBhZGRyZXNzKTsKKworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgZGVsZXRlIG91dHB1dFN0cmVhbTsKKyAgICAgICAgb3V0cHV0U3RyZWFtID0gTlVMTDsKKworICAgICAgICAvLyBGSVhNRSBMb29rIGF0IGFueSBtb2RpZmljYXRpb24gdG8gdGhlIGNvbmZpZy4KKyAgICAgICAgLy8gVGhlIEhBTCBtaWdodCBtb2RpZnkgdGhlIGNvbmZpZyB0byBzdWdnZXN0IGEgd3JhcHBlZCBmb3JtYXQuCisgICAgICAgIC8vIExvZyB0aGlzIHNvIHdlIGNhbiBzZWUgd2hhdCB0aGUgSEFMcyBhcmUgZG9pbmcuCisgICAgICAgIEFMT0dJKCJvcGVuT3V0cHV0U3RyZWFtKCksIEhBTCByZXR1cm5lZCIKKyAgICAgICAgICAgICIgc2FtcGxlUmF0ZSAlZCwgRm9ybWF0ICUjeCwgIgorICAgICAgICAgICAgImNoYW5uZWxNYXNrICUjeCwgc3RhdHVzICVkIiwKKyAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICBjb25maWctPmZvcm1hdCwKKyAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgc3RhdHVzKTsKKworICAgICAgICAvLyBJZiB0aGUgZGF0YSBpcyBlbmNvZGVkIHRoZW4gdHJ5IGFnYWluIHVzaW5nIHdyYXBwZWQgUENNLgorICAgICAgICBib29sIHdyYXBwZXJOZWVkZWQgPSAhYXVkaW9faXNfbGluZWFyX3BjbShvcmlnaW5hbENvbmZpZy5mb3JtYXQpCisgICAgICAgICAgICAgICAgJiYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkKKyAgICAgICAgICAgICAgICAmJiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgPT0gMCk7CisKKyAgICAgICAgaWYgKHdyYXBwZXJOZWVkZWQpIHsKKyAgICAgICAgICAgIGlmIChTUERJRkVuY29kZXI6OmlzRm9ybWF0U3VwcG9ydGVkKG9yaWdpbmFsQ29uZmlnLmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgU3BkaWZTdHJlYW1PdXQodGhpcywgZmxhZ3MsIG9yaWdpbmFsQ29uZmlnLmZvcm1hdCk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gb3V0cHV0U3RyZWFtLT5vcGVuKGhhbmRsZSwgZGV2aWNlcywgJm9yaWdpbmFsQ29uZmlnLCBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFUlJPUiAtIG9wZW5PdXRwdXRTdHJlYW0oKSwgU1BESUYgb3BlbiByZXR1cm5lZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3V0cHV0U3RyZWFtOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVSUk9SIC0gb3Blbk91dHB1dFN0cmVhbSgpLCBTUERJRkVuY29kZXIgZG9lcyBub3Qgc3VwcG9ydCBmb3JtYXQgMHglMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxDb25maWcuZm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICpwcFN0cmVhbU91dCA9IG91dHB1dFN0cmVhbTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWY2NWMxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaApAQCAtMCwwICsxLDg4IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fSFdfREVWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19IV19ERVZJQ0VfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9TdHJlYW1PdXQ7CisKK2NsYXNzIEF1ZGlvSHdEZXZpY2UgeworcHVibGljOgorICAgIGVudW0gRmxhZ3MgeworICAgICAgICBBSFdEX0NBTl9TRVRfTUFTVEVSX1ZPTFVNRSAgPSAweDEsCisgICAgICAgIEFIV0RfQ0FOX1NFVF9NQVNURVJfTVVURSAgICA9IDB4MiwKKyAgICB9OworCisgICAgQXVkaW9Id0RldmljZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kdWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSwKKyAgICAgICAgICAgICAgICAgIEZsYWdzIGZsYWdzKQorICAgICAgICA6IG1IYW5kbGUoaGFuZGxlKQorICAgICAgICAsIG1Nb2R1bGVOYW1lKHN0cmR1cChtb2R1bGVOYW1lKSkKKyAgICAgICAgLCBtSHdEZXZpY2UoaHdEZXZpY2UpCisgICAgICAgICwgbUZsYWdzKGZsYWdzKSB7IH0KKyAgICB2aXJ0dWFsIH5BdWRpb0h3RGV2aWNlKCkgeyBmcmVlKCh2b2lkICopbU1vZHVsZU5hbWUpOyB9CisKKyAgICBib29sIGNhblNldE1hc3RlclZvbHVtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgwICE9IChtRmxhZ3MgJiBBSFdEX0NBTl9TRVRfTUFTVEVSX1ZPTFVNRSkpOworICAgIH0KKworICAgIGJvb2wgY2FuU2V0TWFzdGVyTXV0ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgwICE9IChtRmxhZ3MgJiBBSFdEX0NBTl9TRVRfTUFTVEVSX01VVEUpKTsKKyAgICB9CisKKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbUhhbmRsZTsgfQorICAgIGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUoKSBjb25zdCB7IHJldHVybiBtTW9kdWxlTmFtZTsgfQorICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Id0RldmljZTsgfQorICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uOyB9CisKKyAgICAvKiogVGhpcyBtZXRob2QgY3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uCisgICAgICogVGhlICJhZGRyZXNzIiBwYXJhbWV0ZXIgcXVhbGlmaWVzIHRoZSAiZGV2aWNlcyIgYXVkaW8gZGV2aWNlIHR5cGUgaWYgbmVlZGVkLgorICAgICAqIFRoZSBmb3JtYXQgZm9ybWF0IGRlcGVuZHMgb24gdGhlIGRldmljZSB0eXBlOgorICAgICAqIC0gQmx1ZXRvb3RoIGRldmljZXMgdXNlIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGluIHRoZSBmb3JtICIwMDoxMToyMjpBQTpCQjpDQyIKKyAgICAgKiAtIFVTQiBkZXZpY2VzIHVzZSB0aGUgQUxTQSBjYXJkIGFuZCBkZXZpY2UgbnVtYmVycyBpbiB0aGUgZm9ybSAgImNhcmQ9WDtkZXZpY2U9WSIKKyAgICAgKiAtIE90aGVyIGRldmljZXMgbWF5IHVzZSBhIG51bWJlciBvciBhbnkgb3RoZXIgc3RyaW5nLgorICAgICAqLworICAgIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCAqKnBwU3RyZWFtT3V0LAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MpOworCitwcml2YXRlOgorICAgIGNvbnN0IGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtSGFuZGxlOworICAgIGNvbnN0IGNoYXIgKiBjb25zdCAgICAgICAgICBtTW9kdWxlTmFtZTsKKyAgICBhdWRpb19od19kZXZpY2VfdCAqIGNvbnN0ICAgbUh3RGV2aWNlOworICAgIGNvbnN0IEZsYWdzICAgICAgICAgICAgICAgICBtRmxhZ3M7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0FVRElPX0hXX0RFVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKaW5kZXggZmQyOGVhMS4uOGE5YTgzNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcApAQCAtMzksOSArMzksNiBAQAogI2luY2x1ZGUgPGNvbW1vbl90aW1lL2xvY2FsX2Nsb2NrLmg+CiAjaW5jbHVkZSA8Y29tbW9uX3RpbWUvY2NfaGVscGVyLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgotI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2Rvd25taXguaD4KLQogI2luY2x1ZGUgIkF1ZGlvTWl4ZXJPcHMuaCIKICNpbmNsdWRlICJBdWRpb01peGVyLmgiCiAKQEAgLTY5LDkgKzY2LDE2IEBACiAjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KS9zaXplb2YoKHgpWzBdKSkKICNlbmRpZgogCi0vLyBTZXQga1VzZU5ld01peGVyIHRvIHRydWUgdG8gdXNlIHRoZSBuZXcgbWl4ZXIgZW5naW5lLiBPdGhlcndpc2UgdGhlCi0vLyBvcmlnaW5hbCBjb2RlIHdpbGwgYmUgdXNlZC4gIFRoaXMgaXMgZmFsc2UgZm9yIG5vdy4KLXN0YXRpYyBjb25zdCBib29sIGtVc2VOZXdNaXhlciA9IGZhbHNlOworLy8gVE9ETzogTW92ZSB0aGVzZSBtYWNyby9pbmxpbmVzIHRvIGEgaGVhZGVyIGZpbGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbmxpbmUKK1QgbWF4KGNvbnN0IFQmIHgsIGNvbnN0IFQmIHkpIHsKKyAgICByZXR1cm4geCA+IHkgPyB4IDogeTsKK30KKworLy8gU2V0IGtVc2VOZXdNaXhlciB0byB0cnVlIHRvIHVzZSB0aGUgbmV3IG1peGVyIGVuZ2luZSBhbHdheXMuIE90aGVyd2lzZSB0aGUKKy8vIG9yaWdpbmFsIGNvZGUgd2lsbCBiZSB1c2VkIGZvciBzdGVyZW8gc2lua3MsIHRoZSBuZXcgbWl4ZXIgZm9yIG11bHRpY2hhbm5lbC4KK3N0YXRpYyBjb25zdCBib29sIGtVc2VOZXdNaXhlciA9IHRydWU7CiAKIC8vIFNldCBrVXNlRmxvYXQgdG8gdHJ1ZSB0byBhbGxvdyBmbG9hdGluZyBpbnB1dCBpbnRvIHRoZSBtaXhlciBlbmdpbmUuCiAvLyBJZiBrVXNlTmV3TWl4ZXIgaXMgZmFsc2UsIHRoaXMgaXMgaWdub3JlZCBvciBtYXkgYmUgb3ZlcnJpZGRlbiBpbnRlcm5hbGx5CkBAIC05MSwyODggKzk1LDYgQEAKICAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKIH0KIAotQXVkaW9NaXhlcjo6Q29weUJ1ZmZlclByb3ZpZGVyOjpDb3B5QnVmZmVyUHJvdmlkZXIoc2l6ZV90IGlucHV0RnJhbWVTaXplLAotICAgICAgICBzaXplX3Qgb3V0cHV0RnJhbWVTaXplLCBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgotICAgICAgICBtSW5wdXRGcmFtZVNpemUoaW5wdXRGcmFtZVNpemUpLAotICAgICAgICBtT3V0cHV0RnJhbWVTaXplKG91dHB1dEZyYW1lU2l6ZSksCi0gICAgICAgIG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQoYnVmZmVyRnJhbWVDb3VudCksCi0gICAgICAgIG1Mb2NhbEJ1ZmZlckRhdGEoTlVMTCksCi0gICAgICAgIG1Db25zdW1lZCgwKQotewotICAgIEFMT0dWKCJDb3B5QnVmZmVyUHJvdmlkZXIoJXApKCV6dSwgJXp1LCAlenUpIiwgdGhpcywKLSAgICAgICAgICAgIGlucHV0RnJhbWVTaXplLCBvdXRwdXRGcmFtZVNpemUsIGJ1ZmZlckZyYW1lQ291bnQpOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5wdXRGcmFtZVNpemUgPCBvdXRwdXRGcmFtZVNpemUgJiYgYnVmZmVyRnJhbWVDb3VudCA9PSAwLAotICAgICAgICAgICAgIlJlcXVpcmVzIGxvY2FsIGJ1ZmZlciBpZiBpbnB1dEZyYW1lU2l6ZSglenUpIDwgb3V0cHV0RnJhbWVTaXplKCV6dSkiLAotICAgICAgICAgICAgaW5wdXRGcmFtZVNpemUsIG91dHB1dEZyYW1lU2l6ZSk7Ci0gICAgaWYgKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQpIHsKLSAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1Mb2NhbEJ1ZmZlckRhdGEsIDMyLCBtTG9jYWxCdWZmZXJGcmFtZUNvdW50ICogbU91dHB1dEZyYW1lU2l6ZSk7Ci0gICAgfQotICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IDA7Ci19Ci0KLUF1ZGlvTWl4ZXI6OkNvcHlCdWZmZXJQcm92aWRlcjo6fkNvcHlCdWZmZXJQcm92aWRlcigpCi17Ci0gICAgQUxPR1YoIn5Db3B5QnVmZmVyUHJvdmlkZXIoJXApIiwgdGhpcyk7Ci0gICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCAhPSAwKSB7Ci0gICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKLSAgICB9Ci0gICAgZnJlZShtTG9jYWxCdWZmZXJEYXRhKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9NaXhlcjo6Q29weUJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlciwKLSAgICAgICAgaW50NjRfdCBwdHMpCi17Ci0gICAgLy9BTE9HVigiQ29weUJ1ZmZlclByb3ZpZGVyKCVwKTo6Z2V0TmV4dEJ1ZmZlciglcCAoJXp1KSwgJWxsZCkiLAotICAgIC8vICAgICAgICB0aGlzLCBwQnVmZmVyLCBwQnVmZmVyLT5mcmFtZUNvdW50LCBwdHMpOwotICAgIGlmIChtTG9jYWxCdWZmZXJGcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrQnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIocEJ1ZmZlciwgcHRzKTsKLSAgICAgICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICAgICAgY29weUZyYW1lcyhwQnVmZmVyLT5yYXcsIHBCdWZmZXItPnJhdywgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IHBCdWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IG1UcmFja0J1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyLCBwdHMpOwotICAgICAgICAvLyBBdCBvbmUgdGltZSBhbiB1cHN0cmVhbSBidWZmZXIgcHJvdmlkZXIgaGFkCi0gICAgICAgIC8vIHJlcyA9PSBPSyBhbmQgbUJ1ZmZlci5mcmFtZUNvdW50ID09IDAsIGRvZXNuJ3Qgc2VlbSB0byBoYXBwZW4gbm93IDcvMTgvMjAxNC4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQnkgQVBJIHNwZWMsIGlmIHJlcyAhPSBPSywgdGhlbiBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMC4KLSAgICAgICAgLy8gYnV0IHRoZXJlIG1heSBiZSBpbXByb3BlciBpbXBsZW1lbnRhdGlvbnMuCi0gICAgICAgIEFMT0dfQVNTRVJUKHJlcyA9PSBPSyB8fCBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0sgfHwgbUJ1ZmZlci5mcmFtZUNvdW50ID09IDApIHsgLy8gbm90IG5lZWRlZCBieSBBUEkgc3BlYywgYnV0IHRvIGJlIHNhZmUuCi0gICAgICAgICAgICBwQnVmZmVyLT5yYXcgPSBOVUxMOwotICAgICAgICAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgICAgIG1Db25zdW1lZCA9IDA7Ci0gICAgfQotICAgIEFMT0dfQVNTRVJUKG1Db25zdW1lZCA8IG1CdWZmZXIuZnJhbWVDb3VudCk7Ci0gICAgc2l6ZV90IGNvdW50ID0gbWluKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQsIG1CdWZmZXIuZnJhbWVDb3VudCAtIG1Db25zdW1lZCk7Ci0gICAgY291bnQgPSBtaW4oY291bnQsIHBCdWZmZXItPmZyYW1lQ291bnQpOwotICAgIHBCdWZmZXItPnJhdyA9IG1Mb2NhbEJ1ZmZlckRhdGE7Ci0gICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IGNvdW50OwotICAgIGNvcHlGcmFtZXMocEJ1ZmZlci0+cmF3LCAodWludDhfdCopbUJ1ZmZlci5yYXcgKyBtQ29uc3VtZWQgKiBtSW5wdXRGcmFtZVNpemUsCi0gICAgICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgQXVkaW9NaXhlcjo6Q29weUJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlcikKLXsKLSAgICAvL0FMT0dWKCJDb3B5QnVmZmVyUHJvdmlkZXIoJXApOjpyZWxlYXNlQnVmZmVyKCVwKCV6dSkpIiwKLSAgICAvLyAgICAgICAgdGhpcywgcEJ1ZmZlciwgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7Ci0gICAgaWYgKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQgPT0gMCkgewotICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcihwQnVmZmVyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBMT0dfQUxXQVlTX0ZBVEFMX0lGKHBCdWZmZXItPmZyYW1lQ291bnQgPT0gMCwgIkludmFsaWQgZnJhbWVjb3VudCIpOwotICAgIG1Db25zdW1lZCArPSBwQnVmZmVyLT5mcmFtZUNvdW50OyAvLyBUT0RPOiB1cGRhdGUgZm9yIGVmZmljaWVuY3kgdG8gcmV1c2UgZXhpc3RpbmcgY29udGVudAotICAgIGlmIChtQ29uc3VtZWQgIT0gMCAmJiBtQ29uc3VtZWQgPj0gbUJ1ZmZlci5mcmFtZUNvdW50KSB7Ci0gICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKLSAgICAgICAgQUxPR19BU1NFUlQobUJ1ZmZlci5mcmFtZUNvdW50ID09IDApOwotICAgIH0KLSAgICBwQnVmZmVyLT5yYXcgPSBOVUxMOwotICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSAwOwotfQotCi12b2lkIEF1ZGlvTWl4ZXI6OkNvcHlCdWZmZXJQcm92aWRlcjo6cmVzZXQoKQotewotICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgIT0gMCkgewotICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7Ci0gICAgfQotICAgIG1Db25zdW1lZCA9IDA7Ci19Ci0KLUF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBzZXNzaW9uSWQsIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6Ci0gICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKLSAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSAqIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhpbnB1dENoYW5uZWxNYXNrKSwKLSAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSAqIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhvdXRwdXRDaGFubmVsTWFzayksCi0gICAgICAgICAgICBidWZmZXJGcmFtZUNvdW50KSAgLy8gc2V0IGJ1ZmZlckZyYW1lQ291bnQgdG8gMCB0byBkbyBpbi1wbGFjZQotewotICAgIEFMT0dWKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlciglcCkoJSN4LCAlI3gsICUjeCAldSAlZCkiLAotICAgICAgICAgICAgdGhpcywgaW5wdXRDaGFubmVsTWFzaywgb3V0cHV0Q2hhbm5lbE1hc2ssIGZvcm1hdCwKLSAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNlc3Npb25JZCk7Ci0gICAgaWYgKCFzSXNNdWx0aWNoYW5uZWxDYXBhYmxlCi0gICAgICAgICAgICB8fCBFZmZlY3RDcmVhdGUoJnNEd25tRnhEZXNjLnV1aWQsCi0gICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgU0VTU0lPTl9JRF9JTlZBTElEX0FORF9JR05PUkVELAotICAgICAgICAgICAgICAgICAgICAmbURvd25taXhIYW5kbGUpICE9IDApIHsKLSAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGVycm9yIGNyZWF0aW5nIGRvd25taXhlciBlZmZlY3QiKTsKLSAgICAgICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKLSAgICAgICAgIHJldHVybjsKLSAgICAgfQotICAgICAvLyBjaGFubmVsIGlucHV0IGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBvdmVycmlkZGVuIHBlci10cmFjawotICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IGlucHV0Q2hhbm5lbE1hc2s7ICAgLy8gRklYTUU6IFNob3VsZCBiZSBiaXRzCi0gICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IG91dHB1dENoYW5uZWxNYXNrOyAvLyBGSVhNRTogc2hvdWxkIGJlIGJpdHMKLSAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gZm9ybWF0OwotICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gZm9ybWF0OwotICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSBzYW1wbGVSYXRlOwotICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7Ci0gICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEU7Ci0gICAgIC8vIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyIHByb3ZpZGVyLCBhbmQgZnJhbWUgY291bnQgd2lsbCBub3QgYmUgdXNlZCBhcyB0aGUgZG93bm1peCBlZmZlY3QKLSAgICAgLy8gcHJvY2VzcygpIGZ1bmN0aW9uIGlzIGNhbGxlZCBkaXJlY3RseSAoc2VlIERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKCkpCi0gICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX1NNUF9SQVRFIHwgRUZGRUNUX0NPTkZJR19DSEFOTkVMUyB8Ci0gICAgICAgICAgICAgRUZGRUNUX0NPTkZJR19GT1JNQVQgfCBFRkZFQ1RfQ09ORklHX0FDQ19NT0RFOwotICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcubWFzayA9IG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLm1hc2s7Ci0KLSAgICAgaW50IGNtZFN0YXR1czsKLSAgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKGludCk7Ci0KLSAgICAgLy8gQ29uZmlndXJlIGRvd25taXhlcgotICAgICBzdGF0dXNfdCBzdGF0dXMgPSAoKm1Eb3dubWl4SGFuZGxlKS0+Y29tbWFuZChtRG93bm1peEhhbmRsZSwKLSAgICAgICAgICAgICBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgLypjbWRDb2RlKi8sIHNpemVvZihlZmZlY3RfY29uZmlnX3QpIC8qY21kU2l6ZSovLAotICAgICAgICAgICAgICZtRG93bm1peENvbmZpZyAvKnBDbWREYXRhKi8sCi0gICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmNtZFN0YXR1cyAvKnBSZXBseURhdGEqLyk7Ci0gICAgIGlmIChzdGF0dXMgIT0gMCB8fCBjbWRTdGF0dXMgIT0gMCkgewotICAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZXJyb3IgJWQgY21kU3RhdHVzICVkIHdoaWxlIGNvbmZpZ3VyaW5nIGRvd25taXhlciIsCi0gICAgICAgICAgICAgICAgIHN0YXR1cywgY21kU3RhdHVzKTsKLSAgICAgICAgIEVmZmVjdFJlbGVhc2UobURvd25taXhIYW5kbGUpOwotICAgICAgICAgbURvd25taXhIYW5kbGUgPSBOVUxMOwotICAgICAgICAgcmV0dXJuOwotICAgICB9Ci0KLSAgICAgLy8gRW5hYmxlIGRvd25taXhlcgotICAgICByZXBseVNpemUgPSBzaXplb2YoaW50KTsKLSAgICAgc3RhdHVzID0gKCptRG93bm1peEhhbmRsZSktPmNvbW1hbmQobURvd25taXhIYW5kbGUsCi0gICAgICAgICAgICAgRUZGRUNUX0NNRF9FTkFCTEUgLypjbWRDb2RlKi8sIDAgLypjbWRTaXplKi8sIE5VTEwgLypwQ21kRGF0YSovLAotICAgICAgICAgICAgICZyZXBseVNpemUsICZjbWRTdGF0dXMgLypwUmVwbHlEYXRhKi8pOwotICAgICBpZiAoc3RhdHVzICE9IDAgfHwgY21kU3RhdHVzICE9IDApIHsKLSAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGVycm9yICVkIGNtZFN0YXR1cyAlZCB3aGlsZSBlbmFibGluZyBkb3dubWl4ZXIiLAotICAgICAgICAgICAgICAgICBzdGF0dXMsIGNtZFN0YXR1cyk7Ci0gICAgICAgICBFZmZlY3RSZWxlYXNlKG1Eb3dubWl4SGFuZGxlKTsKLSAgICAgICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKLSAgICAgICAgIHJldHVybjsKLSAgICAgfQotCi0gICAgIC8vIFNldCBkb3dubWl4IHR5cGUKLSAgICAgLy8gcGFyYW1ldGVyIHNpemUgcm91bmRlZCBmb3IgcGFkZGluZyBvbiAzMmJpdCBib3VuZGFyeQotICAgICBjb25zdCBpbnQgcHNpemVQYWRkZWQgPSAoKHNpemVvZihkb3dubWl4X3BhcmFtc190KSAtIDEpL3NpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KTsKLSAgICAgY29uc3QgaW50IGRvd25taXhQYXJhbVNpemUgPQotICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwc2l6ZVBhZGRlZCArIHNpemVvZihkb3dubWl4X3R5cGVfdCk7Ci0gICAgIGVmZmVjdF9wYXJhbV90ICogY29uc3QgcGFyYW0gPSAoZWZmZWN0X3BhcmFtX3QgKikgbWFsbG9jKGRvd25taXhQYXJhbVNpemUpOwotICAgICBwYXJhbS0+cHNpemUgPSBzaXplb2YoZG93bm1peF9wYXJhbXNfdCk7Ci0gICAgIGNvbnN0IGRvd25taXhfcGFyYW1zX3QgZG93bm1peFBhcmFtID0gRE9XTk1JWF9QQVJBTV9UWVBFOwotICAgICBtZW1jcHkocGFyYW0tPmRhdGEsICZkb3dubWl4UGFyYW0sIHBhcmFtLT5wc2l6ZSk7Ci0gICAgIGNvbnN0IGRvd25taXhfdHlwZV90IGRvd25taXhUeXBlID0gRE9XTk1JWF9UWVBFX0ZPTEQ7Ci0gICAgIHBhcmFtLT52c2l6ZSA9IHNpemVvZihkb3dubWl4X3R5cGVfdCk7Ci0gICAgIG1lbWNweShwYXJhbS0+ZGF0YSArIHBzaXplUGFkZGVkLCAmZG93bm1peFR5cGUsIHBhcmFtLT52c2l6ZSk7Ci0gICAgIHJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOwotICAgICBzdGF0dXMgPSAoKm1Eb3dubWl4SGFuZGxlKS0+Y29tbWFuZChtRG93bm1peEhhbmRsZSwKLSAgICAgICAgICAgICBFRkZFQ1RfQ01EX1NFVF9QQVJBTSAvKiBjbWRDb2RlICovLCBkb3dubWl4UGFyYW1TaXplIC8qIGNtZFNpemUgKi8sCi0gICAgICAgICAgICAgcGFyYW0gLypwQ21kRGF0YSovLCAmcmVwbHlTaXplLCAmY21kU3RhdHVzIC8qcFJlcGx5RGF0YSovKTsKLSAgICAgZnJlZShwYXJhbSk7Ci0gICAgIGlmIChzdGF0dXMgIT0gMCB8fCBjbWRTdGF0dXMgIT0gMCkgewotICAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZXJyb3IgJWQgY21kU3RhdHVzICVkIHdoaWxlIHNldHRpbmcgZG93bm1peCB0eXBlIiwKLSAgICAgICAgICAgICAgICAgc3RhdHVzLCBjbWRTdGF0dXMpOwotICAgICAgICAgRWZmZWN0UmVsZWFzZShtRG93bm1peEhhbmRsZSk7Ci0gICAgICAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7Ci0gICAgICAgICByZXR1cm47Ci0gICAgIH0KLSAgICAgQUxPR1YoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZG93bm1peCB0eXBlIHNldCB0byAlZCIsIChpbnQpIGRvd25taXhUeXBlKTsKLX0KLQotQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6On5Eb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpCi17Ci0gICAgQUxPR1YoIn5Eb3dubWl4ZXJCdWZmZXJQcm92aWRlciAoJXApIiwgdGhpcyk7Ci0gICAgRWZmZWN0UmVsZWFzZShtRG93bm1peEhhbmRsZSk7Ci0gICAgbURvd25taXhIYW5kbGUgPSBOVUxMOwotfQotCi12b2lkIEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQotewotICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzOwotICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgPSBjb25zdF9jYXN0PHZvaWQgKj4oc3JjKTsKLSAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXM7Ci0gICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5yYXcgPSBkc3Q7Ci0gICAgLy8gbWF5IGJlIGluLXBsYWNlIGlmIHNyYyA9PSBkc3QuCi0gICAgc3RhdHVzX3QgcmVzID0gKCptRG93bm1peEhhbmRsZSktPnByb2Nlc3MobURvd25taXhIYW5kbGUsCi0gICAgICAgICAgICAmbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLCAmbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmJ1ZmZlcik7Ci0gICAgQUxPR0VfSUYocmVzICE9IE9LLCAiRG93bm1peEJ1ZmZlclByb3ZpZGVyIGVycm9yICVkIiwgcmVzKTsKLX0KLQotLyogY2FsbCBvbmNlIGluIGEgcHRocmVhZF9vbmNlIGhhbmRsZXIuICovCi0vKnN0YXRpYyovIHN0YXR1c190IEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjppbml0KCkKLXsKLSAgICAvLyBmaW5kIG11bHRpY2hhbm5lbCBkb3dubWl4IGVmZmVjdCBpZiB3ZSBoYXZlIHRvIHBsYXkgbXVsdGljaGFubmVsIGNvbnRlbnQKLSAgICB1aW50MzJfdCBudW1FZmZlY3RzID0gMDsKLSAgICBpbnQgcmV0ID0gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCZudW1FZmZlY3RzKTsKLSAgICBpZiAocmV0ICE9IDApIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvTWl4ZXIoKSBlcnJvciAlZCBxdWVyeWluZyBudW1iZXIgb2YgZWZmZWN0cyIsIHJldCk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBBTE9HVigiRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkgbnVtRWZmZWN0cz0lZCIsIG51bUVmZmVjdHMpOwotCi0gICAgZm9yICh1aW50MzJfdCBpID0gMCA7IGkgPCBudW1FZmZlY3RzIDsgaSsrKSB7Ci0gICAgICAgIGlmIChFZmZlY3RRdWVyeUVmZmVjdChpLCAmc0R3bm1GeERlc2MpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJlZmZlY3QgJWQgaXMgY2FsbGVkICVzIiwgaSwgc0R3bm1GeERlc2MubmFtZSk7Ci0gICAgICAgICAgICBpZiAobWVtY21wKCZzRHdubUZ4RGVzYy50eXBlLCBFRkZFQ1RfVUlJRF9ET1dOTUlYLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgZWZmZWN0IFwiJXNcIiBmcm9tICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNEd25tRnhEZXNjLm5hbWUsIHNEd25tRnhEZXNjLmltcGxlbWVudG9yKTsKLSAgICAgICAgICAgICAgICBzSXNNdWx0aWNoYW5uZWxDYXBhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HV19JRighc0lzTXVsdGljaGFubmVsQ2FwYWJsZSwgInVuYWJsZSB0byBmaW5kIGRvd25taXggZWZmZWN0Iik7Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Ci19Ci0KLS8qc3RhdGljKi8gYm9vbCBBdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6c0lzTXVsdGljaGFubmVsQ2FwYWJsZSA9IGZhbHNlOwotLypzdGF0aWMqLyBlZmZlY3RfZGVzY3JpcHRvcl90IEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpzRHdubUZ4RGVzYzsKLQotQXVkaW9NaXhlcjo6UmVtaXhCdWZmZXJQcm92aWRlcjo6UmVtaXhCdWZmZXJQcm92aWRlcihhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgotICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIoCi0gICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpCi0gICAgICAgICAgICAgICAgICAgICogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGlucHV0Q2hhbm5lbE1hc2spLAotICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KQotICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhvdXRwdXRDaGFubmVsTWFzayksCi0gICAgICAgICAgICAgICAgYnVmZmVyRnJhbWVDb3VudCksCi0gICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKLSAgICAgICAgbVNhbXBsZVNpemUoYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpKSwKLSAgICAgICAgbUlucHV0Q2hhbm5lbHMoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGlucHV0Q2hhbm5lbE1hc2spKSwKLSAgICAgICAgbU91dHB1dENoYW5uZWxzKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhvdXRwdXRDaGFubmVsTWFzaykpCi17Ci0gICAgQUxPR1YoIlJlbWl4QnVmZmVyUHJvdmlkZXIoJXApKCUjeCwgJSN4LCAlI3gpICV6dSAlenUiLAotICAgICAgICAgICAgdGhpcywgZm9ybWF0LCBpbnB1dENoYW5uZWxNYXNrLCBvdXRwdXRDaGFubmVsTWFzaywKLSAgICAgICAgICAgIG1JbnB1dENoYW5uZWxzLCBtT3V0cHV0Q2hhbm5lbHMpOwotICAgIC8vIFRPRE86IGNvbnNpZGVyIGNoYW5uZWwgcmVwcmVzZW50YXRpb24gaW4gaW5kZXggYXJyYXkgZm9ybXVsYXRpb24KLSAgICAvLyBXZSBpZ25vcmUgY2hhbm5lbCByZXByZXNlbnRhdGlvbiwgYW5kIGp1c3QgdXNlIHRoZSBiaXRzLgotICAgIG1lbWNweV9ieV9pbmRleF9hcnJheV9pbml0aWFsaXphdGlvbihtSWR4QXJ5LCBBUlJBWV9TSVpFKG1JZHhBcnkpLAotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKG91dHB1dENoYW5uZWxNYXNrKSwKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhpbnB1dENoYW5uZWxNYXNrKSk7Ci19Ci0KLXZvaWQgQXVkaW9NaXhlcjo6UmVtaXhCdWZmZXJQcm92aWRlcjo6Y29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKLXsKLSAgICBtZW1jcHlfYnlfaW5kZXhfYXJyYXkoZHN0LCBtT3V0cHV0Q2hhbm5lbHMsCi0gICAgICAgICAgICBzcmMsIG1JbnB1dENoYW5uZWxzLCBtSWR4QXJ5LCBtU2FtcGxlU2l6ZSwgZnJhbWVzKTsKLX0KLQotQXVkaW9NaXhlcjo6UmVmb3JtYXRCdWZmZXJQcm92aWRlcjo6UmVmb3JtYXRCdWZmZXJQcm92aWRlcihpbnQzMl90IGNoYW5uZWxzLAotICAgICAgICBhdWRpb19mb3JtYXRfdCBpbnB1dEZvcm1hdCwgYXVkaW9fZm9ybWF0X3Qgb3V0cHV0Rm9ybWF0LAotICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgotICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIoCi0gICAgICAgICAgICBjaGFubmVscyAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoaW5wdXRGb3JtYXQpLAotICAgICAgICAgICAgY2hhbm5lbHMgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG91dHB1dEZvcm1hdCksCi0gICAgICAgICAgICBidWZmZXJGcmFtZUNvdW50KSwKLSAgICAgICAgbUNoYW5uZWxzKGNoYW5uZWxzKSwKLSAgICAgICAgbUlucHV0Rm9ybWF0KGlucHV0Rm9ybWF0KSwKLSAgICAgICAgbU91dHB1dEZvcm1hdChvdXRwdXRGb3JtYXQpCi17Ci0gICAgQUxPR1YoIlJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoJXApKCVkLCAlI3gsICUjeCkiLCB0aGlzLCBjaGFubmVscywgaW5wdXRGb3JtYXQsIG91dHB1dEZvcm1hdCk7Ci19Ci0KLXZvaWQgQXVkaW9NaXhlcjo6UmVmb3JtYXRCdWZmZXJQcm92aWRlcjo6Y29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKLXsKLSAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGRzdCwgbU91dHB1dEZvcm1hdCwgc3JjLCBtSW5wdXRGb3JtYXQsIGZyYW1lcyAqIG1DaGFubmVscyk7Ci19Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gRW5zdXJlIG1Db25maWd1cmVkTmFtZXMgYml0bWFzayBpcyBpbml0aWFsaXplZCBwcm9wZXJseSBvbiBhbGwgYXJjaGl0ZWN0dXJlcy4KQEAgLTQwNyw2ICsxMjksNyBAQAogICAgICAgICB0LT5yZXNhbXBsZXIgPSBOVUxMOwogICAgICAgICB0LT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IE5VTEw7CiAgICAgICAgIHQtPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKKyAgICAgICAgdC0+bVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgPSBOVUxMOwogICAgICAgICB0Kys7CiAgICAgfQogCkBAIC00MTksNiArMTQyLDcgQEAKICAgICAgICAgZGVsZXRlIHQtPnJlc2FtcGxlcjsKICAgICAgICAgZGVsZXRlIHQtPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBkZWxldGUgdC0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CisgICAgICAgIGRlbGV0ZSB0LT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjsKICAgICAgICAgdCsrOwogICAgIH0KICAgICBkZWxldGUgW10gbVN0YXRlLm91dHB1dFRlbXA7CkBAIC00MzAsNiArMTU0LDEwIEBACiAgICAgbVN0YXRlLm1Mb2cgPSBsb2c7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYXVkaW9fZm9ybWF0X3Qgc2VsZWN0TWl4ZXJJbkZvcm1hdChhdWRpb19mb3JtYXRfdCBpbnB1dEZvcm1hdCBfX3VudXNlZCkgeworICAgIHJldHVybiBrVXNlRmxvYXQgJiYga1VzZU5ld01peGVyID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVCA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworfQorCiBpbnQgQXVkaW9NaXhlcjo6Z2V0VHJhY2tOYW1lKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBzZXNzaW9uSWQpCiB7CkBAIC00OTIsMjQgKzIyMCwyNSBAQAogICAgICAgICB0LT5tSW5wdXRCdWZmZXJQcm92aWRlciA9IE5VTEw7CiAgICAgICAgIHQtPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKICAgICAgICAgdC0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBOVUxMOworICAgICAgICB0LT5tUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKKyAgICAgICAgdC0+bVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgPSBOVUxMOwogICAgICAgICB0LT5tTWl4ZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICAgICAgdC0+bUZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgdC0+bU1peGVySW5Gb3JtYXQgPSBrVXNlRmxvYXQgJiYga1VzZU5ld01peGVyCi0gICAgICAgICAgICAgICAgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIHQtPm1NaXhlckluRm9ybWF0ID0gc2VsZWN0TWl4ZXJJbkZvcm1hdChmb3JtYXQpOworICAgICAgICB0LT5tRG93bm1peFJlcXVpcmVzRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7IC8vIG5vIGZvcm1hdCByZXF1aXJlZAogICAgICAgICB0LT5tTWl4ZXJDaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfbWFza19mcm9tX3JlcHJlc2VudGF0aW9uX2FuZF9iaXRzKAogICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT04sIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CiAgICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayh0LT5tTWl4ZXJDaGFubmVsTWFzayk7CisgICAgICAgIHQtPm1QbGF5YmFja1JhdGUgPSBBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQ7CiAgICAgICAgIC8vIENoZWNrIHRoZSBkb3dubWl4aW5nIChvciB1cG1peGluZykgcmVxdWlyZW1lbnRzLgotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbml0VHJhY2tEb3dubWl4KHQsIG4pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSB0LT5wcmVwYXJlRm9yRG93bm1peCgpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiQXVkaW9NaXhlcjo6Z2V0VHJhY2tOYW1lIGludmFsaWQgY2hhbm5lbE1hc2sgKCUjeCkiLCBjaGFubmVsTWFzayk7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLSAgICAgICAgLy8gaW5pdFRyYWNrRG93bm1peCgpIG1heSBjaGFuZ2UgdGhlIGlucHV0IGZvcm1hdCByZXF1aXJlbWVudC4KLSAgICAgICAgLy8gSWYgeW91IGRlc2lyZSBmbG9hdGluZyBwb2ludCBpbnB1dCB0byB0aGUgbWl4ZXIsIGl0IG1heSBjaGFuZ2UKLSAgICAgICAgLy8gdG8gaW50ZWdlciBiZWNhdXNlIHRoZSBkb3dubWl4ZXIgcmVxdWlyZXMgaW50ZWdlciB0byBwcm9jZXNzLgorICAgICAgICAvLyBwcmVwYXJlRm9yRG93bm1peCgpIG1heSBjaGFuZ2UgbURvd25taXhSZXF1aXJlc0Zvcm1hdAogICAgICAgICBBTE9HVlYoIm1NaXhlckZvcm1hdDolI3ggIG1NaXhlckluRm9ybWF0OiUjeFxuIiwgdC0+bU1peGVyRm9ybWF0LCB0LT5tTWl4ZXJJbkZvcm1hdCk7Ci0gICAgICAgIHByZXBhcmVUcmFja0ZvclJlZm9ybWF0KHQsIG4pOworICAgICAgICB0LT5wcmVwYXJlRm9yUmVmb3JtYXQoKTsKICAgICAgICAgbVRyYWNrTmFtZXMgfD0gMSA8PCBuOwogICAgICAgICByZXR1cm4gVFJBQ0swICsgbjsKICAgICB9CkBAIC01MjYsNyArMjU1LDcgQEAKICB9CiAKIC8vIENhbGxlZCB3aGVuIGNoYW5uZWwgbWFza3MgaGF2ZSBjaGFuZ2VkIGZvciBhIHRyYWNrIG5hbWUKLS8vIFRPRE86IEZpeCBEb3dubWl4YnVmZmVycHJvZmlkZXIgbm90IHRvIChwb3NzaWJseSkgY2hhbmdlIG1peGVyIGlucHV0IGZvcm1hdCwKKy8vIFRPRE86IEZpeCBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciBub3QgdG8gKHBvc3NpYmx5KSBjaGFuZ2UgbWl4ZXIgaW5wdXQgZm9ybWF0LAogLy8gd2hpY2ggd2lsbCBzaW1wbGlmeSB0aGlzIGxvZ2ljLgogYm9vbCBBdWRpb01peGVyOjpzZXRDaGFubmVsTWFza3MoaW50IG5hbWUsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHRyYWNrQ2hhbm5lbE1hc2ssIGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVyQ2hhbm5lbE1hc2spIHsKQEAgLTU1MSwyMSArMjgwLDE4IEBACiAKICAgICAvLyBjaGFubmVsIG1hc2tzIGhhdmUgY2hhbmdlZCwgZG9lcyB0aGlzIHRyYWNrIG5lZWQgYSBkb3dubWl4ZXI/CiAgICAgLy8gdXBkYXRlIHRvIHRyeSB1c2luZyBvdXIgZGVzaXJlZCBmb3JtYXQgKGlmIHdlIGFyZW4ndCBhbHJlYWR5IHVzaW5nIGl0KQotICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHByZXZNaXhlckluRm9ybWF0ID0gdHJhY2subU1peGVySW5Gb3JtYXQ7Ci0gICAgdHJhY2subU1peGVySW5Gb3JtYXQgPSBrVXNlRmxvYXQgJiYga1VzZU5ld01peGVyCi0gICAgICAgICAgICA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLSAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBpbml0VHJhY2tEb3dubWl4KCZtU3RhdGUudHJhY2tzW25hbWVdLCBuYW1lKTsKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBwcmV2RG93bm1peGVyRm9ybWF0ID0gdHJhY2subURvd25taXhSZXF1aXJlc0Zvcm1hdDsKKyAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBtU3RhdGUudHJhY2tzW25hbWVdLnByZXBhcmVGb3JEb3dubWl4KCk7CiAgICAgQUxPR0VfSUYoc3RhdHVzICE9IE9LLAotICAgICAgICAgICAgImluaXRUcmFja0Rvd25taXggZXJyb3IgJWQsIHRyYWNrIGNoYW5uZWwgbWFzayAlI3gsIG1peGVyIGNoYW5uZWwgbWFzayAlI3giLAorICAgICAgICAgICAgInByZXBhcmVGb3JEb3dubWl4IGVycm9yICVkLCB0cmFjayBjaGFubmVsIG1hc2sgJSN4LCBtaXhlciBjaGFubmVsIG1hc2sgJSN4IiwKICAgICAgICAgICAgIHN0YXR1cywgdHJhY2suY2hhbm5lbE1hc2ssIHRyYWNrLm1NaXhlckNoYW5uZWxNYXNrKTsKIAotICAgIGNvbnN0IGJvb2wgbWl4ZXJJbkZvcm1hdENoYW5nZWQgPSBwcmV2TWl4ZXJJbkZvcm1hdCAhPSB0cmFjay5tTWl4ZXJJbkZvcm1hdDsKLSAgICBpZiAobWl4ZXJJbkZvcm1hdENoYW5nZWQpIHsKLSAgICAgICAgcHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQoJnRyYWNrLCBuYW1lKTsgLy8gYmVjYXVzZSBvZiBkb3dubWl4ZXIsIHRyYWNrIGZvcm1hdCBtYXkgY2hhbmdlIQorICAgIGlmIChwcmV2RG93bm1peGVyRm9ybWF0ICE9IHRyYWNrLm1Eb3dubWl4UmVxdWlyZXNGb3JtYXQpIHsKKyAgICAgICAgdHJhY2sucHJlcGFyZUZvclJlZm9ybWF0KCk7IC8vIGJlY2F1c2Ugb2YgZG93bm1peGVyLCB0cmFjayBmb3JtYXQgbWF5IGNoYW5nZSEKICAgICB9CiAKLSAgICBpZiAodHJhY2sucmVzYW1wbGVyICYmIChtaXhlckluRm9ybWF0Q2hhbmdlZCB8fCBtaXhlckNoYW5uZWxDb3VudENoYW5nZWQpKSB7Ci0gICAgICAgIC8vIHJlc2FtcGxlciBpbnB1dCBmb3JtYXQgb3IgY2hhbm5lbHMgbWF5IGhhdmUgY2hhbmdlZC4KKyAgICBpZiAodHJhY2sucmVzYW1wbGVyICYmIG1peGVyQ2hhbm5lbENvdW50Q2hhbmdlZCkgeworICAgICAgICAvLyByZXNhbXBsZXIgY2hhbm5lbHMgbWF5IGhhdmUgY2hhbmdlZC4KICAgICAgICAgY29uc3QgdWludDMyX3QgcmVzZXRUb1NhbXBsZVJhdGUgPSB0cmFjay5zYW1wbGVSYXRlOwogICAgICAgICBkZWxldGUgdHJhY2sucmVzYW1wbGVyOwogICAgICAgICB0cmFjay5yZXNhbXBsZXIgPSBOVUxMOwpAQCAtNTc2LDk5ICszMDIsMTI5IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXR1c190IEF1ZGlvTWl4ZXI6OmluaXRUcmFja0Rvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lKQotewotICAgIC8vIE9ubHkgcmVtaXggKHVwbWl4IG9yIGRvd25taXgpIGlmIHRoZSB0cmFjayBhbmQgbWl4ZXIvZGV2aWNlIGNoYW5uZWwgbWFza3MKLSAgICAvLyBhcmUgbm90IHRoZSBzYW1lIGFuZCBub3QgaGFuZGxlZCBpbnRlcm5hbGx5LCBhcyBtb25vIC0+IHN0ZXJlbyBjdXJyZW50bHkgaXMuCi0gICAgaWYgKHBUcmFjay0+Y2hhbm5lbE1hc2sgIT0gcFRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzawotICAgICAgICAgICAgJiYgIShwVHJhY2stPmNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8KLSAgICAgICAgICAgICAgICAgICAgJiYgcFRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pKSB7Ci0gICAgICAgIHJldHVybiBwcmVwYXJlVHJhY2tGb3JEb3dubWl4KHBUcmFjaywgdHJhY2tOYW1lKTsKLSAgICB9Ci0gICAgLy8gbm8gcmVtaXggbmVjZXNzYXJ5Ci0gICAgdW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KHBUcmFjaywgdHJhY2tOYW1lKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Cit2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OnVucHJlcGFyZUZvckRvd25taXgoKSB7CisgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnVucHJlcGFyZUZvckRvd25taXgoJXApIiwgdGhpcyk7CiAKLXZvaWQgQXVkaW9NaXhlcjo6dW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSBfX3VudXNlZCkgewotICAgIEFMT0dWKCJBdWRpb01peGVyOjp1bnByZXBhcmVUcmFja0ZvckRvd25taXgoJWQpIiwgdHJhY2tOYW1lKTsKLQotICAgIGlmIChwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKKyAgICBtRG93bm1peFJlcXVpcmVzRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgaWYgKGRvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKICAgICAgICAgLy8gdGhpcyB0cmFjayBoYWQgcHJldmlvdXNseSBiZWVuIGNvbmZpZ3VyZWQgd2l0aCBhIGRvd25taXhlciwgZGVsZXRlIGl0CiAgICAgICAgIEFMT0dWKCIgZGVsZXRpbmcgb2xkIGRvd25taXhlciIpOwotICAgICAgICBkZWxldGUgcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsKLSAgICAgICAgcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IE5VTEw7Ci0gICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHBUcmFjayk7CisgICAgICAgIGRlbGV0ZSBkb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsKKyAgICAgICAgZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBOVUxMOworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCIgbm90aGluZyB0byBkbywgbm8gZG93bm1peGVyIHRvIGRlbGV0ZSIpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9NaXhlcjo6cHJlcGFyZVRyYWNrRm9yRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUpCitzdGF0dXNfdCBBdWRpb01peGVyOjp0cmFja190OjpwcmVwYXJlRm9yRG93bm1peCgpCiB7Ci0gICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnByZXBhcmVUcmFja0ZvckRvd25taXgoJWQpIHdpdGggbWFzayAweCV4IiwgdHJhY2tOYW1lLCBwVHJhY2stPmNoYW5uZWxNYXNrKTsKKyAgICBBTE9HVigiQXVkaW9NaXhlcjo6cHJlcGFyZUZvckRvd25taXgoJXApIHdpdGggbWFzayAweCV4IiwKKyAgICAgICAgICAgIHRoaXMsIGNoYW5uZWxNYXNrKTsKIAogICAgIC8vIGRpc2NhcmQgdGhlIHByZXZpb3VzIGRvd25taXhlciBpZiB0aGVyZSB3YXMgb25lCi0gICAgdW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KHBUcmFjaywgdHJhY2tOYW1lKTsKLSAgICBpZiAoRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmlzTXVsdGljaGFubmVsQ2FwYWJsZSgpKSB7Ci0gICAgICAgIERvd25taXhlckJ1ZmZlclByb3ZpZGVyKiBwRGJwID0gbmV3IERvd25taXhlckJ1ZmZlclByb3ZpZGVyKHBUcmFjay0+Y2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgcFRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAvKiBUT0RPOiB1c2UgcFRyYWNrLT5tTWl4ZXJJbkZvcm1hdCwgbm93IG9ubHkgUENNIDE2ICovLAotICAgICAgICAgICAgICAgIHBUcmFjay0+c2FtcGxlUmF0ZSwgcFRyYWNrLT5zZXNzaW9uSWQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCk7CisgICAgdW5wcmVwYXJlRm9yRG93bm1peCgpOworICAgIC8vIE1PTk9fSEFDSyBPbmx5IHJlbWl4ICh1cG1peCBvciBkb3dubWl4KSBpZiB0aGUgdHJhY2sgYW5kIG1peGVyL2RldmljZSBjaGFubmVsIG1hc2tzCisgICAgLy8gYXJlIG5vdCB0aGUgc2FtZSBhbmQgbm90IGhhbmRsZWQgaW50ZXJuYWxseSwgYXMgbW9ubyAtPiBzdGVyZW8gY3VycmVudGx5IGlzLgorICAgIGlmIChjaGFubmVsTWFzayA9PSBtTWl4ZXJDaGFubmVsTWFzaworICAgICAgICAgICAgfHwgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8KKyAgICAgICAgICAgICAgICAgICAgJiYgbU1peGVyQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSkgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIC8vIERvd25taXhlckJ1ZmZlclByb3ZpZGVyIGlzIG9ubHkgdXNlZCBmb3IgcG9zaXRpb24gbWFza3MuCisgICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oY2hhbm5lbE1hc2spCisgICAgICAgICAgICAgICAgPT0gQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTgorICAgICAgICAgICAgJiYgRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmlzTXVsdGljaGFubmVsQ2FwYWJsZSgpKSB7CisgICAgICAgIERvd25taXhlckJ1ZmZlclByb3ZpZGVyKiBwRGJwID0gbmV3IERvd25taXhlckJ1ZmZlclByb3ZpZGVyKGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIG1NaXhlckNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIC8qIFRPRE86IHVzZSBtTWl4ZXJJbkZvcm1hdCwgbm93IG9ubHkgUENNIDE2ICovLAorICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNlc3Npb25JZCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KTsKIAogICAgICAgICBpZiAocERicC0+aXNWYWxpZCgpKSB7IC8vIGlmIGNvbnN0cnVjdG9yIGNvbXBsZXRlZCBwcm9wZXJseQotICAgICAgICAgICAgcFRyYWNrLT5tTWl4ZXJJbkZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOyAvLyBQQ00gMTYgYml0IHJlcXVpcmVkIGZvciBkb3dubWl4Ci0gICAgICAgICAgICBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gcERicDsKLSAgICAgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHBUcmFjayk7CisgICAgICAgICAgICBtRG93bm1peFJlcXVpcmVzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7IC8vIFBDTSAxNiBiaXQgcmVxdWlyZWQgZm9yIGRvd25taXgKKyAgICAgICAgICAgIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gcERicDsKKyAgICAgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KICAgICAgICAgZGVsZXRlIHBEYnA7CiAgICAgfQogCiAgICAgLy8gRWZmZWN0IGRvd25taXhlciBkb2VzIG5vdCBhY2NlcHQgdGhlIGNoYW5uZWwgY29udmVyc2lvbi4gIExldCdzIHVzZSBvdXIgcmVtaXhlci4KLSAgICBSZW1peEJ1ZmZlclByb3ZpZGVyKiBwUmJwID0gbmV3IFJlbWl4QnVmZmVyUHJvdmlkZXIocFRyYWNrLT5jaGFubmVsTWFzaywKLSAgICAgICAgICAgIHBUcmFjay0+bU1peGVyQ2hhbm5lbE1hc2ssIHBUcmFjay0+bU1peGVySW5Gb3JtYXQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCk7CisgICAgUmVtaXhCdWZmZXJQcm92aWRlciogcFJicCA9IG5ldyBSZW1peEJ1ZmZlclByb3ZpZGVyKGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgbU1peGVyQ2hhbm5lbE1hc2ssIG1NaXhlckluRm9ybWF0LCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpOwogICAgIC8vIFJlbWl4IGFsd2F5cyBmaW5kcyBhIGNvbnZlcnNpb24gd2hlcmVhcyBEb3dubWl4ZXIgZWZmZWN0IGFib3ZlIG1heSBmYWlsLgotICAgIHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBwUmJwOwotICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHBUcmFjayk7CisgICAgZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBwUmJwOworICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIEF1ZGlvTWl4ZXI6OnVucHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lIF9fdW51c2VkKSB7Ci0gICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnVucHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQoJWQpIiwgdHJhY2tOYW1lKTsKLSAgICBpZiAocFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOwotICAgICAgICBwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKLSAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMocFRyYWNrKTsKK3ZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfdDo6dW5wcmVwYXJlRm9yUmVmb3JtYXQoKSB7CisgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnVucHJlcGFyZUZvclJlZm9ybWF0KCVwKSIsIHRoaXMpOworICAgIGJvb2wgcmVxdWlyZXNSZWNvbmZpZ3VyZSA9IGZhbHNlOworICAgIGlmIChtUmVmb3JtYXRCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtUmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKKyAgICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOworICAgICAgICByZXF1aXJlc1JlY29uZmlndXJlID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKKyAgICAgICAgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlciA9IE5VTEw7CisgICAgICAgIHJlcXVpcmVzUmVjb25maWd1cmUgPSB0cnVlOworICAgIH0KKyAgICBpZiAocmVxdWlyZXNSZWNvbmZpZ3VyZSkgeworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9NaXhlcjo6cHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lKQorc3RhdHVzX3QgQXVkaW9NaXhlcjo6dHJhY2tfdDo6cHJlcGFyZUZvclJlZm9ybWF0KCkKIHsKLSAgICBBTE9HVigiQXVkaW9NaXhlcjo6cHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQoJWQpIHdpdGggZm9ybWF0ICUjeCIsIHRyYWNrTmFtZSwgcFRyYWNrLT5tRm9ybWF0KTsKLSAgICAvLyBkaXNjYXJkIHRoZSBwcmV2aW91cyByZWZvcm1hdHRlciBpZiB0aGVyZSB3YXMgb25lCi0gICAgdW5wcmVwYXJlVHJhY2tGb3JSZWZvcm1hdChwVHJhY2ssIHRyYWNrTmFtZSk7Ci0gICAgLy8gb25seSBjb25maWd1cmUgcmVmb3JtYXR0ZXIgaWYgbmVlZGVkCi0gICAgaWYgKHBUcmFjay0+bUZvcm1hdCAhPSBwVHJhY2stPm1NaXhlckluRm9ybWF0KSB7Ci0gICAgICAgIHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBuZXcgUmVmb3JtYXRCdWZmZXJQcm92aWRlcigKLSAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socFRyYWNrLT5jaGFubmVsTWFzayksCi0gICAgICAgICAgICAgICAgcFRyYWNrLT5tRm9ybWF0LCBwVHJhY2stPm1NaXhlckluRm9ybWF0LAorICAgIEFMT0dWKCJBdWRpb01peGVyOjpwcmVwYXJlRm9yUmVmb3JtYXQoJXApIHdpdGggZm9ybWF0ICUjeCIsIHRoaXMsIG1Gb3JtYXQpOworICAgIC8vIGRpc2NhcmQgcHJldmlvdXMgcmVmb3JtYXR0ZXJzCisgICAgdW5wcmVwYXJlRm9yUmVmb3JtYXQoKTsKKyAgICAvLyBvbmx5IGNvbmZpZ3VyZSByZWZvcm1hdHRlcnMgYXMgbmVlZGVkCisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgdGFyZ2V0Rm9ybWF0ID0gbURvd25taXhSZXF1aXJlc0Zvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRAorICAgICAgICAgICAgPyBtRG93bm1peFJlcXVpcmVzRm9ybWF0IDogbU1peGVySW5Gb3JtYXQ7CisgICAgYm9vbCByZXF1aXJlc1JlY29uZmlndXJlID0gZmFsc2U7CisgICAgaWYgKG1Gb3JtYXQgIT0gdGFyZ2V0Rm9ybWF0KSB7CisgICAgICAgIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gbmV3IFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgICAgICBtRm9ybWF0LAorICAgICAgICAgICAgICAgIHRhcmdldEZvcm1hdCwKICAgICAgICAgICAgICAgICBrQ29weUJ1ZmZlckZyYW1lQ291bnQpOwotICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyhwVHJhY2spOworICAgICAgICByZXF1aXJlc1JlY29uZmlndXJlID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHRhcmdldEZvcm1hdCAhPSBtTWl4ZXJJbkZvcm1hdCkgeworICAgICAgICBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gbmV3IFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1NaXhlckNoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgICAgICB0YXJnZXRGb3JtYXQsCisgICAgICAgICAgICAgICAgbU1peGVySW5Gb3JtYXQsCisgICAgICAgICAgICAgICAga0NvcHlCdWZmZXJGcmFtZUNvdW50KTsKKyAgICAgICAgcmVxdWlyZXNSZWNvbmZpZ3VyZSA9IHRydWU7CisgICAgfQorICAgIGlmIChyZXF1aXJlc1JlY29uZmlndXJlKSB7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBBdWRpb01peGVyOjpyZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyh0cmFja190KiBwVHJhY2spCit2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OnJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCkKIHsKLSAgICBwVHJhY2stPmJ1ZmZlclByb3ZpZGVyID0gcFRyYWNrLT5tSW5wdXRCdWZmZXJQcm92aWRlcjsKLSAgICBpZiAocFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlcikgewotICAgICAgICBwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihwVHJhY2stPmJ1ZmZlclByb3ZpZGVyKTsKLSAgICAgICAgcFRyYWNrLT5idWZmZXJQcm92aWRlciA9IHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CisgICAgYnVmZmVyUHJvdmlkZXIgPSBtSW5wdXRCdWZmZXJQcm92aWRlcjsKKyAgICBpZiAobVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIpIHsKKyAgICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtUmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKICAgICB9Ci0gICAgaWYgKHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIpIHsKLSAgICAgICAgcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIocFRyYWNrLT5idWZmZXJQcm92aWRlcik7Ci0gICAgICAgIHBUcmFjay0+YnVmZmVyUHJvdmlkZXIgPSBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyOworICAgIGlmIChkb3dubWl4ZXJCdWZmZXJQcm92aWRlcikgeworICAgICAgICBkb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOworICAgICAgICBidWZmZXJQcm92aWRlciA9IGRvd25taXhlckJ1ZmZlclByb3ZpZGVyOworICAgIH0KKyAgICBpZiAobVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcikgeworICAgICAgICBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihidWZmZXJQcm92aWRlcik7CisgICAgICAgIGJ1ZmZlclByb3ZpZGVyID0gbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKKyAgICB9CisgICAgaWYgKG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyKSB7CisgICAgICAgIG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihidWZmZXJQcm92aWRlcik7CisgICAgICAgIGJ1ZmZlclByb3ZpZGVyID0gbVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI7CiAgICAgfQogfQogCkBAIC02ODcsMTAgKzQ0MywxMiBAQAogICAgIGRlbGV0ZSB0cmFjay5yZXNhbXBsZXI7CiAgICAgdHJhY2sucmVzYW1wbGVyID0gTlVMTDsKICAgICAvLyBkZWxldGUgdGhlIGRvd25taXhlcgotICAgIHVucHJlcGFyZVRyYWNrRm9yRG93bm1peCgmbVN0YXRlLnRyYWNrc1tuYW1lXSwgbmFtZSk7CisgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS51bnByZXBhcmVGb3JEb3dubWl4KCk7CiAgICAgLy8gZGVsZXRlIHRoZSByZWZvcm1hdHRlcgotICAgIHVucHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQoJm1TdGF0ZS50cmFja3NbbmFtZV0sIG5hbWUpOwotCisgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS51bnByZXBhcmVGb3JSZWZvcm1hdCgpOworICAgIC8vIGRlbGV0ZSB0aGUgdGltZXN0cmV0Y2ggcHJvdmlkZXIKKyAgICBkZWxldGUgdHJhY2subVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI7CisgICAgdHJhY2subVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgPSBOVUxMOwogICAgIG1UcmFja05hbWVzICY9IH4oMTw8bmFtZSk7CiB9CiAKQEAgLTc0OCw0MSArNTA2LDk5IEBACiBzdGF0aWMgaW5saW5lIGJvb2wgc2V0Vm9sdW1lUmFtcFZhcmlhYmxlcyhmbG9hdCBuZXdWb2x1bWUsIGludDMyX3QgcmFtcCwKICAgICAgICAgaW50MTZfdCAqcEludFNldFZvbHVtZSwgaW50MzJfdCAqcEludFByZXZWb2x1bWUsIGludDMyX3QgKnBJbnRWb2x1bWVJbmMsCiAgICAgICAgIGZsb2F0ICpwU2V0Vm9sdW1lLCBmbG9hdCAqcFByZXZWb2x1bWUsIGZsb2F0ICpwVm9sdW1lSW5jKSB7CisgICAgLy8gY2hlY2sgZmxvYXRpbmcgcG9pbnQgdm9sdW1lIHRvIHNlZSBpZiBpdCBpcyBpZGVudGljYWwgdG8gdGhlIHByZXZpb3VzbHkKKyAgICAvLyBzZXQgdm9sdW1lLgorICAgIC8vIFdlIGRvIG5vdCB1c2UgYSB0b2xlcmFuY2UgaGVyZSAoYW5kIHJlamVjdCBjaGFuZ2VzIHRvbyBzbWFsbCkKKyAgICAvLyBhcyBpdCBtYXkgYmUgY29uZnVzaW5nIHRvIHVzZSBhIGRpZmZlcmVudCB2YWx1ZSB0aGFuIHRoZSBvbmUgc2V0LgorICAgIC8vIElmIHRoZSByZXN1bHRpbmcgdm9sdW1lIGlzIHRvbyBzbWFsbCB0byByYW1wLCBpdCBpcyBhIGRpcmVjdCBzZXQgb2YgdGhlIHZvbHVtZS4KICAgICBpZiAobmV3Vm9sdW1lID09ICpwU2V0Vm9sdW1lKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgLyogc2V0IHRoZSBmbG9hdGluZyBwb2ludCB2b2x1bWUgdmFyaWFibGVzICovCi0gICAgaWYgKHJhbXAgIT0gMCkgewotICAgICAgICAqcFZvbHVtZUluYyA9IChuZXdWb2x1bWUgLSAqcFNldFZvbHVtZSkgLyByYW1wOwotICAgICAgICAqcFByZXZWb2x1bWUgPSAqcFNldFZvbHVtZTsKKyAgICBpZiAobmV3Vm9sdW1lIDwgMCkgeworICAgICAgICBuZXdWb2x1bWUgPSAwOyAvLyBzaG91bGQgbm90IGhhdmUgbmVnYXRpdmUgdm9sdW1lcwogICAgIH0gZWxzZSB7Ci0gICAgICAgICpwVm9sdW1lSW5jID0gMDsKLSAgICAgICAgKnBQcmV2Vm9sdW1lID0gbmV3Vm9sdW1lOworICAgICAgICBzd2l0Y2ggKGZwY2xhc3NpZnkobmV3Vm9sdW1lKSkgeworICAgICAgICBjYXNlIEZQX1NVQk5PUk1BTDoKKyAgICAgICAgY2FzZSBGUF9OQU46CisgICAgICAgICAgICBuZXdWb2x1bWUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRlBfWkVSTzoKKyAgICAgICAgICAgIGJyZWFrOyAvLyB6ZXJvIHZvbHVtZSBpcyBmaW5lCisgICAgICAgIGNhc2UgRlBfSU5GSU5JVEU6CisgICAgICAgICAgICAvLyBJbmZpbml0ZSB2b2x1bWUgY291bGQgYmUgaGFuZGxlZCBjb25zaXN0ZW50bHkgc2luY2UKKyAgICAgICAgICAgIC8vIGZsb2F0aW5nIHBvaW50IG1hdGggc2F0dXJhdGVzIGF0IGluZmluaXRpZXMsCisgICAgICAgICAgICAvLyBidXQgd2UgbGltaXQgdm9sdW1lIHRvIHVuaXR5IGdhaW4gZmxvYXQuCisgICAgICAgICAgICAvLyByYW1wID0gMDsgYnJlYWs7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgbmV3Vm9sdW1lID0gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZQX05PUk1BTDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIEZsb2F0aW5nIHBvaW50IGRvZXMgbm90IGhhdmUgcHJvYmxlbXMgd2l0aCBvdmVyZmxvdyB3cmFwCisgICAgICAgICAgICAvLyB0aGF0IGludGVnZXIgaGFzLiAgSG93ZXZlciwgd2UgbGltaXQgdGhlIHZvbHVtZSB0bworICAgICAgICAgICAgLy8gdW5pdHkgZ2FpbiBoZXJlLgorICAgICAgICAgICAgLy8gVE9ETzogUmV2aXNpdCB0aGUgdm9sdW1lIGxpbWl0YXRpb24gYW5kIHBlcmhhcHMgcGFyYW1ldGVyaXplLgorICAgICAgICAgICAgaWYgKG5ld1ZvbHVtZSA+IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQpIHsKKyAgICAgICAgICAgICAgICBuZXdWb2x1bWUgPSBBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICB9Ci0gICAgKnBTZXRWb2x1bWUgPSBuZXdWb2x1bWU7CiAKLSAgICAvKiBzZXQgdGhlIGxlZ2FjeSBpbnRlZ2VyIHZvbHVtZSB2YXJpYWJsZXMgKi8KLSAgICBpbnQzMl90IGludFZvbHVtZSA9IG5ld1ZvbHVtZSAqIEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fSU5UOwotICAgIGlmIChpbnRWb2x1bWUgPiBBdWRpb01peGVyOjpVTklUWV9HQUlOX0lOVCkgewotICAgICAgICBpbnRWb2x1bWUgPSBBdWRpb01peGVyOjpVTklUWV9HQUlOX0lOVDsKLSAgICB9IGVsc2UgaWYgKGludFZvbHVtZSA8IDApIHsKLSAgICAgICAgQUxPR0UoIm5lZ2F0aXZlIHZvbHVtZSAlLjdnIiwgbmV3Vm9sdW1lKTsKLSAgICAgICAgaW50Vm9sdW1lID0gMDsgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGZvciBzYWZldHkgY2hlY2suCisgICAgLy8gc2V0IGZsb2F0aW5nIHBvaW50IHZvbHVtZSByYW1wCisgICAgaWYgKHJhbXAgIT0gMCkgeworICAgICAgICAvLyB3aGVuIHRoZSByYW1wIGNvbXBsZXRlcywgKnBQcmV2Vm9sdW1lIGlzIHNldCB0byAqcFNldFZvbHVtZSwgc28gdGhlcmUKKyAgICAgICAgLy8gaXMgbm8gY29tcHV0YXRpb25hbCBtaXNtYXRjaDsgaGVuY2UgZXF1YWxpdHkgaXMgY2hlY2tlZCBoZXJlLgorICAgICAgICBBTE9HRF9JRigqcFByZXZWb2x1bWUgIT0gKnBTZXRWb2x1bWUsICJwcmV2aW91cyBmbG9hdCByYW1wIGhhc24ndCBmaW5pc2hlZCwiCisgICAgICAgICAgICAgICAgIiBwcmV2OiVmICBzZXRfdG86JWYiLCAqcFByZXZWb2x1bWUsICpwU2V0Vm9sdW1lKTsKKyAgICAgICAgY29uc3QgZmxvYXQgaW5jID0gKG5ld1ZvbHVtZSAtICpwUHJldlZvbHVtZSkgLyByYW1wOyAvLyBjb3VsZCBiZSBpbmYsIG5hbiwgc3Vibm9ybWFsCisgICAgICAgIGNvbnN0IGZsb2F0IG1heHYgPSBtYXgobmV3Vm9sdW1lLCAqcFByZXZWb2x1bWUpOyAvLyBjb3VsZCBiZSBpbmYsIGNhbm5vdCBiZSBuYW4sIHN1Ym5vcm1hbAorCisgICAgICAgIGlmIChpc25vcm1hbChpbmMpIC8vIGluYyBtdXN0IGJlIGEgbm9ybWFsIG51bWJlciAobm8gc3Vibm9ybWFscywgaW5maW5pdGUsIG5hbikKKyAgICAgICAgICAgICAgICAmJiBtYXh2ICsgaW5jICE9IG1heHYpIHsgLy8gaW5jIG11c3QgbWFrZSBmb3J3YXJkIHByb2dyZXNzCisgICAgICAgICAgICAqcFZvbHVtZUluYyA9IGluYzsKKyAgICAgICAgICAgIC8vIHJhbXAgaXMgc2V0IG5vdy4KKyAgICAgICAgICAgIC8vIE5vdGU6IGlmIG5ld1ZvbHVtZSBpcyAwLCB0aGVuIG5lYXIgdGhlIGVuZCBvZiB0aGUgcmFtcCwKKyAgICAgICAgICAgIC8vIGl0IG1heSBiZSBwb3NzaWJsZSB0aGF0IHRoZSByYW1wZWQgdm9sdW1lIG1heSBiZSBzdWJub3JtYWwgb3IKKyAgICAgICAgICAgIC8vIHRlbXBvcmFyaWx5IG5lZ2F0aXZlIGJ5IGEgc21hbGwgYW1vdW50IG9yIHN1Ym5vcm1hbCBkdWUgdG8gZmxvYXRpbmcKKyAgICAgICAgICAgIC8vIHBvaW50IGluYWNjdXJhY2llcy4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJhbXAgPSAwOyAvLyByYW1wIG5vdCBhbGxvd2VkCisgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKGludFZvbHVtZSA9PSAqcEludFNldFZvbHVtZSkgewotICAgICAgICAqcEludFZvbHVtZUluYyA9IDA7Ci0gICAgICAgIC8qIFRPRE86IGludGVnZXIvZmxvYXQgd29ya2Fyb3VuZDogaWdub3JlIGZsb2F0aW5nIHZvbHVtZSByYW1wICovCisKKyAgICAvLyBjb21wdXRlIGFuZCBjaGVjayBpbnRlZ2VyIHZvbHVtZSwgbm8gbmVlZCB0byBjaGVjayBuZWdhdGl2ZSB2YWx1ZXMKKyAgICAvLyBUaGUgaW50ZWdlciB2b2x1bWUgaXMgbGltaXRlZCB0byAidW5pdHlfZ2FpbiIgdG8gYXZvaWQgd3JhcHBpbmcgYW5kIG90aGVyCisgICAgLy8gYXVkaW8gYXJ0aWZhY3RzLCBzbyBpdCBuZXZlciByZWFjaGVzIHRoZSByYW5nZSBsaW1pdCBvZiBVNC4yOC4KKyAgICAvLyBXZSBzYWZlbHkgdXNlIHNpZ25lZCAxNiBhbmQgMzIgYml0IGludGVnZXJzIGhlcmUuCisgICAgY29uc3QgZmxvYXQgc2NhbGVkVm9sdW1lID0gbmV3Vm9sdW1lICogQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9JTlQ7IC8vIG5vdCBuZWcsIHN1Ym5vcm1hbCwgbmFuCisgICAgY29uc3QgaW50MzJfdCBpbnRWb2x1bWUgPSAoc2NhbGVkVm9sdW1lID49IChmbG9hdClBdWRpb01peGVyOjpVTklUWV9HQUlOX0lOVCkgPworICAgICAgICAgICAgQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9JTlQgOiAoaW50MzJfdClzY2FsZWRWb2x1bWU7CisKKyAgICAvLyBzZXQgaW50ZWdlciB2b2x1bWUgcmFtcAorICAgIGlmIChyYW1wICE9IDApIHsKKyAgICAgICAgLy8gaW50ZWdlciB2b2x1bWUgaXMgVTQuMTIgKHRvIHVzZSAxNiBiaXQgbXVsdGlwbGllcyksIGJ1dCByYW1waW5nIHVzZXMgVTQuMjguCisgICAgICAgIC8vIHdoZW4gdGhlIHJhbXAgY29tcGxldGVzLCAqcEludFByZXZWb2x1bWUgaXMgc2V0IHRvICpwSW50U2V0Vm9sdW1lIDw8IDE2LCBzbyB0aGVyZQorICAgICAgICAvLyBpcyBubyBjb21wdXRhdGlvbmFsIG1pc21hdGNoOyBoZW5jZSBlcXVhbGl0eSBpcyBjaGVja2VkIGhlcmUuCisgICAgICAgIEFMT0dEX0lGKCpwSW50UHJldlZvbHVtZSAhPSAqcEludFNldFZvbHVtZSA8PCAxNiwgInByZXZpb3VzIGludCByYW1wIGhhc24ndCBmaW5pc2hlZCwiCisgICAgICAgICAgICAgICAgIiBwcmV2OiVkICBzZXRfdG86JWQiLCAqcEludFByZXZWb2x1bWUsICpwSW50U2V0Vm9sdW1lIDw8IDE2KTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBpbmMgPSAoKGludFZvbHVtZSA8PCAxNikgLSAqcEludFByZXZWb2x1bWUpIC8gcmFtcDsKKworICAgICAgICBpZiAoaW5jICE9IDApIHsgLy8gaW5jIG11c3QgbWFrZSBmb3J3YXJkIHByb2dyZXNzCisgICAgICAgICAgICAqcEludFZvbHVtZUluYyA9IGluYzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJhbXAgPSAwOyAvLyByYW1wIG5vdCBhbGxvd2VkCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpZiBubyByYW1wLCBvciByYW1wIG5vdCBhbGxvd2VkLCB0aGVuIGNsZWFyIGZsb2F0IGFuZCBpbnRlZ2VyIGluY3JlbWVudHMKKyAgICBpZiAocmFtcCA9PSAwKSB7CiAgICAgICAgICpwVm9sdW1lSW5jID0gMDsKICAgICAgICAgKnBQcmV2Vm9sdW1lID0gbmV3Vm9sdW1lOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKHJhbXAgIT0gMCkgewotICAgICAgICAqcEludFZvbHVtZUluYyA9ICgoaW50Vm9sdW1lIC0gKnBJbnRTZXRWb2x1bWUpIDw8IDE2KSAvIHJhbXA7Ci0gICAgICAgICpwSW50UHJldlZvbHVtZSA9ICgqcEludFZvbHVtZUluYyA9PSAwID8gaW50Vm9sdW1lIDogKnBJbnRTZXRWb2x1bWUpIDw8IDE2OwotICAgIH0gZWxzZSB7CiAgICAgICAgICpwSW50Vm9sdW1lSW5jID0gMDsKICAgICAgICAgKnBJbnRQcmV2Vm9sdW1lID0gaW50Vm9sdW1lIDw8IDE2OwogICAgIH0KKyAgICAqcFNldFZvbHVtZSA9IG5ld1ZvbHVtZTsKICAgICAqcEludFNldFZvbHVtZSA9IGludFZvbHVtZTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTgyOCw3ICs2NDQsNyBAQAogICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSwgIkludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CiAgICAgICAgICAgICAgICAgdHJhY2subUZvcm1hdCA9IGZvcm1hdDsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBGT1JNQVQsICUjeCkiLCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIHByZXBhcmVUcmFja0ZvclJlZm9ybWF0KCZ0cmFjaywgbmFtZSk7CisgICAgICAgICAgICAgICAgdHJhY2sucHJlcGFyZUZvclJlZm9ybWF0KCk7CiAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOwpAQCAtOTEyLDYgKzcyOCwyOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRJTUVTVFJFVENIOgorICAgICAgICAgICAgc3dpdGNoIChwYXJhbSkgeworICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19SQVRFOiB7CisgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgKnBsYXliYWNrUmF0ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEF1ZGlvUGxheWJhY2tSYXRlKj4odmFsdWUpOworICAgICAgICAgICAgICAgIEFMT0dXX0lGKCFpc0F1ZGlvUGxheWJhY2tSYXRlVmFsaWQoKnBsYXliYWNrUmF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIHBhcmFtZXRlcnMgc3BlZWQgJWYsIHBpdGNoICVmIixwbGF5YmFja1JhdGUtPm1TcGVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bVBpdGNoKTsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2suc2V0UGxheWJhY2tSYXRlKCpwbGF5YmFja1JhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVElNRVNUUkVUQ0gsIFBMQVlCQUNLX1JBVEUsIFNUUkVUQ0hfTU9ERSwgRkFMTEJBQ0tfTU9ERSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVmICVmICVkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUtPm1TcGVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUtPm1QaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUtPm1TdHJldGNoTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUtPm1GYWxsYmFja01vZGUpOworICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzZXRQYXJhbWV0ZXIgdGltZXN0cmV0Y2g6IGJhZCBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgic2V0UGFyYW1ldGVyOiBiYWQgdGFyZ2V0ICVkIiwgdGFyZ2V0KTsKQEAgLTkzMSwxMSArNzY5LDEwIEBACiAgICAgICAgICAgICAgICAgLy8gRklYTUUgdGhpcyBpcyBmbGF3ZWQgZm9yIGR5bmFtaWMgc2FtcGxlIHJhdGVzLCBhcyB3ZSBjaG9vc2UgdGhlIHJlc2FtcGxlcgogICAgICAgICAgICAgICAgIC8vIHF1YWxpdHkgbGV2ZWwgYmFzZWQgb24gdGhlIGluaXRpYWwgcmF0aW8sIGJ1dCB0aGF0IGNvdWxkIGNoYW5nZSBsYXRlci4KICAgICAgICAgICAgICAgICAvLyBTaG91bGQgaGF2ZSBhIHdheSB0byBkaXN0aW5ndWlzaCB0cmFja3Mgd2l0aCBzdGF0aWMgcmF0aW9zIHZzLiBkeW5hbWljIHJhdGlvcy4KLSAgICAgICAgICAgICAgICBpZiAoISgodHJhY2tTYW1wbGVSYXRlID09IDQ0MTAwICYmIGRldlNhbXBsZVJhdGUgPT0gNDgwMDApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKHRyYWNrU2FtcGxlUmF0ZSA9PSA0ODAwMCAmJiBkZXZTYW1wbGVSYXRlID09IDQ0MTAwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSA9IEF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNNdXNpY1JhdGUodHJhY2tTYW1wbGVSYXRlKSkgewogICAgICAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkRFRkFVTFRfUVVBTElUWTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZW1vdmUgTU9OT19IQUNLLiBSZXNhbXBsZXIgc2VlcyAjY2hhbm5lbHMgYWZ0ZXIgdGhlIGRvd25taXhlcgpAQCAtOTU3LDYgKzc5NCwzMCBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBBdWRpb01peGVyOjp0cmFja190OjpzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkKK3sKKyAgICBpZiAoKG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyID09IE5VTEwgJiYKKyAgICAgICAgICAgIGZhYnMocGxheWJhY2tSYXRlLm1TcGVlZCAtIG1QbGF5YmFja1JhdGUubVNwZWVkKSA8IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTl9ERUxUQSAmJgorICAgICAgICAgICAgZmFicyhwbGF5YmFja1JhdGUubVBpdGNoIC0gbVBsYXliYWNrUmF0ZS5tUGl0Y2gpIDwgQVVESU9fVElNRVNUUkVUQ0hfUElUQ0hfTUlOX0RFTFRBKSB8fAorICAgICAgICAgICAgaXNBdWRpb1BsYXliYWNrUmF0ZUVxdWFsKHBsYXliYWNrUmF0ZSwgbVBsYXliYWNrUmF0ZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtUGxheWJhY2tSYXRlID0gcGxheWJhY2tSYXRlOworICAgIGlmIChtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciA9PSBOVUxMKSB7CisgICAgICAgIC8vIFRPRE86IFJlbW92ZSBNT05PX0hBQ0suIFJlc2FtcGxlciBzZWVzICNjaGFubmVscyBhZnRlciB0aGUgZG93bm1peGVyCisgICAgICAgIC8vIGJ1dCBpZiBub25lIGV4aXN0cywgaXQgaXMgdGhlIGNoYW5uZWwgY291bnQgKDEgZm9yIG1vbm8pLgorICAgICAgICBjb25zdCBpbnQgdGltZXN0cmV0Y2hDaGFubmVsQ291bnQgPSBkb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBOVUxMCisgICAgICAgICAgICAgICAgPyBtTWl4ZXJDaGFubmVsQ291bnQgOiBjaGFubmVsQ291bnQ7CisgICAgICAgIG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyID0gbmV3IFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIodGltZXN0cmV0Y2hDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgbU1peGVySW5Gb3JtYXQsIHNhbXBsZVJhdGUsIHBsYXliYWNrUmF0ZSk7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyKj4obVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIpCisgICAgICAgICAgICAgICAgLT5zZXRQbGF5YmFja1JhdGUocGxheWJhY2tSYXRlKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKIC8qIENoZWNrcyB0byBzZWUgaWYgdGhlIHZvbHVtZSByYW1wIGhhcyBjb21wbGV0ZWQgYW5kIGNsZWFycyB0aGUgaW5jcmVtZW50CiAgKiB2YXJpYWJsZXMgYXBwcm9wcmlhdGVseS4KICAqCkBAIC05NzQsNyArODM1LDggQEAKIHsKICAgICBpZiAodXNlRmxvYXQpIHsKICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IE1BWF9OVU1fVk9MVU1FUzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobVZvbHVtZUluY1tpXSAhPSAwICYmIGZhYnMobVZvbHVtZVtpXSAtIG1QcmV2Vm9sdW1lW2ldKSA8PSBmYWJzKG1Wb2x1bWVJbmNbaV0pKSB7CisgICAgICAgICAgICBpZiAoKG1Wb2x1bWVJbmNbaV0gPiAwICYmIG1QcmV2Vm9sdW1lW2ldICsgbVZvbHVtZUluY1tpXSA+PSBtVm9sdW1lW2ldKSB8fAorICAgICAgICAgICAgICAgICAgICAgKG1Wb2x1bWVJbmNbaV0gPCAwICYmIG1QcmV2Vm9sdW1lW2ldICsgbVZvbHVtZUluY1tpXSA8PSBtVm9sdW1lW2ldKSkgewogICAgICAgICAgICAgICAgIHZvbHVtZUluY1tpXSA9IDA7CiAgICAgICAgICAgICAgICAgcHJldlZvbHVtZVtpXSA9IHZvbHVtZVtpXSA8PCAxNjsKICAgICAgICAgICAgICAgICBtVm9sdW1lSW5jW2ldID0gMC47CkBAIC0xMDMyLDEwICs4OTQsMTUgQEAKICAgICBpZiAobVN0YXRlLnRyYWNrc1tuYW1lXS5tUmVmb3JtYXRCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CiAgICAgICAgIG1TdGF0ZS50cmFja3NbbmFtZV0ubVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CiAgICAgfSBlbHNlIGlmIChtU3RhdGUudHJhY2tzW25hbWVdLmRvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5kb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKG1TdGF0ZS50cmFja3NbbmFtZV0ubVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CisgICAgICAgIG1TdGF0ZS50cmFja3NbbmFtZV0ubVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKG1TdGF0ZS50cmFja3NbbmFtZV0ubVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgeworICAgICAgICBtU3RhdGUudHJhY2tzW25hbWVdLm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwogICAgIH0KIAogICAgIG1TdGF0ZS50cmFja3NbbmFtZV0ubUlucHV0QnVmZmVyUHJvdmlkZXIgPSBidWZmZXJQcm92aWRlcjsKLSAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygmbVN0YXRlLnRyYWNrc1tuYW1lXSk7CisgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5yZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwogfQogCiAKQEAgLTExMTQsNyArOTgxLDggQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKChuICYgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSykgPT0gTkVFRFNfQ0hBTk5FTF8xKXsKICAgICAgICAgICAgICAgICAgICAgdC5ob29rID0gZ2V0VHJhY2tIb29rKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVyQ2hhbm5lbENvdW50ID09IDIgLy8gVE9ETzogTU9OT19IQUNLLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0Lm1NaXhlckNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyAgLy8gVE9ETzogTU9OT19IQUNLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0LmNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gVFJBQ0tUWVBFX05PUkVTQU1QTEVNT05PIDogVFJBQ0tUWVBFX05PUkVTQU1QTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJJbkZvcm1hdCwgdC5tTWl4ZXJGb3JtYXQpOwpAQCAtMjIzNiw0ICsyMTA0LDQgQEAKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCmluZGV4IGY0ZjE0MmIuLjcxNjVjNmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaApAQCAtMjMsMTIgKzIzLDE0IEBACiAKICNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL0NvbXBhdC5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAogI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyLmgiCisjaW5jbHVkZSAiQnVmZmVyUHJvdmlkZXJzLmgiCiAKIC8vIEZJWE1FIFRoaXMgaXMgYWN0dWFsbHkgdW5pdHkgZ2Fpbiwgd2hpY2ggbWlnaHQgbm90IGJlIG1heCBpbiBmdXR1cmUsIGV4cHJlc3NlZCBpbiBVLjEyCiAjZGVmaW5lIE1BWF9HQUlOX0lOVCBBdWRpb01peGVyOjpVTklUWV9HQUlOX0lOVApAQCAtNzIsNiArNzQsNyBAQAogICAgICAgICBSRVNBTVBMRSAgICAgICAgPSAweDMwMDEsCiAgICAgICAgIFJBTVBfVk9MVU1FICAgICA9IDB4MzAwMiwgLy8gcmFtcCB0byBuZXcgdm9sdW1lCiAgICAgICAgIFZPTFVNRSAgICAgICAgICA9IDB4MzAwMywgLy8gZG9uJ3QgcmFtcAorICAgICAgICBUSU1FU1RSRVRDSCAgICAgPSAweDMwMDQsCiAKICAgICAgICAgLy8gc2V0IFBhcmFtZXRlciBuYW1lcwogICAgICAgICAvLyBmb3IgdGFyZ2V0IFRSQUNLCkBAIC05OSw2ICsxMDIsOSBAQAogICAgICAgICBWT0xVTUUwICAgICAgICAgPSAweDQyMDAsCiAgICAgICAgIFZPTFVNRTEgICAgICAgICA9IDB4NDIwMSwKICAgICAgICAgQVVYTEVWRUwgICAgICAgID0gMHg0MjEwLAorICAgICAgICAvLyBmb3IgdGFyZ2V0IFRJTUVTVFJFVENICisgICAgICAgIFBMQVlCQUNLX1JBVEUgICA9IDB4NDMwMCwgLy8gQ29uZmlndXJlIHRpbWVzdHJldGNoIG9uIHRoaXMgdHJhY2sgbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgJ3ZhbHVlJyBpcyBhIHBvaW50ZXIgdG8gdGhlIG5ldyBwbGF5YmFjayByYXRlLgogICAgIH07CiAKIApAQCAtMTI3LDEwICsxMzMsMTYgQEAKICAgICBzaXplX3QgICAgICBnZXRVbnJlbGVhc2VkRnJhbWVzKGludCBuYW1lKSBjb25zdDsKIAogICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkUGNtVHJhY2tGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7Ci0gICAgICAgIHJldHVybiBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgfHwKLSAgICAgICAgICAgICAgICBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEIHx8Ci0gICAgICAgICAgICAgICAgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUIHx8Ci0gICAgICAgICAgICAgICAgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV84X0JJVDoKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAgICAgfQogCiBwcml2YXRlOgpAQCAtMTUzLDcgKzE2NSw2IEBACiAKICAgICBzdHJ1Y3Qgc3RhdGVfdDsKICAgICBzdHJ1Y3QgdHJhY2tfdDsKLSAgICBjbGFzcyBDb3B5QnVmZmVyUHJvdmlkZXI7CiAKICAgICB0eXBlZGVmIHZvaWQgKCpob29rX3QpKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dHB1dCwgc2l6ZV90IG51bU91dEZyYW1lcywgaW50MzJfdCogdGVtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGF1eCk7CkBAIC0yMDUsMTcgKzIxNiwzOCBAQAogICAgICAgICBpbnQzMl90KiAgICAgICAgICAgYXV4QnVmZmVyOwogCiAgICAgICAgIC8vIDE2LWJ5dGUgYm91bmRhcnkKKworICAgICAgICAvKiBCdWZmZXIgcHJvdmlkZXJzIGFyZSBjb25zdHJ1Y3RlZCB0byB0cmFuc2xhdGUgdGhlIHRyYWNrIGlucHV0IGRhdGEgYXMgbmVlZGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBUT0RPOiBwZXJoYXBzIG1ha2UgYSBzaW5nbGUgUGxheWJhY2tDb252ZXJ0ZXJQcm92aWRlciBjbGFzcyB0byBtb3ZlCisgICAgICAgICAqIGFsbCBwcmUtbWl4ZXIgdHJhY2sgYnVmZmVyIGNvbnZlcnNpb25zIG91dHNpZGUgdGhlIEF1ZGlvTWl4ZXIgY2xhc3MuCisgICAgICAgICAqCisgICAgICAgICAqIDEpIG1JbnB1dEJ1ZmZlclByb3ZpZGVyOiBUaGUgQXVkaW9UcmFjayBidWZmZXIgcHJvdmlkZXIuCisgICAgICAgICAqIDIpIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgdGhlIGF1ZGlvIHJlZm9ybWF0IHRvCisgICAgICAgICAqICAgIG1hdGNoIGVpdGhlciBtTWl4ZXJJbkZvcm1hdCBvciBtRG93bm1peFJlcXVpcmVzRm9ybWF0LCBpZiB0aGUgZG93bm1peGVyCisgICAgICAgICAqICAgIHJlcXVpcmVzIHJlZm9ybWF0LiBGb3IgZXhhbXBsZSwgaXQgbWF5IGNvbnZlcnQgZmxvYXRpbmcgcG9pbnQgaW5wdXQgdG8KKyAgICAgICAgICogICAgUENNXzE2X2JpdCBpZiB0aGF0J3MgcmVxdWlyZWQgYnkgdGhlIGRvd25taXhlci4KKyAgICAgICAgICogMykgZG93bm1peGVyQnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgY2hhbm5lbCByZW1peGluZyB0byBtYXRjaAorICAgICAgICAgKiAgICB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHJlcXVpcmVkIGJ5IHRoZSBtaXhlciBzaW5rLgorICAgICAgICAgKiA0KSBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgcmVmb3JtYXR0aW5nIGZyb20KKyAgICAgICAgICogICAgdGhlIGRvd25taXhlciByZXF1aXJlbWVudHMgdG8gdGhlIG1peGVyIGVuZ2luZSBpbnB1dCByZXF1aXJlbWVudHMuCisgICAgICAgICAqIDUpIG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOiBBZGRzIHRpbWVzdHJldGNoaW5nIGZvciBwbGF5YmFjayByYXRlCisgICAgICAgICAqLwogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiAgICAgbUlucHV0QnVmZmVyUHJvdmlkZXI7ICAgIC8vIGV4dGVybmFsbHkgcHJvdmlkZWQgYnVmZmVyIHByb3ZpZGVyLgotICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIqICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7IC8vIHByb3ZpZGVyIHdyYXBwZXIgZm9yIHJlZm9ybWF0dGluZy4KLSAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKiAgICAgIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyOyAvLyB3cmFwcGVyIGZvciBjaGFubmVsIGNvbnZlcnNpb24uCisgICAgICAgIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIqICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlcjsgLy8gcHJvdmlkZXIgd3JhcHBlciBmb3IgcmVmb3JtYXR0aW5nLgorICAgICAgICBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyKiAgZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7IC8vIHdyYXBwZXIgZm9yIGNoYW5uZWwgY29udmVyc2lvbi4KKyAgICAgICAgUGFzc3RocnVCdWZmZXJQcm92aWRlciogIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CisgICAgICAgIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIqICBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjsKIAogICAgICAgICBpbnQzMl90ICAgICBzZXNzaW9uSWQ7CiAKLSAgICAgICAgLy8gMTYtYnl0ZSBib3VuZGFyeQogICAgICAgICBhdWRpb19mb3JtYXRfdCBtTWl4ZXJGb3JtYXQ7ICAgICAvLyBvdXRwdXQgbWl4IGZvcm1hdDogQVVESU9fRk9STUFUX1BDTV8oRkxPQVR8MTZfQklUKQogICAgICAgICBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OyAgICAgICAgICAvLyBpbnB1dCB0cmFjayBmb3JtYXQKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgbU1peGVySW5Gb3JtYXQ7ICAgLy8gbWl4IGludGVybmFsIGZvcm1hdCBBVURJT19GT1JNQVRfUENNXyhGTE9BVHwxNl9CSVQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVhY2ggdHJhY2sgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gdGhpcyBmb3JtYXQuCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQ7ICAvLyByZXF1aXJlZCBkb3dubWl4ZXIgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCBpZiAxNiBiaXQgbmVjZXNzYXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBVURJT19GT1JNQVRfSU5WQUxJRCBpZiBubyByZXF1aXJlZCBmb3JtYXQKIAogICAgICAgICBmbG9hdCAgICAgICAgICBtVm9sdW1lW01BWF9OVU1fVk9MVU1FU107ICAgICAvLyBmbG9hdGluZyBwb2ludCBzZXQgdm9sdW1lCiAgICAgICAgIGZsb2F0ICAgICAgICAgIG1QcmV2Vm9sdW1lW01BWF9OVU1fVk9MVU1FU107IC8vIGZsb2F0aW5nIHBvaW50IHByZXZpb3VzIHZvbHVtZQpAQCAtMjI1LDEwICsyNTcsMTEgQEAKICAgICAgICAgZmxvYXQgICAgICAgICAgbVByZXZBdXhMZXZlbDsgICAgICAgICAgICAgICAgIC8vIGZsb2F0aW5nIHBvaW50IHByZXYgYXV4IGxldmVsCiAgICAgICAgIGZsb2F0ICAgICAgICAgIG1BdXhJbmM7ICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCBhdXggaW5jcmVtZW50CiAKLSAgICAgICAgLy8gMTYtYnl0ZSBib3VuZGFyeQogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtTWl4ZXJDaGFubmVsTWFzazsKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbU1peGVyQ2hhbm5lbENvdW50OwogCisgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlICAgIG1QbGF5YmFja1JhdGU7CisKICAgICAgICAgYm9vbCAgICAgICAgbmVlZHNSYW1wKCkgeyByZXR1cm4gKHZvbHVtZUluY1swXSB8IHZvbHVtZUluY1sxXSB8IGF1eEluYykgIT0gMDsgfQogICAgICAgICBib29sICAgICAgICBzZXRSZXNhbXBsZXIodWludDMyX3QgdHJhY2tTYW1wbGVSYXRlLCB1aW50MzJfdCBkZXZTYW1wbGVSYXRlKTsKICAgICAgICAgYm9vbCAgICAgICAgZG9lc1Jlc2FtcGxlKCkgY29uc3QgeyByZXR1cm4gcmVzYW1wbGVyICE9IE5VTEw7IH0KQEAgLTIzNiw2ICsyNjksMTMgQEAKICAgICAgICAgdm9pZCAgICAgICAgYWRqdXN0Vm9sdW1lUmFtcChib29sIGF1eCwgYm9vbCB1c2VGbG9hdCA9IGZhbHNlKTsKICAgICAgICAgc2l6ZV90ICAgICAgZ2V0VW5yZWxlYXNlZEZyYW1lcygpIGNvbnN0IHsgcmV0dXJuIHJlc2FtcGxlciAhPSBOVUxMID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNhbXBsZXItPmdldFVucmVsZWFzZWRGcmFtZXMoKSA6IDA7IH07CisKKyAgICAgICAgc3RhdHVzX3QgICAgcHJlcGFyZUZvckRvd25taXgoKTsKKyAgICAgICAgdm9pZCAgICAgICAgdW5wcmVwYXJlRm9yRG93bm1peCgpOworICAgICAgICBzdGF0dXNfdCAgICBwcmVwYXJlRm9yUmVmb3JtYXQoKTsKKyAgICAgICAgdm9pZCAgICAgICAgdW5wcmVwYXJlRm9yUmVmb3JtYXQoKTsKKyAgICAgICAgYm9vbCAgICAgICAgc2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpOworICAgICAgICB2b2lkICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwogICAgIH07CiAKICAgICB0eXBlZGVmIHZvaWQgKCpwcm9jZXNzX2hvb2tfdCkoc3RhdGVfdCogc3RhdGUsIGludDY0X3QgcHRzKTsKQEAgLTI1NCwxMTIgKzI5NCw2IEBACiAgICAgICAgIHRyYWNrX3QgICAgICAgICB0cmFja3NbTUFYX05VTV9UUkFDS1NdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CiAgICAgfTsKIAotICAgIC8vIEJhc2UgQXVkaW9CdWZmZXJQcm92aWRlciBjbGFzcyB1c2VkIGZvciBEb3duTWl4ZXJCdWZmZXJQcm92aWRlciwgUmVtaXhCdWZmZXJQcm92aWRlciwKLSAgICAvLyBhbmQgUmVmb3JtYXRCdWZmZXJQcm92aWRlci4KLSAgICAvLyBJdCBoYW5kbGVzIGEgcHJpdmF0ZSBidWZmZXIgZm9yIHVzZSBpbiBjb252ZXJ0aW5nIGZvcm1hdCBvciBjaGFubmVsIG1hc2tzIGZyb20gdGhlCi0gICAgLy8gaW5wdXQgZGF0YSB0byBhIGZvcm0gYWNjZXB0YWJsZSBieSB0aGUgbWl4ZXIuCi0gICAgLy8gVE9ETzogTWFrZSBhIFJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyIHdoZW4gaW50ZWdlcnMgYXJlIGVudGlyZWx5IHJlbW92ZWQgZnJvbSB0aGUKLSAgICAvLyBwcm9jZXNzaW5nIHBpcGVsaW5lLgotICAgIGNsYXNzIENvcHlCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIC8vIFVzZSBhIHByaXZhdGUgYnVmZmVyIG9mIGJ1ZmZlckZyYW1lQ291bnQgZnJhbWVzIChlYWNoIGZyYW1lIGlzIG91dHB1dEZyYW1lU2l6ZSBieXRlcykuCi0gICAgICAgIC8vIElmIGJ1ZmZlckZyYW1lQ291bnQgaXMgMCwgbm8gcHJpdmF0ZSBidWZmZXIgaXMgY3JlYXRlZCBhbmQgaW4tcGxhY2UgbW9kaWZpY2F0aW9uIG9mCi0gICAgICAgIC8vIHRoZSB1cHN0cmVhbSBidWZmZXIgcHJvdmlkZXIncyBidWZmZXJzIGlzIHBlcmZvcm1lZCBieSBjb3B5RnJhbWVzKCkuCi0gICAgICAgIENvcHlCdWZmZXJQcm92aWRlcihzaXplX3QgaW5wdXRGcmFtZVNpemUsIHNpemVfdCBvdXRwdXRGcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpOwotICAgICAgICB2aXJ0dWFsIH5Db3B5QnVmZmVyUHJvdmlkZXIoKTsKLQotICAgICAgICAvLyBPdmVycmlkZXMgQXVkaW9CdWZmZXJQcm92aWRlciBtZXRob2RzCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcik7Ci0KLSAgICAgICAgLy8gT3RoZXIgcHVibGljIG1ldGhvZHMKLQotICAgICAgICAvLyBjYWxsIHRoaXMgdG8gcmVsZWFzZSB0aGUgYnVmZmVyIHRvIHRoZSB1cHN0cmVhbSBwcm92aWRlci4KLSAgICAgICAgLy8gdHJlYXQgaXQgYXMgYW4gYXVkaW8gZGlzY29udGludWl0eSBmb3IgZnV0dXJlIHNhbXBsZXMuCi0gICAgICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOwotCi0gICAgICAgIC8vIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHN1cHBsaWVkIGJ5IHRoZSBkZXJpdmVkIGNsYXNzLiAgSXQgY29udmVydHMKLSAgICAgICAgLy8gI2ZyYW1lcyBpbiB0aGUgKnNyYyBwb2ludGVyIHRvIHRoZSAqZHN0IHBvaW50ZXIuICBJdCBpcyBwdWJsaWMgYmVjYXVzZQotICAgICAgICAvLyBzb21lIHByb3ZpZGVycyB3aWxsIGFsbG93IHRoaXMgdG8gd29yayBvbiBhcmJpdHJhcnkgYnVmZmVycyBvdXRzaWRlCi0gICAgICAgIC8vIG9mIHRoZSBpbnRlcm5hbCBidWZmZXJzLgotICAgICAgICB2aXJ0dWFsIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykgPSAwOwotCi0gICAgICAgIC8vIHNldCB0aGUgdXBzdHJlYW0gYnVmZmVyIHByb3ZpZGVyLiBDb25zaWRlciBjYWxsaW5nICJyZXNldCIgYmVmb3JlIHRoaXMgZnVuY3Rpb24uCi0gICAgICAgIHZvaWQgc2V0QnVmZmVyUHJvdmlkZXIoQXVkaW9CdWZmZXJQcm92aWRlciAqcCkgewotICAgICAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXIgPSBwOwotICAgICAgICB9Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIG1UcmFja0J1ZmZlclByb3ZpZGVyOwotICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICBtSW5wdXRGcmFtZVNpemU7Ci0gICAgICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1PdXRwdXRGcmFtZVNpemU7Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIG1CdWZmZXI7Ci0gICAgICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQ7Ci0gICAgICAgIHZvaWQqICAgICAgICAgICAgICAgIG1Mb2NhbEJ1ZmZlckRhdGE7Ci0gICAgICAgIHNpemVfdCAgICAgICAgICAgICAgIG1Db25zdW1lZDsKLSAgICB9OwotCi0gICAgLy8gRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgd3JhcHMgYSB0cmFjayBBdWRpb0J1ZmZlclByb3ZpZGVyIHRvIHByb3ZpZGUKLSAgICAvLyBwb3NpdGlvbiBkZXBlbmRlbnQgZG93bm1peGluZyBieSBhbiBBdWRpbyBFZmZlY3QuCi0gICAgY2xhc3MgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIERvd25taXhlckJ1ZmZlclByb3ZpZGVyKGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IHNlc3Npb25JZCwgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpOwotICAgICAgICB2aXJ0dWFsIH5Eb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcyk7Ci0gICAgICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1Eb3dubWl4SGFuZGxlICE9IE5VTEw7IH0KLQotICAgICAgICBzdGF0aWMgc3RhdHVzX3QgaW5pdCgpOwotICAgICAgICBzdGF0aWMgYm9vbCBpc011bHRpY2hhbm5lbENhcGFibGUoKSB7IHJldHVybiBzSXNNdWx0aWNoYW5uZWxDYXBhYmxlOyB9Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIGVmZmVjdF9oYW5kbGVfdCAgICBtRG93bm1peEhhbmRsZTsKLSAgICAgICAgZWZmZWN0X2NvbmZpZ190ICAgIG1Eb3dubWl4Q29uZmlnOwotCi0gICAgICAgIC8vIGVmZmVjdCBkZXNjcmlwdG9yIGZvciB0aGUgZG93bm1peGVyIHVzZWQgYnkgdGhlIG1peGVyCi0gICAgICAgIHN0YXRpYyBlZmZlY3RfZGVzY3JpcHRvcl90IHNEd25tRnhEZXNjOwotICAgICAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciBhIGRvd25taXggZWZmZWN0IGhhcyBiZWVuIGZvdW5kIGFuZCBpcyB1c2FibGUgYnkgdGhpcyBtaXhlcgotICAgICAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICAgICBzSXNNdWx0aWNoYW5uZWxDYXBhYmxlOwotICAgICAgICAvLyBGSVhNRTogc2hvdWxkIHdlIGFsbG93IGVmZmVjdHMgb3V0c2lkZSBvZiB0aGUgZnJhbWV3b3JrPwotICAgICAgICAvLyBXZSBuZWVkIHRvIGhlcmUuIEEgc3BlY2lhbCBpb0lkIHRoYXQgbXVzdCBiZSA8PSAtMiBzbyBpdCBkb2VzIG5vdCBtYXAgdG8gYSBzZXNzaW9uLgotICAgICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBTRVNTSU9OX0lEX0lOVkFMSURfQU5EX0lHTk9SRUQgPSAtMjsKLSAgICB9OwotCi0gICAgLy8gUmVtaXhCdWZmZXJQcm92aWRlciB3cmFwcyBhIHRyYWNrIEF1ZGlvQnVmZmVyUHJvdmlkZXIgdG8gcGVyZm9ybSBhbgotICAgIC8vIHVwbWl4IG9yIGRvd25taXggdG8gdGhlIHByb3BlciBjaGFubmVsIGNvdW50IGFuZCBtYXNrLgotICAgIGNsYXNzIFJlbWl4QnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFJlbWl4QnVmZmVyUHJvdmlkZXIoYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OwotICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICBtU2FtcGxlU2l6ZTsKLSAgICAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUlucHV0Q2hhbm5lbHM7Ci0gICAgICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1PdXRwdXRDaGFubmVsczsKLSAgICAgICAgaW50OF90ICAgICAgICAgICAgICAgbUlkeEFyeVtzaXplb2YodWludDMyX3QpKjhdOyAvLyAzMiBiaXRzID0+IGNoYW5uZWwgaW5kaWNlcwotICAgIH07Ci0KLSAgICAvLyBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyIHdyYXBzIGEgdHJhY2sgQXVkaW9CdWZmZXJQcm92aWRlciB0byBjb252ZXJ0IHRoZSBpbnB1dCBkYXRhCi0gICAgLy8gdG8gYW4gYWNjZXB0YWJsZSBtaXhlciBpbnB1dCBmb3JtYXQgdHlwZS4KLSAgICBjbGFzcyBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyIDogcHVibGljIENvcHlCdWZmZXJQcm92aWRlciB7Ci0gICAgcHVibGljOgotICAgICAgICBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKGludDMyX3QgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgaW5wdXRGb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG91dHB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgY29uc3QgaW50MzJfdCAgICAgICAgbUNoYW5uZWxzOwotICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtSW5wdXRGb3JtYXQ7Ci0gICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1PdXRwdXRGb3JtYXQ7Ci0gICAgfTsKLQogICAgIC8vIGJpdG1hc2sgb2YgYWxsb2NhdGVkIHRyYWNrIG5hbWVzLCB3aGVyZSBiaXQgMCBjb3JyZXNwb25kcyB0byBUUkFDSzAgZXRjLgogICAgIHVpbnQzMl90ICAgICAgICBtVHJhY2tOYW1lczsKIApAQCAtMzgyLDE0ICszMTYsNiBAQAogICAgIGJvb2wgc2V0Q2hhbm5lbE1hc2tzKGludCBuYW1lLAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHJhY2tDaGFubmVsTWFzaywgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJDaGFubmVsTWFzayk7CiAKLSAgICAvLyBUT0RPOiByZW1vdmUgdW51c2VkIHRyYWNrTmFtZS90cmFja051bSBmcm9tIGZ1bmN0aW9ucyBiZWxvdy4KLSAgICBzdGF0aWMgc3RhdHVzX3QgaW5pdFRyYWNrRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBwcmVwYXJlVHJhY2tGb3JEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTnVtKTsKLSAgICBzdGF0aWMgdm9pZCB1bnByZXBhcmVUcmFja0ZvckRvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgcHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOdW0pOwotICAgIHN0YXRpYyB2b2lkIHVucHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lKTsKLSAgICBzdGF0aWMgdm9pZCByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyh0cmFja190KiBwVHJhY2spOwotCiAgICAgc3RhdGljIHZvaWQgdHJhY2tfX2dlbmVyaWNSZXNhbXBsZSh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsCiAgICAgICAgICAgICBpbnQzMl90KiBhdXgpOwogICAgIHN0YXRpYyB2b2lkIHRyYWNrX19ub3AodHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgbnVtRnJhbWVzLCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpOwpAQCAtNDY1LDYgKzM5MSw2IEBACiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9BVURJT19NSVhFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlck9wcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXJPcHMuaAppbmRleCAyNjc4ODU3Li44ZDc0MDI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlck9wcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyT3BzLmgKQEAgLTE2NCwxMyArMTY0LDEyIEBACiB0ZW1wbGF0ZSA8PgogaW5saW5lIGludDE2X3QgTWl4TXVsPGludDE2X3QsIGludDE2X3QsIGZsb2F0PihpbnQxNl90IHZhbHVlLCBmbG9hdCB2b2x1bWUpIHsKICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJNaXhNdWw8aW50MTZfdCwgaW50MTZfdCwgZmxvYXQ+IFJ1bnRpbWUgU2hvdWxkIG5vdCBiZSBoZXJlIik7Ci0gICAgcmV0dXJuIHZhbHVlICogdm9sdW1lOworICAgIHJldHVybiBjbGFtcDE2X2Zyb21fZmxvYXQoTWl4TXVsPGZsb2F0LCBpbnQxNl90LCBmbG9hdD4odmFsdWUsIHZvbHVtZSkpOwogfQogCiB0ZW1wbGF0ZSA8PgogaW5saW5lIGludDE2X3QgTWl4TXVsPGludDE2X3QsIGZsb2F0LCBmbG9hdD4oZmxvYXQgdmFsdWUsIGZsb2F0IHZvbHVtZSkgewotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBxXzE1X2Zyb21fZmxvYXQgPSAoMSA8PCAxNSk7Ci0gICAgcmV0dXJuIHZhbHVlICogdm9sdW1lICogcV8xNV9mcm9tX2Zsb2F0OworICAgIHJldHVybiBjbGFtcDE2X2Zyb21fZmxvYXQodmFsdWUgKiB2b2x1bWUpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5jcHAKaW5kZXggNDZlM2Q2Yy4uZTQ5YjdiMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwCkBAIC00MSw3ICs0MSw3IEBACiAgICAgQXVkaW9SZXNhbXBsZXJPcmRlcjEoaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUpIDoKICAgICAgICAgQXVkaW9SZXNhbXBsZXIoaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIExPV19RVUFMSVRZKSwgbVgwTCgwKSwgbVgwUigwKSB7CiAgICAgfQotICAgIHZpcnR1YWwgdm9pZCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorICAgIHZpcnR1YWwgc2l6ZV90IHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CiBwcml2YXRlOgogICAgIC8vIG51bWJlciBvZiBiaXRzIHVzZWQgaW4gaW50ZXJwb2xhdGlvbiBtdWx0aXBseSAtIDE1IGJpdHMgYXZvaWRzIG92ZXJmbG93CkBAIC01MSw5ICs1MSw5IEBACiAgICAgc3RhdGljIGNvbnN0IGludCBrUHJlSW50ZXJwU2hpZnQgPSBrTnVtUGhhc2VCaXRzIC0ga051bUludGVycEJpdHM7CiAKICAgICB2b2lkIGluaXQoKSB7fQotICAgIHZvaWQgcmVzYW1wbGVNb25vMTYoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKKyAgICBzaXplX3QgcmVzYW1wbGVNb25vMTYoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKLSAgICB2b2lkIHJlc2FtcGxlU3RlcmVvMTYoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKKyAgICBzaXplX3QgcmVzYW1wbGVTdGVyZW8xNihpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwogI2lmZGVmIEFTTV9BUk1fUkVTQU1QMSAgLy8gYXNtIG9wdGltaXNhdGlvbiBmb3IgUmVzYW1wbGVyT3JkZXIxCiAgICAgdm9pZCBBc21Nb25vMTZMb29wKGludDE2X3QgKmluLCBpbnQzMl90KiBtYXhPdXRQdCwgaW50MzJfdCBtYXhJbklkeCwKQEAgLTMyOSw3ICszMjksNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgQXVkaW9SZXNhbXBsZXJPcmRlcjE6OnJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCitzaXplX3QgQXVkaW9SZXNhbXBsZXJPcmRlcjE6OnJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKSB7CiAKICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgd2Ugb3ZlcmZsb3cgaWYgaXQgZG9lcwpAQCAtMzM4LDE1ICszMzgsMTYgQEAKICAgICAvLyBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHJlc2FtcGxlcgogICAgIHN3aXRjaCAobUNoYW5uZWxDb3VudCkgewogICAgIGNhc2UgMToKLSAgICAgICAgcmVzYW1wbGVNb25vMTYob3V0LCBvdXRGcmFtZUNvdW50LCBwcm92aWRlcik7Ci0gICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gcmVzYW1wbGVNb25vMTYob3V0LCBvdXRGcmFtZUNvdW50LCBwcm92aWRlcik7CiAgICAgY2FzZSAyOgotICAgICAgICByZXNhbXBsZVN0ZXJlbzE2KG91dCwgb3V0RnJhbWVDb3VudCwgcHJvdmlkZXIpOwotICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIHJlc2FtcGxlU3RlcmVvMTYob3V0LCBvdXRGcmFtZUNvdW50LCBwcm92aWRlcik7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiaW52YWxpZCBjaGFubmVsIGNvdW50OiAlZCIsIG1DaGFubmVsQ291bnQpOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9SZXNhbXBsZXJPcmRlcjE6OnJlc2FtcGxlU3RlcmVvMTYoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKK3NpemVfdCBBdWRpb1Jlc2FtcGxlck9yZGVyMTo6cmVzYW1wbGVTdGVyZW8xNihpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcikgewogCiAgICAgaW50MzJfdCB2bCA9IG1Wb2x1bWVbMF07CkBAIC00NDIsOSArNDQzLDEwIEBACiAgICAgLy8gc2F2ZSBzdGF0ZQogICAgIG1JbnB1dEluZGV4ID0gaW5wdXRJbmRleDsKICAgICBtUGhhc2VGcmFjdGlvbiA9IHBoYXNlRnJhY3Rpb247CisgICAgcmV0dXJuIG91dHB1dEluZGV4IC8gMiAvKiBjaGFubmVscyBmb3Igc3RlcmVvICovOwogfQogCi12b2lkIEF1ZGlvUmVzYW1wbGVyT3JkZXIxOjpyZXNhbXBsZU1vbm8xNihpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorc2l6ZV90IEF1ZGlvUmVzYW1wbGVyT3JkZXIxOjpyZXNhbXBsZU1vbm8xNihpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcikgewogCiAgICAgaW50MzJfdCB2bCA9IG1Wb2x1bWVbMF07CkBAIC01MzgsNiArNTQwLDcgQEAKICAgICAvLyBzYXZlIHN0YXRlCiAgICAgbUlucHV0SW5kZXggPSBpbnB1dEluZGV4OwogICAgIG1QaGFzZUZyYWN0aW9uID0gcGhhc2VGcmFjdGlvbjsKKyAgICByZXR1cm4gb3V0cHV0SW5kZXg7CiB9CiAKICNpZmRlZiBBU01fQVJNX1JFU0FNUDEgIC8vIGFzbSBvcHRpbWlzYXRpb24gZm9yIFJlc2FtcGxlck9yZGVyMQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuaAppbmRleCAwNjlkOTQ2Li5hOGUzZTZmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuaApAQCAtNjcsMTIgKzY3LDE4IEBACiAgICAgLy8gUmVzYW1wbGUgaW50MTZfdCBzYW1wbGVzIGZyb20gcHJvdmlkZXIgYW5kIGFjY3VtdWxhdGUgaW50byAnb3V0Jy4KICAgICAvLyBBIG1vbm8gcHJvdmlkZXIgZGVsaXZlcnMgYSBzZXF1ZW5jZSBvZiBzYW1wbGVzLgogICAgIC8vIEEgc3RlcmVvIHByb3ZpZGVyIGRlbGl2ZXJzIGEgc2VxdWVuY2Ugb2YgaW50ZXJsZWF2ZWQgcGFpcnMgb2Ygc2FtcGxlcy4KLSAgICAvLyBNdWx0aS1jaGFubmVsIHByb3ZpZGVycyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgICAvLwogICAgIC8vIEluIGVpdGhlciBjYXNlLCAnb3V0JyBob2xkcyBpbnRlcmxlYXZlZCBwYWlycyBvZiBmaXhlZC1wb2ludCBRNC4yNy4KICAgICAvLyBUaGF0IGlzLCBmb3IgYSBtb25vIHByb3ZpZGVyLCB0aGVyZSBpcyBhbiBpbXBsaWNpdCB1cC1jaGFubmVsaW5nLgogICAgIC8vIFNpbmNlIHRoaXMgbWV0aG9kIGFjY3VtdWxhdGVzLCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjbGVhcmluZyAnb3V0JyBpbml0aWFsbHkuCi0gICAgLy8gRklYTUUgYXNzdW1lcyBwcm92aWRlciBpcyBhbHdheXMgc3VjY2Vzc2Z1bDsgaXQgc2hvdWxkIHJldHVybiB0aGUgYWN0dWFsIGZyYW1lIGNvdW50LgotICAgIHZpcnR1YWwgdm9pZCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorICAgIC8vCisgICAgLy8gRm9yIGEgZmxvYXQgcmVzYW1wbGVyLCAnb3V0JyBob2xkcyBpbnRlcmxlYXZlZCBwYWlycyBvZiBmbG9hdCBzYW1wbGVzLgorICAgIC8vCisgICAgLy8gTXVsdGljaGFubmVsIGludGVybGVhdmVkIGZyYW1lcyBmb3IgbiA+IDIgaXMgc3VwcG9ydGVkIGZvciBxdWFsaXR5IERZTl9MT1dfUVVBTElUWSwKKyAgICAvLyBEWU5fTUVEX1FVQUxJVFksIGFuZCBEWU5fSElHSF9RVUFMSVRZLgorICAgIC8vCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZyYW1lcyByZXNhbXBsZWQgaW50byB0aGUgb3V0IGJ1ZmZlci4KKyAgICB2aXJ0dWFsIHNpemVfdCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOwpAQCAtMTcwLDcgKzE3Niw2IEBACiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19Ci07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAKaW5kZXggOGYxNGZmOS4uMTcyYzJhNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJBdWRpb1NSQyIKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9SZXNhbXBsZXJDdWJpYyIKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMzIsNyArMzIsNyBAQAogICAgIG1lbXNldCgmcmlnaHQsIDAsIHNpemVvZihzdGF0ZSkpOwogfQogCi12b2lkIEF1ZGlvUmVzYW1wbGVyQ3ViaWM6OnJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCitzaXplX3QgQXVkaW9SZXNhbXBsZXJDdWJpYzo6cmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpIHsKIAogICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCB3ZSBvdmVyZmxvdyBpZiBpdCBkb2VzCkBAIC00MSwxNSArNDEsMTYgQEAKICAgICAvLyBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHJlc2FtcGxlcgogICAgIHN3aXRjaCAobUNoYW5uZWxDb3VudCkgewogICAgIGNhc2UgMToKLSAgICAgICAgcmVzYW1wbGVNb25vMTYob3V0LCBvdXRGcmFtZUNvdW50LCBwcm92aWRlcik7Ci0gICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gcmVzYW1wbGVNb25vMTYob3V0LCBvdXRGcmFtZUNvdW50LCBwcm92aWRlcik7CiAgICAgY2FzZSAyOgotICAgICAgICByZXNhbXBsZVN0ZXJlbzE2KG91dCwgb3V0RnJhbWVDb3VudCwgcHJvdmlkZXIpOwotICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIHJlc2FtcGxlU3RlcmVvMTYob3V0LCBvdXRGcmFtZUNvdW50LCBwcm92aWRlcik7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiaW52YWxpZCBjaGFubmVsIGNvdW50OiAlZCIsIG1DaGFubmVsQ291bnQpOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9SZXNhbXBsZXJDdWJpYzo6cmVzYW1wbGVTdGVyZW8xNihpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorc2l6ZV90IEF1ZGlvUmVzYW1wbGVyQ3ViaWM6OnJlc2FtcGxlU3RlcmVvMTYoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpIHsKIAogICAgIGludDMyX3QgdmwgPSBtVm9sdW1lWzBdOwpAQCAtNjcsNyArNjgsNyBAQAogICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBpbkZyYW1lQ291bnQ7CiAgICAgICAgIHByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyLCBtUFRTKTsKICAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgICAgIC8vIEFMT0dXKCJOZXcgYnVmZmVyOiBvZmZzZXQ9JXAsIGZyYW1lcz0lZG4iLCBtQnVmZmVyLnJhdywgbUJ1ZmZlci5mcmFtZUNvdW50KTsKICAgICB9CkBAIC0xMTUsOSArMTE2LDEwIEBACiAgICAgLy8gQUxPR1coIkRvbmU6IGluZGV4PSVkLCBmcmFjdGlvbj0ldSIsIGlucHV0SW5kZXgsIHBoYXNlRnJhY3Rpb24pOwogICAgIG1JbnB1dEluZGV4ID0gaW5wdXRJbmRleDsKICAgICBtUGhhc2VGcmFjdGlvbiA9IHBoYXNlRnJhY3Rpb247CisgICAgcmV0dXJuIG91dHB1dEluZGV4IC8gMiAvKiBjaGFubmVscyBmb3Igc3RlcmVvICovOwogfQogCi12b2lkIEF1ZGlvUmVzYW1wbGVyQ3ViaWM6OnJlc2FtcGxlTW9ubzE2KGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCitzaXplX3QgQXVkaW9SZXNhbXBsZXJDdWJpYzo6cmVzYW1wbGVNb25vMTYoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpIHsKIAogICAgIGludDMyX3QgdmwgPSBtVm9sdW1lWzBdOwpAQCAtMTM1LDcgKzEzNyw3IEBACiAgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IGluRnJhbWVDb3VudDsKICAgICAgICAgcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIsIG1QVFMpOwogICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgLy8gQUxPR1coIk5ldyBidWZmZXI6IG9mZnNldD0lcCwgZnJhbWVzPSVkIiwgbUJ1ZmZlci5yYXcsIG1CdWZmZXIuZnJhbWVDb3VudCk7CiAgICAgfQpAQCAtMTgyLDggKzE4NCw4IEBACiAgICAgLy8gQUxPR1coIkRvbmU6IGluZGV4PSVkLCBmcmFjdGlvbj0ldSIsIGlucHV0SW5kZXgsIHBoYXNlRnJhY3Rpb24pOwogICAgIG1JbnB1dEluZGV4ID0gaW5wdXRJbmRleDsKICAgICBtUGhhc2VGcmFjdGlvbiA9IHBoYXNlRnJhY3Rpb247CisgICAgcmV0dXJuIG91dHB1dEluZGV4OwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19Ci07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuaAppbmRleCBiMzE1ZGE1Li40YjQ1YjBiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmgKQEAgLTMxLDcgKzMxLDcgQEAKICAgICBBdWRpb1Jlc2FtcGxlckN1YmljKGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlKSA6CiAgICAgICAgIEF1ZGlvUmVzYW1wbGVyKGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlLCBNRURfUVVBTElUWSkgewogICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKKyAgICB2aXJ0dWFsIHNpemVfdCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwogcHJpdmF0ZToKICAgICAvLyBudW1iZXIgb2YgYml0cyB1c2VkIGluIGludGVycG9sYXRpb24gbXVsdGlwbHkgLSAxNCBiaXRzIGF2b2lkcyBvdmVyZmxvdwpAQCAtNDMsOSArNDMsOSBAQAogICAgICAgICBpbnQzMl90IGEsIGIsIGMsIHkwLCB5MSwgeTIsIHkzOwogICAgIH0gc3RhdGU7CiAgICAgdm9pZCBpbml0KCk7Ci0gICAgdm9pZCByZXNhbXBsZU1vbm8xNihpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorICAgIHNpemVfdCByZXNhbXBsZU1vbm8xNihpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwotICAgIHZvaWQgcmVzYW1wbGVTdGVyZW8xNihpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorICAgIHNpemVfdCByZXNhbXBsZVN0ZXJlbzE2KGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CiAgICAgc3RhdGljIGlubGluZSBpbnQzMl90IGludGVycChzdGF0ZSogcCwgaW50MzJfdCB4KSB7CiAgICAgICAgIHJldHVybiAoKCgoKHAtPmEgKiB4ID4+IDE0KSArIHAtPmIpICogeCA+PiAxNCkgKyBwLT5jKSAqIHggPj4gMTQpICsgcC0+eTE7CkBAIC02Myw2ICs2Myw2IEBACiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLypBTkRST0lEX0FVRElPX1JFU0FNUExFUl9DVUJJQ19IKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCmluZGV4IDBlZWIyMDEuLjY0ODFiODUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmNwcApAQCAtNDc3LDE1ICs0NzcsMTUgQEAKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KLXZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCitzaXplX3QgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcikKIHsKLSAgICAodGhpcy0+Km1SZXNhbXBsZUZ1bmMpKHJlaW50ZXJwcmV0X2Nhc3Q8VE8qPihvdXQpLCBvdXRGcmFtZUNvdW50LCBwcm92aWRlcik7CisgICAgcmV0dXJuICh0aGlzLT4qbVJlc2FtcGxlRnVuYykocmVpbnRlcnByZXRfY2FzdDxUTyo+KG91dCksIG91dEZyYW1lQ291bnQsIHByb3ZpZGVyKTsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KIHRlbXBsYXRlPGludCBDSEFOTkVMUywgYm9vbCBMT0NLRUQsIGludCBTVFJJREU+Ci12b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZShUTyogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKK3NpemVfdCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGUoVE8qIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKQogewogICAgIC8vIFRPRE8gTW9ubyAtPiBNb25vIGlzIG5vdCBzdXBwb3J0ZWQuIE9VVFBVVF9DSEFOTkVMUyByZWZsZWN0cyBtaW5pbXVtIG9mIHN0ZXJlbyBvdXQuCkBAIC02MTAsNiArNjEwLDcgQEAKICAgICBBTE9HX0FTU0VSVChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCk7IC8vIHRoZXJlIG11c3QgYmUgbm8gZnJhbWVzIGluIHRoZSBidWZmZXIKICAgICBtSW5CdWZmZXIuc2V0SW1wdWxzZShpbXB1bHNlKTsKICAgICBtUGhhc2VGcmFjdGlvbiA9IHBoYXNlRnJhY3Rpb247CisgICAgcmV0dXJuIG91dHB1dEluZGV4IC8gT1VUUFVUX0NIQU5ORUxTOwogfQogCiAvKiBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgdXNlZCBieSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlICovCkBAIC02MTgsNCArNjE5LDQgQEAKIHRlbXBsYXRlIGNsYXNzIEF1ZGlvUmVzYW1wbGVyRHluPGludDMyX3QsIGludDE2X3QsIGludDMyX3Q+OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJEeW4uaAppbmRleCBlODg2YTY4Li4zYjFjMzgxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJEeW4uaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJEeW4uaApAQCAtNTIsNyArNTIsNyBAQAogCiAgICAgdmlydHVhbCB2b2lkIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKKyAgICB2aXJ0dWFsIHNpemVfdCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwogCiBwcml2YXRlOgpAQCAtMTExLDEwICsxMTEsMTAgQEAKICAgICAgICAgICAgIGludCBpblNhbXBsZVJhdGUsIGludCBvdXRTYW1wbGVSYXRlLCBkb3VibGUgdGJ3Q2hlYXQpOwogCiAgICAgdGVtcGxhdGU8aW50IENIQU5ORUxTLCBib29sIExPQ0tFRCwgaW50IFNUUklERT4KLSAgICB2b2lkIHJlc2FtcGxlKFRPKiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LCBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CisgICAgc2l6ZV90IHJlc2FtcGxlKFRPKiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LCBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CiAKICAgICAvLyBkZWZpbmUgYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlIGZvciByZXNhbXBsZQotICAgIHR5cGVkZWYgdm9pZCAoQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OipyZXNhbXBsZV9BQlBfdCkoVE8qIG91dCwKKyAgICB0eXBlZGVmIHNpemVfdCAoQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OipyZXNhbXBsZV9BQlBfdCkoVE8qIG91dCwKICAgICAgICAgICAgIHNpemVfdCBvdXRGcmFtZUNvdW50LCBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CiAKICAgICAvLyBkYXRhIC0gdGhlIGNvbnRpZ3VvdXMgc3RvcmFnZSBhbmQgbGF5b3V0IG9mIHRoZXNlIGlzIGltcG9ydGFudC4KQEAgLTEyNyw2ICsxMjcsNiBAQAogICAgICAgICAgICAgICB2b2lkKiBtQ29lZkJ1ZmZlcjsgICAgICAgLy8gaWYgYSBmaWx0ZXIgaXMgY3JlYXRlZCwgdGhpcyBpcyBub3QgbnVsbAogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8qQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRFlOX0gqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJHZW4uaAppbmRleCBmMzcxOGI2Li5hZDE4OTY1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJHZW4uaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJHZW4uaApAQCAtMjA0LDcgKzIwNCw4IEBACiAKIHRlbXBsYXRlIDw+CiBzdHJ1Y3QgSTBBVGVybTwwPiB7IC8vIDEvc3FydCgyKlBJKTsKLSAgICBzdGF0aWMgY29uc3QgQ09OU1RFWFBSIGRvdWJsZSB2YWx1ZSA9IDAuMzk4OTQyMjgwNDAxNDMyNjc3OTM5OTQ2MDU5OTM0MzgxODY4NDc1ODU4NjMxMTY0OTM0NjU3NjY1OTI1OworICAgIHN0YXRpYyBjb25zdCBDT05TVEVYUFIgZG91YmxlIHZhbHVlID0KKyAgICAgICAgICAgIDAuMzk4OTQyMjgwNDAxNDMyNjc3OTM5OTQ2MDU5OTM0MzgxODY4NDc1ODU4NjMxMTY0OTM0NjU3NjY1OTI1OwogfTsKIAogI2lmIFVTRV9IT1JORVJTX01FVEhPRApAQCAtNzA2LDYgKzcwNyw2IEBACiAgICAgfQogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLypBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfR0VOX0gqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyT3BzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJPcHMuaAppbmRleCBiZjIxNjNmLi42NTgyODVkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJPcHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJPcHMuaApAQCAtMjUsNyArMjUsNyBAQAogI2RlZmluZSBVU0VfSU5MSU5FX0FTU0VNQkxZIChmYWxzZSkKICNlbmRpZgogCi0jaWYgVVNFX0lOTElORV9BU1NFTUJMWSAmJiBkZWZpbmVkKF9fQVJNX05FT05fXykKKyNpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKSB8fCBkZWZpbmVkKF9fQVJNX05FT05fXykKICNkZWZpbmUgVVNFX05FT04gKHRydWUpCiAjaW5jbHVkZSA8YXJtX25lb24uaD4KICNlbHNlCkBAIC0xNTgsNiArMTU4LDYgQEAKICNlbmRpZgogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLypBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfT1BTX0gqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCmluZGV4IGVmYzgwNTUuLjE3NjIwMmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKQEAgLTE3NCw3ICsxNzQsOCBAQAogICogUHJvY2VzcygpIGNhbGxzIFByb2Nlc3NCYXNlKCkgd2l0aCBURlVOQyA9IEludGVycENvbXB1dGUsIGZvciBpbnRlcnBvbGF0ZWQgcGhhc2UuCiAgKi8KIAotdGVtcGxhdGUgPGludCBDSEFOTkVMUywgaW50IFNUUklERSwgdHlwZW5hbWUgVEZVTkMsIHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJTlRFUlA+Cit0ZW1wbGF0ZSA8aW50IENIQU5ORUxTLCBpbnQgU1RSSURFLCB0eXBlbmFtZSBURlVOQywgdHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTywKKyAgICAgICAgdHlwZW5hbWUgVElOVEVSUD4KIHN0YXRpYyBpbmxpbmUKIHZvaWQgUHJvY2Vzc0Jhc2UoVE8qIGNvbnN0IG91dCwKICAgICAgICAgc2l6ZV90IGNvdW50LApAQCAtMjQyLDYgKzI0Myw5IEBACiAgICAgfQogfQogCisvKiBDYWxjdWxhdGVzIGEgc2luZ2xlIG91dHB1dCBmcmFtZSBmcm9tIGEgcG9seXBoYXNlIHJlc2FtcGxpbmcgZmlsdGVyLgorICogU2VlIFByb2Nlc3MoKSBmb3IgcGFyYW1ldGVyIGRldGFpbHMuCisgKi8KIHRlbXBsYXRlIDxpbnQgQ0hBTk5FTFMsIGludCBTVFJJREUsIHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+CiBzdGF0aWMgaW5saW5lCiB2b2lkIFByb2Nlc3NMKFRPKiBjb25zdCBvdXQsCkBAIC0yNTUsNiArMjU5LDM5IEBACiAgICAgUHJvY2Vzc0Jhc2U8Q0hBTk5FTFMsIFNUUklERSwgSW50ZXJwTnVsbD4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgMCwgdm9sdW1lTFIpOwogfQogCisvKgorICogQ2FsY3VsYXRlcyBhIHNpbmdsZSBvdXRwdXQgZnJhbWUgZnJvbSBhIHBvbHlwaGFzZSByZXNhbXBsaW5nIGZpbHRlciwKKyAqIHdpdGggZmlsdGVyIHBoYXNlIGludGVycG9sYXRpb24uCisgKgorICogQHBhcmFtIG91dCBzaG91bGQgcG9pbnQgdG8gdGhlIG91dHB1dCBidWZmZXIgd2l0aCBzcGFjZSBmb3IgYXQgbGVhc3Qgb25lIG91dHB1dCBmcmFtZS4KKyAqCisgKiBAcGFyYW0gY291bnQgc2hvdWxkIGJlIGhhbGYgdGhlIHNpemUgb2YgdGhlIHRvdGFsIGZpbHRlciBsZW5ndGggKGhhbGZOdW1Db2VmcyksIGFzIHdlCisgKiB1c2Ugc3ltbWV0cnkgaW4gZmlsdGVyIGNvZWZmaWNpZW50cyB0byBldmFsdWF0ZSB0d28gZG90IHByb2R1Y3RzLgorICoKKyAqIEBwYXJhbSBjb2Vmc1AgaXMgb25lIHBoYXNlIG9mIHRoZSBwb2x5cGhhc2UgZmlsdGVyIGJhbmsgb2Ygc2l6ZSBoYWxmTnVtQ29lZnMsIGNvcnJlc3BvbmRpbmcKKyAqIHRvIHRoZSBwb3NpdGl2ZSBzUC4KKyAqCisgKiBAcGFyYW0gY29lZnNOIGlzIG9uZSBwaGFzZSBvZiB0aGUgcG9seXBoYXNlIGZpbHRlciBiYW5rIG9mIHNpemUgaGFsZk51bUNvZWZzLCBjb3JyZXNwb25kaW5nCisgKiB0byB0aGUgbmVnYXRpdmUgc04uCisgKgorICogQHBhcmFtIGNvZWZzUDEgaXMgdGhlIG5leHQgcGhhc2Ugb2YgY29lZnNQICh1c2VkIGZvciBpbnRlcnBvbGF0aW9uKS4KKyAqCisgKiBAcGFyYW0gY29lZnNOMSBpcyB0aGUgbmV4dCBwaGFzZSBvZiBjb2Vmc04gKHVzZWQgZm9yIGludGVycG9sYXRpb24pLgorICoKKyAqIEBwYXJhbSBzUCBpcyB0aGUgcG9zaXRpdmUgaGFsZiBvZiB0aGUgY29lZmZpY2llbnRzIChhcyB2aWV3ZWQgYnkgYSBjb252b2x1dGlvbiksCisgKiBzdGFydGluZyBhdCB0aGUgb3JpZ2luYWwgc2FtcGxlcyBwb2ludGVyIGFuZCBkZWNyZW1lbnRpbmcgKGJ5IENIQU5ORUxTKS4KKyAqCisgKiBAcGFyYW0gc04gaXMgdGhlIG5lZ2F0aXZlIGhhbGYgb2YgdGhlIHNhbXBsZXMgKGFzIHZpZXdlZCBieSBhIGNvbnZvbHV0aW9uKSwKKyAqIHN0YXJ0aW5nIGF0IHRoZSBvcmlnaW5hbCBzYW1wbGVzIHBvaW50ZXIgKyBDSEFOTkVMUyBhbmQgaW5jcmVtZW50aW5nIChieSBDSEFOTkVMUykuCisgKgorICogQHBhcmFtIGxlcnBQIFRoZSBmcmFjdGlvbmFsIHNpdGluZyBiZXR3ZWVuIHRoZSBwb2x5cGhhc2UgaW5kaWNlcyBpcyBnaXZlbiBieSB0aGUgYml0cworICogYmVsb3cgY29lZlNoaWZ0LiBTZWUgZmlyKCkgZm9yIGRldGFpbHMuCisgKgorICogQHBhcmFtIHZvbHVtZUxSIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiB0d28gMzIgYml0IHZvbHVtZSB2YWx1ZXMsIG9uZSBwZXIgc3RlcmVvIGNoYW5uZWwsCisgKiBleHByZXNzZWQgYXMgYSBTMzIgaW50ZWdlciBvciBmbG9hdC4gIEEgbmVnYXRpdmUgdmFsdWUgaW52ZXJ0cyB0aGUgY2hhbm5lbCAxODAgZGVncmVlcy4KKyAqIFRoZSBwb2ludGVyIHZvbHVtZUxSIHNob3VsZCBiZSBhbGlnbmVkIHRvIGEgbWluaW11bSBvZiA4IGJ5dGVzLgorICogQSB0eXBpY2FsIHZhbHVlIGZvciB2b2x1bWUgaXMgMHgxMDAwIHRvIGFsaWduIHRvIGEgdW5pdHkgZ2FpbiBvdXRwdXQgb2YgMjAuMTIuCisgKi8KIHRlbXBsYXRlIDxpbnQgQ0hBTk5FTFMsIGludCBTVFJJREUsIHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJTlRFUlA+CiBzdGF0aWMgaW5saW5lCiB2b2lkIFByb2Nlc3MoVE8qIGNvbnN0IG91dCwKQEAgLTI2OCwxMSArMzA1LDEyIEBACiAgICAgICAgIFRJTlRFUlAgbGVycFAsCiAgICAgICAgIGNvbnN0IFRPKiBjb25zdCB2b2x1bWVMUikKIHsKLSAgICBQcm9jZXNzQmFzZTxDSEFOTkVMUywgU1RSSURFLCBJbnRlcnBDb21wdXRlPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCBsZXJwUCwgdm9sdW1lTFIpOworICAgIFByb2Nlc3NCYXNlPENIQU5ORUxTLCBTVFJJREUsIEludGVycENvbXB1dGU+KG91dCwgY291bnQsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIGxlcnBQLAorICAgICAgICAgICAgdm9sdW1lTFIpOwogfQogCiAvKgotICogQ2FsY3VsYXRlcyBhIHNpbmdsZSBvdXRwdXQgZnJhbWUgKHR3byBzYW1wbGVzKSBmcm9tIGlucHV0IHNhbXBsZSBwb2ludGVyLgorICogQ2FsY3VsYXRlcyBhIHNpbmdsZSBvdXRwdXQgZnJhbWUgZnJvbSBpbnB1dCBzYW1wbGUgcG9pbnRlci4KICAqCiAgKiBUaGlzIHNldHMgdXAgdGhlIHBhcmFtcyBmb3IgdGhlIGFjY2VsZXJhdGVkIFByb2Nlc3MoKSBhbmQgUHJvY2Vzc0woKQogICogZnVuY3Rpb25zIHRvIGRvIHRoZSBhcHByb3ByaWF0ZSBkb3QgcHJvZHVjdHMuCkBAIC0zMDcsNyArMzQ1LDcgQEAKICAqIHRoZSBwb3NpdGl2ZSBoYWxmIG9mIHRoZSBmaWx0ZXIgaXMgZG90IHByb2R1Y3QgZnJvbSBzYW1wbGVzIHRvIHNhbXBsZXMtaGFsZk51bUNvZWZzKzEuCiAgKgogICogQHBhcmFtIHZvbHVtZUxSIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiB0d28gMzIgYml0IHZvbHVtZSB2YWx1ZXMsIG9uZSBwZXIgc3RlcmVvIGNoYW5uZWwsCi0gKiBleHByZXNzZWQgYXMgYSBTMzIgaW50ZWdlci4gIEEgbmVnYXRpdmUgdmFsdWUgaW52ZXJ0cyB0aGUgY2hhbm5lbCAxODAgZGVncmVlcy4KKyAqIGV4cHJlc3NlZCBhcyBhIFMzMiBpbnRlZ2VyIG9yIGZsb2F0LiAgQSBuZWdhdGl2ZSB2YWx1ZSBpbnZlcnRzIHRoZSBjaGFubmVsIDE4MCBkZWdyZWVzLgogICogVGhlIHBvaW50ZXIgdm9sdW1lTFIgc2hvdWxkIGJlIGFsaWduZWQgdG8gYSBtaW5pbXVtIG9mIDggYnl0ZXMuCiAgKiBBIHR5cGljYWwgdmFsdWUgZm9yIHZvbHVtZSBpcyAweDEwMDAgdG8gYWxpZ24gdG8gYSB1bml0eSBnYWluIG91dHB1dCBvZiAyMC4xMi4KICAqCkBAIC0zOTYsNiArNDM0LDYgQEAKICAgICB9CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvKkFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9QUk9DRVNTX0gqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzc05lb24uaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3NOZW9uLmgKaW5kZXggZjMxMWNlZi4uM2RlOWVkZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzc05lb24uaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzTmVvbi5oCkBAIC0yMiwxNCArMjIsMzUgQEAKIC8vIGRlcGVuZHMgb24gQXVkaW9SZXNhbXBsZXJGaXJPcHMuaCwgQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKIAogI2lmIFVTRV9ORU9OCisKKy8vIHVzZSBpbnRyaW5zaWNzIGlmIGlubGluZSBhcm0zMiBhc3NlbWJseSBpcyBub3QgcG9zc2libGUKKyNpZiAhVVNFX0lOTElORV9BU1NFTUJMWQorI2RlZmluZSBVU0VfSU5UUklOU0lDCisjZW5kaWYKKworLy8gZm9sbG93aW5nIGludHJpbnNpY3MgYXZhaWxhYmxlIG9ubHkgb24gQVJNIDY0IGJpdCBBQ0xFCisjaWZuZGVmIF9fYWFyY2g2NF9fCisjdW5kZWYgdmxkMXFfZjMyX3gyCisjdW5kZWYgdmxkMXFfczMyX3gyCisjZW5kaWYKKworI2RlZmluZSBUT19TVFJJTkcyKHgpICN4CisjZGVmaW5lIFRPX1NUUklORyh4KSBUT19TVFJJTkcyKHgpCisvLyB1bmNvbW1lbnQgdG8gcHJpbnQgR0NDIHZlcnNpb24sIG1heSBiZSByZWxldmFudCBmb3IgaW50cmluc2ljIG9wdGltaXphdGlvbnMKKy8qICNwcmFnbWEgbWVzc2FnZSAoIkdDQyB2ZXJzaW9uOiAiIFRPX1NUUklORyhfX0dOVUNfXykgXAorICAgICAgICAiLiIgVE9fU1RSSU5HKF9fR05VQ19NSU5PUl9fKSBcCisgICAgICAgICIuIiBUT19TVFJJTkcoX19HTlVDX1BBVENITEVWRUxfXykpICovCisKIC8vCi0vLyBORU9OIHNwZWNpYWxpemF0aW9ucyBhcmUgZW5hYmxlZCBmb3IgUHJvY2VzcygpIGFuZCBQcm9jZXNzTCgpCisvLyBORU9OIHNwZWNpYWxpemF0aW9ucyBhcmUgZW5hYmxlZCBmb3IgUHJvY2VzcygpIGFuZCBQcm9jZXNzTCgpIGluIEF1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCiAvLwotLy8gVE9ETzogU3RyaWRlIDE2IGFuZCBTdHJpZGUgOCBjYW4gYmUgY29tYmluZWQgd2l0aCBvbmUgcGFzcyBzdHJpZGUgOCAoaWYgbmVjZXNzYXJ5KQotLy8gYW5kIGxvb3Bpbmcgc3RyaWRlIDE2IChvciB2aWNlIHZlcnNhKS4gVGhpcyBoYXMgc29tZSBwb2x5cGhhc2UgY29lZiBkYXRhIGFsaWdubWVudAotLy8gaXNzdWVzIHdpdGggUzE2IGNvZWZzLiBDb25zaWRlciB0aGlzIGxhdGVyLgorLy8gVHdvIHZhcmlhbnRzIGFyZSBwcmVzZW50ZWQgaGVyZToKKy8vIEFSTSBORU9OIGlubGluZSBhc3NlbWJseSB3aGljaCBhcHBlYXJzIHVwIHRvIDEwLTE1JSBmYXN0ZXIgdGhhbiBpbnRyaW5zaWNzIChnY2MgNC45KSBmb3IgYXJtMzIuCisvLyBBUk0gTkVPTiBpbnRyaW5zaWNzIHdoaWNoIGNhbiBhbHNvIGJlIHVzZWQgYnkgYXJtNjQgYW5kIHg4Ni82NCB3aXRoIE5FT04gaGVhZGVyLgorLy8KIAogLy8gTWFjcm9zIHRvIHNhdmUgYSBtb25vL3N0ZXJlbyBhY2N1bXVsYXRvciBzYW1wbGUgaW4gcTAgKGFuZCBxNCkgYXMgc3RlcmVvIG91dC4KKy8vIFRoZXNlIGFyZSBvbmx5IHVzZWQgZm9yIGlubGluZSBhc3NlbWJseS4KICNkZWZpbmUgQVNTRU1CTFlfQUNDVU1VTEFURV9NT05PIFwKICAgICAgICAgInZsZDEuczMyICAgICAgIHtkMn0sIFslW3ZMUl06NjRdICAgICAgICBcbiIvKiAoMSkgbG9hZCB2b2x1bWVzICovXAogICAgICAgICAidmxkMS5zMzIgICAgICAge2QzfSwgJVtvdXRdICAgICAgICAgICAgIFxuIi8qICgyKSB1bmFsaWduZWQgbG9hZCB0aGUgb3V0cHV0ICovXApAQCAtNDksNiArNzAsNDU4IEBACiAgICAgICAgICJ2cWFkZC5zMzIgICAgICBkMywgZDMsIGQwICAgICAgICAgICAgICAgXG4iLyogKDErNGQpIGFjY3VtdWxhdGUgcmVzdWx0IChzYXR1cmF0aW5nKSovXAogICAgICAgICAidnN0MS5zMzIgICAgICAge2QzfSwgJVtvdXRdICAgICAgICAgICAgIFxuIi8qICgyKzJkKXN0b3JlIHJlc3VsdCovCiAKK3RlbXBsYXRlIDxpbnQgQ0hBTk5FTFMsIGludCBTVFJJREUsIGJvb2wgRklYRUQ+CitzdGF0aWMgaW5saW5lIHZvaWQgUHJvY2Vzc05lb25JbnRyaW5zaWMoaW50MzJfdCogb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIHZvbHVtZUxSLAorICAgICAgICB1aW50MzJfdCBsZXJwUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOMSkKK3sKKyAgICBBTE9HX0FTU0VSVChjb3VudCA+IDAgJiYgKGNvdW50ICYgNykgPT0gMCk7IC8vIG11bHRpcGxlIG9mIDgKKyAgICBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKENIQU5ORUxTID09IDEgfHwgQ0hBTk5FTFMgPT0gMik7CisKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgY29lZnNQID0gKGNvbnN0IGludDE2X3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc1AsIDE2KTsKKyAgICBjb2Vmc04gPSAoY29uc3QgaW50MTZfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzTiwgMTYpOworCisgICAgaW50MTZ4NF90IGludGVycDsKKyAgICBpZiAoIUZJWEVEKSB7CisgICAgICAgIGludGVycCA9IHZkdXBfbl9zMTYobGVycFApOworICAgICAgICAvL2ludGVycCA9IChpbnQxNng0X3QpdnNldF9sYW5lX3MzMiAoKGludDMyeDJfdClsZXJwUCwgaW50ZXJwLCAwKTsKKyAgICAgICAgY29lZnNQMSA9IChjb25zdCBpbnQxNl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNQMSwgMTYpOworICAgICAgICBjb2Vmc04xID0gKGNvbnN0IGludDE2X3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc04xLCAxNik7CisgICAgfQorICAgIGludDMyeDRfdCBhY2N1bSwgYWNjdW0yOworICAgIC8vIHdhcm5pbmcgdW5pbml0aWFsaXplZCBpZiB3ZSB1c2UgdmVvcnFfczMyCisgICAgLy8gKGFsdGVybmF0aXZlIHRvIGJlbG93KSBhY2N1bSA9IHZlb3JxX3MzMihhY2N1bSwgYWNjdW0pOworICAgIGFjY3VtID0gdmR1cHFfbl9zMzIoMCk7CisgICAgaWYgKENIQU5ORUxTID09IDIpIHsKKyAgICAgICAgLy8gKGFsdGVybmF0aXZlIHRvIGJlbG93KSBhY2N1bTIgPSB2ZW9ycV9zMzIoYWNjdW0yLCBhY2N1bTIpOworICAgICAgICBhY2N1bTIgPSB2ZHVwcV9uX3MzMigwKTsKKyAgICB9CisgICAgZG8geworICAgICAgICBpbnQxNng4X3QgcG9zQ29lZiA9IHZsZDFxX3MxNihjb2Vmc1ApOworICAgICAgICBjb2Vmc1AgKz0gODsKKyAgICAgICAgaW50MTZ4OF90IG5lZ0NvZWYgPSB2bGQxcV9zMTYoY29lZnNOKTsKKyAgICAgICAgY29lZnNOICs9IDg7CisgICAgICAgIGlmICghRklYRUQpIHsgLy8gaW50ZXJwb2xhdGUKKyAgICAgICAgICAgIGludDE2eDhfdCBwb3NDb2VmMSA9IHZsZDFxX3MxNihjb2Vmc1AxKTsKKyAgICAgICAgICAgIGNvZWZzUDEgKz0gODsKKyAgICAgICAgICAgIGludDE2eDhfdCBuZWdDb2VmMSA9IHZsZDFxX3MxNihjb2Vmc04xKTsKKyAgICAgICAgICAgIGNvZWZzTjEgKz0gODsKKworICAgICAgICAgICAgcG9zQ29lZjEgPSB2c3VicV9zMTYocG9zQ29lZjEsIHBvc0NvZWYpOworICAgICAgICAgICAgbmVnQ29lZiA9IHZzdWJxX3MxNihuZWdDb2VmLCBuZWdDb2VmMSk7CisKKyAgICAgICAgICAgIHBvc0NvZWYxID0gdnFyZG11bGhxX2xhbmVfczE2KHBvc0NvZWYxLCBpbnRlcnAsIDApOworICAgICAgICAgICAgbmVnQ29lZiA9IHZxcmRtdWxocV9sYW5lX3MxNihuZWdDb2VmLCBpbnRlcnAsIDApOworCisgICAgICAgICAgICBwb3NDb2VmID0gdmFkZHFfczE2KHBvc0NvZWYsIHBvc0NvZWYxKTsKKyAgICAgICAgICAgIG5lZ0NvZWYgPSB2YWRkcV9zMTYobmVnQ29lZiwgbmVnQ29lZjEpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoQ0hBTk5FTFMpIHsKKyAgICAgICAgY2FzZSAxOiB7CisgICAgICAgICAgICBpbnQxNng4X3QgcG9zU2FtcCA9IHZsZDFxX3MxNihzUCk7CisgICAgICAgICAgICBpbnQxNng4X3QgbmVnU2FtcCA9IHZsZDFxX3MxNihzTik7CisgICAgICAgICAgICBzTiArPSA4OworICAgICAgICAgICAgcG9zU2FtcCA9IHZyZXY2NHFfczE2KHBvc1NhbXApOworCisgICAgICAgICAgICAvLyBkb3QgcHJvZHVjdAorICAgICAgICAgICAgYWNjdW0gPSB2bWxhbF9zMTYoYWNjdW0sIHZnZXRfbG93X3MxNihwb3NTYW1wKSwgdmdldF9oaWdoX3MxNihwb3NDb2VmKSk7IC8vIHJldmVyc2VkCisgICAgICAgICAgICBhY2N1bSA9IHZtbGFsX3MxNihhY2N1bSwgdmdldF9oaWdoX3MxNihwb3NTYW1wKSwgdmdldF9sb3dfczE2KHBvc0NvZWYpKTsgLy8gcmV2ZXJzZWQKKyAgICAgICAgICAgIGFjY3VtID0gdm1sYWxfczE2KGFjY3VtLCB2Z2V0X2xvd19zMTYobmVnU2FtcCksIHZnZXRfbG93X3MxNihuZWdDb2VmKSk7CisgICAgICAgICAgICBhY2N1bSA9IHZtbGFsX3MxNihhY2N1bSwgdmdldF9oaWdoX3MxNihuZWdTYW1wKSwgdmdldF9oaWdoX3MxNihuZWdDb2VmKSk7CisgICAgICAgICAgICBzUCAtPSA4OworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIDI6IHsKKyAgICAgICAgICAgIGludDE2eDh4Ml90IHBvc1NhbXAgPSB2bGQycV9zMTYoc1ApOworICAgICAgICAgICAgaW50MTZ4OHgyX3QgbmVnU2FtcCA9IHZsZDJxX3MxNihzTik7CisgICAgICAgICAgICBzTiArPSAxNjsKKyAgICAgICAgICAgIHBvc1NhbXAudmFsWzBdID0gdnJldjY0cV9zMTYocG9zU2FtcC52YWxbMF0pOworICAgICAgICAgICAgcG9zU2FtcC52YWxbMV0gPSB2cmV2NjRxX3MxNihwb3NTYW1wLnZhbFsxXSk7CisKKyAgICAgICAgICAgIC8vIGRvdCBwcm9kdWN0CisgICAgICAgICAgICBhY2N1bSA9IHZtbGFsX3MxNihhY2N1bSwgdmdldF9sb3dfczE2KHBvc1NhbXAudmFsWzBdKSwgdmdldF9oaWdoX3MxNihwb3NDb2VmKSk7IC8vIHIKKyAgICAgICAgICAgIGFjY3VtID0gdm1sYWxfczE2KGFjY3VtLCB2Z2V0X2hpZ2hfczE2KHBvc1NhbXAudmFsWzBdKSwgdmdldF9sb3dfczE2KHBvc0NvZWYpKTsgLy8gcgorICAgICAgICAgICAgYWNjdW0yID0gdm1sYWxfczE2KGFjY3VtMiwgdmdldF9sb3dfczE2KHBvc1NhbXAudmFsWzFdKSwgdmdldF9oaWdoX3MxNihwb3NDb2VmKSk7IC8vIHIKKyAgICAgICAgICAgIGFjY3VtMiA9IHZtbGFsX3MxNihhY2N1bTIsIHZnZXRfaGlnaF9zMTYocG9zU2FtcC52YWxbMV0pLCB2Z2V0X2xvd19zMTYocG9zQ29lZikpOyAvLyByCisgICAgICAgICAgICBhY2N1bSA9IHZtbGFsX3MxNihhY2N1bSwgdmdldF9sb3dfczE2KG5lZ1NhbXAudmFsWzBdKSwgdmdldF9sb3dfczE2KG5lZ0NvZWYpKTsKKyAgICAgICAgICAgIGFjY3VtID0gdm1sYWxfczE2KGFjY3VtLCB2Z2V0X2hpZ2hfczE2KG5lZ1NhbXAudmFsWzBdKSwgdmdldF9oaWdoX3MxNihuZWdDb2VmKSk7CisgICAgICAgICAgICBhY2N1bTIgPSB2bWxhbF9zMTYoYWNjdW0yLCB2Z2V0X2xvd19zMTYobmVnU2FtcC52YWxbMV0pLCB2Z2V0X2xvd19zMTYobmVnQ29lZikpOworICAgICAgICAgICAgYWNjdW0yID0gdm1sYWxfczE2KGFjY3VtMiwgdmdldF9oaWdoX3MxNihuZWdTYW1wLnZhbFsxXSksIHZnZXRfaGlnaF9zMTYobmVnQ29lZikpOworICAgICAgICAgICAgc1AgLT0gMTY7CisgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICB9IHdoaWxlIChjb3VudCAtPSA4KTsKKworICAgIC8vIG11bHRpcGx5IGJ5IHZvbHVtZSBhbmQgc2F2ZQorICAgIHZvbHVtZUxSID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZCh2b2x1bWVMUiwgOCk7CisgICAgaW50MzJ4Ml90IHZMUiA9IHZsZDFfczMyKHZvbHVtZUxSKTsKKyAgICBpbnQzMngyX3Qgb3V0U2FtcCA9IHZsZDFfczMyKG91dCk7CisgICAgLy8gY29tYmluZSBhbmQgZnVubmVsIGRvd24gYWNjdW11bGF0b3IKKyAgICBpbnQzMngyX3Qgb3V0QWNjdW0gPSB2cGFkZF9zMzIodmdldF9sb3dfczMyKGFjY3VtKSwgdmdldF9oaWdoX3MzMihhY2N1bSkpOworICAgIGlmIChDSEFOTkVMUyA9PSAxKSB7CisgICAgICAgIC8vIGR1cGxpY2F0ZSBhY2N1bSB0byBib3RoIEwgYW5kIFIKKyAgICAgICAgb3V0QWNjdW0gPSB2cGFkZF9zMzIob3V0QWNjdW0sIG91dEFjY3VtKTsKKyAgICB9IGVsc2UgaWYgKENIQU5ORUxTID09IDIpIHsKKyAgICAgICAgLy8gYWNjdW0yIGNvbnRhaW5zIFIsIGZvbGQgaW4KKyAgICAgICAgaW50MzJ4Ml90IG91dEFjY3VtMiA9IHZwYWRkX3MzMih2Z2V0X2xvd19zMzIoYWNjdW0yKSwgdmdldF9oaWdoX3MzMihhY2N1bTIpKTsKKyAgICAgICAgb3V0QWNjdW0gPSB2cGFkZF9zMzIob3V0QWNjdW0sIG91dEFjY3VtMik7CisgICAgfQorICAgIG91dEFjY3VtID0gdnFyZG11bGhfczMyKG91dEFjY3VtLCB2TFIpOworICAgIG91dFNhbXAgPSB2cWFkZF9zMzIob3V0U2FtcCwgb3V0QWNjdW0pOworICAgIHZzdDFfczMyKG91dCwgb3V0U2FtcCk7Cit9CisKK3RlbXBsYXRlIDxpbnQgQ0hBTk5FTFMsIGludCBTVFJJREUsIGJvb2wgRklYRUQ+CitzdGF0aWMgaW5saW5lIHZvaWQgUHJvY2Vzc05lb25JbnRyaW5zaWMoaW50MzJfdCogb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIHZvbHVtZUxSLAorICAgICAgICB1aW50MzJfdCBsZXJwUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQMSwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOMSkKK3sKKyAgICBBTE9HX0FTU0VSVChjb3VudCA+IDAgJiYgKGNvdW50ICYgNykgPT0gMCk7IC8vIG11bHRpcGxlIG9mIDgKKyAgICBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKENIQU5ORUxTID09IDEgfHwgQ0hBTk5FTFMgPT0gMik7CisKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgY29lZnNQID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc1AsIDE2KTsKKyAgICBjb2Vmc04gPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzTiwgMTYpOworCisgICAgaW50MzJ4Ml90IGludGVycDsKKyAgICBpZiAoIUZJWEVEKSB7CisgICAgICAgIGludGVycCA9IHZkdXBfbl9zMzIobGVycFApOworICAgICAgICBjb2Vmc1AxID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc1AxLCAxNik7CisgICAgICAgIGNvZWZzTjEgPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzTjEsIDE2KTsKKyAgICB9CisgICAgaW50MzJ4NF90IGFjY3VtLCBhY2N1bTI7CisgICAgLy8gd2FybmluZyB1bmluaXRpYWxpemVkIGlmIHdlIHVzZSB2ZW9ycV9zMzIKKyAgICAvLyAoYWx0ZXJuYXRpdmUgdG8gYmVsb3cpIGFjY3VtID0gdmVvcnFfczMyKGFjY3VtLCBhY2N1bSk7CisgICAgYWNjdW0gPSB2ZHVwcV9uX3MzMigwKTsKKyAgICBpZiAoQ0hBTk5FTFMgPT0gMikgeworICAgICAgICAvLyAoYWx0ZXJuYXRpdmUgdG8gYmVsb3cpIGFjY3VtMiA9IHZlb3JxX3MzMihhY2N1bTIsIGFjY3VtMik7CisgICAgICAgIGFjY3VtMiA9IHZkdXBxX25fczMyKDApOworICAgIH0KKyAgICBkbyB7CisjaWZkZWYgdmxkMXFfczMyX3gyCisgICAgICAgIGludDMyeDR4Ml90IHBvc0NvZWYgPSB2bGQxcV9zMzJfeDIoY29lZnNQKTsKKyAgICAgICAgY29lZnNQICs9IDg7CisgICAgICAgIGludDMyeDR4Ml90IG5lZ0NvZWYgPSB2bGQxcV9zMzJfeDIoY29lZnNOKTsKKyAgICAgICAgY29lZnNOICs9IDg7CisjZWxzZQorICAgICAgICBpbnQzMng0eDJfdCBwb3NDb2VmOworICAgICAgICBwb3NDb2VmLnZhbFswXSA9IHZsZDFxX3MzMihjb2Vmc1ApOworICAgICAgICBjb2Vmc1AgKz0gNDsKKyAgICAgICAgcG9zQ29lZi52YWxbMV0gPSB2bGQxcV9zMzIoY29lZnNQKTsKKyAgICAgICAgY29lZnNQICs9IDQ7CisgICAgICAgIGludDMyeDR4Ml90IG5lZ0NvZWY7CisgICAgICAgIG5lZ0NvZWYudmFsWzBdID0gdmxkMXFfczMyKGNvZWZzTik7CisgICAgICAgIGNvZWZzTiArPSA0OworICAgICAgICBuZWdDb2VmLnZhbFsxXSA9IHZsZDFxX3MzMihjb2Vmc04pOworICAgICAgICBjb2Vmc04gKz0gNDsKKyNlbmRpZgorICAgICAgICBpZiAoIUZJWEVEKSB7IC8vIGludGVycG9sYXRlCisjaWZkZWYgdmxkMXFfczMyX3gyCisgICAgICAgICAgICBpbnQzMng0eDJfdCBwb3NDb2VmMSA9IHZsZDFxX3MzMl94Mihjb2Vmc1AxKTsKKyAgICAgICAgICAgIGNvZWZzUDEgKz0gODsKKyAgICAgICAgICAgIGludDMyeDR4Ml90IG5lZ0NvZWYxID0gdmxkMXFfczMyX3gyKGNvZWZzTjEpOworICAgICAgICAgICAgY29lZnNOMSArPSA4OworI2Vsc2UKKyAgICAgICAgICAgIGludDMyeDR4Ml90IHBvc0NvZWYxOworICAgICAgICAgICAgcG9zQ29lZjEudmFsWzBdID0gdmxkMXFfczMyKGNvZWZzUDEpOworICAgICAgICAgICAgY29lZnNQMSArPSA0OworICAgICAgICAgICAgcG9zQ29lZjEudmFsWzFdID0gdmxkMXFfczMyKGNvZWZzUDEpOworICAgICAgICAgICAgY29lZnNQMSArPSA0OworICAgICAgICAgICAgaW50MzJ4NHgyX3QgbmVnQ29lZjE7CisgICAgICAgICAgICBuZWdDb2VmMS52YWxbMF0gPSB2bGQxcV9zMzIoY29lZnNOMSk7CisgICAgICAgICAgICBjb2Vmc04xICs9IDQ7CisgICAgICAgICAgICBuZWdDb2VmMS52YWxbMV0gPSB2bGQxcV9zMzIoY29lZnNOMSk7CisgICAgICAgICAgICBjb2Vmc04xICs9IDQ7CisjZW5kaWYKKworICAgICAgICAgICAgcG9zQ29lZjEudmFsWzBdID0gdnN1YnFfczMyKHBvc0NvZWYxLnZhbFswXSwgcG9zQ29lZi52YWxbMF0pOworICAgICAgICAgICAgcG9zQ29lZjEudmFsWzFdID0gdnN1YnFfczMyKHBvc0NvZWYxLnZhbFsxXSwgcG9zQ29lZi52YWxbMV0pOworICAgICAgICAgICAgbmVnQ29lZi52YWxbMF0gPSB2c3VicV9zMzIobmVnQ29lZi52YWxbMF0sIG5lZ0NvZWYxLnZhbFswXSk7CisgICAgICAgICAgICBuZWdDb2VmLnZhbFsxXSA9IHZzdWJxX3MzMihuZWdDb2VmLnZhbFsxXSwgbmVnQ29lZjEudmFsWzFdKTsKKworICAgICAgICAgICAgcG9zQ29lZjEudmFsWzBdID0gdnFyZG11bGhxX2xhbmVfczMyKHBvc0NvZWYxLnZhbFswXSwgaW50ZXJwLCAwKTsKKyAgICAgICAgICAgIHBvc0NvZWYxLnZhbFsxXSA9IHZxcmRtdWxocV9sYW5lX3MzMihwb3NDb2VmMS52YWxbMV0sIGludGVycCwgMCk7CisgICAgICAgICAgICBuZWdDb2VmLnZhbFswXSA9IHZxcmRtdWxocV9sYW5lX3MzMihuZWdDb2VmLnZhbFswXSwgaW50ZXJwLCAwKTsKKyAgICAgICAgICAgIG5lZ0NvZWYudmFsWzFdID0gdnFyZG11bGhxX2xhbmVfczMyKG5lZ0NvZWYudmFsWzFdLCBpbnRlcnAsIDApOworCisgICAgICAgICAgICBwb3NDb2VmLnZhbFswXSA9IHZhZGRxX3MzMihwb3NDb2VmLnZhbFswXSwgcG9zQ29lZjEudmFsWzBdKTsKKyAgICAgICAgICAgIHBvc0NvZWYudmFsWzFdID0gdmFkZHFfczMyKHBvc0NvZWYudmFsWzFdLCBwb3NDb2VmMS52YWxbMV0pOworICAgICAgICAgICAgbmVnQ29lZi52YWxbMF0gPSB2YWRkcV9zMzIobmVnQ29lZi52YWxbMF0sIG5lZ0NvZWYxLnZhbFswXSk7CisgICAgICAgICAgICBuZWdDb2VmLnZhbFsxXSA9IHZhZGRxX3MzMihuZWdDb2VmLnZhbFsxXSwgbmVnQ29lZjEudmFsWzFdKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKENIQU5ORUxTKSB7CisgICAgICAgIGNhc2UgMTogeworICAgICAgICAgICAgaW50MTZ4OF90IHBvc1NhbXAgPSB2bGQxcV9zMTYoc1ApOworICAgICAgICAgICAgaW50MTZ4OF90IG5lZ1NhbXAgPSB2bGQxcV9zMTYoc04pOworICAgICAgICAgICAgc04gKz0gODsKKyAgICAgICAgICAgIHBvc1NhbXAgPSB2cmV2NjRxX3MxNihwb3NTYW1wKTsKKworICAgICAgICAgICAgaW50MzJ4NF90IHBvc1NhbXAwID0gdnNobGxfbl9zMTYodmdldF9sb3dfczE2KHBvc1NhbXApLCAxNSk7CisgICAgICAgICAgICBpbnQzMng0X3QgcG9zU2FtcDEgPSB2c2hsbF9uX3MxNih2Z2V0X2hpZ2hfczE2KHBvc1NhbXApLCAxNSk7CisgICAgICAgICAgICBpbnQzMng0X3QgbmVnU2FtcDAgPSB2c2hsbF9uX3MxNih2Z2V0X2xvd19zMTYobmVnU2FtcCksIDE1KTsKKyAgICAgICAgICAgIGludDMyeDRfdCBuZWdTYW1wMSA9IHZzaGxsX25fczE2KHZnZXRfaGlnaF9zMTYobmVnU2FtcCksIDE1KTsKKworICAgICAgICAgICAgLy8gZG90IHByb2R1Y3QKKyAgICAgICAgICAgIHBvc1NhbXAwID0gdnFyZG11bGhxX3MzMihwb3NTYW1wMCwgcG9zQ29lZi52YWxbMV0pOyAvLyByZXZlcnNlZAorICAgICAgICAgICAgcG9zU2FtcDEgPSB2cXJkbXVsaHFfczMyKHBvc1NhbXAxLCBwb3NDb2VmLnZhbFswXSk7IC8vIHJldmVyc2VkCisgICAgICAgICAgICBuZWdTYW1wMCA9IHZxcmRtdWxocV9zMzIobmVnU2FtcDAsIG5lZ0NvZWYudmFsWzBdKTsKKyAgICAgICAgICAgIG5lZ1NhbXAxID0gdnFyZG11bGhxX3MzMihuZWdTYW1wMSwgbmVnQ29lZi52YWxbMV0pOworCisgICAgICAgICAgICBhY2N1bSA9IHZhZGRxX3MzMihhY2N1bSwgcG9zU2FtcDApOworICAgICAgICAgICAgbmVnU2FtcDAgPSB2YWRkcV9zMzIobmVnU2FtcDAsIG5lZ1NhbXAxKTsKKyAgICAgICAgICAgIGFjY3VtID0gdmFkZHFfczMyKGFjY3VtLCBwb3NTYW1wMSk7CisgICAgICAgICAgICBhY2N1bSA9IHZhZGRxX3MzMihhY2N1bSwgbmVnU2FtcDApOworCisgICAgICAgICAgICBzUCAtPSA4OworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIDI6IHsKKyAgICAgICAgICAgIGludDE2eDh4Ml90IHBvc1NhbXAgPSB2bGQycV9zMTYoc1ApOworICAgICAgICAgICAgaW50MTZ4OHgyX3QgbmVnU2FtcCA9IHZsZDJxX3MxNihzTik7CisgICAgICAgICAgICBzTiArPSAxNjsKKyAgICAgICAgICAgIHBvc1NhbXAudmFsWzBdID0gdnJldjY0cV9zMTYocG9zU2FtcC52YWxbMF0pOworICAgICAgICAgICAgcG9zU2FtcC52YWxbMV0gPSB2cmV2NjRxX3MxNihwb3NTYW1wLnZhbFsxXSk7CisKKyAgICAgICAgICAgIC8vIGxlZnQKKyAgICAgICAgICAgIGludDMyeDRfdCBwb3NTYW1wMCA9IHZzaGxsX25fczE2KHZnZXRfbG93X3MxNihwb3NTYW1wLnZhbFswXSksIDE1KTsKKyAgICAgICAgICAgIGludDMyeDRfdCBwb3NTYW1wMSA9IHZzaGxsX25fczE2KHZnZXRfaGlnaF9zMTYocG9zU2FtcC52YWxbMF0pLCAxNSk7CisgICAgICAgICAgICBpbnQzMng0X3QgbmVnU2FtcDAgPSB2c2hsbF9uX3MxNih2Z2V0X2xvd19zMTYobmVnU2FtcC52YWxbMF0pLCAxNSk7CisgICAgICAgICAgICBpbnQzMng0X3QgbmVnU2FtcDEgPSB2c2hsbF9uX3MxNih2Z2V0X2hpZ2hfczE2KG5lZ1NhbXAudmFsWzBdKSwgMTUpOworCisgICAgICAgICAgICAvLyBkb3QgcHJvZHVjdAorICAgICAgICAgICAgcG9zU2FtcDAgPSB2cXJkbXVsaHFfczMyKHBvc1NhbXAwLCBwb3NDb2VmLnZhbFsxXSk7IC8vIHJldmVyc2VkCisgICAgICAgICAgICBwb3NTYW1wMSA9IHZxcmRtdWxocV9zMzIocG9zU2FtcDEsIHBvc0NvZWYudmFsWzBdKTsgLy8gcmV2ZXJzZWQKKyAgICAgICAgICAgIG5lZ1NhbXAwID0gdnFyZG11bGhxX3MzMihuZWdTYW1wMCwgbmVnQ29lZi52YWxbMF0pOworICAgICAgICAgICAgbmVnU2FtcDEgPSB2cXJkbXVsaHFfczMyKG5lZ1NhbXAxLCBuZWdDb2VmLnZhbFsxXSk7CisKKyAgICAgICAgICAgIGFjY3VtID0gdmFkZHFfczMyKGFjY3VtLCBwb3NTYW1wMCk7CisgICAgICAgICAgICBuZWdTYW1wMCA9IHZhZGRxX3MzMihuZWdTYW1wMCwgbmVnU2FtcDEpOworICAgICAgICAgICAgYWNjdW0gPSB2YWRkcV9zMzIoYWNjdW0sIHBvc1NhbXAxKTsKKyAgICAgICAgICAgIGFjY3VtID0gdmFkZHFfczMyKGFjY3VtLCBuZWdTYW1wMCk7CisKKyAgICAgICAgICAgIC8vIHJpZ2h0CisgICAgICAgICAgICBwb3NTYW1wMCA9IHZzaGxsX25fczE2KHZnZXRfbG93X3MxNihwb3NTYW1wLnZhbFsxXSksIDE1KTsKKyAgICAgICAgICAgIHBvc1NhbXAxID0gdnNobGxfbl9zMTYodmdldF9oaWdoX3MxNihwb3NTYW1wLnZhbFsxXSksIDE1KTsKKyAgICAgICAgICAgIG5lZ1NhbXAwID0gdnNobGxfbl9zMTYodmdldF9sb3dfczE2KG5lZ1NhbXAudmFsWzFdKSwgMTUpOworICAgICAgICAgICAgbmVnU2FtcDEgPSB2c2hsbF9uX3MxNih2Z2V0X2hpZ2hfczE2KG5lZ1NhbXAudmFsWzFdKSwgMTUpOworCisgICAgICAgICAgICAvLyBkb3QgcHJvZHVjdAorICAgICAgICAgICAgcG9zU2FtcDAgPSB2cXJkbXVsaHFfczMyKHBvc1NhbXAwLCBwb3NDb2VmLnZhbFsxXSk7IC8vIHJldmVyc2VkCisgICAgICAgICAgICBwb3NTYW1wMSA9IHZxcmRtdWxocV9zMzIocG9zU2FtcDEsIHBvc0NvZWYudmFsWzBdKTsgLy8gcmV2ZXJzZWQKKyAgICAgICAgICAgIG5lZ1NhbXAwID0gdnFyZG11bGhxX3MzMihuZWdTYW1wMCwgbmVnQ29lZi52YWxbMF0pOworICAgICAgICAgICAgbmVnU2FtcDEgPSB2cXJkbXVsaHFfczMyKG5lZ1NhbXAxLCBuZWdDb2VmLnZhbFsxXSk7CisKKyAgICAgICAgICAgIGFjY3VtMiA9IHZhZGRxX3MzMihhY2N1bTIsIHBvc1NhbXAwKTsKKyAgICAgICAgICAgIG5lZ1NhbXAwID0gdmFkZHFfczMyKG5lZ1NhbXAwLCBuZWdTYW1wMSk7CisgICAgICAgICAgICBhY2N1bTIgPSB2YWRkcV9zMzIoYWNjdW0yLCBwb3NTYW1wMSk7CisgICAgICAgICAgICBhY2N1bTIgPSB2YWRkcV9zMzIoYWNjdW0yLCBuZWdTYW1wMCk7CisKKyAgICAgICAgICAgIHNQIC09IDE2OworICAgICAgICB9IGJyZWFrOworICAgICAgICB9CisgICAgfSB3aGlsZSAoY291bnQgLT0gOCk7CisKKyAgICAvLyBtdWx0aXBseSBieSB2b2x1bWUgYW5kIHNhdmUKKyAgICB2b2x1bWVMUiA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQodm9sdW1lTFIsIDgpOworICAgIGludDMyeDJfdCB2TFIgPSB2bGQxX3MzMih2b2x1bWVMUik7CisgICAgaW50MzJ4Ml90IG91dFNhbXAgPSB2bGQxX3MzMihvdXQpOworICAgIC8vIGNvbWJpbmUgYW5kIGZ1bm5lbCBkb3duIGFjY3VtdWxhdG9yCisgICAgaW50MzJ4Ml90IG91dEFjY3VtID0gdnBhZGRfczMyKHZnZXRfbG93X3MzMihhY2N1bSksIHZnZXRfaGlnaF9zMzIoYWNjdW0pKTsKKyAgICBpZiAoQ0hBTk5FTFMgPT0gMSkgeworICAgICAgICAvLyBkdXBsaWNhdGUgYWNjdW0gdG8gYm90aCBMIGFuZCBSCisgICAgICAgIG91dEFjY3VtID0gdnBhZGRfczMyKG91dEFjY3VtLCBvdXRBY2N1bSk7CisgICAgfSBlbHNlIGlmIChDSEFOTkVMUyA9PSAyKSB7CisgICAgICAgIC8vIGFjY3VtMiBjb250YWlucyBSLCBmb2xkIGluCisgICAgICAgIGludDMyeDJfdCBvdXRBY2N1bTIgPSB2cGFkZF9zMzIodmdldF9sb3dfczMyKGFjY3VtMiksIHZnZXRfaGlnaF9zMzIoYWNjdW0yKSk7CisgICAgICAgIG91dEFjY3VtID0gdnBhZGRfczMyKG91dEFjY3VtLCBvdXRBY2N1bTIpOworICAgIH0KKyAgICBvdXRBY2N1bSA9IHZxcmRtdWxoX3MzMihvdXRBY2N1bSwgdkxSKTsKKyAgICBvdXRTYW1wID0gdnFhZGRfczMyKG91dFNhbXAsIG91dEFjY3VtKTsKKyAgICB2c3QxX3MzMihvdXQsIG91dFNhbXApOworfQorCit0ZW1wbGF0ZSA8aW50IENIQU5ORUxTLCBpbnQgU1RSSURFLCBib29sIEZJWEVEPgorc3RhdGljIGlubGluZSB2b2lkIFByb2Nlc3NOZW9uSW50cmluc2ljKGZsb2F0KiBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgZmxvYXQqIHNQLAorICAgICAgICBjb25zdCBmbG9hdCogc04sCisgICAgICAgIGNvbnN0IGZsb2F0KiB2b2x1bWVMUiwKKyAgICAgICAgZmxvYXQgbGVycFAsCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb2Vmc1AxLAorICAgICAgICBjb25zdCBmbG9hdCogY29lZnNOMSkKK3sKKyAgICBBTE9HX0FTU0VSVChjb3VudCA+IDAgJiYgKGNvdW50ICYgNykgPT0gMCk7IC8vIG11bHRpcGxlIG9mIDgKKyAgICBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKENIQU5ORUxTID09IDEgfHwgQ0hBTk5FTFMgPT0gMik7CisKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgY29lZnNQID0gKGNvbnN0IGZsb2F0KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNQLCAxNik7CisgICAgY29lZnNOID0gKGNvbnN0IGZsb2F0KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNOLCAxNik7CisKKyAgICBmbG9hdDMyeDJfdCBpbnRlcnA7CisgICAgaWYgKCFGSVhFRCkgeworICAgICAgICBpbnRlcnAgPSB2ZHVwX25fZjMyKGxlcnBQKTsKKyAgICAgICAgY29lZnNQMSA9IChjb25zdCBmbG9hdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzUDEsIDE2KTsKKyAgICAgICAgY29lZnNOMSA9IChjb25zdCBmbG9hdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzTjEsIDE2KTsKKyAgICB9CisgICAgZmxvYXQzMng0X3QgYWNjdW0sIGFjY3VtMjsKKyAgICAvLyB3YXJuaW5nIHVuaW5pdGlhbGl6ZWQgaWYgd2UgdXNlIHZlb3JxX3MzMgorICAgIC8vIChhbHRlcm5hdGl2ZSB0byBiZWxvdykgYWNjdW0gPSB2ZW9ycV9zMzIoYWNjdW0sIGFjY3VtKTsKKyAgICBhY2N1bSA9IHZkdXBxX25fZjMyKDApOworICAgIGlmIChDSEFOTkVMUyA9PSAyKSB7CisgICAgICAgIC8vIChhbHRlcm5hdGl2ZSB0byBiZWxvdykgYWNjdW0yID0gdmVvcnFfczMyKGFjY3VtMiwgYWNjdW0yKTsKKyAgICAgICAgYWNjdW0yID0gdmR1cHFfbl9mMzIoMCk7CisgICAgfQorICAgIGRvIHsKKyNpZmRlZiB2bGQxcV9mMzJfeDIKKyAgICAgICAgZmxvYXQzMng0eDJfdCBwb3NDb2VmID0gdmxkMXFfZjMyX3gyKGNvZWZzUCk7CisgICAgICAgIGNvZWZzUCArPSA4OworICAgICAgICBmbG9hdDMyeDR4Ml90IG5lZ0NvZWYgPSB2bGQxcV9mMzJfeDIoY29lZnNOKTsKKyAgICAgICAgY29lZnNOICs9IDg7CisjZWxzZQorICAgICAgICBmbG9hdDMyeDR4Ml90IHBvc0NvZWY7CisgICAgICAgIHBvc0NvZWYudmFsWzBdID0gdmxkMXFfZjMyKGNvZWZzUCk7CisgICAgICAgIGNvZWZzUCArPSA0OworICAgICAgICBwb3NDb2VmLnZhbFsxXSA9IHZsZDFxX2YzMihjb2Vmc1ApOworICAgICAgICBjb2Vmc1AgKz0gNDsKKyAgICAgICAgZmxvYXQzMng0eDJfdCBuZWdDb2VmOworICAgICAgICBuZWdDb2VmLnZhbFswXSA9IHZsZDFxX2YzMihjb2Vmc04pOworICAgICAgICBjb2Vmc04gKz0gNDsKKyAgICAgICAgbmVnQ29lZi52YWxbMV0gPSB2bGQxcV9mMzIoY29lZnNOKTsKKyAgICAgICAgY29lZnNOICs9IDQ7CisjZW5kaWYKKyAgICAgICAgaWYgKCFGSVhFRCkgeyAvLyBpbnRlcnBvbGF0ZQorI2lmZGVmIHZsZDFxX2YzMl94MgorICAgICAgICAgICAgZmxvYXQzMng0eDJfdCBwb3NDb2VmMSA9IHZsZDFxX2YzMl94Mihjb2Vmc1AxKTsKKyAgICAgICAgICAgIGNvZWZzUDEgKz0gODsKKyAgICAgICAgICAgIGZsb2F0MzJ4NHgyX3QgbmVnQ29lZjEgPSB2bGQxcV9mMzJfeDIoY29lZnNOMSk7CisgICAgICAgICAgICBjb2Vmc04xICs9IDg7CisjZWxzZQorICAgICAgICAgICAgZmxvYXQzMng0eDJfdCBwb3NDb2VmMTsKKyAgICAgICAgICAgIHBvc0NvZWYxLnZhbFswXSA9IHZsZDFxX2YzMihjb2Vmc1AxKTsKKyAgICAgICAgICAgIGNvZWZzUDEgKz0gNDsKKyAgICAgICAgICAgIHBvc0NvZWYxLnZhbFsxXSA9IHZsZDFxX2YzMihjb2Vmc1AxKTsKKyAgICAgICAgICAgIGNvZWZzUDEgKz0gNDsKKyAgICAgICAgICAgIGZsb2F0MzJ4NHgyX3QgbmVnQ29lZjE7CisgICAgICAgICAgICBuZWdDb2VmMS52YWxbMF0gPSB2bGQxcV9mMzIoY29lZnNOMSk7CisgICAgICAgICAgICBjb2Vmc04xICs9IDQ7CisgICAgICAgICAgICBuZWdDb2VmMS52YWxbMV0gPSB2bGQxcV9mMzIoY29lZnNOMSk7CisgICAgICAgICAgICBjb2Vmc04xICs9IDQ7CisjZW5kaWYKKyAgICAgICAgICAgIHBvc0NvZWYxLnZhbFswXSA9IHZzdWJxX2YzMihwb3NDb2VmMS52YWxbMF0sIHBvc0NvZWYudmFsWzBdKTsKKyAgICAgICAgICAgIHBvc0NvZWYxLnZhbFsxXSA9IHZzdWJxX2YzMihwb3NDb2VmMS52YWxbMV0sIHBvc0NvZWYudmFsWzFdKTsKKyAgICAgICAgICAgIG5lZ0NvZWYudmFsWzBdID0gdnN1YnFfZjMyKG5lZ0NvZWYudmFsWzBdLCBuZWdDb2VmMS52YWxbMF0pOworICAgICAgICAgICAgbmVnQ29lZi52YWxbMV0gPSB2c3VicV9mMzIobmVnQ29lZi52YWxbMV0sIG5lZ0NvZWYxLnZhbFsxXSk7CisKKyAgICAgICAgICAgIHBvc0NvZWYudmFsWzBdID0gdm1sYXFfbGFuZV9mMzIocG9zQ29lZi52YWxbMF0sIHBvc0NvZWYxLnZhbFswXSwgaW50ZXJwLCAwKTsKKyAgICAgICAgICAgIHBvc0NvZWYudmFsWzFdID0gdm1sYXFfbGFuZV9mMzIocG9zQ29lZi52YWxbMV0sIHBvc0NvZWYxLnZhbFsxXSwgaW50ZXJwLCAwKTsKKyAgICAgICAgICAgIG5lZ0NvZWYudmFsWzBdID0gdm1sYXFfbGFuZV9mMzIobmVnQ29lZjEudmFsWzBdLCBuZWdDb2VmLnZhbFswXSwgaW50ZXJwLCAwKTsgLy8gcmV2CisgICAgICAgICAgICBuZWdDb2VmLnZhbFsxXSA9IHZtbGFxX2xhbmVfZjMyKG5lZ0NvZWYxLnZhbFsxXSwgbmVnQ29lZi52YWxbMV0sIGludGVycCwgMCk7IC8vIHJldgorICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoQ0hBTk5FTFMpIHsKKyAgICAgICAgY2FzZSAxOiB7CisjaWZkZWYgdmxkMXFfZjMyX3gyCisgICAgICAgICAgICBmbG9hdDMyeDR4Ml90IHBvc1NhbXAgPSB2bGQxcV9mMzJfeDIoc1ApOworICAgICAgICAgICAgZmxvYXQzMng0eDJfdCBuZWdTYW1wID0gdmxkMXFfZjMyX3gyKHNOKTsKKyAgICAgICAgICAgIHNOICs9IDg7CisgICAgICAgICAgICBzUCAtPSA4OworI2Vsc2UKKyAgICAgICAgICAgIGZsb2F0MzJ4NHgyX3QgcG9zU2FtcDsKKyAgICAgICAgICAgIHBvc1NhbXAudmFsWzBdID0gdmxkMXFfZjMyKHNQKTsKKyAgICAgICAgICAgIHNQICs9IDQ7CisgICAgICAgICAgICBwb3NTYW1wLnZhbFsxXSA9IHZsZDFxX2YzMihzUCk7CisgICAgICAgICAgICBzUCAtPSAxMjsKKyAgICAgICAgICAgIGZsb2F0MzJ4NHgyX3QgbmVnU2FtcDsKKyAgICAgICAgICAgIG5lZ1NhbXAudmFsWzBdID0gdmxkMXFfZjMyKHNOKTsKKyAgICAgICAgICAgIHNOICs9IDQ7CisgICAgICAgICAgICBuZWdTYW1wLnZhbFsxXSA9IHZsZDFxX2YzMihzTik7CisgICAgICAgICAgICBzTiArPSA0OworI2VuZGlmCisgICAgICAgICAgICAvLyBlZmZlY3RpdmVseSB3ZSB3YW50IGEgdnJldjEyOHFfZjMyKCkKKyAgICAgICAgICAgIHBvc1NhbXAudmFsWzBdID0gdnJldjY0cV9mMzIocG9zU2FtcC52YWxbMF0pOworICAgICAgICAgICAgcG9zU2FtcC52YWxbMV0gPSB2cmV2NjRxX2YzMihwb3NTYW1wLnZhbFsxXSk7CisgICAgICAgICAgICBwb3NTYW1wLnZhbFswXSA9IHZjb21iaW5lX2YzMigKKyAgICAgICAgICAgICAgICAgICAgdmdldF9oaWdoX2YzMihwb3NTYW1wLnZhbFswXSksIHZnZXRfbG93X2YzMihwb3NTYW1wLnZhbFswXSkpOworICAgICAgICAgICAgcG9zU2FtcC52YWxbMV0gPSB2Y29tYmluZV9mMzIoCisgICAgICAgICAgICAgICAgICAgIHZnZXRfaGlnaF9mMzIocG9zU2FtcC52YWxbMV0pLCB2Z2V0X2xvd19mMzIocG9zU2FtcC52YWxbMV0pKTsKKworICAgICAgICAgICAgYWNjdW0gPSB2bWxhcV9mMzIoYWNjdW0sIHBvc1NhbXAudmFsWzBdLCBwb3NDb2VmLnZhbFsxXSk7CisgICAgICAgICAgICBhY2N1bSA9IHZtbGFxX2YzMihhY2N1bSwgcG9zU2FtcC52YWxbMV0sIHBvc0NvZWYudmFsWzBdKTsKKyAgICAgICAgICAgIGFjY3VtID0gdm1sYXFfZjMyKGFjY3VtLCBuZWdTYW1wLnZhbFswXSwgbmVnQ29lZi52YWxbMF0pOworICAgICAgICAgICAgYWNjdW0gPSB2bWxhcV9mMzIoYWNjdW0sIG5lZ1NhbXAudmFsWzFdLCBuZWdDb2VmLnZhbFsxXSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgMjogeworICAgICAgICAgICAgZmxvYXQzMng0eDJfdCBwb3NTYW1wMCA9IHZsZDJxX2YzMihzUCk7CisgICAgICAgICAgICBzUCArPSA4OworICAgICAgICAgICAgZmxvYXQzMng0eDJfdCBuZWdTYW1wMCA9IHZsZDJxX2YzMihzTik7CisgICAgICAgICAgICBzTiArPSA4OworICAgICAgICAgICAgcG9zU2FtcDAudmFsWzBdID0gdnJldjY0cV9mMzIocG9zU2FtcDAudmFsWzBdKTsKKyAgICAgICAgICAgIHBvc1NhbXAwLnZhbFsxXSA9IHZyZXY2NHFfZjMyKHBvc1NhbXAwLnZhbFsxXSk7CisgICAgICAgICAgICBwb3NTYW1wMC52YWxbMF0gPSB2Y29tYmluZV9mMzIoCisgICAgICAgICAgICAgICAgICAgIHZnZXRfaGlnaF9mMzIocG9zU2FtcDAudmFsWzBdKSwgdmdldF9sb3dfZjMyKHBvc1NhbXAwLnZhbFswXSkpOworICAgICAgICAgICAgcG9zU2FtcDAudmFsWzFdID0gdmNvbWJpbmVfZjMyKAorICAgICAgICAgICAgICAgICAgICB2Z2V0X2hpZ2hfZjMyKHBvc1NhbXAwLnZhbFsxXSksIHZnZXRfbG93X2YzMihwb3NTYW1wMC52YWxbMV0pKTsKKworICAgICAgICAgICAgZmxvYXQzMng0eDJfdCBwb3NTYW1wMSA9IHZsZDJxX2YzMihzUCk7CisgICAgICAgICAgICBzUCAtPSAyNDsKKyAgICAgICAgICAgIGZsb2F0MzJ4NHgyX3QgbmVnU2FtcDEgPSB2bGQycV9mMzIoc04pOworICAgICAgICAgICAgc04gKz0gODsKKyAgICAgICAgICAgIHBvc1NhbXAxLnZhbFswXSA9IHZyZXY2NHFfZjMyKHBvc1NhbXAxLnZhbFswXSk7CisgICAgICAgICAgICBwb3NTYW1wMS52YWxbMV0gPSB2cmV2NjRxX2YzMihwb3NTYW1wMS52YWxbMV0pOworICAgICAgICAgICAgcG9zU2FtcDEudmFsWzBdID0gdmNvbWJpbmVfZjMyKAorICAgICAgICAgICAgICAgICAgICB2Z2V0X2hpZ2hfZjMyKHBvc1NhbXAxLnZhbFswXSksIHZnZXRfbG93X2YzMihwb3NTYW1wMS52YWxbMF0pKTsKKyAgICAgICAgICAgIHBvc1NhbXAxLnZhbFsxXSA9IHZjb21iaW5lX2YzMigKKyAgICAgICAgICAgICAgICAgICAgdmdldF9oaWdoX2YzMihwb3NTYW1wMS52YWxbMV0pLCB2Z2V0X2xvd19mMzIocG9zU2FtcDEudmFsWzFdKSk7CisKKyAgICAgICAgICAgIC8vIE5vdGU6IHNwZWVkIGlzIGFmZmVjdGVkIGJ5IGFjY3VtdWxhdGlvbiBvcmRlci4KKyAgICAgICAgICAgIC8vIEFsc28sIHNwZWVkIGFwcGVhcnMgc2xvd2VyIHVzaW5nIHZtdWwvdmFkZCBpbnN0ZWFkIG9mIHZtbGEgZm9yCisgICAgICAgICAgICAvLyBzdGVyZW8gY2FzZSwgY29tcGFyYWJsZSBmb3IgbW9uby4KKworICAgICAgICAgICAgYWNjdW0gPSB2bWxhcV9mMzIoYWNjdW0sIG5lZ1NhbXAwLnZhbFswXSwgbmVnQ29lZi52YWxbMF0pOworICAgICAgICAgICAgYWNjdW0gPSB2bWxhcV9mMzIoYWNjdW0sIG5lZ1NhbXAxLnZhbFswXSwgbmVnQ29lZi52YWxbMV0pOworICAgICAgICAgICAgYWNjdW0yID0gdm1sYXFfZjMyKGFjY3VtMiwgbmVnU2FtcDAudmFsWzFdLCBuZWdDb2VmLnZhbFswXSk7CisgICAgICAgICAgICBhY2N1bTIgPSB2bWxhcV9mMzIoYWNjdW0yLCBuZWdTYW1wMS52YWxbMV0sIG5lZ0NvZWYudmFsWzFdKTsKKworICAgICAgICAgICAgYWNjdW0gPSB2bWxhcV9mMzIoYWNjdW0sIHBvc1NhbXAwLnZhbFswXSwgcG9zQ29lZi52YWxbMV0pOyAvLyByZXZlcnNlZAorICAgICAgICAgICAgYWNjdW0gPSB2bWxhcV9mMzIoYWNjdW0sIHBvc1NhbXAxLnZhbFswXSwgcG9zQ29lZi52YWxbMF0pOyAvLyByZXZlcnNlZAorICAgICAgICAgICAgYWNjdW0yID0gdm1sYXFfZjMyKGFjY3VtMiwgcG9zU2FtcDAudmFsWzFdLCBwb3NDb2VmLnZhbFsxXSk7IC8vIHJldmVyc2VkCisgICAgICAgICAgICBhY2N1bTIgPSB2bWxhcV9mMzIoYWNjdW0yLCBwb3NTYW1wMS52YWxbMV0sIHBvc0NvZWYudmFsWzBdKTsgLy8gcmV2ZXJzZWQKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGNvdW50IC09IDgpOworCisgICAgLy8gbXVsdGlwbHkgYnkgdm9sdW1lIGFuZCBzYXZlCisgICAgdm9sdW1lTFIgPSAoY29uc3QgZmxvYXQqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZCh2b2x1bWVMUiwgOCk7CisgICAgZmxvYXQzMngyX3QgdkxSID0gdmxkMV9mMzIodm9sdW1lTFIpOworICAgIGZsb2F0MzJ4Ml90IG91dFNhbXAgPSB2bGQxX2YzMihvdXQpOworICAgIC8vIGNvbWJpbmUgYW5kIGZ1bm5lbCBkb3duIGFjY3VtdWxhdG9yCisgICAgZmxvYXQzMngyX3Qgb3V0QWNjdW0gPSB2cGFkZF9mMzIodmdldF9sb3dfZjMyKGFjY3VtKSwgdmdldF9oaWdoX2YzMihhY2N1bSkpOworICAgIGlmIChDSEFOTkVMUyA9PSAxKSB7CisgICAgICAgIC8vIGR1cGxpY2F0ZSBhY2N1bSB0byBib3RoIEwgYW5kIFIKKyAgICAgICAgb3V0QWNjdW0gPSB2cGFkZF9mMzIob3V0QWNjdW0sIG91dEFjY3VtKTsKKyAgICB9IGVsc2UgaWYgKENIQU5ORUxTID09IDIpIHsKKyAgICAgICAgLy8gYWNjdW0yIGNvbnRhaW5zIFIsIGZvbGQgaW4KKyAgICAgICAgZmxvYXQzMngyX3Qgb3V0QWNjdW0yID0gdnBhZGRfZjMyKHZnZXRfbG93X2YzMihhY2N1bTIpLCB2Z2V0X2hpZ2hfZjMyKGFjY3VtMikpOworICAgICAgICBvdXRBY2N1bSA9IHZwYWRkX2YzMihvdXRBY2N1bSwgb3V0QWNjdW0yKTsKKyAgICB9CisgICAgb3V0U2FtcCA9IHZtbGFfZjMyKG91dFNhbXAsIG91dEFjY3VtLCB2TFIpOworICAgIHZzdDFfZjMyKG91dCwgb3V0U2FtcCk7Cit9CisKIHRlbXBsYXRlIDw+CiBpbmxpbmUgdm9pZCBQcm9jZXNzTDwxLCAxNj4oaW50MzJfdCogY29uc3Qgb3V0LAogICAgICAgICBpbnQgY291bnQsCkBAIC01OCw2ICs1MzEsMTAgQEAKICAgICAgICAgY29uc3QgaW50MTZfdCogc04sCiAgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQogeworI2lmZGVmIFVTRV9JTlRSSU5TSUMKKyAgICBQcm9jZXNzTmVvbkludHJpbnNpYzwxLCAxNiwgdHJ1ZT4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgdm9sdW1lTFIsCisgICAgICAgICAgICAwIC8qbGVycFAqLywgTlVMTCAvKmNvZWZzUDEqLywgTlVMTCAvKmNvZWZzTjEqLyk7CisjZWxzZQogICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcwogICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKICAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CkBAIC05OSw2ICs1NzYsNyBAQAogICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCiAgICAgICAgICAgInE4IiwgInExMCIKICAgICApOworI2VuZGlmCiB9CiAKIHRlbXBsYXRlIDw+CkBAIC0xMTAsNiArNTg4LDEwIEBACiAgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAogICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKIHsKKyNpZmRlZiBVU0VfSU5UUklOU0lDCisgICAgUHJvY2Vzc05lb25JbnRyaW5zaWM8MiwgMTYsIHRydWU+KG91dCwgY291bnQsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIHZvbHVtZUxSLAorICAgICAgICAgICAgMCAvKmxlcnBQKi8sIE5VTEwgLypjb2Vmc1AxKi8sIE5VTEwgLypjb2Vmc04xKi8pOworI2Vsc2UKICAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAyOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKICAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CiAgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOwpAQCAtMTE5LDEzICs2MDEsMTMgQEAKIAogICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgogCi0gICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTIsIHEzfSwgWyVbc1BdXSAgICAgICAgXG4iLy8gKDMrMGQpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTUsIHE2fSwgWyVbc05dXSEgICAgICAgXG4iLy8gKDMpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTIsIHEzfSwgWyVbc1BdXSAgICAgICAgXG4iLy8gKDMrMGQpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBmcmFtZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxNSwgcTZ9LCBbJVtzTl1dISAgICAgICBcbiIvLyAoMykgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIGZyYW1lcwogICAgICAgICAidmxkMS4xNiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcwogICAgICAgICAidmxkMS4xNiAgICAgICAge3ExMH0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcwogCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIGxlZnQgcG9zaXRpdmUKLSAgICAgICAgInZyZXY2NC4xNiAgICAgIHEzLCBxMyAgICAgICAgICAgICAgICAgICBcbiIvLyAoMCBjb21iaW5lcyspIHJldmVyc2UgcmlnaHQgcG9zaXRpdmUKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSA4IHNhbXBsZXMgb2YgcG9zaXRpdmUgbGVmdAorICAgICAgICAidnJldjY0LjE2ICAgICAgcTMsIHEzICAgICAgICAgICAgICAgICAgIFxuIi8vICgwIGNvbWJpbmVzKykgcmV2ZXJzZSBwb3NpdGl2ZSByaWdodAogCiAgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDQsIGQxNyAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZCkgc2FtcGxlcyBsZWZ0CiAgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDUsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZCkgc2FtcGxlcyBsZWZ0CkBAIC0xNTcsNiArNjM5LDcgQEAKICAgICAgICAgICAicTQiLCAicTUiLCAicTYiLAogICAgICAgICAgICJxOCIsICJxMTAiCiAgICAgICk7CisjZW5kaWYKIH0KIAogdGVtcGxhdGUgPD4KQEAgLTE3MSw2ICs2NTQsMTEgQEAKICAgICAgICAgdWludDMyX3QgbGVycFAsCiAgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQogeworI2lmZGVmIFVTRV9JTlRSSU5TSUMKKyAgICBQcm9jZXNzTmVvbkludHJpbnNpYzwxLCAxNiwgZmFsc2U+KG91dCwgY291bnQsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIHZvbHVtZUxSLAorICAgICAgICAgICAgbGVycFAsIGNvZWZzUDEsIGNvZWZzTjEpOworI2Vsc2UKKwogICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcwogICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKICAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CkBAIC0yMjcsNiArNzE1LDcgQEAKICAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAogICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIgogICAgICk7CisjZW5kaWYKIH0KIAogdGVtcGxhdGUgPD4KQEAgLTI0MSw2ICs3MzAsMTAgQEAKICAgICAgICAgdWludDMyX3QgbGVycFAsCiAgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQogeworI2lmZGVmIFVTRV9JTlRSSU5TSUMKKyAgICBQcm9jZXNzTmVvbkludHJpbnNpYzwyLCAxNiwgZmFsc2U+KG91dCwgY291bnQsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIHZvbHVtZUxSLAorICAgICAgICAgICAgbGVycFAsIGNvZWZzUDEsIGNvZWZzTjEpOworI2Vsc2UKICAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAyOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKICAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CiAgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOwpAQCAtMjUxLDggKzc0NCw4IEBACiAKICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKIAotICAgICAgICAidmxkMi4xNiAgICAgICAge3EyLCBxM30sIFslW3NQXV0gICAgICAgIFxuIi8vICgzKzBkKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAidmxkMi4xNiAgICAgICAge3E1LCBxNn0sIFslW3NOXV0hICAgICAgIFxuIi8vICgzKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMi4xNiAgICAgICAge3EyLCBxM30sIFslW3NQXV0gICAgICAgIFxuIi8vICgzKzBkKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gZnJhbWVzCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTUsIHE2fSwgWyVbc05dXSEgICAgICAgXG4iLy8gKDMpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBmcmFtZXMKICAgICAgICAgInZsZDEuMTYgICAgICAgIHtxOH0sIFslW2NvZWZzUDBdOjEyOF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKICAgICAgICAgInZsZDEuMTYgICAgICAgIHtxOX0sIFslW2NvZWZzUDFdOjEyOF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KICAgICAgICAgInZsZDEuMTYgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKQEAgLTI2NCw4ICs3NTcsOCBAQAogICAgICAgICAidnFyZG11bGguczE2ICAgcTksIHE5LCBkMlswXSAgICAgICAgICAgIFxuIi8vICgyKSBpbnRlcnBvbGF0ZSAoc3RlcDIpIDFzdCBzZXQgb2YgY29lZnMKICAgICAgICAgInZxcmRtdWxoLnMxNiAgIHExMSwgcTExLCBkMlswXSAgICAgICAgICBcbiIvLyAoMikgaW50ZXJwb2xhdGUgKHN0ZXAyKSAybmQgc2V0IG9mIGNvZWZzCiAKLSAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgbGVmdCBwb3NpdGl2ZQotICAgICAgICAidnJldjY0LjE2ICAgICAgcTMsIHEzICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSByaWdodCBwb3NpdGl2ZQorICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIDggc2FtcGxlcyBvZiBwb3NpdGl2ZSBsZWZ0CisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMywgcTMgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgOCBzYW1wbGVzIG9mIHBvc2l0aXZlIHJpZ2h0CiAKICAgICAgICAgInZhZGQuczE2ICAgICAgIHE4LCBxOCwgcTkgICAgICAgICAgICAgICBcbiIvLyAoMSsxZCkgaW50ZXJwb2xhdGUgKHN0ZXAzKSAxc3Qgc2V0CiAgICAgICAgICJ2YWRkLnMxNiAgICAgICBxMTAsIHExMCwgcTExICAgICAgICAgICAgXG4iLy8gKDErMWQpIGludGVycG9sYXRlIChzdGVwMykgMm5kIHNldApAQCAtMzAzLDYgKzc5Niw3IEBACiAgICAgICAgICAgInE0IiwgInE1IiwgInE2IiwKICAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIKICAgICApOworI2VuZGlmCiB9CiAKIHRlbXBsYXRlIDw+CkBAIC0zMTQsNiArODA4LDEwIEBACiAgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAogICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKIHsKKyNpZmRlZiBVU0VfSU5UUklOU0lDCisgICAgUHJvY2Vzc05lb25JbnRyaW5zaWM8MSwgMTYsIHRydWU+KG91dCwgY291bnQsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIHZvbHVtZUxSLAorICAgICAgICAgICAgMCAvKmxlcnBQKi8sIE5VTEwgLypjb2Vmc1AxKi8sIE5VTEwgLypjb2Vmc04xKi8pOworI2Vsc2UKICAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKICAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CiAgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOwpAQCAtMzI3LDcgKzgyNSw3IEBACiAgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTgsIHE5fSwgWyVbY29lZnNQMF06MTI4XSEgICBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcwogICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMCwgcTExfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKIAotICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQorICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IHNhbXBsZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKIAogICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCBkNCwgIzE1ICAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwogICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCBkNSwgIzE1ICAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwpAQCAtMzM1LDEwICs4MzMsMTAgQEAKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgZDYsICMxNSAgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNSwgZDcsICMxNSAgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKIAotICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMSAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcworICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcworICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcworICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMSAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcwogCiAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAogICAgICAgICAidmFkZC5zMzIgICAgICAgcTEzLCBxMTMsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKQEAgLTM2NCw2ICs4NjIsNyBAQAogICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKICAgICAgICAgICAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgogICAgICk7CisjZW5kaWYKIH0KIAogdGVtcGxhdGUgPD4KQEAgLTM3NSw2ICs4NzQsMTAgQEAKICAgICAgICAgY29uc3QgaW50MTZfdCogc04sCiAgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQogeworI2lmZGVmIFVTRV9JTlRSSU5TSUMKKyAgICBQcm9jZXNzTmVvbkludHJpbnNpYzwyLCAxNiwgdHJ1ZT4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgdm9sdW1lTFIsCisgICAgICAgICAgICAwIC8qbGVycFAqLywgTlVMTCAvKmNvZWZzUDEqLywgTlVMTCAvKmNvZWZzTjEqLyk7CisjZWxzZQogICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcwogICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKICAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CkBAIC0zODQsMTMgKzg4NywxMyBAQAogCiAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKIAotICAgICAgICAidmxkMi4xNiAgICAgICAge3EyLCBxM30sIFslW3NQXV0gICAgICAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgInZsZDIuMTYgICAgICAgIHtxNSwgcTZ9LCBbJVtzTl1dISAgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICJ2bGQxLjMyICAgICAgICB7cTgsIHE5fSwgWyVbY29lZnNQMF06MTI4XSEgICBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcwotICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMCwgcTExfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxMiwgcTN9LCBbJVtzUF1dICAgICAgICAgICAgIFxuIi8vIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBmcmFtZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxNSwgcTZ9LCBbJVtzTl1dISAgICAgICAgICAgIFxuIi8vIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBmcmFtZXMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOCwgcTl9LCBbJVtjb2Vmc1AwXToxMjhdISAgIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwLCBxMTF9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcwogCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBxMywgcTMgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggc2FtcGxlcyBvZiBwb3NpdGl2ZSBsZWZ0CisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMywgcTMgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggc2FtcGxlcyBvZiBwb3NpdGl2ZSByaWdodAogCiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsICBkNCwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsICBkNSwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCkBAIC0zOTgsMTUgKzkwMSwxNSBAQAogICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCAgZDEwLCAjMTUgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwogICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCAgZDExLCAjMTUgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwogCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGNvZWYKIAogICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKICAgICAgICAgInZhZGQuczMyICAgICAgIHExMywgcTEzLCBxMTQgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNSAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMyAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNSAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKIAogICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCAgZDYsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwogICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCAgZDcsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwpAQCAtNDE0LDE1ICs5MTcsMTUgQEAKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgIGQxMiwgIzE1ICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNSwgIGQxMywgIzE1ICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKIAotICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMSAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMSAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCiAKICAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEyICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CiAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTMsIHExMywgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTUgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTUgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CiAKICAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzggICAgICAgIFxuIi8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKICAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzMyICAgICAgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCkBAIC00NDQsNiArOTQ3LDcgQEAKICAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCiAgICAgICAgICAgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKICAgICApOworI2VuZGlmCiB9CiAKIHRlbXBsYXRlIDw+CkBAIC00NTgsNiArOTYyLDEwIEBACiAgICAgICAgIHVpbnQzMl90IGxlcnBQLAogICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKIHsKKyNpZmRlZiBVU0VfSU5UUklOU0lDCisgICAgUHJvY2Vzc05lb25JbnRyaW5zaWM8MSwgMTYsIGZhbHNlPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCB2b2x1bWVMUiwKKyAgICAgICAgICAgIGxlcnBQLCBjb2Vmc1AxLCBjb2Vmc04xKTsKKyNlbHNlCiAgICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCiAgICAgY29uc3QgaW50IFNUUklERSA9IDE2OwogICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKQEAgLTQ4OSw3ICs5OTcsNyBAQAogICAgICAgICAidmFkZC5zMzIgICAgICAgcTEwLCBxMTAsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQogICAgICAgICAidmFkZC5zMzIgICAgICAgcTExLCBxMTEsIHExNSAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQogCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggc2FtcGxlcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQogCiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsICBkNCwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsICBkNSwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCkBAIC01MjksNiArMTAzNyw3IEBACiAgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAogICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCiAgICAgKTsKKyNlbmRpZgogfQogCiB0ZW1wbGF0ZSA8PgpAQCAtNTQzLDYgKzEwNTIsMTAgQEAKICAgICAgICAgdWludDMyX3QgbGVycFAsCiAgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQogeworI2lmZGVmIFVTRV9JTlRSSU5TSUMKKyAgICBQcm9jZXNzTmVvbkludHJpbnNpYzwyLCAxNiwgZmFsc2U+KG91dCwgY291bnQsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIHZvbHVtZUxSLAorICAgICAgICAgICAgbGVycFAsIGNvZWZzUDEsIGNvZWZzTjEpOworI2Vsc2UKICAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAyOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKICAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CiAgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOwpAQCAtNTUzLDggKzEwNjYsOCBAQAogCiAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKIAotICAgICAgICAidmxkMi4xNiAgICAgICAge3EyLCBxM30sIFslW3NQXV0gICAgICAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgInZsZDIuMTYgICAgICAgIHtxNSwgcTZ9LCBbJVtzTl1dISAgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTIsIHEzfSwgWyVbc1BdXSAgICAgICAgICAgICBcbiIvLyBsb2FkIDggMTYtYml0cyBzdGVyZW8gZnJhbWVzCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTUsIHE2fSwgWyVbc05dXSEgICAgICAgICAgICBcbiIvLyBsb2FkIDggMTYtYml0cyBzdGVyZW8gZnJhbWVzCiAgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTgsIHE5fSwgWyVbY29lZnNQMF06MTI4XSEgICBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcwogICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMiwgcTEzfSwgWyVbY29lZnNQMV06MTI4XSEgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKICAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTAsIHExMX0sIFslW2NvZWZzTjFdOjEyOF0hIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCkBAIC01NzUsOCArMTA4OCw4IEBACiAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTAsIHExMCwgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpCiAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTEsIHExMSwgcTE1ICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpCiAKLSAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKLSAgICAgICAgInZyZXY2NC4xNiAgICAgIHEzLCBxMyAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBzYW1wbGVzIG9mIHBvc2l0aXZlIGxlZnQKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEzLCBxMyAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBzYW1wbGVzIG9mIHBvc2l0aXZlIHJpZ2h0CiAKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgIGQ0LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgIGQ1LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKQEAgLTU5MSw4ICsxMTA0LDggQEAKIAogICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKICAgICAgICAgInZhZGQuczMyICAgICAgIHExMywgcTEzLCBxMTQgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNSAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMyAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNSAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKIAogICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCAgZDYsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwogICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCAgZDcsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwpAQCAtNjA3LDggKzExMjAsOCBAQAogCiAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExMiAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAogICAgICAgICAidmFkZC5zMzIgICAgICAgcTEzLCBxMTMsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTE1ICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTE1ICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExMyAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAogCiAgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM4ICAgICAgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCiAgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMzMiAgICAgICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcwpAQCAtNjMzLDUxNyArMTE0Niw2OSBAQAogICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKICAgICAgICAgICAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgogICAgICk7CisjZW5kaWYKIH0KIAotdGVtcGxhdGUgPD4KLWlubGluZSB2b2lkIFByb2Nlc3NMPDEsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKK3RlbXBsYXRlPD4KK2lubGluZSB2b2lkIFByb2Nlc3NMPDEsIDE2PihmbG9hdCogY29uc3Qgb3V0LAogICAgICAgICBpbnQgY291bnQsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUCwKLSAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOLAotICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKLSAgICAgICAgY29uc3QgaW50MTZfdCogc04sCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQorICAgICAgICBjb25zdCBmbG9hdCogY29lZnNQLAorICAgICAgICBjb25zdCBmbG9hdCogY29lZnNOLAorICAgICAgICBjb25zdCBmbG9hdCogc1AsCisgICAgICAgIGNvbnN0IGZsb2F0KiBzTiwKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvbnN0IHZvbHVtZUxSKQogewotICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcwotICAgIGNvbnN0IGludCBTVFJJREUgPSA4OwotICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKLSAgICBhc20gKAotICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vICgwIC0gY29tYmluZXMrKSBhY2N1bXVsYXRvciA9IDAKLQotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDR9LCBbJVtzUF1dICAgICAgICAgICAgXG4iLy8gKDIrMGQpIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcwotICAgICAgICAidmxkMS4xNiAgICAgICAge2Q2fSwgWyVbc05dXSEgICAgICAgICAgIFxuIi8vICgyKSBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMTZ9LCBbJVtjb2Vmc1AwXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA0IDE2LWJpdHMgY29lZnMKLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMjB9LCBbJVtjb2Vmc04wXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA0IDE2LWJpdHMgY29lZnMKLQotICAgICAgICAidnJldjY0LjE2ICAgICAgZDQsIGQ0ICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlZCBzMywgczIsIHMxLCBzMCwgczcsIHM2LCBzNSwgczQKLQotICAgICAgICAvLyByZW9yZGVyaW5nIHRoZSB2bWFsIHRvIGRvIGQ2LCBkNyBiZWZvcmUgZDQsIGQ1IGlzIHNsb3dlcig/KQotICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ0LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpc2FtcGxlcyBieSBjb2VmCi0gICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDYsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IG5lZyBzYW1wbGVzCi0KLSAgICAgICAgLy8gbW92aW5nIHRoZXNlIEFSTSBpbnN0cnVjdGlvbnMgYmVmb3JlIG5lb24gYWJvdmUgc2VlbXMgdG8gYmUgc2xvd2VyCi0gICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gKDEpIHVwZGF0ZSBsb29wIGNvdW50ZXIKLSAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzggICAgICAgICBcbiIvLyAoMCkgbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKLQotICAgICAgICAvLyBzUCB1c2VkIGFmdGVyIGJyYW5jaCAod2FybmluZykKLSAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCi0KLSAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9NT05PCi0KLSAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCi0gICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKLSAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKLSAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKLSAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAotICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKLSAgICAgICAgOiBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKLSAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKLSAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAotICAgICAgICAgICJxOCIsICJxMTAiCi0gICAgKTsKKyAgICBQcm9jZXNzTmVvbkludHJpbnNpYzwxLCAxNiwgdHJ1ZT4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgdm9sdW1lTFIsCisgICAgICAgICAgICAwIC8qbGVycFAqLywgTlVMTCAvKmNvZWZzUDEqLywgTlVMTCAvKmNvZWZzTjEqLyk7CiB9CiAKLXRlbXBsYXRlIDw+Ci1pbmxpbmUgdm9pZCBQcm9jZXNzTDwyLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCit0ZW1wbGF0ZTw+CitpbmxpbmUgdm9pZCBQcm9jZXNzTDwyLCAxNj4oZmxvYXQqIGNvbnN0IG91dCwKICAgICAgICAgaW50IGNvdW50LAotICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTiwKLSAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgZmxvYXQqIHNQLAorICAgICAgICBjb25zdCBmbG9hdCogc04sCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb25zdCB2b2x1bWVMUikKIHsKLSAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAyOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKLSAgICBjb25zdCBpbnQgU1RSSURFID0gODsKLSAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7Ci0gICAgYXNtICgKLSAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyAoMSkgYWNjX0wgPSAwCi0gICAgICAgICJ2ZW9yICAgICAgICAgICBxNCwgcTQsIHE0ICAgICAgICAgICAgICAgXG4iLy8gKDAgY29tYmluZXMrKSBhY2NfUiA9IDAKLQotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDQsIGQ1fSwgWyVbc1BdXSAgICAgICAgXG4iLy8gKDIrMGQpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDYsIGQ3fSwgWyVbc05dXSEgICAgICAgXG4iLy8gKDIpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDE2fSwgWyVbY29lZnNQMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDIwfSwgWyVbY29lZnNOMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCi0KLSAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgbGVmdCBwb3NpdGl2ZQotCi0gICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDQsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZCkgc2FtcGxlcyBsZWZ0Ci0gICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDUsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZCkgc2FtcGxlcyByaWdodAotICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ2LCBkMjAgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIGxlZnQKLSAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkNywgZDIwICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyByaWdodAotCi0gICAgICAgIC8vIG1vdmluZyB0aGVzZSBBUk0gYmVmb3JlIG5lb24gc2VlbXMgdG8gYmUgc2xvd2VyCi0gICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gKDEpIHVwZGF0ZSBsb29wIGNvdW50ZXIKLSAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICBcbiIvLyAoMCkgbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKLQotICAgICAgICAvLyBzUCB1c2VkIGFmdGVyIGJyYW5jaCAod2FybmluZykKLSAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCi0KLSAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8KLQotICAgICAgICA6IFtvdXRdICI9VXYiIChvdXRbMF0pLAotICAgICAgICAgIFtjb3VudF0gIityIiAoY291bnQpLAotICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAotICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAotICAgICAgICAgIFtzUF0gIityIiAoc1ApLAotICAgICAgICAgIFtzTl0gIityIiAoc04pCi0gICAgICAgIDogW3ZMUl0gInIiICh2b2x1bWVMUikKLSAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKLSAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAotICAgICAgICAgICJxNCIsICJxNSIsICJxNiIsCi0gICAgICAgICAgInE4IiwgInExMCIKLSAgICAgKTsKKyAgICBQcm9jZXNzTmVvbkludHJpbnNpYzwyLCAxNiwgdHJ1ZT4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgdm9sdW1lTFIsCisgICAgICAgICAgICAwIC8qbGVycFAqLywgTlVMTCAvKmNvZWZzUDEqLywgTlVMTCAvKmNvZWZzTjEqLyk7CiB9CiAKLXRlbXBsYXRlIDw+Ci1pbmxpbmUgdm9pZCBQcm9jZXNzPDEsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKK3RlbXBsYXRlPD4KK2lubGluZSB2b2lkIFByb2Nlc3M8MSwgMTY+KGZsb2F0KiBjb25zdCBvdXQsCiAgICAgICAgIGludCBjb3VudCwKLSAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQLAotICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04sCi0gICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUDEsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTjEsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAotICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKLSAgICAgICAgdWludDMyX3QgbGVycFAsCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQorICAgICAgICBjb25zdCBmbG9hdCogY29lZnNQLAorICAgICAgICBjb25zdCBmbG9hdCogY29lZnNOLAorICAgICAgICBjb25zdCBmbG9hdCogY29lZnNQMSwKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvZWZzTjEsCisgICAgICAgIGNvbnN0IGZsb2F0KiBzUCwKKyAgICAgICAgY29uc3QgZmxvYXQqIHNOLAorICAgICAgICBmbG9hdCBsZXJwUCwKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvbnN0IHZvbHVtZUxSKQogewotICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcwotICAgIGNvbnN0IGludCBTVFJJREUgPSA4OwotICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKLSAgICBhc20gKAotICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgIFxuIi8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlIFMzMiBRMTUKLSAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyAoMCAtIGNvbWJpbmVzKykgYWNjdW11bGF0b3IgPSAwCi0KLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICAgICAidmxkMS4xNiAgICAgICAge2Q0fSwgWyVbc1BdXSAgICAgICAgICAgIFxuIi8vICgyKzBkKSBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNn0sIFslW3NOXV0hICAgICAgICAgICBcbiIvLyAoMikgbG9hZCA0IDE2LWJpdHMgbW9ubyBzYW1wbGVzCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDE2fSwgWyVbY29lZnNQMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgNCAxNi1iaXRzIGNvZWZzCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDE3fSwgWyVbY29lZnNQMV06NjRdISAgXG4iLy8gKDEpIGxvYWQgNCAxNi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDIwfSwgWyVbY29lZnNOMV06NjRdISAgXG4iLy8gKDEpIGxvYWQgNCAxNi1iaXRzIGNvZWZzCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDIxfSwgWyVbY29lZnNOMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgNCAxNi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCi0KLSAgICAgICAgInZzdWIuczE2ICAgICAgIGQxNywgZDE3LCBkMTYgICAgICAgICAgICBcbiIvLyAoMSkgaW50ZXJwb2xhdGUgKHN0ZXAxKSAxc3Qgc2V0IG9mIGNvZWZzCi0gICAgICAgICJ2c3ViLnMxNiAgICAgICBkMjEsIGQyMSwgZDIwICAgICAgICAgICAgXG4iLy8gKDEpIGludGVycG9sYXRlIChzdGVwMSkgMm5kIHNldCBvZiBjb2V0cwotCi0gICAgICAgICJ2cXJkbXVsaC5zMTYgICBkMTcsIGQxNywgZDJbMF0gICAgICAgICAgXG4iLy8gKDIpIGludGVycG9sYXRlIChzdGVwMikgMXN0IHNldCBvZiBjb2VmcwotICAgICAgICAidnFyZG11bGguczE2ICAgZDIxLCBkMjEsIGQyWzBdICAgICAgICAgIFxuIi8vICgyKSBpbnRlcnBvbGF0ZSAoc3RlcDIpIDJuZCBzZXQgb2YgY29lZnMKLQotICAgICAgICAidnJldjY0LjE2ICAgICAgZDQsIGQ0ICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIHMzLCBzMiwgczEsIHMwLCBzNywgczYsIHM1LCBzNAotCi0gICAgICAgICJ2YWRkLnMxNiAgICAgICBkMTYsIGQxNiwgZDE3ICAgICAgICAgICAgXG4iLy8gKDErMmQpIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAotICAgICAgICAidmFkZC5zMTYgICAgICAgZDIwLCBkMjAsIGQyMSAgICAgICAgICAgIFxuIi8vICgxKzFkKSBpbnRlcnBvbGF0ZSAoc3RlcDMpIDJuZCBzZXQKLQotICAgICAgICAvLyByZW9yZGVyaW5nIHRoZSB2bWFsIHRvIGRvIGQ2LCBkNyBiZWZvcmUgZDQsIGQ1IGlzIHNsb3dlcig/KQotICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ0LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKzBkKSBtdWx0aXBseSAocmV2ZXJzZWQpYnkgY29lZgotICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ2LCBkMjAgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBuZWcgc2FtcGxlcwotCi0gICAgICAgIC8vIG1vdmluZyB0aGVzZSBBUk0gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBuZW9uIGFib3ZlIHNlZW1zIHRvIGJlIHNsb3dlcgotICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vICgxKSB1cGRhdGUgbG9vcCBjb3VudGVyCi0gICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICM4ICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcwotCi0gICAgICAgIC8vIHNQIHVzZWQgYWZ0ZXIgYnJhbmNoICh3YXJuaW5nKQotICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKLQotICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8KLQotICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKLSAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAotICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAotICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAotICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKLSAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCi0gICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKLSAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCi0gICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAotICAgICAgICAgIFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQotICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAotICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCi0gICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiCi0gICAgKTsKKyAgICBQcm9jZXNzTmVvbkludHJpbnNpYzwxLCAxNiwgZmFsc2U+KG91dCwgY291bnQsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIHZvbHVtZUxSLAorICAgICAgICAgICAgbGVycFAsIGNvZWZzUDEsIGNvZWZzTjEpOwogfQogCi10ZW1wbGF0ZSA8PgotaW5saW5lIHZvaWQgUHJvY2VzczwyLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCit0ZW1wbGF0ZTw+CitpbmxpbmUgdm9pZCBQcm9jZXNzPDIsIDE2PihmbG9hdCogY29uc3Qgb3V0LAogICAgICAgICBpbnQgY291bnQsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUCwKLSAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOLAotICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AxLAotICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04xLAotICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKLSAgICAgICAgY29uc3QgaW50MTZfdCogc04sCi0gICAgICAgIHVpbnQzMl90IGxlcnBQLAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvZWZzUDEsCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb2Vmc04xLAorICAgICAgICBjb25zdCBmbG9hdCogc1AsCisgICAgICAgIGNvbnN0IGZsb2F0KiBzTiwKKyAgICAgICAgZmxvYXQgbGVycFAsCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb25zdCB2b2x1bWVMUikKIHsKLSAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAyOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKLSAgICBjb25zdCBpbnQgU1RSSURFID0gODsKLSAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7Ci0gICAgYXNtICgKLSAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICBcbiIvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZQotICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vICgxKSBhY2NfTCA9IDAKLSAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICBcbiIvLyAoMCBjb21iaW5lcyspIGFjY19SID0gMAotCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNCwgZDV9LCBbJVtzUF1dICAgICAgICBcbiIvLyAoMyswZCkgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNiwgZDd9LCBbJVtzTl1dISAgICAgICBcbiIvLyAoMykgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMTZ9LCBbJVtjb2Vmc1AwXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMTd9LCBbJVtjb2Vmc1AxXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMjB9LCBbJVtjb2Vmc04xXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMjF9LCBbJVtjb2Vmc04wXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KLQotICAgICAgICAidnN1Yi5zMTYgICAgICAgZDE3LCBkMTcsIGQxNiAgICAgICAgICAgIFxuIi8vICgxKSBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKLSAgICAgICAgInZzdWIuczE2ICAgICAgIGQyMSwgZDIxLCBkMjAgICAgICAgICAgICBcbiIvLyAoMSkgaW50ZXJwb2xhdGUgKHN0ZXAxKSAybmQgc2V0IG9mIGNvZXRzCi0KLSAgICAgICAgInZxcmRtdWxoLnMxNiAgIGQxNywgZDE3LCBkMlswXSAgICAgICAgICBcbiIvLyAoMikgaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCi0gICAgICAgICJ2cXJkbXVsaC5zMTYgICBkMjEsIGQyMSwgZDJbMF0gICAgICAgICAgXG4iLy8gKDIpIGludGVycG9sYXRlIChzdGVwMikgMm5kIHNldCBvZiBjb2VmcwotCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIGxlZnQgcG9zaXRpdmUKLQotICAgICAgICAidmFkZC5zMTYgICAgICAgZDE2LCBkMTYsIGQxNyAgICAgICAgICAgIFxuIi8vICgxKzFkKSBpbnRlcnBvbGF0ZSAoc3RlcDMpIDFzdCBzZXQKLSAgICAgICAgInZhZGQuczE2ICAgICAgIGQyMCwgZDIwLCBkMjEgICAgICAgICAgICBcbiIvLyAoMSsxZCkgaW50ZXJwb2xhdGUgKHN0ZXAzKSAybmQgc2V0Ci0KLSAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNCwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKSBzYW1wbGVzIGxlZnQKLSAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkNSwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKSBzYW1wbGVzIHJpZ2h0Ci0gICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDYsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgbGVmdAotICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQ3LCBkMjAgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIHJpZ2h0Ci0KLSAgICAgICAgLy8gbW92aW5nIHRoZXNlIEFSTSBiZWZvcmUgbmVvbiBzZWVtcyB0byBiZSBzbG93ZXIKLSAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyAoMSkgdXBkYXRlIGxvb3AgY291bnRlcgotICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMTYgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCi0KLSAgICAgICAgLy8gc1AgdXNlZCBhZnRlciBicmFuY2ggKHdhcm5pbmcpCi0gICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAotCi0gICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPCi0KLSAgICAgICAgOiBbb3V0XSAiPVV2IiAob3V0WzBdKSwKLSAgICAgICAgICBbY291bnRdICIrciIgKGNvdW50KSwKLSAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKLSAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKLSAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCi0gICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAotICAgICAgICAgIFtzUF0gIityIiAoc1ApLAotICAgICAgICAgIFtzTl0gIityIiAoc04pCi0gICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAotICAgICAgICAgIFt2TFJdICJyIiAodm9sdW1lTFIpCi0gICAgICAgIDogImNjIiwgIm1lbW9yeSIsCi0gICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKLSAgICAgICAgICAicTQiLCAicTUiLCAicTYiLAotICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIgotICAgICk7Ci19Ci0KLXRlbXBsYXRlIDw+Ci1pbmxpbmUgdm9pZCBQcm9jZXNzTDwxLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCi0gICAgICAgIGludCBjb3VudCwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQLAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04sCi0gICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAotICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCi17Ci0gICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCi0gICAgY29uc3QgaW50IFNUUklERSA9IDg7Ci0gICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOwotICAgIGFzbSAoCi0gICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKLQotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDR9LCBbJVtzUF1dICAgICAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgbW9ubyBzYW1wbGVzCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDZ9LCBbJVtzTl1dISAgICAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgbW9ubyBzYW1wbGVzCi0gICAgICAgICJ2bGQxLjMyICAgICAgICB7cTh9LCBbJVtjb2Vmc1AwXToxMjhdISAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKLSAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcwotCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBkNCwgZDQgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSAyIGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQotCi0gICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsIGQ0LCAjMTUgICAgICAgICAgICAgXG4iLy8gKHN0YWxsKSBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCi0gICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsIGQ2LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwotCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLQotICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNCAgICAgICAgICAgICAgXG4iLy8gKHN0YWxsKSBhY2N1bXVsYXRlIHJlc3VsdAotCi0gICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gdXBkYXRlIGxvb3AgY291bnRlcgotICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjOCAgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCi0KLSAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCi0KLSAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9NT05PCi0KLSAgICAgICAgOiBbb3V0XSAiPVV2IiAob3V0WzBdKSwKLSAgICAgICAgICBbY291bnRdICIrciIgKGNvdW50KSwKLSAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKLSAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKLSAgICAgICAgICBbc1BdICIrciIgKHNQKSwKLSAgICAgICAgICBbc05dICIrciIgKHNOKQotICAgICAgICA6IFt2TFJdICJyIiAodm9sdW1lTFIpCi0gICAgICAgIDogImNjIiwgIm1lbW9yeSIsCi0gICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKLSAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCi0gICAgICAgICAgInExMiIsICJxMTQiCi0gICAgKTsKLX0KLQotdGVtcGxhdGUgPD4KLWlubGluZSB2b2lkIFByb2Nlc3NMPDIsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKLSAgICAgICAgaW50IGNvdW50LAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AsCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTiwKLSAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKLXsKLSAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAyOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKLSAgICBjb25zdCBpbnQgU1RSSURFID0gODsKLSAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7Ci0gICAgYXNtICgKLSAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAotICAgICAgICAidmVvciAgICAgICAgICAgcTQsIHE0LCBxNCAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCi0KLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICAgICAidmxkMi4xNiAgICAgICAge2Q0LCBkNX0sIFslW3NQXV0gICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDYsIGQ3fSwgWyVbc05dXSEgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOH0sIFslW2NvZWZzUDBdOjEyOF0hICBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcwotICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMH0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCi0KLSAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDIgZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCi0KLSAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgZDQsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCi0gICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsIGQ1LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwotCi0gICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsIGQ2LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwotICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCBkNywgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKLQotICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE4ICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgY29lZgotICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgY29lZgotICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgY29lZgotICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMCAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgY29lZgotCi0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEzICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTQgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExNSAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKLQotICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKLSAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcwotCi0gICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAotCi0gICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPCi0KLSAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCi0gICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKLSAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKLSAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKLSAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAotICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKLSAgICAgICAgOiBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKLSAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKLSAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLCAicTQiLAotICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKLSAgICAgICAgICAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgotICAgICk7Ci19Ci0KLXRlbXBsYXRlIDw+Ci1pbmxpbmUgdm9pZCBQcm9jZXNzPDEsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKLSAgICAgICAgaW50IGNvdW50LAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AsCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTiwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQMSwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOMSwKLSAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAotICAgICAgICB1aW50MzJfdCBsZXJwUCwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCi17Ci0gICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCi0gICAgY29uc3QgaW50IFNUUklERSA9IDg7Ci0gICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOwotICAgIGFzbSAoCi0gICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgXG4iLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UKLSAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAotCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNH0sIFslW3NQXV0gICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNn0sIFslW3NOXV0hICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKLSAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOH0sIFslW2NvZWZzUDBdOjEyOF0hICBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcwotICAgICAgICAidmxkMS4zMiAgICAgICAge3E5fSwgWyVbY29lZnNQMV06MTI4XSEgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCi0gICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwfSwgWyVbY29lZnNOMV06MTI4XSEgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKLSAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTF9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgotCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBkNCwgZDQgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSAyIGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQotCi0gICAgICAgICJ2c3ViLnMzMiAgICAgICBxOSwgcTksIHE4ICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKSAxc3Qgc2V0IG9mIGNvZWZzCi0gICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTEsIHExMSwgcTEwICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKSAybmQgc2V0IG9mIGNvZXRzCi0gICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsIGQ0LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwotCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxOSwgcTksIGQyWzBdICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTEsIHExMSwgZDJbMF0gICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKSAybmQgc2V0IG9mIGNvZWZzCi0gICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsIGQ2LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwotCi0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxOCwgcTgsIHE5ICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKSAxc3Qgc2V0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTAsIHExMCwgcTExICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXA0KSAybmQgc2V0Ci0KLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOCAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotCi0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE0ICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAotCi0gICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gdXBkYXRlIGxvb3AgY291bnRlcgotICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjOCAgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCi0KLSAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCi0KLSAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9NT05PCi0KLSAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCi0gICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKLSAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKLSAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCi0gICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCi0gICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAotICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCi0gICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQotICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKLSAgICAgICAgICBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKLSAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKLSAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAotICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKLSAgICAgICAgICAicTEyIiwgInExNCIKLSAgICApOwotfQotCi10ZW1wbGF0ZSA8PgotaW5saW5lCi12b2lkIFByb2Nlc3M8MiwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAotICAgICAgICBpbnQgY291bnQsCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUCwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOLAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AxLAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04xLAotICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKLSAgICAgICAgY29uc3QgaW50MTZfdCogc04sCi0gICAgICAgIHVpbnQzMl90IGxlcnBQLAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKLXsKLSAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAyOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKLSAgICBjb25zdCBpbnQgU1RSSURFID0gODsKLSAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7Ci0gICAgYXNtICgKLSAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICBcbiIvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZQotICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCi0gICAgICAgICJ2ZW9yICAgICAgICAgICBxNCwgcTQsIHE0ICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKLQotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotICAgICAgICAidmxkMi4xNiAgICAgICAge2Q0LCBkNX0sIFslW3NQXV0gICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDYsIGQ3fSwgWyVbc05dXSEgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOH0sIFslW2NvZWZzUDBdOjEyOF0hICBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcwotICAgICAgICAidmxkMS4zMiAgICAgICAge3E5fSwgWyVbY29lZnNQMV06MTI4XSEgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCi0gICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwfSwgWyVbY29lZnNOMV06MTI4XSEgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKLSAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTF9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgotCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gKHJldmVyc2VkKSAyIGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQotCi0gICAgICAgICJ2c3ViLnMzMiAgICAgICBxOSwgcTksIHE4ICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKSAxc3Qgc2V0IG9mIGNvZWZzCi0gICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTEsIHExMSwgcTEwICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKSAybmQgc2V0IG9mIGNvZXRzCi0gICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsIGQ0LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwotICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCBkNSwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKLQotICAgICAgICAidnFyZG11bGguczMyICAgcTksIHE5LCBkMlswXSAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikgMXN0IHNldCBvZiBjb2VmcwotICAgICAgICAidnFyZG11bGguczMyICAgcTExLCBxMTEsIGQyWzFdICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykgMm5kIHNldCBvZiBjb2VmcwotICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCBkNiwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKLSAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNSwgZDcsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCi0KLSAgICAgICAgInZhZGQuczMyICAgICAgIHE4LCBxOCwgcTkgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpIDFzdCBzZXQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHExMCwgcTEwLCBxMTEgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDQpIDJuZCBzZXQKLQotICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE4ICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMCAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLQotICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExMyAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE0ICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTUgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0KLSAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCi0gICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMxNiAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKLQotICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKLQotICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX1NURVJFTwotCi0gICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAotICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCi0gICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCi0gICAgICAgICAgW2NvZWZzUDFdICIrciIgKGNvZWZzUDEpLAotICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAotICAgICAgICAgIFtjb2Vmc04xXSAiK3IiIChjb2Vmc04xKSwKLSAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAotICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKLSAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCi0gICAgICAgICAgW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCi0gICAgICAgIDogImNjIiwgIm1lbW9yeSIsCi0gICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwgInE0IiwKLSAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCi0gICAgICAgICAgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKLSAgICApOworICAgIFByb2Nlc3NOZW9uSW50cmluc2ljPDIsIDE2LCBmYWxzZT4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgdm9sdW1lTFIsCisgICAgICAgICAgICBsZXJwUCwgY29lZnNQMSwgY29lZnNOMSk7CiB9CiAKICNlbmRpZiAvL1VTRV9ORU9OCiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvKkFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9QUk9DRVNTX05FT05fSCovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCmluZGV4IGU2ZmI3NmMuLjQxNzMwZWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCkBAIC02MSwxMzUgKzYxLDcgQEAKICAqIGNtZC1saW5lOiBmaXIgLWwgNyAtcyA0ODAwMCAtYyAyMDQ3OAogICovCiBjb25zdCB1aW50MzJfdCBBdWRpb1Jlc2FtcGxlclNpbmM6Om1GaXJDb2Vmc1VwW10gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDMyKSkpID0gewotICAgICAgICAweDZkMzc0YmM3LCAweDExMWM2YmEwLCAweGYzMjQwZTYxLCAweDA3ZDE0YTM4LCAweGZjNTA5ZTY0LCAweDAxMzljZWU5LCAweGZmYzhjODY2LCAweGZmZmNjMzAwLAotICAgICAgICAweDZkMzUyNzhhLCAweDEwM2U4MTkyLCAweGYzNmI5ZGZkLCAweDA3YmRmYWE1LCAweGZjNTEwMmQwLCAweDAxM2Q2MThkLCAweGZmYzY2M2I5LCAweGZmZmQ5NTkyLAotICAgICAgICAweDZkMmViYWZlLCAweDBmNjI4MTFhLCAweGYzYjNkOGFjLCAweDA3YTlmMzk5LCAweGZjNTFkOWE2LCAweDAxNDBiZWE1LCAweGZmYzQxMjEyLCAweGZmZmU2MzFlLAotICAgICAgICAweDZkMjQwNjlkLCAweDBlODg3NWFkLCAweGYzZmNiNDNlLCAweDA3OTUzOTc2LCAweGZjNTMyMTZmLCAweDAxNDNlNjdjLCAweGZmYzFkMzczLCAweGZmZmYyYjlmLAotICAgICAgICAweDZkMTUwYjM1LCAweDBkYjA2YTg5LCAweGY0NDYyNjkwLCAweDA3N2ZkMGFjLCAweGZjNTRkOGFlLCAweDAxNDZkOTY1LCAweGZmYmZhN2Q5LCAweGZmZmZlZjEwLAotICAgICAgICAweDZkMDFjOWUzLCAweDBjZGE2YWI1LCAweGY0OTAyNTg3LCAweDA3NjliZGFmLCAweGZjNTZmZGRhLCAweDAxNDk5N2JiLCAweGZmYmQ4ZjQwLCAweDAwMDBhZDZlLAotICAgICAgICAweDZjZWE0NDE4LCAweDBjMDY4MGZlLCAweGY0ZGFhNzE4LCAweDA3NTMwNTAxLCAweGZjNTk4ZjYwLCAweDAxNGMyMWRiLCAweGZmYmI4OWExLCAweDAwMDE2NmI2LAotICAgICAgICAweDZjY2U3Yjk3LCAweDBiMzRiN2Y1LCAweGY1MjVhMTQzLCAweDA3M2JhYjI4LCAweGZjNWM4YmE1LCAweDAxNGU3ODJhLCAweGZmYjk5NmYzLCAweDAwMDIxYWU1LAotICAgICAgICAweDZjYWU3MjcyLCAweDBhNjUxOWY0LCAweGY1NzEwYTE3LCAweDA3MjNiNGI0LCAweGZjNWZmMTA1LCAweDAxNTA5YjE0LCAweGZmYjdiNzI4LCAweDAwMDJjOWZkLAotICAgICAgICAweDZjOGEyYjBmLCAweDA5OTdiMTE2LCAweGY1YmNkN2IxLCAweDA3MGIyNjM5LCAweGZjNjNiZGQzLCAweDAxNTI4YjA4LCAweGZmYjVlYTMxLCAweDAwMDM3M2ZiLAotICAgICAgICAweDZjNjFhODIzLCAweDA4Y2M4NzNjLCAweGY2MDkwMDNmLCAweDA2ZjIwNDUzLCAweGZjNjdmMDVhLCAweDAxNTQ0ODdiLCAweGZmYjQyZmZjLCAweDAwMDQxOGUyLAotICAgICAgICAweDZjMzRlY2I1LCAweDA4MDNhNjBhLCAweGY2NTU3YTAwLCAweDA2ZDg1M2EyLCAweGZjNmM4NmRkLCAweDAxNTVkM2U4LCAweGZmYjI4ODc2LCAweDAwMDRiOGIzLAotICAgICAgICAweDZjMDNmYzFjLCAweDA3M2QxNmU3LCAweGY2YTIzYjQ0LCAweDA2YmUxOGNkLCAweGZjNzE3Zjk3LCAweDAxNTcyZGNmLCAweGZmYjBmMzg4LCAweDAwMDU1MzcxLAotICAgICAgICAweDZiY2VkOWZmLCAweDA2NzhlMmZjLCAweGY2ZWYzYTZlLCAweDA2YTM1ODdlLCAweGZjNzZkOGJjLCAweDAxNTg1NmI2LCAweGZmYWY3MTE4LCAweDAwMDVlOTIxLAotICAgICAgICAweDZiOTU4YTU0LCAweDA1YjcxMzMyLCAweGY3M2M2ZGY0LCAweDA2ODgxNzYxLCAweGZjN2M5MDc5LCAweDAxNTk0ZjI1LCAweGZmYWUwMTBiLCAweDAwMDY3OWM1LAotICAgICAgICAweDZiNTgxMTYzLCAweDA0ZjdiMDM3LCAweGY3ODljYzYxLCAweDA2NmM1YTI3LCAweGZjODJhNGY0LCAweDAxNWExN2FiLCAweGZmYWNhMzQ0LCAweDAwMDcwNTY0LAotICAgICAgICAweDZiMTY3M2MxLCAweDA0M2FjMjc2LCAweGY3ZDc0YzUzLCAweDA2NTAyNTgzLCAweGZjODkxNDRkLCAweDAxNWFiMGRiLCAweGZmYWI1N2ExLCAweDAwMDc4YzA0LAotICAgICAgICAweDZhZDBiNjUyLCAweDAzODA1MjFjLCAweGY4MjRlNDgwLCAweDA2MzM3ZTJhLCAweGZjOGZkYzlmLCAweDAxNWIxYjRlLCAweGZmYWExZTAyLCAweDAwMDgwZGFiLAotICAgICAgICAweDZhODZkZTQ4LCAweDAyYzg2NzE1LCAweGY4NzI4YmIzLCAweDA2MTY2OGQyLCAweGZjOTZmYmZjLCAweDAxNWI1NzllLCAweGZmYThmNjQxLCAweDAwMDg4YTYyLAotICAgICAgICAweDZhMzhmMTIzLCAweDAyMTMwOTBjLCAweGY4YzAzOGQwLCAweDA1ZjhlYTMwLCAweGZjOWU3MDc0LCAweDAxNWI2NjZjLCAweGZmYTdlMDM5LCAweDAwMDkwMjMwLAotICAgICAgICAweDY5ZTZmNGIxLCAweDAxNjAzZjZlLCAweGY5MGRlMmQxLCAweDA1ZGIwNmZjLCAweGZjYTYzODEwLCAweDAxNWI0ODViLCAweGZmYTZkYmMwLCAweDAwMDk3NTFlLAotICAgICAgICAweDY5OTBlZjBiLCAweDAwYjAxMTYyLCAweGY5NWI4MGNiLCAweDA1YmNjM2VkLCAweGZjYWU1MGQ2LCAweDAxNWFmZTE0LCAweGZmYTVlOGFkLCAweDAwMDllMzM3LAotICAgICAgICAweDY5MzZlNjk3LCAweDAwMDI4NWQwLCAweGY5YTkwOWVhLCAweDA1OWUyNWI1LCAweGZjYjZiOGM0LCAweDAxNWE4ODQzLCAweGZmYTUwNmQyLCAweDAwMGE0Yzg1LAotICAgICAgICAweDY4ZDhlMjA2LCAweGZmNTdhMzVlLCAweGY5ZjY3NTc3LCAweDA1N2YzMTBhLCAweGZjYmY2ZGQ4LCAweDAxNTllNzk2LCAweGZmYTQzNjAzLCAweDAwMGFiMTEyLAotICAgICAgICAweDY4NzZlODU1LCAweGZlYWY3MDZmLCAweGZhNDNiYWQyLCAweDA1NWZlYTlkLCAweGZjYzg2ZTA5LCAweDAxNTkxY2MwLCAweGZmYTM3NjBlLCAweDAwMGIxMGVjLAotICAgICAgICAweDY4MTEwMGM5LCAweGZlMDlmMzIzLCAweGZhOTBkMTdiLCAweDA1NDA1NzFhLCAweGZjZDFiNzRjLCAweDAxNTgyODc4LCAweGZmYTJjNmMyLCAweDAwMGI2YzFkLAotICAgICAgICAweDY3YTczMmY0LCAweGZkNjczMTU5LCAweGZhZGRiMTBjLCAweDA1MjA3YjJmLCAweGZjZGI0NzkzLCAweDAxNTcwYjc3LCAweGZmYTIyN2VjLCAweDAwMGJjMmIzLAotICAgICAgICAweDY3Mzk4NmFjLCAweGZjYzczMGFhLCAweGZiMmE1MTNiLCAweDA1MDA1YjgyLCAweGZjZTUxY2NiLCAweDAxNTVjNjc4LCAweGZmYTE5OTU3LCAweDAwMGMxNGJiLAotICAgICAgICAweDY2YzgwNDEzLCAweGZjMjlmNjcwLCAweGZiNzZhOWRkLCAweDA0ZGZmY2I2LCAweGZjZWYzNGUxLCAweDAxNTQ1YTNjLCAweGZmYTExYWNiLCAweDAwMGM2MjQ0LAotICAgICAgICAweDY2NTJiMzkyLCAweGZiOGY4N2JkLCAweGZiYzJiMmU0LCAweDA0YmY2MzY5LCAweGZjZjk4ZGJlLCAweDAxNTJjNzgzLCAweGZmYTBhYzExLCAweDAwMGNhYjVjLAotICAgICAgICAweDY1ZDk5ZGQ1LCAweGZhZjdlOTYzLCAweGZjMGU2NDYxLCAweDA0OWU5NDMzLCAweGZkMDQyNTRhLCAweDAxNTEwZjEzLCAweGZmYTA0Y2YwLCAweDAwMGNmMDEyLAotICAgICAgICAweDY1NWNjYmQzLCAweGZhNjMxZmVmLCAweGZjNTliNjg1LCAweDA0N2Q5M2E4LCAweGZkMGVmOTY5LCAweDAxNGYzMWIyLCAweGZmOWZmZDJjLCAweDAwMGQzMDc1LAotICAgICAgICAweDY0ZGM0NmMzLCAweGY5ZDEyZmFiLCAweGZjYTRhMTlmLCAweDA0NWM2NjU0LCAweGZkMWEwODAxLCAweDAxNGQzMDI5LCAweGZmOWZiYzg5LCAweDAwMGQ2Yzk3LAotICAgICAgICAweDY0NTgxODIzLCAweGY5NDIxYzlkLCAweGZjZWYxZTIwLCAweDA0M2IxMGJkLCAweGZkMjU0ZWY0LCAweDAxNGIwYjQ1LCAweGZmOWY4YWM5LCAweDAwMGRhNDg2LAotICAgICAgICAweDYzZDA0OWI0LCAweGY4YjVlYTg3LCAweGZkMzkyNDk4LCAweDA0MTk5NzYwLCAweGZkMzBjYzI0LCAweDAxNDhjM2QyLCAweGZmOWY2N2FlLCAweDAwMGRkODU0LAotICAgICAgICAweDYzNDRlNTc4LCAweGY4MmM5Y2U3LCAweGZkODJhZGJhLCAweDAzZjdmZWI0LCAweGZkM2M3ZDczLCAweDAxNDY1YTlmLCAweGZmOWY1MmY3LCAweDAwMGUwODEyLAotICAgICAgICAweDYyYjVmNWIyLCAweGY3YTYzNmZhLCAweGZkY2JiMjVhLCAweDAzZDY0YjI3LCAweGZkNDg2MGMyLCAweDAxNDNkMDdmLCAweGZmOWY0YzY1LCAweDAwMGUzM2QzLAotICAgICAgICAweDYyMjM4NGU4LCAweGY3MjJiYmI1LCAweGZlMTQyYjZlLCAweDAzYjQ4MTFkLCAweGZkNTQ3M2YzLCAweDAxNDEyNjQzLCAweGZmOWY1M2I0LCAweDAwMGU1YmE3LAotICAgICAgICAweDYxOGQ5ZGRjLCAweGY2YTIyZGNmLCAweGZlNWMxMjBmLCAweDAzOTJhNGY0LCAweGZkNjBiNGU3LCAweDAxM2U1Y2MwLCAweGZmOWY2OGExLCAweDAwMGU3ZmExLAotICAgICAgICAweDYwZjQ0YjkxLCAweGY2MjQ4ZmI2LCAweGZlYTM1Zjc5LCAweDAzNzBiYWZjLCAweGZkNmQyMTgwLCAweDAxM2I3NGNhLCAweGZmOWY4YWU5LCAweDAwMGU5ZmQ1LAotICAgICAgICAweDYwNTc5OTQ3LCAweGY1YTllMzk4LCAweGZlZWEwZDBjLCAweDAzNGVjNzdmLCAweGZkNzliN2ExLCAweDAxMzg2ZjNhLCAweGZmOWZiYTQ3LCAweDAwMGViYzU0LAotICAgICAgICAweDVmYjc5Mjc4LCAweGY1MzIyYjYxLCAweGZmMzAxNDRhLCAweDAzMmNjZWJiLCAweGZkODY3NTJlLCAweDAxMzU0Y2U3LCAweGZmOWZmNjc0LCAweDAwMGVkNTMzLAotICAgICAgICAweDVmMTQ0MmRjLCAweGY0YmQ2OGI2LCAweGZmNzU2ZWRjLCAweDAzMGFkNGUxLCAweGZkOTM1ODBkLCAweDAxMzIwZWE5LCAweGZmYTAzZjJiLCAweDAwMGVlYTg0LAotICAgICAgICAweDVlNmRiNjY1LCAweGY0NGI5Y2ZlLCAweGZmYmExNjhkLCAweDAyZThkZTE5LCAweGZkYTA1ZTIzLCAweDAxMmViNTVhLCAweGZmYTA5NDI1LCAweDAwMGVmYzVjLAotICAgICAgICAweDVkYzNmOTNjLCAweGYzZGNjOTU5LCAweGZmZmUwNTRlLCAweDAyYzZlZTdmLCAweGZkYWQ4NTViLCAweDAxMmI0MWQzLCAweGZmYTBmNTE5LCAweDAwMGYwYWNlLAotICAgICAgICAweDVkMTcxN2M0LCAweGYzNzBlZWE5LCAweDAwNDEzNTM2LCAweDAyYTUwYTIyLCAweGZkYmFjYjllLCAweDAxMjdiNGYxLCAweGZmYTE2MWJmLCAweDAwMGYxNWVmLAotICAgICAgICAweDVjNjcxZTk2LCAweGYzMDgwZDhjLCAweDAwODNhMDgxLCAweDAyODMzNTA2LCAweGZkYzgyZWRiLCAweDAxMjQwZjhlLCAweGZmYTFkOWNmLCAweDAwMGYxZGQyLAotICAgICAgICAweDViYjQxYTgwLCAweGYyYTIyNjVlLCAweDAwYzU0MTkwLCAweDAyNjE3MzIxLCAweGZkZDVhZDAxLCAweDAxMjA1Mjg1LCAweGZmYTI1Y2ZlLCAweDAwMGYyMjhkLAotICAgICAgICAweDVhZmUxODg2LCAweGYyM2YzOTNiLCAweDAxMDYxMmViLCAweDAyM2ZjODVjLCAweGZkZTM0NDAzLCAweDAxMWM3ZWIyLCAweGZmYTJlYjA0LCAweDAwMGYyNDM0LAotICAgICAgICAweDVhNDUyNWRmLCAweGYxZGY0NWZkLCAweDAxNDYwZjQxLCAweDAyMWUzODkxLCAweGZkZjBmMWQ2LCAweDAxMTg5NGYwLCAweGZmYTM4Mzk1LCAweDAwMGYyMmRjLAotICAgICAgICAweDU5ODk0ZmYzLCAweGYxODI0YzNlLCAweDAxODUzMTY1LCAweDAxZmNjNzhmLCAweGZkZmViNDc1LCAweDAxMTQ5NjFiLCAweGZmYTQyNjY4LCAweDAwMGYxZTk5LAotICAgICAgICAweDU4Y2FhNDViLCAweGYxMjg0YjU4LCAweDAxYzM3NDUyLCAweDAxZGI3OTE0LCAweGZlMGM4OWRiLCAweDAxMTA4MzBmLCAweGZmYTRkMzMyLCAweDAwMGYxNzgxLAotICAgICAgICAweDU4MDkzMGUxLCAweGYwZDE0MjY3LCAweDAyMDBkMzJjLCAweDAxYmE1MGQyLCAweGZlMWE3MDA5LCAweDAxMGM1Y2E2LCAweGZmYTU4OWE2LCAweDAwMGYwZGE4LAotICAgICAgICAweDU3NDUwMzdjLCAweGYwN2QzMDQzLCAweDAyM2Q0OTNjLCAweDAxOTk1MjZiLCAweGZlMjg2NTA1LCAweDAxMDgyM2JhLCAweGZmYTY0OTdjLCAweDAwMGYwMTI1LAotICAgICAgICAweDU2N2UyYTUxLCAweGYwMmMxMzhhLCAweDAyNzhkMWYyLCAweDAxNzg4MTcwLCAweGZlMzY2NmQ1LCAweDAxMDNkOTI3LCAweGZmYTcxMjY2LCAweDAwMGVmMjBiLAotICAgICAgICAweDU1YjRiM2FmLCAweGVmZGRlYTlhLCAweDAyYjM2OGU2LCAweDAxNTdlMTY2LCAweGZlNDQ3Mzg5LCAweDAwZmY3ZGM0LCAweGZmYTdlNDFhLCAweDAwMGVlMDcwLAotICAgICAgICAweDU0ZThhZTEzLCAweGVmOTJiMzkzLCAweDAyZWQwOWQ3LCAweDAxMzc3NWJmLCAweGZlNTI4OTMxLCAweDAwZmIxMjZiLCAweGZmYThiZTRjLCAweDAwMGVjYzY5LAotICAgICAgICAweDU0MWEyODFlLCAweGVmNGE2YzU4LCAweDAzMjViMGFkLCAweDAxMTc0MWRmLCAweGZlNjBhNWU1LCAweDAwZjY5N2YzLCAweGZmYTlhMGIxLCAweDAwMGViNjBiLAotICAgICAgICAweDUzNDkzMDllLCAweGVmMDUxMjkwLCAweDAzNWQ1OTc3LCAweDAwZjc0OTFhLCAweGZlNmVjN2MwLCAweDAwZjIwZjMyLCAweGZmYWE4YWZlLCAweDAwMGU5ZDZiLAotICAgICAgICAweDUyNzVkNjg0LCAweGVlYzJhM2EzLCAweDAzOTQwMDZhLCAweDAwZDc4ZWIzLCAweGZlN2NlY2UyLCAweDAwZWQ3OGZmLCAweGZmYWI3Y2U3LCAweDAwMGU4MjllLAotICAgICAgICAweDUxYTAyOGU4LCAweGVlODMxY2MzLCAweDAzYzlhMWU1LCAweDAwYjgxNWRhLCAweGZlOGIxMzczLCAweDAwZThkNjJkLCAweGZmYWM3NjIxLCAweDAwMGU2NWJhLAotICAgICAgICAweDUwYzgzNzA0LCAweGVlNDY3YWUxLCAweDAzZmUzYTZmLCAweDAwOThlMWIzLCAweGZlOTkzOTlmLCAweDAwZTQyNzhmLCAweGZmYWQ3NjYyLCAweDAwMGU0NmQzLAotICAgICAgICAweDRmZWUxMDM3LCAweGVlMGNiYWI5LCAweDA0MzFjNmI1LCAweDAwNzlmNTRjLCAweGZlYTc1ZDk3LCAweDAwZGY2ZGY3LCAweGZmYWU3ZDVmLCAweDAwMGUyNWZkLAotICAgICAgICAweDRmMTFjM2ZlLCAweGVkZDVkOGNhLCAweDA0NjQ0MzhjLCAweDAwNWI1M2E0LCAweGZlYjU3ZDkyLCAweDAwZGFhYTM0LCAweGZmYWY4YWNkLCAweDAwMGUwMzRmLAotICAgICAgICAweDRlMzM2MWY3LCAweGVkYTFkMTVjLCAweDA0OTVhZGYyLCAweDAwM2NmZmE5LCAweGZlYzM5N2NmLCAweDAwZDVkZDE2LCAweGZmYjA5ZTYzLCAweDAwMGRkZWRiLAotICAgICAgICAweDRkNTJmOWRmLCAweGVkNzBhMDdkLCAweDA0YzYwMzBkLCAweDAwMWVmYzM1LCAweGZlZDFhYTkyLCAweDAwZDEwNzY5LCAweGZmYjFiN2Q4LCAweDAwMGRiOGI3LAotICAgICAgICAweDRjNzA5YjhlLCAweGVkNDI0MjA1LCAweDA0ZjU0MDI5LCAweDAwMDE0YzEyLCAweGZlZGZiNDI1LCAweDAwY2MyOWY3LCAweGZmYjJkNmUxLCAweDAwMGQ5MGY2LAotICAgICAgICAweDRiOGM1NmY4LCAweGVkMTZiMTk2LCAweDA1MjM2MmJhLCAweGZmZTNmMWY3LCAweGZlZWRiMmRhLCAweDAwYzc0NThhLCAweGZmYjNmYjM3LCAweDAwMGQ2N2FlLAotICAgICAgICAweDRhYTYzYzJjLCAweGVjZWRlYTk5LCAweDA1NTA2ODVkLCAweGZmYzZmMDhhLCAweGZlZmJhNTA4LCAweDAwYzI1YWU4LCAweGZmYjUyNDkwLCAweDAwMGQzY2YxLAotICAgICAgICAweDQ5YmU1YjUwLCAweGVjYzdlODQ1LCAweDA1N2M0ZWQ0LCAweGZmYWE0YTVkLCAweGZmMDk4OTBmLCAweDAwYmQ2YWQ3LCAweGZmYjY1MmE3LCAweDAwMGQxMGQ1LAotICAgICAgICAweDQ4ZDRjNGEyLCAweGVjYTRhNTliLCAweDA1YTcxNDBiLCAweGZmOGUwMWYxLCAweGZmMTc1ZDUzLCAweDAwYjg3NjE5LCAweGZmYjc4NTMzLCAweDAwMGNlMzZiLAotICAgICAgICAweDQ3ZTk4ODc0LCAweGVjODQxZDY4LCAweDA1ZDBiNjEyLCAweGZmNzIxOWIzLCAweGZmMjUyMDQyLCAweDAwYjM3ZDcwLCAweGZmYjhiYmVkLCAweDAwMGNiNGM4LAotICAgICAgICAweDQ2ZmNiNzJkLCAweGVjNjY0YTQ4LCAweDA1ZjkzMzI0LCAweGZmNTY5M2ZlLCAweGZmMzJkMDRmLCAweDAwYWU4MTk4LCAweGZmYjlmNjkxLCAweDAwMGM4NGZmLAotICAgICAgICAweDQ2MGU2MTQ4LCAweGVjNGIyNmEyLCAweDA2MjA4OTllLCAweGZmM2I3MzFiLCAweGZmNDA2YmY4LCAweDAwYTk4MzRlLCAweGZmYmIzNGQ4LCAweDAwMGM1NDIyLAotICAgICAgICAweDQ1MWU5NzUwLCAweGVjMzJhY2IwLCAweDA2NDZiODA4LCAweGZmMjBiOTNlLCAweGZmNGRmMWJlLCAweDAwYTQ4MzRjLCAweGZmYmM3NjdmLCAweDAwMGMyMjQ1LAotICAgICAgICAweDQ0MmQ2OWRlLCAweGVjMWNkNjc3LCAweDA2NmJiZDBkLCAweGZmMDY2ODg5LCAweGZmNWI2MDJjLCAweDAwOWY4MjQ5LCAweGZmYmRiYjQyLCAweDAwMGJlZjc5LAotICAgICAgICAweDQzM2FlOTljLCAweGVjMDk5ZGNmLCAweDA2OGY5NzgxLCAweGZlZWM4MzBkLCAweGZmNjhiNWQ1LCAweDAwOWE4MGY4LCAweGZmYmYwMmRkLCAweDAwMGJiYmQyLAotICAgICAgICAweDQyNDcyNzNmLCAweGViZjhmYzY0LCAweDA2YjI0NjViLCAweGZlZDMwYWM1LCAweGZmNzVmMTUzLCAweDAwOTU4MDBjLCAweGZmYzA0ZDBmLCAweDAwMGI4NzYwLAotICAgICAgICAweDQxNTIzMzg5LCAweGViZWFlYmFmLCAweDA2ZDNjOGJiLCAweGZlYmEwMTk5LCAweGZmODMxMTQ4LCAweDAwOTA4MDM0LCAweGZmYzE5OTk2LCAweDAwMGI1MjM1LAotICAgICAgICAweDQwNWMxZjQzLCAweGViZGY2NTAwLCAweDA2ZjQxZGUzLCAweGZlYTE2OTYwLCAweGZmOTAxNDVlLCAweDAwOGI4MjFiLCAweGZmYzJlODMyLCAweDAwMGIxYzY0LAotICAgICAgICAweDNmNjRmYjQwLCAweGViZDY2MTdiLCAweDA3MTM0NTNkLCAweGZlODk0M2RjLCAweGZmOWNmOTQ3LCAweDAwODY4NjZiLCAweGZmYzQzOGEzLCAweDAwMGFlNWZjLAotICAgICAgICAweDNlNmNkODViLCAweGViY2ZkYTE5LCAweDA3MzEzZTU2LCAweGZlNzE5MmJkLCAweGZmYTliZWJlLCAweDAwODE4ZGNiLCAweGZmYzU4YWFhLCAweDAwMGFhZjBmLAotICAgICAgICAweDNkNzNjNzcyLCAweGViY2JjN2E3LCAweDA3NGUwOGUwLCAweGZlNWE1NzlkLCAweGZmYjY2Mzg2LCAweDAwN2M5OGRlLCAweGZmYzZkZTA5LCAweDAwMGE3N2FjLAotICAgICAgICAweDNjNzlkOTY4LCAweGViY2EyMmNjLCAweDA3NjlhNGIyLCAweGZlNDM5NDA3LCAweGZmYzJlNjY5LCAweDAwNzdhODQ1LCAweGZmYzgzMjg1LCAweDAwMGEzZmU1LAotICAgICAgICAweDNiN2YxZjIzLCAweGViY2FlNDA1LCAweDA3ODQxMWM3LCAweGZlMmQ0OTZmLCAweGZmY2Y0NjNhLCAweDAwNzJiYzlkLCAweGZmYzk4N2UwLCAweDAwMGEwN2M5LAotICAgICAgICAweDNhODNhOTg5LCAweGViY2UwM2FhLCAweDA3OWQ1MDNiLCAweGZlMTc3OTM3LCAweGZmZGI4MWQ2LCAweDAwNmRkNjgwLCAweGZmY2FkZGUxLCAweDAwMDljZjY3LAotICAgICAgICAweDM5ODc4OTdmLCAweGViZDM3OWViLCAweDA3YjU2MDUxLCAweGZlMDIyNGIwLCAweGZmZTc5ODIwLCAweDAwNjhmNjg3LCAweGZmY2MzNDRjLCAweDAwMDk5NmNlLAotICAgICAgICAweDM4OGFjZmU5LCAweGViZGIzZWQ1LCAweDA3Y2M0MjZjLCAweGZkZWQ0ZDEzLCAweGZmZjM4ODA2LCAweDAwNjQxZDQ0LCAweGZmY2Q4YWViLCAweDAwMDk1ZTBlLAotICAgICAgICAweDM3OGQ4ZGE4LCAweGViZTU0YTRmLCAweDA3ZTFmNzEyLCAweGZkZDhmMzhiLCAweGZmZmY1MDdiLCAweDAwNWY0YjRhLCAweGZmY2VlMTgzLCAweDAwMDkyNTM1LAotICAgICAgICAweDM2OGZkMzk3LCAweGViZjE5NDFmLCAweDA3ZjY3ZWVjLCAweGZkYzUxOTJkLCAweDAwMGFmMDdmLCAweDAwNWE4MTI1LCAweGZmZDAzN2UwLCAweDAwMDhlYzUwLAotICAgICAgICAweDM1OTFiMjhiLCAweGVjMDAxM2U4LCAweDA4MDlkYWMzLCAweGZkYjFiZWZjLCAweDAwMTY2NzE4LCAweDAwNTViZjYwLCAweGZmZDE4ZGNjLCAweDAwMDhiMzZlLAotICAgICAgICAweDM0OTMzYjUwLCAweGVjMTBjMTJjLCAweDA4MWMwYjg0LCAweGZkOWVlNWU3LCAweDAwMjFiMzU1LCAweDAwNTEwNjgyLCAweGZmZDJlMzExLCAweDAwMDg3YTljLAotICAgICAgICAweDMzOTQ3ZWFiLCAweGVjMjM5MzRmLCAweDA4MmQxMjM5LCAweGZkOGM4ZWNjLCAweDAwMmNkNDRkLCAweDAwNGM1NzBmLCAweGZmZDQzNzdkLCAweDAwMDg0MWU4LAotICAgICAgICAweDMyOTU4ZDU1LCAweGVjMzg4MTk0LCAweDA4M2NmMDEwLCAweGZkN2FiYTc0LCAweDAwMzdjOTIyLCAweDAwNDdiMTg2LCAweGZmZDU4YWRlLCAweDAwMDgwOTVkLAotICAgICAgICAweDMxOTY3N2ZhLCAweGVjNGY4MzIyLCAweDA4NGJhNjU0LCAweGZkNjk2OTk4LCAweDAwNDI5MGZjLCAweDAwNDMxNjY2LCAweGZmZDZkZDAyLCAweDAwMDdkMTA4LAotICAgICAgICAweDMwOTc0ZjNiLCAweGVjNjg4ZjAyLCAweDA4NTkzNjcxLCAweGZkNTg5Y2RjLCAweDAwNGQyYjBlLCAweDAwM2U4NjI4LCAweGZmZDgyZGJhLCAweDAwMDc5OGY1LAotICAgICAgICAweDJmOTgyM2E4LCAweGVjODM5YzIyLCAweDA4NjVhMWYxLCAweGZkNDg1NGQzLCAweDAwNTc5NjkxLCAweDAwM2EwMTQxLCAweGZmZDk3Y2Q2LCAweDAwMDc2MTMwLAotICAgICAgICAweDJlOTkwNWMxLCAweGVjYTBhMTU2LCAweDA4NzBlYTdlLCAweGZkMzg5MWZkLCAweDAwNjFkMmNhLCAweDAwMzU4ODI0LCAweGZmZGFjYTJhLCAweDAwMDcyOWM0LAotICAgICAgICAweDJkOWEwNWY0LCAweGVjYmY5NTU4LCAweDA4N2IxMWRlLCAweGZkMjk1NGM4LCAweDAwNmJkZjA1LCAweDAwMzExYjQxLCAweGZmZGMxNTg4LCAweDAwMDZmMmJiLAotICAgICAgICAweDJjOWIzNDllLCAweGVjZTA2ZWNiLCAweDA4ODQxOWY2LCAweGZkMWE5ZDkxLCAweDAwNzViYTk1LCAweDAwMmNiYjAzLCAweGZmZGQ1ZWM2LCAweDAwMDZiYzIxLAotICAgICAgICAweDJiOWNhMjAzLCAweGVkMDMyNDM5LCAweDA4OGMwNGM4LCAweGZkMGM2Y2EyLCAweDAwN2Y2NGRhLCAweDAwMjg2N2QyLCAweGZmZGVhNWJiLCAweDAwMDY4NWZmLAotICAgICAgICAweDJhOWU1ZTU3LCAweGVkMjdhYzE2LCAweDA4OTJkNDcwLCAweGZjZmVjMjMzLCAweDAwODhkZDM4LCAweDAwMjQyMjEzLCAweGZmZGZlYTNjLCAweDAwMDY1MDVmLAotICAgICAgICAweDI5YTA3OWIyLCAweGVkNGRmY2MyLCAweDA4OTg4YjJhLCAweGZjZjE5ZTZiLCAweDAwOTIyMzFlLCAweDAwMWZlYTI3LCAweGZmZTEyYzIyLCAweDAwMDYxYjRiLAotICAgICAgICAweDI4YTMwNDE2LCAweGVkNzYwYzg4LCAweDA4OWQyYjRhLCAweGZjZTUwMTYxLCAweDAwOWIzNjA1LCAweDAwMWJjMDZiLCAweGZmZTI2YjQ4LCAweDAwMDVlNmNiLAotICAgICAgICAweDI3YTYwZDZhLCAweGVkOWZkMWEyLCAweDA4YTBiNzQwLCAweGZjZDhlYjE3LCAweDAwYTQxNTZiLCAweDAwMTdhNTNiLCAweGZmZTNhNzg4LCAweDAwMDViMmU4LAotICAgICAgICAweDI2YTlhNTdiLCAweGVkY2I0MjM3LCAweDA4YTMzMTk2LCAweGZjY2Q1YjgyLCAweDAwYWNjMGRhLCAweDAwMTM5OGVjLCAweGZmZTRlMGJmLCAweDAwMDU3ZmFhLAotICAgICAgICAweDI1YWRkYmY5LCAweGVkZjg1NDViLCAweDA4YTQ5Y2YwLCAweGZjYzI1Mjg1LCAweDAwYjUzN2UxLCAweDAwMGY5YmQyLCAweGZmZTYxNmM4LCAweDAwMDU0ZDFhLAotICAgICAgICAweDI0YjJjMDc1LCAweGVlMjZmZTE3LCAweDA4YTRmYzBkLCAweGZjYjdjZmYwLCAweDAwYmQ3YTFjLCAweDAwMGJhZTNjLCAweGZmZTc0OTg0LCAweDAwMDUxYjNlLAotICAgICAgICAweDIzYjg2MjYzLCAweGVlNTczNTYyLCAweDA4YTQ1MWMwLCAweGZjYWRkMzg2LCAweDAwYzU4NzJhLCAweDAwMDdkMDc1LCAweGZmZTg3OGQzLCAweDAwMDRlYTFkLAotICAgICAgICAweDIyYmVkMTE2LCAweGVlODhmMDI2LCAweDA4YTJhMGY4LCAweGZjYTQ1Y2Y3LCAweDAwY2Q1ZWI3LCAweDAwMDQwMmM4LCAweGZmZTlhNDk0LCAweDAwMDRiOWMwLAotICAgICAgICAweDIxYzYxYmMwLCAweGVlYmMyNDQ0LCAweDA4OWZlY2JiLCAweGZjOWI2YmU1LCAweDAwZDUwMDc1LCAweDAwMDA0NTc5LCAweGZmZWFjY2FhLCAweDAwMDQ4YTJiLAotICAgICAgICAweDIwY2U1MTZmLCAweGVlZjBjNzhkLCAweDA4OWMzODI0LCAweGZjOTJmZmUxLCAweDAwZGM2YzFlLCAweGZmZmM5OGM5LCAweGZmZWJmMGZhLCAweDAwMDQ1YjY1LAotICAgICAgICAweDFmZDc4MTBmLCAweGVmMjZjZmNhLCAweDA4OTc4NjY2LCAweGZjOGIxODZkLCAweDAwZTNhMTc1LCAweGZmZjhmY2Y3LCAweGZmZWQxMTY2LCAweDAwMDQyZDc0LAotICAgICAgICAweDFlZTFiOTY1LCAweGVmNWUzMmJkLCAweDA4OTFkYWM4LCAweGZjODNiNGZjLCAweDAwZWFhMDQ1LCAweGZmZjU3MjNkLCAweGZmZWUyZGQ3LCAweDAwMDQwMDVlLAotICAgICAgICAweDFkZWQwOTExLCAweGVmOTZlNjFjLCAweDA4OGIzOGE5LCAweGZjN2NkNGYwLCAweDAwZjE2ODYxLCAweGZmZjFmOGQyLCAweGZmZWY0NjMyLCAweDAwMDNkNDI2LAotICAgICAgICAweDFjZjk3ZThiLCAweGVmZDBkZjlhLCAweDA4ODNhMzc4LCAweGZjNzY3NzllLCAweDAwZjdmOWEzLCAweGZmZWU5MGViLCAweGZmZjA1YTYwLCAweDAwMDNhOGQyLAotICAgICAgICAweDFjMDcyODIzLCAweGYwMGMxNGUxLCAweDA4N2IxZWJjLCAweGZjNzA5YzRkLCAweDAwZmU1M2VmLCAweGZmZWIzYWI4LCAweGZmZjE2YTRhLCAweDAwMDM3ZTY1LAotICAgICAgICAweDFiMTYxM2ZmLCAweGYwNDg3Yjk4LCAweDA4NzFhZTBkLCAweGZjNmI0MjMzLCAweDAxMDQ3NzJlLCAweGZmZTdmNjY2LCAweGZmZjI3NWRiLCAweDAwMDM1NGU1LAotICAgICAgICAweDFhMjY1MDFiLCAweGYwODYwOTYyLCAweDA4Njc1NTE2LCAweGZjNjY2ODdhLCAweDAxMGE2MzUzLCAweGZmZTRjNDFlLCAweGZmZjM3ZDAwLCAweDAwMDMyYzU0LAotICAgICAgICAweDE5MzdlYTQ3LCAweGYwYzRiM2UwLCAweDA4NWMxNzk0LCAweGZjNjIwZTNkLCAweDAxMTAxODU4LCAweGZmZTFhNDA4LCAweGZmZjQ3ZmE1LCAweDAwMDMwNGI3LAotICAgICAgICAweDE4NGFmMDI1LCAweGYxMDQ3MGIwLCAweDA4NGZmOTU3LCAweGZjNWUzMjhjLCAweDAxMTU5NjNkLCAweGZmZGU5NjQ2LCAweGZmZjU3ZGI4LCAweDAwMDJkZTBlLAotICAgICAgICAweDE3NWY2ZjJiLCAweGYxNDUzNTcxLCAweDA4NDJmZTNkLCAweGZjNWFkNDY1LCAweDAxMWFkZDBiLCAweGZmZGI5YWY4LCAweGZmZjY3NzI5LCAweDAwMDJiODVmLAotICAgICAgICAweDE2NzU3NDllLCAweGYxODZmN2MwLCAweDA4MzUyYTM1LCAweGZjNTdmMmJlLCAweDAxMWZlY2QzLCAweGZmZDhiMjNiLCAweGZmZjc2YmU5LCAweDAwMDI5M2FhLAotICAgICAgICAweDE1OGQwZDk1LCAweGYxYzlhZDQwLCAweDA4MjY4MTNlLCAweGZjNTU4YzdjLCAweDAxMjRjNWFiLCAweGZmZDVkYzI4LCAweGZmZjg1YmU4LCAweDAwMDI2ZmYyLAotICAgICAgICAweDE0YTY0NmY2LCAweGYyMGQ0YjkyLCAweDA4MTcwNzY3LCAweGZjNTNhMDdiLCAweDAxMjk2N2IxLCAweGZmZDMxOGQ2LCAweGZmZjk0NzFiLCAweDAwMDI0ZDM5LAotICAgICAgICAweDEzYzEyZDczLCAweGYyNTFjODVkLCAweDA4MDZjMGNiLCAweGZjNTIyZDg4LCAweDAxMmRkMzBhLCAweGZmZDA2ODU4LCAweGZmZmEyZDc0LCAweDAwMDIyYjdmLAotICAgICAgICAweDEyZGRjZDhmLCAweGYyOTcxOTRkLCAweDA3ZjViMTkzLCAweGZjNTEzMjY2LCAweDAxMzIwN2U0LCAweGZmY2RjYWJlLCAweGZmZmIwZWU5LCAweDAwMDIwYWM3LAotICAgICAgICAweDExZmMzMzk1LCAweGYyZGQzNDExLCAweDA3ZTNkZGY3LCAweGZjNTBhZGNjLCAweDAxMzYwNjcwLCAweGZmY2I0MDE0LCAweGZmZmJlYjcwLCAweDAwMDFlYjEwLAotICAgICAgICAweDExMWM2YmEwLCAweGYzMjQwZTYxLCAweDA3ZDE0YTM4LCAweGZjNTA5ZTY0LCAweDAxMzljZWU5LCAweGZmYzhjODY2LCAweGZmZmNjMzAwLCAweDAwMDFjYzVjLAorI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyU2luY1VwLmgiCiB9OwogCiAvKgpAQCAtMTk3LDEzNSArNjksNyBAQAogICogY21kLWxpbmU6IGZpciAtbCA3IC1zIDQ4MDAwIC1jIDE3MTg5CiAgKi8KIGNvbnN0IHVpbnQzMl90IEF1ZGlvUmVzYW1wbGVyU2luYzo6bUZpckNvZWZzRG93bltdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgzMikpKSA9IHsKLSAgICAgICAgMHg1YmFjYjZmNCwgMHgxZGVkMWExZCwgMHhmMDM5OGQ1NiwgMHgwMzk0ZjY3NCwgMHgwMTkzYTVmOSwgMHhmZTY2ZGJlYiwgMHgwMDc5MTA0MywgMHhmZmZlNjYzMSwKLSAgICAgICAgMHg1YmFiNmM4MSwgMHgxZDNkZGNjZCwgMHhmMDQyMWQyYywgMHgwM2FmOTk5NSwgMHgwMTgxOGRjOSwgMHhmZTZiYjYzZSwgMHgwMDc5ODEyYSwgMHhmZmZkYzM3ZCwKLSAgICAgICAgMHg1YmE3OGQzNywgMHgxYzhmMmNmOSwgMHhmMDRiZWIxZCwgMHgwM2M5YTA0YSwgMHgwMTZmOGFjYSwgMHhmZTcwYTUxMSwgMHgwMDc5ZTM0ZCwgMHhmZmZkMjU0NSwKLSAgICAgICAgMHg1YmExMTk0ZiwgMHgxYmUxMTIzMSwgMHhmMDU2ZjJjNywgMHgwM2UzMDlmZSwgMHgwMTVkOWU2NCwgMHhmZTc1YTc5ZiwgMHgwMDdhMzZlMiwgMHhmZmZjOGI4NiwKLSAgICAgICAgMHg1Yjk4MTEyMiwgMHgxYjMzOTNmOCwgMHhmMDYzMmZiNywgMHgwM2ZiZDYyNSwgMHgwMTRiYzlmYSwgMHhmZTdhYmQyMywgMHgwMDdhN2MyMCwgMHhmZmZiZjYzOSwKLSAgICAgICAgMHg1YjhjNzUzMCwgMHgxYTg2YjliZiwgMHhmMDcwOWQ3NCwgMHgwNDE0MDQ0OSwgMHgwMTNhMGVlOSwgMHhmZTdmZTRkYiwgMHgwMDdhYjMzZCwgMHhmZmZiNjU1YiwKLSAgICAgICAgMHg1YjdlNDYxYSwgMHgxOWRhOGFlNSwgMHhmMDdmMzc3NiwgMHgwNDJiOTNmZCwgMHgwMTI4NmU4NiwgMHhmZTg1MWUwNSwgMHgwMDdhZGM3MiwgMHhmZmZhZDhlNCwKLSAgICAgICAgMHg1YjZkODRhOCwgMHgxOTJmMGViNywgMHhmMDhlZjkyZCwgMHgwNDQyODRlNiwgMHgwMTE2ZWEyMiwgMHhmZThhNjdkZCwgMHgwMDdhZjdmNiwgMHhmZmZhNTBjZSwKLSAgICAgICAgMHg1YjVhMzFjNiwgMHgxODg0NGM3MCwgMHhmMDlmZGRmZSwgMHgwNDU4ZDZiNywgMHgwMTA1ODMwNiwgMHhmZThmYzFhNSwgMHgwMDdiMDYwMywgMHhmZmY5Y2QxMiwKLSAgICAgICAgMHg1YjQ0NGU4MSwgMHgxN2RhNGIzNywgMHhmMGIxZTE0MywgMHgwNDZlODkzMywgMHgwMGY0M2E3NCwgMHhmZTk1MmE5YiwgMHgwMDdiMDZkNCwgMHhmZmY5NGRhOSwKLSAgICAgICAgMHg1YjJiZGMwZSwgMHgxNzMxMTIyMiwgMHhmMGM0ZmU1MCwgMHgwNDgzOWMyOSwgMHgwMGUzMTFhOSwgMHhmZTlhYTIwMSwgMHgwMDdhZmFhMSwgMHhmZmY4ZDI4YywKLSAgICAgICAgMHg1YjEwZGJjMiwgMHgxNjg4YTgzMiwgMHhmMGQ5MzA2ZCwgMHgwNDk4MGY3OSwgMHgwMGQyMDlkYiwgMHhmZWEwMjcxOSwgMHgwMDdhZTFhNywgMHhmZmY4NWJiMSwKLSAgICAgICAgMHg1YWYzNGYxOCwgMHgxNWUxMTQ1MywgMHhmMGVlNzJkYiwgMHgwNGFiZTMxMCwgMHgwMGMxMjQzOSwgMHhmZWE1YjkyNiwgMHgwMDdhYmMyMCwgMHhmZmY3ZTkxMCwKLSAgICAgICAgMHg1YWQzMzdhZiwgMHgxNTNhNWQ1ZSwgMHhmMTA0YzBkMiwgMHgwNGJmMTZlOSwgMHgwMGIwNjFlYiwgMHhmZWFiNTc2ZCwgMHgwMDdhOGE0OSwgMHhmZmY3N2E5ZiwKLSAgICAgICAgMHg1YWIwOTc0OCwgMHgxNDk0OGExNiwgMHhmMTFjMTU4MywgMHgwNGQxYWIwZCwgMHgwMDlmYzQxMywgMHhmZWIxMDEzNCwgMHgwMDdhNGM1ZCwgMHhmZmY3MTA1NywKLSAgICAgICAgMHg1YThiNmZjNywgMHgxM2VmYTEyYywgMHhmMTM0NmMxNywgMHgwNGUzOWY5MywgMHgwMDhmNGJjYiwgMHhmZWI2YjVjMCwgMHgwMDdhMDI5YSwgMHhmZmY2YWEyYiwKLSAgICAgICAgMHg1YTYzYzMzNiwgMHgxMzRiYTkzNywgMHhmMTRkYmZiMSwgMHgwNGY0ZjRhMiwgMHgwMDdlZmEyOSwgMHhmZWJjNzQ1YywgMHgwMDc5YWQzZCwgMHhmZmY2NDgxMiwKLSAgICAgICAgMHg1YTM5OTNjMCwgMHgxMmE4YThiYiwgMHhmMTY4MGI2ZSwgMHgwNTA1YWE2YSwgMHgwMDZlZDAzOCwgMHhmZWMyM2M1MCwgMHgwMDc5NGM4MiwgMHhmZmY1ZWEwMiwKLSAgICAgICAgMHg1YTBjZTNiMiwgMHgxMjA2YTYyNSwgMHhmMTgzNGE2MywgMHgwNTE1YzEyZCwgMHgwMDVlY2YwMSwgMHhmZWM4MGNlOCwgMHgwMDc4ZTBhOSwgMHhmZmY1OGZmMCwKLSAgICAgICAgMHg1OWRkYjU3ZiwgMHgxMTY1YTdjYywgMHhmMTlmNzdhMCwgMHgwNTI1MzkzOCwgMHgwMDRlZjc4MiwgMHhmZWNkZTU3MSwgMHgwMDc4NjllZSwgMHhmZmY1MzljZiwKLSAgICAgICAgMHg1OWFjMGJiYSwgMHgxMGM1YjNlZiwgMHhmMWJjOGUzMSwgMHgwNTM0MTJlNCwgMHgwMDNmNGFiNCwgMHhmZWQzYzUzOCwgMHgwMDc3ZTg5MSwgMHhmZmY0ZTc5NCwKLSAgICAgICAgMHg1OTc3ZTkxOSwgMHgxMDI2ZDBiOCwgMHhmMWRhODkxYiwgMHgwNTQyNGU5YiwgMHgwMDJmYzk4YSwgMHhmZWQ5YWI4ZiwgMHgwMDc3NWNjZiwgMHhmZmY0OTkzNCwKLSAgICAgICAgMHg1OTQxNTA3NSwgMHgwZjg5MDQzNywgMHhmMWY5NjM2MCwgMHgwNTRmZWNjZiwgMHgwMDIwNzRlZCwgMHhmZWRmOTdjNiwgMHgwMDc2YzZlOCwgMHhmZmY0NGVhMywKLSAgICAgICAgMHg1OTA4NDRjOSwgMHgwZWVjNTQ2NSwgMHhmMjE5MTdmZiwgMHgwNTVjZWUwMywgMHgwMDExNGRjMywgMHhmZWU1ODkzMiwgMHgwMDc2MjcxOSwgMHhmZmY0MDdkMiwKLSAgICAgICAgMHg1OGNjYzkzMCwgMHgwZTUwYzcyMywgMHhmMjM5YTFlZiwgMHgwNTY5NTJjMywgMHgwMDAyNTRlOCwgMHhmZWViN2YyNywgMHgwMDc1N2RhMywgMHhmZmYzYzRiNywKLSAgICAgICAgMHg1ODhlZTBlYSwgMHgwZGI2NjIzYiwgMHhmMjVhZmMyOSwgMHgwNTc1MWJhYSwgMHhmZmYzOGIzMiwgMHhmZWYxNzhmYywgMHgwMDc0Y2FjNCwgMHhmZmYzODU0MiwKLSAgICAgICAgMHg1ODRlOGY1NiwgMHgwZDFkMmI1ZCwgMHhmMjdkMjE5ZiwgMHgwNTgwNDk1YywgMHhmZmU0ZjE3MSwgMHhmZWY3NzYwYywgMHgwMDc0MGViYiwgMHhmZmYzNDk2OCwKLSAgICAgICAgMHg1ODBiZDdmNCwgMHgwYzg1MjgxZiwgMHhmMmEwMGQ0MywgMHgwNThhZGM4ZCwgMHhmZmQ2ODg2ZCwgMHhmZWZkNzVhZiwgMHgwMDczNDljNywgMHhmZmYzMTExYiwKLSAgICAgICAgMHg1N2M2YmU2NywgMHgwYmVlNWRmZiwgMHhmMmMzYmEwNCwgMHgwNTk0ZDVmYSwgMHhmZmM4NTBlNiwgMHhmZjAzNzc0NCwgMHgwMDcyN2MyNywgMHhmZmYyZGM0YywKLSAgICAgICAgMHg1NzdmNDY3MCwgMHgwYjU4ZDI2MiwgMHhmMmU4MjJjZSwgMHgwNTllMzY2YywgMHhmZmJhNGI5OCwgMHhmZjA5N2EyOSwgMHgwMDcxYTYxYiwgMHhmZmYyYWFlZiwKLSAgICAgICAgMHg1NzM1NzNmMiwgMHgwYWM0OGE5MiwgMHhmMzBkNDI4ZSwgMHgwNWE2ZmViOSwgMHhmZmFjNzkzNiwgMHhmZjBmN2RiZiwgMHgwMDcwYzdlMSwgMHhmZmYyN2NmMywKLSAgICAgICAgMHg1NmU5NGFmMSwgMHgwYTMxOGJjMSwgMHhmMzMzMTQyZiwgMHgwNWFmMmZiZiwgMHhmZjllZGE2ZCwgMHhmZjE1ODE2YSwgMHgwMDZmZTFiOCwgMHhmZmYyNTI0YywKLSAgICAgICAgMHg1NjlhY2Y5MCwgMHgwOTlmZGIwNCwgMHhmMzU5OTI5YSwgMHgwNWI2Y2E2YiwgMHhmZjkxNmZlMSwgMHhmZjFiODQ4ZSwgMHgwMDZlZjNkZiwgMHhmZmYyMmFlYSwKLSAgICAgICAgMHg1NjRhMDYxMCwgMHgwOTBmN2Q1NywgMHhmMzgwYjhiYSwgMHgwNWJkY2ZiMiwgMHhmZjg0M2EzMiwgMHhmZjIxODY5MiwgMHgwMDZkZmU5NCwgMHhmZmYyMDZiZiwKLSAgICAgICAgMHg1NWY2ZjJkMywgMHgwODgwNzc5ZCwgMHhmM2E4ODE3OSwgMHgwNWM0NDA5NSwgMHhmZjc3MzlmNywgMHhmZjI3ODZlMSwgMHgwMDZkMDIxNywgMHhmZmYxZTViYiwKLSAgICAgICAgMHg1NWExOWE1YywgMHgwN2YyY2U5YiwgMHhmM2QwZTdjMiwgMHgwNWNhMWUxZiwgMHhmZjZhNmZjMSwgMHhmZjJkODRlNSwgMHgwMDZiZmVhNCwgMHhmZmYxYzdkMCwKLSAgICAgICAgMHg1NTRhMDE0OCwgMHgwNzY2ODZmYywgMHhmM2Y5ZTY4MCwgMHgwNWNmNjk2NSwgMHhmZjVkZGMxYSwgMHhmZjMzODAwZSwgMHgwMDZhZjQ3YiwgMHhmZmYxYWNlZiwKLSAgICAgICAgMHg1NGYwMmM1NiwgMHgwNmRiYTU1MSwgMHhmNDIzNzhhMCwgMHgwNWQ0MjM4NywgMHhmZjUxN2Y4NiwgMHhmZjM5NzdjYiwgMHgwMDY5ZTNkOSwgMHhmZmYxOTUwOCwKLSAgICAgICAgMHg1NDk0MjA2MSwgMHgwNjUyMmUwZiwgMHhmNDRkOTkxMiwgMHgwNWQ4NGRhZiwgMHhmZjQ1NWE4MCwgMHhmZjNmNmI4ZiwgMHgwMDY4Y2NmYSwgMHhmZmYxODAwYiwKLSAgICAgICAgMHg1NDM1ZTI2MywgMHgwNWNhMjU4ZiwgMHhmNDc4NDJjNSwgMHgwNWRiZTkwZiwgMHhmZjM5NmQ3ZiwgMHhmZjQ1NWFjZiwgMHgwMDY3YjAxZSwgMHhmZmYxNmRlOSwKLSAgICAgICAgMHg1M2Q1Nzc3NCwgMHgwNTQzOTAwZCwgMHhmNGEzNzBhZCwgMHgwNWRlZjZlNCwgMHhmZjJkYjhmMiwgMHhmZjRiNDUwMywgMHgwMDY2OGQ4MCwgMHhmZmYxNWU5MywKLSAgICAgICAgMHg1MzcyZTRjNiwgMHgwNGJlNzFhYiwgMHhmNGNmMWRiZiwgMHgwNWUxNzg3MywgMHhmZjIyM2Q0MCwgMHhmZjUxMjlhMywgMHgwMDY1NjU1ZCwgMHhmZmYxNTFmOSwKLSAgICAgICAgMHg1MzBlMmZhYywgMHgwNDNhY2U2ZSwgMHhmNGZiNDRmNCwgMHgwNWUzNmYwZCwgMHhmZjE2ZmFjYSwgMHhmZjU3MDgyZSwgMHgwMDY0MzdmMSwgMHhmZmYxNDgwYiwKLSAgICAgICAgMHg1MmE3NWQ5MCwgMHgwM2I4YWE0MCwgMHhmNTI3ZTE0OSwgMHgwNWU0ZGMwOCwgMHhmZjBiZjFlZCwgMHhmZjVjZTAyMSwgMHgwMDYzMDU3NywgMHhmZmYxNDBiOSwKLSAgICAgICAgMHg1MjNlNzNmZCwgMHgwMzM4MDhlYiwgMHhmNTU0ZWRiZCwgMHgwNWU1YzBjNiwgMHhmZjAxMjJmYywgMHhmZjYyYjBmZCwgMHgwMDYxY2UyYywgMHhmZmYxM2JmMywKLSAgICAgICAgMHg1MWQzNzg5NywgMHgwMmI4ZWUyMiwgMHhmNTgyNjU1NSwgMHgwNWU2MWVhZSwgMHhmZWY2OGU0NSwgMHhmZjY4N2E0NywgMHgwMDYwOTI0OSwgMHhmZmYxMzlhYSwKLSAgICAgICAgMHg1MTY2NzExYywgMHgwMjNiNWQ3NiwgMHhmNWIwNDMxYSwgMHgwNWU1ZjczMywgMHhmZWVjMzQwZiwgMHhmZjZlM2I4NCwgMHgwMDVmNTIwYSwgMHhmZmYxMzljZCwKLSAgICAgICAgMHg1MGY3NjM2OCwgMHgwMWJmNWE1ZSwgMHhmNWRlODIxOCwgMHgwNWU1NGJjZCwgMHhmZWUyMTQ5YiwgMHhmZjczZjQzZCwgMHgwMDVlMGRhOCwgMHhmZmYxM2M0YywKLSAgICAgICAgMHg1MDg2NTU2ZiwgMHgwMTQ0ZTgzNCwgMHhmNjBkMWQ2MywgMHgwNWU0MWRmZSwgMHhmZWQ4MzAyMywgMHhmZjc5YTNmZSwgMHgwMDVjYzU1YywgMHhmZmYxNDExOSwKLSAgICAgICAgMHg1MDEzNGQzZSwgMHgwMGNjMGEzNiwgMHhmNjNjMTAxMiwgMHgwNWUyNmY0ZSwgMHhmZWNlODZkYiwgMHhmZjdmNGE1NCwgMHgwMDViNzk2MSwgMHhmZmYxNDgyMSwKLSAgICAgICAgMHg0ZjllNTBmZiwgMHgwMDU0YzM4MiwgMHhmNjZiNTU0NCwgMHgwNWUwNDE0ZCwgMHhmZWM1MThmMSwgMHhmZjg0ZTZkMCwgMHgwMDVhMjllZCwgMHhmZmYxNTE1NiwKLSAgICAgICAgMHg0ZjI3NjZmMiwgMHhmZmRmMTcxYiwgMHhmNjlhZTgxZCwgMHgwNWRkOTU5MywgMHhmZWJiZTY4YywgMHhmZjhhNzkwNSwgMHgwMDU4ZDczOCwgMHhmZmYxNWNhOCwKLSAgICAgICAgMHg0ZWFlOTU3MSwgMHhmZjZiMDdlNywgMHhmNmNhYzNjNywgMHgwNWRhNmRiZSwgMHhmZWIyZWZjZCwgMHhmZjkwMDA4OSwgMHgwMDU3ODE3YiwgMHhmZmYxNmEwNywKLSAgICAgICAgMHg0ZTMzZTJlZSwgMHhmZWY4OThhZSwgMHhmNmZhZTM3MywgMHgwNWQ2Y2I3MiwgMHhmZWFhMzRkMCwgMHhmZjk1N2NmNCwgMHgwMDU2MjhlYywgMHhmZmYxNzk2MiwKLSAgICAgICAgMHg0ZGI3NTVmMywgMHhmZTg3Y2MxYiwgMHhmNzJiNDI1YiwgMHgwNWQyYjA1YywgMHhmZWExYjVhOSwgMHhmZjlhZWRlMCwgMHgwMDU0Y2RjMCwgMHhmZmYxOGFhYiwKLSAgICAgICAgMHg0ZDM4ZjUyMCwgMHhmZTE4YTRiYywgMHhmNzViZGJiZCwgMHgwNWNlMWUyZCwgMHhmZTk5NzI2OCwgMHhmZmEwNTJlYywgMHgwMDUzNzAyZCwgMHhmZmYxOWRkMSwKLSAgICAgICAgMHg0Y2I4YzcyZSwgMHhmZGFiMjUwMSwgMHhmNzhjYWFlMCwgMHgwNWM5MTY5ZCwgMHhmZTkxNmIxNSwgMHhmZmE1YWJiOCwgMHgwMDUyMTA2OCwgMHhmZmYxYjJjNSwKLSAgICAgICAgMHg0YzM2ZDJlYiwgMHhmZDNmNGYzZCwgMHhmN2JkYWIxNiwgMHgwNWMzOWI2YSwgMHhmZTg5OWZiMiwgMHhmZmFhZjdlNiwgMHgwMDUwYWVhNSwgMHhmZmYxYzk3NiwKLSAgICAgICAgMHg0YmIzMWYzYywgMHhmY2Q1MjVhNSwgMHhmN2VlZDdiNCwgMHgwNWJkYWU1NywgMHhmZTgyMTAzZiwgMHhmZmIwMzcxYywgMHgwMDRmNGIxNywgMHhmZmYxZTFkNiwKLSAgICAgICAgMHg0YjJkYjMxYSwgMHhmYzZjYWE1MywgMHhmODIwMmMxYywgMHgwNWI3NTEyZSwgMHhmZTdhYmNiMSwgMHhmZmI1NjkwMiwgMHgwMDRkZTVmMSwgMHhmZmYxZmJkNSwKLSAgICAgICAgMHg0YWE2OTU5NCwgMHhmYzA1ZGY0MCwgMHhmODUxYTNiNiwgMHgwNWIwODViYywgMHhmZTczYTRmYiwgMHhmZmJhOGQ0NCwgMHgwMDRjN2Y2NiwgMHhmZmYyMTc2NCwKLSAgICAgICAgMHg0YTFkY2RjZSwgMHhmYmEwYzY0YiwgMHhmODgzMzlmNSwgMHgwNWE5NGRkNSwgMHhmZTZjYzkwOSwgMHhmZmJmYTM4ZCwgMHgwMDRiMTdhNiwgMHhmZmYyMzQ3MywKLSAgICAgICAgMHg0OTkzNjJmZiwgMHhmYjNkNjEzMywgMHhmOGI0ZWE1NSwgMHgwNWExYWI1MiwgMHhmZTY2MjhjMSwgMHhmZmM0YWI4ZiwgMHgwMDQ5YWVlMywgMHhmZmYyNTJmMywKLSAgICAgICAgMHg0OTA3NWM3MiwgMHhmYWRiYjE5YSwgMHhmOGU2YjA1OSwgMHgwNTk5YTAwZSwgMHhmZTVmYzQwNSwgMHhmZmM5YTRmYywgMHgwMDQ4NDU0YiwgMHhmZmYyNzJkNiwKLSAgICAgICAgMHg0ODc5YzE4NSwgMHhmYTdiYjkwOCwgMHhmOTE4ODc5MywgMHgwNTkxMmRlYSwgMHhmZTU5OWFhZiwgMHhmZmNlOGY4YSwgMHgwMDQ2ZGIwZiwgMHhmZmYyOTQwYiwKLSAgICAgICAgMHg0N2VhOTlhOSwgMHhmYTFkNzhlMywgMHhmOTRhNmI5YiwgMHgwNTg4NTZjZCwgMHhmZTUzYWM5NywgMHhmZmQzNmFmMSwgMHgwMDQ1NzA1YywgMHhmZmYyYjY4NiwKLSAgICAgICAgMHg0NzU5ZWM2MCwgMHhmOWMwZjI3NiwgMHhmOTdjNTgxNSwgMHgwNTdmMWM5ZSwgMHhmZTRkZjk4ZSwgMHhmZmQ4MzZlYiwgMHgwMDQ0MDU2MSwgMHhmZmYyZGEzNiwKLSAgICAgICAgMHg0NmM3YzE0MCwgMHhmOTY2MjZmMCwgMHhmOWFlNDhhZiwgMHgwNTc1ODE0YywgMHhmZTQ4ODE1ZSwgMHhmZmRjZjMzNiwgMHgwMDQyOWE0YSwgMHhmZmYyZmYwZCwKLSAgICAgICAgMHg0NjM0MWZlZCwgMHhmOTBkMTc2MSwgMHhmOWUwMzkyNCwgMHgwNTZiODZjNiwgMHhmZTQzNDNkMCwgMHhmZmUxOWY5MSwgMHgwMDQxMmY0MywgMHhmZmYzMjRmZCwKLSAgICAgICAgMHg0NTlmMTAxZCwgMHhmOGI1YzRiZSwgMHhmYTEyMjUzNywgMHgwNTYxMmYwMCwgMHhmZTNlNDBhNiwgMHhmZmU2M2JjMCwgMHgwMDNmYzQ3OCwgMHhmZmYzNGJmOSwKLSAgICAgICAgMHg0NTA4OTk5NiwgMHhmODYwMmZkYywgMHhmYTQ0MDhiYSwgMHgwNTU2N2JmMSwgMHhmZTM5Nzc5YSwgMHhmZmVhYzc4NywgMHgwMDNlNWExMiwgMHhmZmYzNzNmMCwKLSAgICAgICAgMHg0NDcwYzQyZCwgMHhmODBjNTk3NywgMHhmYTc1ZGY4NywgMHgwNTRiNmY5MiwgMHhmZTM0ZTg2NywgMHhmZmVmNDJhZiwgMHgwMDNjZjAzZCwgMHhmZmYzOWNkNywKLSAgICAgICAgMHg0M2Q3OTdjNywgMHhmN2JhNDIyYiwgMHhmYWE3YTU4NiwgMHgwNTQwMGJlMSwgMHhmZTMwOTJiZiwgMHhmZmYzYWQwMSwgMHgwMDNiODcxZiwgMHhmZmYzYzY5ZiwKLSAgICAgICAgMHg0MzNkMWM1NiwgMHhmNzY5ZWE3OCwgMHhmYWQ5NTZhYiwgMHgwNTM0NTJkYywgMHhmZTJjNzY1MCwgMHhmZmY4MDY0YiwgMHgwMDNhMWVlMywgMHhmZmYzZjEzYSwKLSAgICAgICAgMHg0MmExNTlkYywgMHhmNzFiNTJjNCwgMHhmYjBhZWVmNiwgMHgwNTI4NDY4NSwgMHhmZTI4OTJjNSwgMHhmZmZjNGU1YywgMHgwMDM4YjdhZSwgMHhmZmY0MWM5YywKLSAgICAgICAgMHg0MjA0NTg2NSwgMHhmNmNlN2I1NywgMHhmYjNjNmE3MywgMHgwNTFiZThkZCwgMHhmZTI0ZTdjMywgMHgwMDAwODUwNywgMHgwMDM3NTFhNywgMHhmZmY0NDhiNywKLSAgICAgICAgMHg0MTY2MjAwZSwgMHhmNjgzNjQ1YSwgMHhmYjZkYzUzYywgMHgwNTBmM2JlYywgMHhmZTIxNzRlYywgMHgwMDA0YWExZiwgMHgwMDM1ZWNmNCwgMHhmZmY0NzU3ZSwKLSAgICAgICAgMHg0MGM2YjhmZCwgMHhmNjNhMGRkZiwgMHhmYjllZmI3NywgMHgwNTAyNDFiNiwgMHhmZTFlMzlkYSwgMHgwMDA4YmQ3YywgMHgwMDM0ODliOSwgMHhmZmY0YTJlNSwKLSAgICAgICAgMHg0MDI2MmI2NSwgMHhmNWYyNzdkOSwgMHhmYmQwMDk1NiwgMHgwNGY0ZmM0NiwgMHhmZTFiMzYyOCwgMHgwMDBjYmVmNywgMHgwMDMzMjgxYSwgMHhmZmY0ZDBkZSwKLSAgICAgICAgMHgzZjg0N2Y4MywgMHhmNWFjYTIxZiwgMHhmYzAwZWIxYiwgMHgwNGU3NmRhMywgMHhmZTE4Njk2YSwgMHgwMDEwYWU2ZSwgMHgwMDMxYzgzYSwgMHhmZmY0ZmY1ZCwKLSAgICAgICAgMHgzZWUxYmRhMiwgMHhmNTY4OGM2ZCwgMHhmYzMxOWQxMywgMHgwNGQ5OTdkOCwgMHhmZTE1ZDMyZiwgMHgwMDE0OGJiZCwgMHgwMDMwNmEzYiwgMHhmZmY1MmU1NywKLSAgICAgICAgMHgzZTNkZWUxMywgMHhmNTI2MzY2NSwgMHhmYzYyMWI5YSwgMHgwNGNiN2NmMiwgMHhmZTEzNzMwNCwgMHgwMDE4NTZjNywgMHgwMDJmMGUzZiwgMHhmZmY1NWRiZiwKLSAgICAgICAgMHgzZDk5MTkzMiwgMHhmNGU1OWY4YSwgMHhmYzkyNjMxOSwgMHgwNGJkMWVmYiwgMHhmZTExNDg3MiwgMHgwMDFjMGY2ZSwgMHgwMDJkYjQ2NiwgMHhmZmY1OGQ4OSwKLSAgICAgICAgMHgzY2YzNDc2NiwgMHhmNGE2Yzc0OCwgMHhmY2MyNzAwOCwgMHgwNGFlODAwMCwgMHhmZTBmNTJmYywgMHgwMDFmYjU5OSwgMHgwMDJjNWNkMCwgMHhmZmY1YmRhYSwKLSAgICAgICAgMHgzYzRjODExYywgMHhmNDY5YWNlZCwgMHhmY2YyM2VlYywgMHgwNDlmYTIwZiwgMHhmZTBkOTIyNCwgMHgwMDIzNDkyZiwgMHgwMDJiMDc5YSwgMHhmZmY1ZWUxNywKLSAgICAgICAgMHgzYmE0Y2VjOSwgMHhmNDJlNGZhZiwgMHhmZDIxY2M1OSwgMHgwNDkwODczMywgMHhmZTBjMDU2NywgMHgwMDI2Y2ExYywgMHgwMDI5YjRlNCwgMHhmZmY2MWVjNSwKLSAgICAgICAgMHgzYWZjMzhlYiwgMHhmM2Y0YWVhNiwgMHhmZDUxMTRmMCwgMHgwNDgxMzE3YSwgMHhmZTBhYWMzZiwgMHgwMDJhMzg0YywgMHgwMDI4NjRjOSwgMHhmZmY2NGZhOCwKLSAgICAgICAgMHgzYTUyYzgwNSwgMHhmM2JjYzhkMywgMHhmZDgwMTU2NCwgMHgwNDcxYTJlZiwgMHhmZTA5ODYyMiwgMHgwMDJkOTNhZSwgMHgwMDI3MTc2NiwgMHhmZmY2ODBiNSwKLSAgICAgICAgMHgzOWE4ODRhMSwgMHhmMzg2OWQxYSwgMHhmZGFlY2E3MywgMHgwNDYxZGRhMCwgMHhmZTA4OTI4MywgMHgwMDMwZGMzNCwgMHgwMDI1Y2NkNywgMHhmZmY2YjFlNCwKLSAgICAgICAgMHgzOGZkNzc0ZSwgMHhmMzUyMmE0OSwgMHhmZGRkMzBlYiwgMHgwNDUxZTM5NiwgMHhmZTA3ZDBkMywgMHgwMDM0MTFkMiwgMHgwMDI0ODUzNSwgMHhmZmY2ZTMyOSwKLSAgICAgICAgMHgzODUxYThhMiwgMHhmMzFmNmYwZiwgMHhmZTBiNDVhYSwgMHgwNDQxYjZkZCwgMHhmZTA3NDA3ZCwgMHgwMDM3MzQ3ZCwgMHgwMDIzNDA5YSwgMHhmZmY3MTQ3YSwKLSAgICAgICAgMHgzN2E1MjEzNSwgMHhmMmVlNmEwNywgMHhmZTM5MDU5YiwgMHgwNDMxNTk3ZCwgMHhmZTA2ZTBlYiwgMHgwMDNhNDQyZSwgMHgwMDIxZmYxZiwgMHhmZmY3NDVjZCwKLSAgICAgICAgMHgzNmY3ZTlhNCwgMHhmMmJmMTlhZSwgMHhmZTY2NmRiYywgMHgwNDIwY2Q4MCwgMHhmZTA2YjE4NCwgMHgwMDNkNDBlMCwgMHgwMDIwYzBkYywgMHhmZmY3NzcxYSwKLSAgICAgICAgMHgzNjRhMGE5MCwgMHhmMjkxN2M2ZCwgMHhmZTkzN2IxNSwgMHgwNDEwMTRlYiwgMHhmZTA2YjFhYywgMHgwMDQwMmE4ZSwgMHgwMDFmODVlNiwgMHhmZmY3YTg1NywKLSAgICAgICAgMHgzNTliOGM5ZCwgMHhmMjY1OTA4ZiwgMHhmZWMwMmFjMiwgMHgwM2ZmMzFjMywgMHhmZTA2ZTBjNCwgMHgwMDQzMDEzNywgMHgwMDFlNGU1NiwgMHhmZmY3ZDk3YSwKLSAgICAgICAgMHgzNGVjNzg2ZiwgMHhmMjNiNTQ0YiwgMHhmZWVjNzllYywgMHgwM2VlMjYwZCwgMHhmZTA3M2UyYSwgMHgwMDQ1YzRkZCwgMHgwMDFkMWEzZiwgMHhmZmY4MGE3YywKLSAgICAgICAgMHgzNDNjZDZhZiwgMHhmMjEyYzViZSwgMHhmZjE4NjVjZCwgMHgwM2RjZjNjYSwgMHhmZTA3YzkzYSwgMHgwMDQ4NzU4MiwgMHgwMDFiZTliNywgMHhmZmY4M2I1MiwKLSAgICAgICAgMHgzMzhjYjAwNCwgMHhmMWViZTJlYywgMHhmZjQzZWJhYywgMHgwM2NiOWNmOSwgMHhmZTA4ODE0ZSwgMHgwMDRiMTMyYiwgMHgwMDFhYmNkMCwgMHhmZmY4NmJmNiwKLSAgICAgICAgMHgzMmRjMGQxNywgMHhmMWM2YTljMywgMHhmZjZmMDhlNCwgMHgwM2JhMjM5OCwgMHhmZTA5NjViYywgMHgwMDRkOWRkZSwgMHgwMDE5OTM5ZCwgMHhmZmY4OWM2MCwKLSAgICAgICAgMHgzMjJhZjY5MywgMHhmMWEzMTgxYSwgMHhmZjk5YmFkYiwgMHgwM2E4ODlhMSwgMHhmZTBhNzVkYSwgMHgwMDUwMTVhNSwgMHgwMDE4NmUzMSwgMHhmZmY4Y2M4NiwKLSAgICAgICAgMHgzMTc5NzUxZiwgMHhmMTgxMmJiMCwgMHhmZmMzZmYwYywgMHgwMzk2ZDEwYywgMHhmZTBiYjBmOSwgMHgwMDUyN2E4YSwgMHgwMDE3NGM5YywgMHhmZmY4ZmM2MiwKLSAgICAgICAgMHgzMGM3OTE2MywgMHhmMTYwZTIyZCwgMHhmZmVkZDJmZCwgMHgwMzg0ZmJkMSwgMHhmZTBkMTY2YiwgMHgwMDU0Y2M5YSwgMHgwMDE2MmVlZiwgMHhmZmY5MmJlYywKLSAgICAgICAgMHgzMDE1NTQwNCwgMHhmMTQyMzkyNCwgMHgwMDE3MzQ0NywgMHgwMzczMGJlMCwgMHhmZTBlYTU3ZSwgMHgwMDU3MGJlNCwgMHgwMDE1MTUzOCwgMHhmZmY5NWIxZSwKLSAgICAgICAgMHgyZjYyYzVhNywgMHhmMTI1MmUwZiwgMHgwMDQwMjA5MiwgMHgwMzYxMDMyYSwgMHhmZTEwNWQ3ZSwgMHgwMDU5Mzg3NywgMHgwMDEzZmY4OCwgMHhmZmY5ODllZiwKLSAgICAgICAgMHgyZWFmZWVlZCwgMHhmMTA5YmU1NiwgMHgwMDY4OTU5OCwgMHgwMzRlZTM5YiwgMHhmZTEyM2RiNiwgMHgwMDViNTI2NywgMHgwMDEyZWRlYSwgMHhmZmY5Yjg1YiwKLSAgICAgICAgMHgyZGZjZDg3MywgMHhmMGVmZTc0OCwgMHgwMDkwOTExZiwgMHgwMzNjYWYxZCwgMHhmZTE0NDU3MCwgMHgwMDVkNTljNiwgMHgwMDExZTA2ZCwgMHhmZmY5ZTY1YSwKLSAgICAgICAgMHgyZDQ5OGFkMywgMHhmMGQ3YTYyMiwgMHgwMGI4MTEwMiwgMHgwMzJhNjc5NiwgMHhmZTE2NzNmMiwgMHgwMDVmNGVhYywgMHgwMDEwZDcxZCwgMHhmZmZhMTNlNSwKLSAgICAgICAgMHgyYzk2MGVhMywgMHhmMGMwZjgwOCwgMHgwMGRmMTMyOCwgMHgwMzE4MGVlNywgMHhmZTE4Yzg4NCwgMHgwMDYxMzEyZSwgMHgwMDBmZDIwNSwgMHhmZmZhNDBmOCwKLSAgICAgICAgMHgyYmUyNmM3MywgMHhmMGFiZGEwZSwgMHgwMTA1OTU4YywgMHgwMzA1YTZmMCwgMHhmZTFiNDI2OCwgMHgwMDYzMDE2NywgMHgwMDBlZDEzMCwgMHhmZmZhNmQ4ZCwKLSAgICAgICAgMHgyYjJlYWNjZiwgMHhmMDk4NDkzMSwgMHgwMTJiOTYzNSwgMHgwMmYzMzE4YSwgMHhmZTFkZTBlMiwgMHgwMDY0YmY3MSwgMHgwMDBkZDRhNywgMHhmZmZhOTk5ZCwKLSAgICAgICAgMHgyYTdhZDgzYywgMHhmMDg2NDI1YSwgMHgwMTUxMTMzZSwgMHgwMmUwYjA4ZCwgMHhmZTIwYTMzNSwgMHgwMDY2NmI2OCwgMHgwMDBjZGM3NCwgMHhmZmZhYzUyNSwKLSAgICAgICAgMHgyOWM2ZjczOCwgMHhmMDc1YzI2MCwgMHgwMTc2MGFkMSwgMHgwMmNlMjVjYSwgMHhmZTIzODhhMSwgMHgwMDY4MDU2YiwgMHgwMDBiZTg5ZiwgMHhmZmZhZjAxZSwKLSAgICAgICAgMHgyOTEzMTIzYywgMHhmMDY2YzYwNiwgMHgwMTlhN2IyNywgMHgwMmJiOTMxMCwgMHhmZTI2OTA2NSwgMHgwMDY5OGQ5OCwgMHgwMDBhZjkzMSwgMHhmZmZiMWE4NCwKLSAgICAgICAgMHgyODVmMzFiNywgMHhmMDU5NDlmYiwgMHgwMWJlNjI4YywgMHgwMmE4ZmEyYSwgMHhmZTI5YjljMSwgMHgwMDZiMDQxMSwgMHgwMDBhMGUyZiwgMHhmZmZiNDQ1MywKLSAgICAgICAgMHgyN2FiNWUxMiwgMHhmMDRkNGFkZSwgMHgwMWUxYmY1OCwgMHgwMjk2NWNkYiwgMHhmZTJkMDNmMiwgMHgwMDZjNjhmOCwgMHgwMDA5MjdhMCwgMHhmZmZiNmQ4NiwKLSAgICAgICAgMHgyNmY3OWZhYiwgMHhmMDQyYzUzOSwgMHgwMjA0OGZmOCwgMHgwMjgzYmNlNiwgMHhmZTMwNmUzNSwgMHgwMDZkYmM3MSwgMHgwMDA4NDU4OSwgMHhmZmZiOTYxYSwKLSAgICAgICAgMHgyNjQzZmVkYSwgMHhmMDM5YjU4NywgMHgwMjI2ZDJlNiwgMHgwMjcxMWMwNSwgMHhmZTMzZjdjNywgMHgwMDZlZmVhMCwgMHgwMDA3NjdmMCwgMHhmZmZiYmUwOSwKLSAgICAgICAgMHgyNTkwODNlYiwgMHhmMDMyMTgyZiwgMHgwMjQ4ODZhZCwgMHgwMjVlN2JmMCwgMHhmZTM3OWZlMywgMHgwMDcwMmZhZSwgMHgwMDA2OGVkOCwgMHhmZmZiZTU1MiwKLSAgICAgICAgMHgyNGRkMzcyMSwgMHhmMDJiZTk4YSwgMHgwMjY5YTllOSwgMHgwMjRiZGU1YSwgMHhmZTNiNjVjNCwgMHgwMDcxNGZjMCwgMHgwMDA1YmE0NiwgMHhmZmZjMGJlZiwKLSAgICAgICAgMHgyNDJhMjBiMywgMHhmMDI3MjVkYywgMHgwMjhhM2I0NCwgMHgwMjM5NDRlZSwgMHhmZTNmNDhhNSwgMHgwMDcyNWYwMiwgMHgwMDA0ZWEzYSwgMHhmZmZjMzFkZiwKLSAgICAgICAgMHgyMzc3NDhjZiwgMHhmMDIzYzk1ZCwgMHgwMmFhMzk3YiwgMHgwMjI2YjE1NiwgMHhmZTQzNDdjMCwgMHgwMDczNWQ5YywgMHgwMDA0MWViOSwgMHhmZmZjNTcxZSwKLSAgICAgICAgMHgyMmM0Yjc5NSwgMHhmMDIxZDAzMSwgMHgwMmM5YTM1OSwgMHgwMjE0MjUzMywgMHhmZTQ3NjI1MCwgMHgwMDc0NGJiYSwgMHgwMDAzNTdjMiwgMHhmZmZjN2JhOSwKLSAgICAgICAgMHgyMjEyNzUxYSwgMHhmMDIxMzY3MSwgMHgwMmU4NzdiOSwgMHgwMjAxYTIyMywgMHhmZTRiOTc4ZSwgMHgwMDc1Mjk4YSwgMHgwMDAyOTU1OCwgMHhmZmZjOWY3ZSwKLSAgICAgICAgMHgyMTYwODk2OCwgMHhmMDIxZjgyMywgMHgwMzA2YjU4NiwgMHgwMWVmMjliZSwgMHhmZTRmZTZiMywgMHgwMDc1ZjczOSwgMHgwMDAxZDc3OSwgMHhmZmZjYzI5YSwKLSAgICAgICAgMHgyMGFlZmM3OSwgMHhmMDI0MTE0MCwgMHgwMzI0NWJiYywgMHgwMWRjYmQ5NiwgMHhmZTU0NGVmYiwgMHgwMDc2YjRmNSwgMHgwMDAxMWUyNiwgMHhmZmZjZTRmYywKLSAgICAgICAgMHgxZmZkZDYzYiwgMHhmMDI3N2RiMSwgMHgwMzQxNjk2NiwgMHgwMWNhNWYzNywgMHhmZTU4Y2Y5ZCwgMHgwMDc3NjJmMCwgMHgwMDAwNjk1ZSwgMHhmZmZkMDZhMSwKLSAgICAgICAgMHgxZjRkMWU4ZSwgMHhmMDJjMzk1MywgMHgwMzVkZGQ5ZSwgMHgwMWI4MTAyOCwgMHhmZTVkNjdkNCwgMHgwMDc4MDE1YSwgMHhmZmZmYjkxZiwgMHhmZmZkMjc4NywKLSAgICAgICAgMHgxZTljZGQ0MywgMHhmMDMyM2ZmNSwgMHgwMzc5Yjc5MCwgMHgwMWE1ZDFlYSwgMHhmZTYyMTZkYiwgMHgwMDc4OTA2NSwgMHhmZmZmMGQ2NiwgMHhmZmZkNDdhZSwKLSAgICAgICAgMHgxZGVkMWExZCwgMHhmMDM5OGQ1NiwgMHgwMzk0ZjY3NCwgMHgwMTkzYTVmOSwgMHhmZTY2ZGJlYiwgMHgwMDc5MTA0MywgMHhmZmZlNjYzMSwgMHhmZmZkNjcxMywKKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlclNpbmNEb3duLmgiCiB9OwogCiAvLyB3ZSB1c2UgMTUgYml0cyB0byBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHRoZXNlIHNhbXBsZXMKQEAgLTUxMiw3ICsyNTYsNyBAQAogICAgIG1Wb2x1bWVTSU1EWzFdID0gdTRfMjhfZnJvbV9mbG9hdChjbGFtcEZsb2F0Vm9sKHJpZ2h0KSk7CiB9CiAKLXZvaWQgQXVkaW9SZXNhbXBsZXJTaW5jOjpyZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorc2l6ZV90IEF1ZGlvUmVzYW1wbGVyU2luYzo6cmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKQogewogICAgIC8vIEZJWE1FIHN0b3JlIGN1cnJlbnQgc3RhdGUgKHVwIG9yIGRvd24gc2FtcGxlKSBhbmQgb25seSBsb2FkIHRoZSBjb2VmcyB3aGVuIHRoZSBzdGF0ZQpAQCAtNTIxLDIzICsyNjUsMjUgQEAKICAgICBpZiAobUNvbnN0YW50cyA9PSAmdmVyeUhpZ2hRdWFsaXR5Q29uc3RhbnRzICYmIHJlYWRSZXNhbXBsZUNvZWZmaWNpZW50cykgewogICAgICAgICBtRmlyQ29lZnMgPSByZWFkUmVzYW1wbGVDb2VmZmljaWVudHMoIG1JblNhbXBsZVJhdGUgPD0gbVNhbXBsZVJhdGUgKTsKICAgICB9IGVsc2UgewotICAgICAgICBtRmlyQ29lZnMgPSAoY29uc3QgaW50MzJfdCAqKSAoKG1JblNhbXBsZVJhdGUgPD0gbVNhbXBsZVJhdGUpID8gbUZpckNvZWZzVXAgOiBtRmlyQ29lZnNEb3duKTsKKyAgICAgICAgbUZpckNvZWZzID0gKGNvbnN0IGludDMyX3QgKikKKyAgICAgICAgICAgICAgICAoKG1JblNhbXBsZVJhdGUgPD0gbVNhbXBsZVJhdGUpID8gbUZpckNvZWZzVXAgOiBtRmlyQ29lZnNEb3duKTsKICAgICB9CiAKICAgICAvLyBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHJlc2FtcGxlcgogICAgIHN3aXRjaCAobUNoYW5uZWxDb3VudCkgewogICAgIGNhc2UgMToKLSAgICAgICAgcmVzYW1wbGU8MT4ob3V0LCBvdXRGcmFtZUNvdW50LCBwcm92aWRlcik7Ci0gICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gcmVzYW1wbGU8MT4ob3V0LCBvdXRGcmFtZUNvdW50LCBwcm92aWRlcik7CiAgICAgY2FzZSAyOgotICAgICAgICByZXNhbXBsZTwyPihvdXQsIG91dEZyYW1lQ291bnQsIHByb3ZpZGVyKTsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiByZXNhbXBsZTwyPihvdXQsIG91dEZyYW1lQ291bnQsIHByb3ZpZGVyKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJpbnZhbGlkIGNoYW5uZWwgY291bnQ6ICVkIiwgbUNoYW5uZWxDb3VudCk7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KIH0KIAogCiB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+Ci12b2lkIEF1ZGlvUmVzYW1wbGVyU2luYzo6cmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKK3NpemVfdCBBdWRpb1Jlc2FtcGxlclNpbmM6OnJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKQogewogICAgIGNvbnN0IENvbnN0YW50cyYgYygqbUNvbnN0YW50cyk7CkBAIC02MTIsNiArMzU4LDcgQEAKICAgICBtSW1wdWxzZSA9IGltcHVsc2U7CiAgICAgbUlucHV0SW5kZXggPSBpbnB1dEluZGV4OwogICAgIG1QaGFzZUZyYWN0aW9uID0gcGhhc2VGcmFjdGlvbjsKKyAgICByZXR1cm4gb3V0cHV0SW5kZXggLyBDSEFOTkVMUzsKIH0KIAogdGVtcGxhdGU8aW50IENIQU5ORUxTPgpAQCAtODU2LDQgKzYwMyw0IEBACiAgICAgfQogfQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuaAppbmRleCA0NjkxZDBhLi4wZmJlYWM4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5oCkBAIC0zOSw3ICszOSw3IEBACiAKICAgICB2aXJ0dWFsIH5BdWRpb1Jlc2FtcGxlclNpbmMoKTsKIAotICAgIHZpcnR1YWwgdm9pZCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorICAgIHZpcnR1YWwgc2l6ZV90IHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CiBwcml2YXRlOgogICAgIHZvaWQgaW5pdCgpOwpAQCAtNDcsNyArNDcsNyBAQAogICAgIHZpcnR1YWwgdm9pZCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwogCiAgICAgdGVtcGxhdGU8aW50IENIQU5ORUxTPgotICAgIHZvaWQgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKKyAgICBzaXplX3QgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKIAogICAgIHRlbXBsYXRlPGludCBDSEFOTkVMUz4KQEAgLTk1LDYgKzk1LDYgQEAKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvKkFORFJPSURfQVVESU9fUkVTQU1QTEVSX1NJTkNfSCovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jRG93bi5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luY0Rvd24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDBmYjg2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luY0Rvd24uaApAQCAtMCwwICsxLDEzMSBAQAorLy8gY21kLWxpbmU6IGZpciAtbCA3IC1zNDgwMDAgLWMgMTcxODkKKworICAgIDB4NWJhY2I2ZjQsIDB4MWRlZDFhMWQsIDB4ZjAzOThkNTYsIDB4MDM5NGY2NzQsIDB4MDE5M2E1ZjksIDB4ZmU2NmRiZWIsIDB4MDA3OTEwNDMsIDB4ZmZmZTY2MzEsCisgICAgMHg1YmFiNmM4MSwgMHgxZDNkZGNjZCwgMHhmMDQyMWQyYywgMHgwM2FmOTk5NSwgMHgwMTgxOGRjOSwgMHhmZTZiYjYzZSwgMHgwMDc5ODEyYSwgMHhmZmZkYzM3ZCwKKyAgICAweDViYTc4ZDM3LCAweDFjOGYyY2Y5LCAweGYwNGJlYjFkLCAweDAzYzlhMDRhLCAweDAxNmY4YWNhLCAweGZlNzBhNTExLCAweDAwNzllMzRkLCAweGZmZmQyNTQ1LAorICAgIDB4NWJhMTE5NGYsIDB4MWJlMTEyMzEsIDB4ZjA1NmYyYzcsIDB4MDNlMzA5ZmUsIDB4MDE1ZDllNjQsIDB4ZmU3NWE3OWYsIDB4MDA3YTM2ZTIsIDB4ZmZmYzhiODYsCisgICAgMHg1Yjk4MTEyMiwgMHgxYjMzOTNmOCwgMHhmMDYzMmZiNywgMHgwM2ZiZDYyNSwgMHgwMTRiYzlmYSwgMHhmZTdhYmQyMywgMHgwMDdhN2MyMCwgMHhmZmZiZjYzOSwKKyAgICAweDViOGM3NTMwLCAweDFhODZiOWJmLCAweGYwNzA5ZDc0LCAweDA0MTQwNDQ5LCAweDAxM2EwZWU5LCAweGZlN2ZlNGRiLCAweDAwN2FiMzNkLCAweGZmZmI2NTViLAorICAgIDB4NWI3ZTQ2MWEsIDB4MTlkYThhZTUsIDB4ZjA3ZjM3NzYsIDB4MDQyYjkzZmQsIDB4MDEyODZlODYsIDB4ZmU4NTFlMDUsIDB4MDA3YWRjNzIsIDB4ZmZmYWQ4ZTQsCisgICAgMHg1YjZkODRhOCwgMHgxOTJmMGViNywgMHhmMDhlZjkyZCwgMHgwNDQyODRlNiwgMHgwMTE2ZWEyMiwgMHhmZThhNjdkZCwgMHgwMDdhZjdmNiwgMHhmZmZhNTBjZSwKKyAgICAweDViNWEzMWM2LCAweDE4ODQ0YzcwLCAweGYwOWZkZGZlLCAweDA0NThkNmI3LCAweDAxMDU4MzA2LCAweGZlOGZjMWE1LCAweDAwN2IwNjAzLCAweGZmZjljZDEyLAorICAgIDB4NWI0NDRlODEsIDB4MTdkYTRiMzcsIDB4ZjBiMWUxNDMsIDB4MDQ2ZTg5MzMsIDB4MDBmNDNhNzQsIDB4ZmU5NTJhOWIsIDB4MDA3YjA2ZDQsIDB4ZmZmOTRkYTksCisgICAgMHg1YjJiZGMwZSwgMHgxNzMxMTIyMiwgMHhmMGM0ZmU1MCwgMHgwNDgzOWMyOSwgMHgwMGUzMTFhOSwgMHhmZTlhYTIwMSwgMHgwMDdhZmFhMSwgMHhmZmY4ZDI4YywKKyAgICAweDViMTBkYmMyLCAweDE2ODhhODMyLCAweGYwZDkzMDZkLCAweDA0OTgwZjc5LCAweDAwZDIwOWRiLCAweGZlYTAyNzE5LCAweDAwN2FlMWE3LCAweGZmZjg1YmIxLAorICAgIDB4NWFmMzRmMTgsIDB4MTVlMTE0NTMsIDB4ZjBlZTcyZGIsIDB4MDRhYmUzMTAsIDB4MDBjMTI0MzksIDB4ZmVhNWI5MjYsIDB4MDA3YWJjMjAsIDB4ZmZmN2U5MTAsCisgICAgMHg1YWQzMzdhZiwgMHgxNTNhNWQ1ZSwgMHhmMTA0YzBkMiwgMHgwNGJmMTZlOSwgMHgwMGIwNjFlYiwgMHhmZWFiNTc2ZCwgMHgwMDdhOGE0OSwgMHhmZmY3N2E5ZiwKKyAgICAweDVhYjA5NzQ4LCAweDE0OTQ4YTE2LCAweGYxMWMxNTgzLCAweDA0ZDFhYjBkLCAweDAwOWZjNDEzLCAweGZlYjEwMTM0LCAweDAwN2E0YzVkLCAweGZmZjcxMDU3LAorICAgIDB4NWE4YjZmYzcsIDB4MTNlZmExMmMsIDB4ZjEzNDZjMTcsIDB4MDRlMzlmOTMsIDB4MDA4ZjRiY2IsIDB4ZmViNmI1YzAsIDB4MDA3YTAyOWEsIDB4ZmZmNmFhMmIsCisgICAgMHg1YTYzYzMzNiwgMHgxMzRiYTkzNywgMHhmMTRkYmZiMSwgMHgwNGY0ZjRhMiwgMHgwMDdlZmEyOSwgMHhmZWJjNzQ1YywgMHgwMDc5YWQzZCwgMHhmZmY2NDgxMiwKKyAgICAweDVhMzk5M2MwLCAweDEyYThhOGJiLCAweGYxNjgwYjZlLCAweDA1MDVhYTZhLCAweDAwNmVkMDM4LCAweGZlYzIzYzUwLCAweDAwNzk0YzgyLCAweGZmZjVlYTAyLAorICAgIDB4NWEwY2UzYjIsIDB4MTIwNmE2MjUsIDB4ZjE4MzRhNjMsIDB4MDUxNWMxMmQsIDB4MDA1ZWNmMDEsIDB4ZmVjODBjZTgsIDB4MDA3OGUwYTksIDB4ZmZmNThmZjAsCisgICAgMHg1OWRkYjU3ZiwgMHgxMTY1YTdjYywgMHhmMTlmNzdhMCwgMHgwNTI1MzkzOCwgMHgwMDRlZjc4MiwgMHhmZWNkZTU3MSwgMHgwMDc4NjllZSwgMHhmZmY1MzljZiwKKyAgICAweDU5YWMwYmJhLCAweDEwYzViM2VmLCAweGYxYmM4ZTMxLCAweDA1MzQxMmU0LCAweDAwM2Y0YWI0LCAweGZlZDNjNTM4LCAweDAwNzdlODkxLCAweGZmZjRlNzk0LAorICAgIDB4NTk3N2U5MTksIDB4MTAyNmQwYjgsIDB4ZjFkYTg5MWIsIDB4MDU0MjRlOWIsIDB4MDAyZmM5OGEsIDB4ZmVkOWFiOGYsIDB4MDA3NzVjY2YsIDB4ZmZmNDk5MzQsCisgICAgMHg1OTQxNTA3NSwgMHgwZjg5MDQzNywgMHhmMWY5NjM2MCwgMHgwNTRmZWNjZiwgMHgwMDIwNzRlZCwgMHhmZWRmOTdjNiwgMHgwMDc2YzZlOCwgMHhmZmY0NGVhMywKKyAgICAweDU5MDg0NGM5LCAweDBlZWM1NDY1LCAweGYyMTkxN2ZmLCAweDA1NWNlZTAzLCAweDAwMTE0ZGMzLCAweGZlZTU4OTMyLCAweDAwNzYyNzE5LCAweGZmZjQwN2QyLAorICAgIDB4NThjY2M5MzAsIDB4MGU1MGM3MjMsIDB4ZjIzOWExZWYsIDB4MDU2OTUyYzMsIDB4MDAwMjU0ZTgsIDB4ZmVlYjdmMjcsIDB4MDA3NTdkYTMsIDB4ZmZmM2M0YjcsCisgICAgMHg1ODhlZTBlYSwgMHgwZGI2NjIzYiwgMHhmMjVhZmMyOSwgMHgwNTc1MWJhYSwgMHhmZmYzOGIzMiwgMHhmZWYxNzhmYywgMHgwMDc0Y2FjNCwgMHhmZmYzODU0MiwKKyAgICAweDU4NGU4ZjU2LCAweDBkMWQyYjVkLCAweGYyN2QyMTlmLCAweDA1ODA0OTVjLCAweGZmZTRmMTcxLCAweGZlZjc3NjBjLCAweDAwNzQwZWJiLCAweGZmZjM0OTY4LAorICAgIDB4NTgwYmQ3ZjQsIDB4MGM4NTI4MWYsIDB4ZjJhMDBkNDMsIDB4MDU4YWRjOGQsIDB4ZmZkNjg4NmQsIDB4ZmVmZDc1YWYsIDB4MDA3MzQ5YzcsIDB4ZmZmMzExMWIsCisgICAgMHg1N2M2YmU2NywgMHgwYmVlNWRmZiwgMHhmMmMzYmEwNCwgMHgwNTk0ZDVmYSwgMHhmZmM4NTBlNiwgMHhmZjAzNzc0NCwgMHgwMDcyN2MyNywgMHhmZmYyZGM0YywKKyAgICAweDU3N2Y0NjcwLCAweDBiNThkMjYyLCAweGYyZTgyMmNlLCAweDA1OWUzNjZjLCAweGZmYmE0Yjk4LCAweGZmMDk3YTI5LCAweDAwNzFhNjFiLCAweGZmZjJhYWVmLAorICAgIDB4NTczNTczZjIsIDB4MGFjNDhhOTIsIDB4ZjMwZDQyOGUsIDB4MDVhNmZlYjksIDB4ZmZhYzc5MzYsIDB4ZmYwZjdkYmYsIDB4MDA3MGM3ZTEsIDB4ZmZmMjdjZjMsCisgICAgMHg1NmU5NGFmMSwgMHgwYTMxOGJjMSwgMHhmMzMzMTQyZiwgMHgwNWFmMmZiZiwgMHhmZjllZGE2ZCwgMHhmZjE1ODE2YSwgMHgwMDZmZTFiOCwgMHhmZmYyNTI0YywKKyAgICAweDU2OWFjZjkwLCAweDA5OWZkYjA0LCAweGYzNTk5MjlhLCAweDA1YjZjYTZiLCAweGZmOTE2ZmUxLCAweGZmMWI4NDhlLCAweDAwNmVmM2RmLCAweGZmZjIyYWVhLAorICAgIDB4NTY0YTA2MTAsIDB4MDkwZjdkNTcsIDB4ZjM4MGI4YmEsIDB4MDViZGNmYjIsIDB4ZmY4NDNhMzIsIDB4ZmYyMTg2OTIsIDB4MDA2ZGZlOTQsIDB4ZmZmMjA2YmYsCisgICAgMHg1NWY2ZjJkMywgMHgwODgwNzc5ZCwgMHhmM2E4ODE3OSwgMHgwNWM0NDA5NSwgMHhmZjc3MzlmNywgMHhmZjI3ODZlMSwgMHgwMDZkMDIxNywgMHhmZmYxZTViYiwKKyAgICAweDU1YTE5YTVjLCAweDA3ZjJjZTliLCAweGYzZDBlN2MyLCAweDA1Y2ExZTFmLCAweGZmNmE2ZmMxLCAweGZmMmQ4NGU1LCAweDAwNmJmZWE0LCAweGZmZjFjN2QwLAorICAgIDB4NTU0YTAxNDgsIDB4MDc2Njg2ZmMsIDB4ZjNmOWU2ODAsIDB4MDVjZjY5NjUsIDB4ZmY1ZGRjMWEsIDB4ZmYzMzgwMGUsIDB4MDA2YWY0N2IsIDB4ZmZmMWFjZWYsCisgICAgMHg1NGYwMmM1NiwgMHgwNmRiYTU1MSwgMHhmNDIzNzhhMCwgMHgwNWQ0MjM4NywgMHhmZjUxN2Y4NiwgMHhmZjM5NzdjYiwgMHgwMDY5ZTNkOSwgMHhmZmYxOTUwOCwKKyAgICAweDU0OTQyMDYxLCAweDA2NTIyZTBmLCAweGY0NGQ5OTEyLCAweDA1ZDg0ZGFmLCAweGZmNDU1YTgwLCAweGZmM2Y2YjhmLCAweDAwNjhjY2ZhLCAweGZmZjE4MDBiLAorICAgIDB4NTQzNWUyNjMsIDB4MDVjYTI1OGYsIDB4ZjQ3ODQyYzUsIDB4MDVkYmU5MGYsIDB4ZmYzOTZkN2YsIDB4ZmY0NTVhY2YsIDB4MDA2N2IwMWUsIDB4ZmZmMTZkZTksCisgICAgMHg1M2Q1Nzc3NCwgMHgwNTQzOTAwZCwgMHhmNGEzNzBhZCwgMHgwNWRlZjZlNCwgMHhmZjJkYjhmMiwgMHhmZjRiNDUwMywgMHgwMDY2OGQ4MCwgMHhmZmYxNWU5MywKKyAgICAweDUzNzJlNGM2LCAweDA0YmU3MWFiLCAweGY0Y2YxZGJmLCAweDA1ZTE3ODczLCAweGZmMjIzZDQwLCAweGZmNTEyOWEzLCAweDAwNjU2NTVkLCAweGZmZjE1MWY5LAorICAgIDB4NTMwZTJmYWMsIDB4MDQzYWNlNmUsIDB4ZjRmYjQ0ZjQsIDB4MDVlMzZmMGQsIDB4ZmYxNmZhY2EsIDB4ZmY1NzA4MmUsIDB4MDA2NDM3ZjEsIDB4ZmZmMTQ4MGIsCisgICAgMHg1MmE3NWQ5MCwgMHgwM2I4YWE0MCwgMHhmNTI3ZTE0OSwgMHgwNWU0ZGMwOCwgMHhmZjBiZjFlZCwgMHhmZjVjZTAyMSwgMHgwMDYzMDU3NywgMHhmZmYxNDBiOSwKKyAgICAweDUyM2U3M2ZkLCAweDAzMzgwOGViLCAweGY1NTRlZGJkLCAweDA1ZTVjMGM2LCAweGZmMDEyMmZjLCAweGZmNjJiMGZkLCAweDAwNjFjZTJjLCAweGZmZjEzYmYzLAorICAgIDB4NTFkMzc4OTcsIDB4MDJiOGVlMjIsIDB4ZjU4MjY1NTUsIDB4MDVlNjFlYWUsIDB4ZmVmNjhlNDUsIDB4ZmY2ODdhNDcsIDB4MDA2MDkyNDksIDB4ZmZmMTM5YWEsCisgICAgMHg1MTY2NzExYywgMHgwMjNiNWQ3NiwgMHhmNWIwNDMxYSwgMHgwNWU1ZjczMywgMHhmZWVjMzQwZiwgMHhmZjZlM2I4NCwgMHgwMDVmNTIwYSwgMHhmZmYxMzljZCwKKyAgICAweDUwZjc2MzY4LCAweDAxYmY1YTVlLCAweGY1ZGU4MjE4LCAweDA1ZTU0YmNkLCAweGZlZTIxNDliLCAweGZmNzNmNDNkLCAweDAwNWUwZGE4LCAweGZmZjEzYzRjLAorICAgIDB4NTA4NjU1NmYsIDB4MDE0NGU4MzQsIDB4ZjYwZDFkNjMsIDB4MDVlNDFkZmUsIDB4ZmVkODMwMjMsIDB4ZmY3OWEzZmUsIDB4MDA1Y2M1NWMsIDB4ZmZmMTQxMTksCisgICAgMHg1MDEzNGQzZSwgMHgwMGNjMGEzNiwgMHhmNjNjMTAxMiwgMHgwNWUyNmY0ZSwgMHhmZWNlODZkYiwgMHhmZjdmNGE1NCwgMHgwMDViNzk2MSwgMHhmZmYxNDgyMSwKKyAgICAweDRmOWU1MGZmLCAweDAwNTRjMzgyLCAweGY2NmI1NTQ0LCAweDA1ZTA0MTRkLCAweGZlYzUxOGYxLCAweGZmODRlNmQwLCAweDAwNWEyOWVkLCAweGZmZjE1MTU2LAorICAgIDB4NGYyNzY2ZjIsIDB4ZmZkZjE3MWIsIDB4ZjY5YWU4MWQsIDB4MDVkZDk1OTMsIDB4ZmViYmU2OGMsIDB4ZmY4YTc5MDUsIDB4MDA1OGQ3MzgsIDB4ZmZmMTVjYTgsCisgICAgMHg0ZWFlOTU3MSwgMHhmZjZiMDdlNywgMHhmNmNhYzNjNywgMHgwNWRhNmRiZSwgMHhmZWIyZWZjZCwgMHhmZjkwMDA4OSwgMHgwMDU3ODE3YiwgMHhmZmYxNmEwNywKKyAgICAweDRlMzNlMmVlLCAweGZlZjg5OGFlLCAweGY2ZmFlMzczLCAweDA1ZDZjYjcyLCAweGZlYWEzNGQwLCAweGZmOTU3Y2Y0LCAweDAwNTYyOGVjLCAweGZmZjE3OTYyLAorICAgIDB4NGRiNzU1ZjMsIDB4ZmU4N2NjMWIsIDB4ZjcyYjQyNWIsIDB4MDVkMmIwNWMsIDB4ZmVhMWI1YTksIDB4ZmY5YWVkZTAsIDB4MDA1NGNkYzAsIDB4ZmZmMThhYWIsCisgICAgMHg0ZDM4ZjUyMCwgMHhmZTE4YTRiYywgMHhmNzViZGJiZCwgMHgwNWNlMWUyZCwgMHhmZTk5NzI2OCwgMHhmZmEwNTJlYywgMHgwMDUzNzAyZCwgMHhmZmYxOWRkMSwKKyAgICAweDRjYjhjNzJlLCAweGZkYWIyNTAxLCAweGY3OGNhYWUwLCAweDA1YzkxNjlkLCAweGZlOTE2YjE1LCAweGZmYTVhYmI4LCAweDAwNTIxMDY4LCAweGZmZjFiMmM1LAorICAgIDB4NGMzNmQyZWIsIDB4ZmQzZjRmM2QsIDB4ZjdiZGFiMTYsIDB4MDVjMzliNmEsIDB4ZmU4OTlmYjIsIDB4ZmZhYWY3ZTYsIDB4MDA1MGFlYTUsIDB4ZmZmMWM5NzYsCisgICAgMHg0YmIzMWYzYywgMHhmY2Q1MjVhNSwgMHhmN2VlZDdiNCwgMHgwNWJkYWU1NywgMHhmZTgyMTAzZiwgMHhmZmIwMzcxYywgMHgwMDRmNGIxNywgMHhmZmYxZTFkNiwKKyAgICAweDRiMmRiMzFhLCAweGZjNmNhYTUzLCAweGY4MjAyYzFjLCAweDA1Yjc1MTJlLCAweGZlN2FiY2IxLCAweGZmYjU2OTAyLCAweDAwNGRlNWYxLCAweGZmZjFmYmQ1LAorICAgIDB4NGFhNjk1OTQsIDB4ZmMwNWRmNDAsIDB4Zjg1MWEzYjYsIDB4MDViMDg1YmMsIDB4ZmU3M2E0ZmIsIDB4ZmZiYThkNDQsIDB4MDA0YzdmNjYsIDB4ZmZmMjE3NjQsCisgICAgMHg0YTFkY2RjZSwgMHhmYmEwYzY0YiwgMHhmODgzMzlmNSwgMHgwNWE5NGRkNSwgMHhmZTZjYzkwOSwgMHhmZmJmYTM4ZCwgMHgwMDRiMTdhNiwgMHhmZmYyMzQ3MywKKyAgICAweDQ5OTM2MmZmLCAweGZiM2Q2MTMzLCAweGY4YjRlYTU1LCAweDA1YTFhYjUyLCAweGZlNjYyOGMxLCAweGZmYzRhYjhmLCAweDAwNDlhZWUzLCAweGZmZjI1MmYzLAorICAgIDB4NDkwNzVjNzIsIDB4ZmFkYmIxOWEsIDB4ZjhlNmIwNTksIDB4MDU5OWEwMGUsIDB4ZmU1ZmM0MDUsIDB4ZmZjOWE0ZmMsIDB4MDA0ODQ1NGIsIDB4ZmZmMjcyZDYsCisgICAgMHg0ODc5YzE4NSwgMHhmYTdiYjkwOCwgMHhmOTE4ODc5MywgMHgwNTkxMmRlYSwgMHhmZTU5OWFhZiwgMHhmZmNlOGY4YSwgMHgwMDQ2ZGIwZiwgMHhmZmYyOTQwYiwKKyAgICAweDQ3ZWE5OWE5LCAweGZhMWQ3OGUzLCAweGY5NGE2YjliLCAweDA1ODg1NmNkLCAweGZlNTNhYzk3LCAweGZmZDM2YWYxLCAweDAwNDU3MDVjLCAweGZmZjJiNjg2LAorICAgIDB4NDc1OWVjNjAsIDB4ZjljMGYyNzYsIDB4Zjk3YzU4MTUsIDB4MDU3ZjFjOWUsIDB4ZmU0ZGY5OGUsIDB4ZmZkODM2ZWIsIDB4MDA0NDA1NjEsIDB4ZmZmMmRhMzYsCisgICAgMHg0NmM3YzE0MCwgMHhmOTY2MjZmMCwgMHhmOWFlNDhhZiwgMHgwNTc1ODE0YywgMHhmZTQ4ODE1ZSwgMHhmZmRjZjMzNiwgMHgwMDQyOWE0YSwgMHhmZmYyZmYwZCwKKyAgICAweDQ2MzQxZmVkLCAweGY5MGQxNzYxLCAweGY5ZTAzOTI0LCAweDA1NmI4NmM2LCAweGZlNDM0M2QwLCAweGZmZTE5ZjkxLCAweDAwNDEyZjQzLCAweGZmZjMyNGZkLAorICAgIDB4NDU5ZjEwMWQsIDB4ZjhiNWM0YmUsIDB4ZmExMjI1MzcsIDB4MDU2MTJmMDAsIDB4ZmUzZTQwYTYsIDB4ZmZlNjNiYzAsIDB4MDAzZmM0NzgsIDB4ZmZmMzRiZjksCisgICAgMHg0NTA4OTk5NiwgMHhmODYwMmZkYywgMHhmYTQ0MDhiYSwgMHgwNTU2N2JmMSwgMHhmZTM5Nzc5YSwgMHhmZmVhYzc4NywgMHgwMDNlNWExMiwgMHhmZmYzNzNmMCwKKyAgICAweDQ0NzBjNDJkLCAweGY4MGM1OTc3LCAweGZhNzVkZjg3LCAweDA1NGI2ZjkyLCAweGZlMzRlODY3LCAweGZmZWY0MmFmLCAweDAwM2NmMDNkLCAweGZmZjM5Y2Q3LAorICAgIDB4NDNkNzk3YzcsIDB4ZjdiYTQyMmIsIDB4ZmFhN2E1ODYsIDB4MDU0MDBiZTEsIDB4ZmUzMDkyYmYsIDB4ZmZmM2FkMDEsIDB4MDAzYjg3MWYsIDB4ZmZmM2M2OWYsCisgICAgMHg0MzNkMWM1NiwgMHhmNzY5ZWE3OCwgMHhmYWQ5NTZhYiwgMHgwNTM0NTJkYywgMHhmZTJjNzY1MCwgMHhmZmY4MDY0YiwgMHgwMDNhMWVlMywgMHhmZmYzZjEzYSwKKyAgICAweDQyYTE1OWRjLCAweGY3MWI1MmM0LCAweGZiMGFlZWY2LCAweDA1Mjg0Njg1LCAweGZlMjg5MmM1LCAweGZmZmM0ZTVjLCAweDAwMzhiN2FlLCAweGZmZjQxYzljLAorICAgIDB4NDIwNDU4NjUsIDB4ZjZjZTdiNTcsIDB4ZmIzYzZhNzMsIDB4MDUxYmU4ZGQsIDB4ZmUyNGU3YzMsIDB4MDAwMDg1MDcsIDB4MDAzNzUxYTcsIDB4ZmZmNDQ4YjcsCisgICAgMHg0MTY2MjAwZSwgMHhmNjgzNjQ1YSwgMHhmYjZkYzUzYywgMHgwNTBmM2JlYywgMHhmZTIxNzRlYywgMHgwMDA0YWExZiwgMHgwMDM1ZWNmNCwgMHhmZmY0NzU3ZSwKKyAgICAweDQwYzZiOGZkLCAweGY2M2EwZGRmLCAweGZiOWVmYjc3LCAweDA1MDI0MWI2LCAweGZlMWUzOWRhLCAweDAwMDhiZDdjLCAweDAwMzQ4OWI5LCAweGZmZjRhMmU1LAorICAgIDB4NDAyNjJiNjUsIDB4ZjVmMjc3ZDksIDB4ZmJkMDA5NTYsIDB4MDRmNGZjNDYsIDB4ZmUxYjM2MjgsIDB4MDAwY2JlZjcsIDB4MDAzMzI4MWEsIDB4ZmZmNGQwZGUsCisgICAgMHgzZjg0N2Y4MywgMHhmNWFjYTIxZiwgMHhmYzAwZWIxYiwgMHgwNGU3NmRhMywgMHhmZTE4Njk2YSwgMHgwMDEwYWU2ZSwgMHgwMDMxYzgzYSwgMHhmZmY0ZmY1ZCwKKyAgICAweDNlZTFiZGEyLCAweGY1Njg4YzZkLCAweGZjMzE5ZDEzLCAweDA0ZDk5N2Q4LCAweGZlMTVkMzJmLCAweDAwMTQ4YmJkLCAweDAwMzA2YTNiLCAweGZmZjUyZTU3LAorICAgIDB4M2UzZGVlMTMsIDB4ZjUyNjM2NjUsIDB4ZmM2MjFiOWEsIDB4MDRjYjdjZjIsIDB4ZmUxMzczMDQsIDB4MDAxODU2YzcsIDB4MDAyZjBlM2YsIDB4ZmZmNTVkYmYsCisgICAgMHgzZDk5MTkzMiwgMHhmNGU1OWY4YSwgMHhmYzkyNjMxOSwgMHgwNGJkMWVmYiwgMHhmZTExNDg3MiwgMHgwMDFjMGY2ZSwgMHgwMDJkYjQ2NiwgMHhmZmY1OGQ4OSwKKyAgICAweDNjZjM0NzY2LCAweGY0YTZjNzQ4LCAweGZjYzI3MDA4LCAweDA0YWU4MDAwLCAweGZlMGY1MmZjLCAweDAwMWZiNTk5LCAweDAwMmM1Y2QwLCAweGZmZjViZGFhLAorICAgIDB4M2M0YzgxMWMsIDB4ZjQ2OWFjZWQsIDB4ZmNmMjNlZWMsIDB4MDQ5ZmEyMGYsIDB4ZmUwZDkyMjQsIDB4MDAyMzQ5MmYsIDB4MDAyYjA3OWEsIDB4ZmZmNWVlMTcsCisgICAgMHgzYmE0Y2VjOSwgMHhmNDJlNGZhZiwgMHhmZDIxY2M1OSwgMHgwNDkwODczMywgMHhmZTBjMDU2NywgMHgwMDI2Y2ExYywgMHgwMDI5YjRlNCwgMHhmZmY2MWVjNSwKKyAgICAweDNhZmMzOGViLCAweGYzZjRhZWE2LCAweGZkNTExNGYwLCAweDA0ODEzMTdhLCAweGZlMGFhYzNmLCAweDAwMmEzODRjLCAweDAwMjg2NGM5LCAweGZmZjY0ZmE4LAorICAgIDB4M2E1MmM4MDUsIDB4ZjNiY2M4ZDMsIDB4ZmQ4MDE1NjQsIDB4MDQ3MWEyZWYsIDB4ZmUwOTg2MjIsIDB4MDAyZDkzYWUsIDB4MDAyNzE3NjYsIDB4ZmZmNjgwYjUsCisgICAgMHgzOWE4ODRhMSwgMHhmMzg2OWQxYSwgMHhmZGFlY2E3MywgMHgwNDYxZGRhMCwgMHhmZTA4OTI4MywgMHgwMDMwZGMzNCwgMHgwMDI1Y2NkNywgMHhmZmY2YjFlNCwKKyAgICAweDM4ZmQ3NzRlLCAweGYzNTIyYTQ5LCAweGZkZGQzMGViLCAweDA0NTFlMzk2LCAweGZlMDdkMGQzLCAweDAwMzQxMWQyLCAweDAwMjQ4NTM1LCAweGZmZjZlMzI5LAorICAgIDB4Mzg1MWE4YTIsIDB4ZjMxZjZmMGYsIDB4ZmUwYjQ1YWEsIDB4MDQ0MWI2ZGQsIDB4ZmUwNzQwN2QsIDB4MDAzNzM0N2QsIDB4MDAyMzQwOWEsIDB4ZmZmNzE0N2EsCisgICAgMHgzN2E1MjEzNSwgMHhmMmVlNmEwNywgMHhmZTM5MDU5YiwgMHgwNDMxNTk3ZCwgMHhmZTA2ZTBlYiwgMHgwMDNhNDQyZSwgMHgwMDIxZmYxZiwgMHhmZmY3NDVjZCwKKyAgICAweDM2ZjdlOWE0LCAweGYyYmYxOWFlLCAweGZlNjY2ZGJjLCAweDA0MjBjZDgwLCAweGZlMDZiMTg0LCAweDAwM2Q0MGUwLCAweDAwMjBjMGRjLCAweGZmZjc3NzFhLAorICAgIDB4MzY0YTBhOTAsIDB4ZjI5MTdjNmQsIDB4ZmU5MzdiMTUsIDB4MDQxMDE0ZWIsIDB4ZmUwNmIxYWMsIDB4MDA0MDJhOGUsIDB4MDAxZjg1ZTYsIDB4ZmZmN2E4NTcsCisgICAgMHgzNTliOGM5ZCwgMHhmMjY1OTA4ZiwgMHhmZWMwMmFjMiwgMHgwM2ZmMzFjMywgMHhmZTA2ZTBjNCwgMHgwMDQzMDEzNywgMHgwMDFlNGU1NiwgMHhmZmY3ZDk3YSwKKyAgICAweDM0ZWM3ODZmLCAweGYyM2I1NDRiLCAweGZlZWM3OWVjLCAweDAzZWUyNjBkLCAweGZlMDczZTJhLCAweDAwNDVjNGRkLCAweDAwMWQxYTNmLCAweGZmZjgwYTdjLAorICAgIDB4MzQzY2Q2YWYsIDB4ZjIxMmM1YmUsIDB4ZmYxODY1Y2QsIDB4MDNkY2YzY2EsIDB4ZmUwN2M5M2EsIDB4MDA0ODc1ODIsIDB4MDAxYmU5YjcsIDB4ZmZmODNiNTIsCisgICAgMHgzMzhjYjAwNCwgMHhmMWViZTJlYywgMHhmZjQzZWJhYywgMHgwM2NiOWNmOSwgMHhmZTA4ODE0ZSwgMHgwMDRiMTMyYiwgMHgwMDFhYmNkMCwgMHhmZmY4NmJmNiwKKyAgICAweDMyZGMwZDE3LCAweGYxYzZhOWMzLCAweGZmNmYwOGU0LCAweDAzYmEyMzk4LCAweGZlMDk2NWJjLCAweDAwNGQ5ZGRlLCAweDAwMTk5MzlkLCAweGZmZjg5YzYwLAorICAgIDB4MzIyYWY2OTMsIDB4ZjFhMzE4MWEsIDB4ZmY5OWJhZGIsIDB4MDNhODg5YTEsIDB4ZmUwYTc1ZGEsIDB4MDA1MDE1YTUsIDB4MDAxODZlMzEsIDB4ZmZmOGNjODYsCisgICAgMHgzMTc5NzUxZiwgMHhmMTgxMmJiMCwgMHhmZmMzZmYwYywgMHgwMzk2ZDEwYywgMHhmZTBiYjBmOSwgMHgwMDUyN2E4YSwgMHgwMDE3NGM5YywgMHhmZmY4ZmM2MiwKKyAgICAweDMwYzc5MTYzLCAweGYxNjBlMjJkLCAweGZmZWRkMmZkLCAweDAzODRmYmQxLCAweGZlMGQxNjZiLCAweDAwNTRjYzlhLCAweDAwMTYyZWVmLCAweGZmZjkyYmVjLAorICAgIDB4MzAxNTU0MDQsIDB4ZjE0MjM5MjQsIDB4MDAxNzM0NDcsIDB4MDM3MzBiZTAsIDB4ZmUwZWE1N2UsIDB4MDA1NzBiZTQsIDB4MDAxNTE1MzgsIDB4ZmZmOTViMWUsCisgICAgMHgyZjYyYzVhNywgMHhmMTI1MmUwZiwgMHgwMDQwMjA5MiwgMHgwMzYxMDMyYSwgMHhmZTEwNWQ3ZSwgMHgwMDU5Mzg3NywgMHgwMDEzZmY4OCwgMHhmZmY5ODllZiwKKyAgICAweDJlYWZlZWVkLCAweGYxMDliZTU2LCAweDAwNjg5NTk4LCAweDAzNGVlMzliLCAweGZlMTIzZGI2LCAweDAwNWI1MjY3LCAweDAwMTJlZGVhLCAweGZmZjliODViLAorICAgIDB4MmRmY2Q4NzMsIDB4ZjBlZmU3NDgsIDB4MDA5MDkxMWYsIDB4MDMzY2FmMWQsIDB4ZmUxNDQ1NzAsIDB4MDA1ZDU5YzYsIDB4MDAxMWUwNmQsIDB4ZmZmOWU2NWEsCisgICAgMHgyZDQ5OGFkMywgMHhmMGQ3YTYyMiwgMHgwMGI4MTEwMiwgMHgwMzJhNjc5NiwgMHhmZTE2NzNmMiwgMHgwMDVmNGVhYywgMHgwMDEwZDcxZCwgMHhmZmZhMTNlNSwKKyAgICAweDJjOTYwZWEzLCAweGYwYzBmODA4LCAweDAwZGYxMzI4LCAweDAzMTgwZWU3LCAweGZlMThjODg0LCAweDAwNjEzMTJlLCAweDAwMGZkMjA1LCAweGZmZmE0MGY4LAorICAgIDB4MmJlMjZjNzMsIDB4ZjBhYmRhMGUsIDB4MDEwNTk1OGMsIDB4MDMwNWE2ZjAsIDB4ZmUxYjQyNjgsIDB4MDA2MzAxNjcsIDB4MDAwZWQxMzAsIDB4ZmZmYTZkOGQsCisgICAgMHgyYjJlYWNjZiwgMHhmMDk4NDkzMSwgMHgwMTJiOTYzNSwgMHgwMmYzMzE4YSwgMHhmZTFkZTBlMiwgMHgwMDY0YmY3MSwgMHgwMDBkZDRhNywgMHhmZmZhOTk5ZCwKKyAgICAweDJhN2FkODNjLCAweGYwODY0MjVhLCAweDAxNTExMzNlLCAweDAyZTBiMDhkLCAweGZlMjBhMzM1LCAweDAwNjY2YjY4LCAweDAwMGNkYzc0LCAweGZmZmFjNTI1LAorICAgIDB4MjljNmY3MzgsIDB4ZjA3NWMyNjAsIDB4MDE3NjBhZDEsIDB4MDJjZTI1Y2EsIDB4ZmUyMzg4YTEsIDB4MDA2ODA1NmIsIDB4MDAwYmU4OWYsIDB4ZmZmYWYwMWUsCisgICAgMHgyOTEzMTIzYywgMHhmMDY2YzYwNiwgMHgwMTlhN2IyNywgMHgwMmJiOTMxMCwgMHhmZTI2OTA2NSwgMHgwMDY5OGQ5OCwgMHgwMDBhZjkzMSwgMHhmZmZiMWE4NCwKKyAgICAweDI4NWYzMWI3LCAweGYwNTk0OWZiLCAweDAxYmU2MjhjLCAweDAyYThmYTJhLCAweGZlMjliOWMxLCAweDAwNmIwNDExLCAweDAwMGEwZTJmLCAweGZmZmI0NDUzLAorICAgIDB4MjdhYjVlMTIsIDB4ZjA0ZDRhZGUsIDB4MDFlMWJmNTgsIDB4MDI5NjVjZGIsIDB4ZmUyZDAzZjIsIDB4MDA2YzY4ZjgsIDB4MDAwOTI3YTAsIDB4ZmZmYjZkODYsCisgICAgMHgyNmY3OWZhYiwgMHhmMDQyYzUzOSwgMHgwMjA0OGZmOCwgMHgwMjgzYmNlNiwgMHhmZTMwNmUzNSwgMHgwMDZkYmM3MSwgMHgwMDA4NDU4OSwgMHhmZmZiOTYxYSwKKyAgICAweDI2NDNmZWRhLCAweGYwMzliNTg3LCAweDAyMjZkMmU2LCAweDAyNzExYzA1LCAweGZlMzNmN2M3LCAweDAwNmVmZWEwLCAweDAwMDc2N2YwLCAweGZmZmJiZTA5LAorICAgIDB4MjU5MDgzZWIsIDB4ZjAzMjE4MmYsIDB4MDI0ODg2YWQsIDB4MDI1ZTdiZjAsIDB4ZmUzNzlmZTMsIDB4MDA3MDJmYWUsIDB4MDAwNjhlZDgsIDB4ZmZmYmU1NTIsCisgICAgMHgyNGRkMzcyMSwgMHhmMDJiZTk4YSwgMHgwMjY5YTllOSwgMHgwMjRiZGU1YSwgMHhmZTNiNjVjNCwgMHgwMDcxNGZjMCwgMHgwMDA1YmE0NiwgMHhmZmZjMGJlZiwKKyAgICAweDI0MmEyMGIzLCAweGYwMjcyNWRjLCAweDAyOGEzYjQ0LCAweDAyMzk0NGVlLCAweGZlM2Y0OGE1LCAweDAwNzI1ZjAyLCAweDAwMDRlYTNhLCAweGZmZmMzMWRmLAorICAgIDB4MjM3NzQ4Y2YsIDB4ZjAyM2M5NWQsIDB4MDJhYTM5N2IsIDB4MDIyNmIxNTYsIDB4ZmU0MzQ3YzAsIDB4MDA3MzVkOWMsIDB4MDAwNDFlYjksIDB4ZmZmYzU3MWUsCisgICAgMHgyMmM0Yjc5NSwgMHhmMDIxZDAzMSwgMHgwMmM5YTM1OSwgMHgwMjE0MjUzMywgMHhmZTQ3NjI1MCwgMHgwMDc0NGJiYSwgMHgwMDAzNTdjMiwgMHhmZmZjN2JhOSwKKyAgICAweDIyMTI3NTFhLCAweGYwMjEzNjcxLCAweDAyZTg3N2I5LCAweDAyMDFhMjIzLCAweGZlNGI5NzhlLCAweDAwNzUyOThhLCAweDAwMDI5NTU4LCAweGZmZmM5ZjdlLAorICAgIDB4MjE2MDg5NjgsIDB4ZjAyMWY4MjMsIDB4MDMwNmI1ODYsIDB4MDFlZjI5YmUsIDB4ZmU0ZmU2YjMsIDB4MDA3NWY3MzksIDB4MDAwMWQ3NzksIDB4ZmZmY2MyOWEsCisgICAgMHgyMGFlZmM3OSwgMHhmMDI0MTE0MCwgMHgwMzI0NWJiYywgMHgwMWRjYmQ5NiwgMHhmZTU0NGVmYiwgMHgwMDc2YjRmNSwgMHgwMDAxMWUyNiwgMHhmZmZjZTRmYywKKyAgICAweDFmZmRkNjNiLCAweGYwMjc3ZGIxLCAweDAzNDE2OTY2LCAweDAxY2E1ZjM3LCAweGZlNThjZjlkLCAweDAwNzc2MmYwLCAweDAwMDA2OTVlLCAweGZmZmQwNmExLAorICAgIDB4MWY0ZDFlOGUsIDB4ZjAyYzM5NTMsIDB4MDM1ZGRkOWUsIDB4MDFiODEwMjgsIDB4ZmU1ZDY3ZDQsIDB4MDA3ODAxNWEsIDB4ZmZmZmI5MWYsIDB4ZmZmZDI3ODcsCisgICAgMHgxZTljZGQ0MywgMHhmMDMyM2ZmNSwgMHgwMzc5Yjc5MCwgMHgwMWE1ZDFlYSwgMHhmZTYyMTZkYiwgMHgwMDc4OTA2NSwgMHhmZmZmMGQ2NiwgMHhmZmZkNDdhZSwKKyAgICAweDFkZWQxYTFkLCAweGYwMzk4ZDU2LCAweDAzOTRmNjc0LCAweDAxOTNhNWY5LCAweGZlNjZkYmViLCAweDAwNzkxMDQzLCAweGZmZmU2NjMxLCAweGZmZmQ2NzEzLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luY1VwLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jVXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDUzNjdlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luY1VwLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8vIGNtZC1saW5lOiBmaXIgLWwgNyAtczQ4MDAwIC1jIDIwNDc4CisKKyAgICAweDZkMzc0YmM3LCAweDExMWM2YmEwLCAweGYzMjQwZTYxLCAweDA3ZDE0YTM4LCAweGZjNTA5ZTY0LCAweDAxMzljZWU5LCAweGZmYzhjODY2LCAweGZmZmNjMzAwLAorICAgIDB4NmQzNTI3OGEsIDB4MTAzZTgxOTIsIDB4ZjM2YjlkZmQsIDB4MDdiZGZhYTUsIDB4ZmM1MTAyZDAsIDB4MDEzZDYxOGQsIDB4ZmZjNjYzYjksIDB4ZmZmZDk1OTIsCisgICAgMHg2ZDJlYmFmZSwgMHgwZjYyODExYSwgMHhmM2IzZDhhYywgMHgwN2E5ZjM5OSwgMHhmYzUxZDlhNiwgMHgwMTQwYmVhNSwgMHhmZmM0MTIxMiwgMHhmZmZlNjMxZSwKKyAgICAweDZkMjQwNjlkLCAweDBlODg3NWFkLCAweGYzZmNiNDNlLCAweDA3OTUzOTc2LCAweGZjNTMyMTZmLCAweDAxNDNlNjdjLCAweGZmYzFkMzczLCAweGZmZmYyYjlmLAorICAgIDB4NmQxNTBiMzUsIDB4MGRiMDZhODksIDB4ZjQ0NjI2OTAsIDB4MDc3ZmQwYWMsIDB4ZmM1NGQ4YWUsIDB4MDE0NmQ5NjUsIDB4ZmZiZmE3ZDksIDB4ZmZmZmVmMTAsCisgICAgMHg2ZDAxYzllMywgMHgwY2RhNmFiNSwgMHhmNDkwMjU4NywgMHgwNzY5YmRhZiwgMHhmYzU2ZmRkYSwgMHgwMTQ5OTdiYiwgMHhmZmJkOGY0MCwgMHgwMDAwYWQ2ZSwKKyAgICAweDZjZWE0NDE4LCAweDBjMDY4MGZlLCAweGY0ZGFhNzE4LCAweDA3NTMwNTAxLCAweGZjNTk4ZjYwLCAweDAxNGMyMWRiLCAweGZmYmI4OWExLCAweDAwMDE2NmI2LAorICAgIDB4NmNjZTdiOTcsIDB4MGIzNGI3ZjUsIDB4ZjUyNWExNDMsIDB4MDczYmFiMjgsIDB4ZmM1YzhiYTUsIDB4MDE0ZTc4MmEsIDB4ZmZiOTk2ZjMsIDB4MDAwMjFhZTUsCisgICAgMHg2Y2FlNzI3MiwgMHgwYTY1MTlmNCwgMHhmNTcxMGExNywgMHgwNzIzYjRiNCwgMHhmYzVmZjEwNSwgMHgwMTUwOWIxNCwgMHhmZmI3YjcyOCwgMHgwMDAyYzlmZCwKKyAgICAweDZjOGEyYjBmLCAweDA5OTdiMTE2LCAweGY1YmNkN2IxLCAweDA3MGIyNjM5LCAweGZjNjNiZGQzLCAweDAxNTI4YjA4LCAweGZmYjVlYTMxLCAweDAwMDM3M2ZiLAorICAgIDB4NmM2MWE4MjMsIDB4MDhjYzg3M2MsIDB4ZjYwOTAwM2YsIDB4MDZmMjA0NTMsIDB4ZmM2N2YwNWEsIDB4MDE1NDQ4N2IsIDB4ZmZiNDJmZmMsIDB4MDAwNDE4ZTIsCisgICAgMHg2YzM0ZWNiNSwgMHgwODAzYTYwYSwgMHhmNjU1N2EwMCwgMHgwNmQ4NTNhMiwgMHhmYzZjODZkZCwgMHgwMTU1ZDNlOCwgMHhmZmIyODg3NiwgMHgwMDA0YjhiMywKKyAgICAweDZjMDNmYzFjLCAweDA3M2QxNmU3LCAweGY2YTIzYjQ0LCAweDA2YmUxOGNkLCAweGZjNzE3Zjk3LCAweDAxNTcyZGNmLCAweGZmYjBmMzg4LCAweDAwMDU1MzcxLAorICAgIDB4NmJjZWQ5ZmYsIDB4MDY3OGUyZmMsIDB4ZjZlZjNhNmUsIDB4MDZhMzU4N2UsIDB4ZmM3NmQ4YmMsIDB4MDE1ODU2YjYsIDB4ZmZhZjcxMTgsIDB4MDAwNWU5MjEsCisgICAgMHg2Yjk1OGE1NCwgMHgwNWI3MTMzMiwgMHhmNzNjNmRmNCwgMHgwNjg4MTc2MSwgMHhmYzdjOTA3OSwgMHgwMTU5NGYyNSwgMHhmZmFlMDEwYiwgMHgwMDA2NzljNSwKKyAgICAweDZiNTgxMTYzLCAweDA0ZjdiMDM3LCAweGY3ODljYzYxLCAweDA2NmM1YTI3LCAweGZjODJhNGY0LCAweDAxNWExN2FiLCAweGZmYWNhMzQ0LCAweDAwMDcwNTY0LAorICAgIDB4NmIxNjczYzEsIDB4MDQzYWMyNzYsIDB4ZjdkNzRjNTMsIDB4MDY1MDI1ODMsIDB4ZmM4OTE0NGQsIDB4MDE1YWIwZGIsIDB4ZmZhYjU3YTEsIDB4MDAwNzhjMDQsCisgICAgMHg2YWQwYjY1MiwgMHgwMzgwNTIxYywgMHhmODI0ZTQ4MCwgMHgwNjMzN2UyYSwgMHhmYzhmZGM5ZiwgMHgwMTViMWI0ZSwgMHhmZmFhMWUwMiwgMHgwMDA4MGRhYiwKKyAgICAweDZhODZkZTQ4LCAweDAyYzg2NzE1LCAweGY4NzI4YmIzLCAweDA2MTY2OGQyLCAweGZjOTZmYmZjLCAweDAxNWI1NzllLCAweGZmYThmNjQxLCAweDAwMDg4YTYyLAorICAgIDB4NmEzOGYxMjMsIDB4MDIxMzA5MGMsIDB4ZjhjMDM4ZDAsIDB4MDVmOGVhMzAsIDB4ZmM5ZTcwNzQsIDB4MDE1YjY2NmMsIDB4ZmZhN2UwMzksIDB4MDAwOTAyMzAsCisgICAgMHg2OWU2ZjRiMSwgMHgwMTYwM2Y2ZSwgMHhmOTBkZTJkMSwgMHgwNWRiMDZmYywgMHhmY2E2MzgxMCwgMHgwMTViNDg1YiwgMHhmZmE2ZGJjMCwgMHgwMDA5NzUxZSwKKyAgICAweDY5OTBlZjBiLCAweDAwYjAxMTYyLCAweGY5NWI4MGNiLCAweDA1YmNjM2VkLCAweGZjYWU1MGQ2LCAweDAxNWFmZTE0LCAweGZmYTVlOGFkLCAweDAwMDllMzM3LAorICAgIDB4NjkzNmU2OTcsIDB4MDAwMjg1ZDAsIDB4ZjlhOTA5ZWEsIDB4MDU5ZTI1YjUsIDB4ZmNiNmI4YzQsIDB4MDE1YTg4NDMsIDB4ZmZhNTA2ZDIsIDB4MDAwYTRjODUsCisgICAgMHg2OGQ4ZTIwNiwgMHhmZjU3YTM1ZSwgMHhmOWY2NzU3NywgMHgwNTdmMzEwYSwgMHhmY2JmNmRkOCwgMHgwMTU5ZTc5NiwgMHhmZmE0MzYwMywgMHgwMDBhYjExMiwKKyAgICAweDY4NzZlODU1LCAweGZlYWY3MDZmLCAweGZhNDNiYWQyLCAweDA1NWZlYTlkLCAweGZjYzg2ZTA5LCAweDAxNTkxY2MwLCAweGZmYTM3NjBlLCAweDAwMGIxMGVjLAorICAgIDB4NjgxMTAwYzksIDB4ZmUwOWYzMjMsIDB4ZmE5MGQxN2IsIDB4MDU0MDU3MWEsIDB4ZmNkMWI3NGMsIDB4MDE1ODI4NzgsIDB4ZmZhMmM2YzIsIDB4MDAwYjZjMWQsCisgICAgMHg2N2E3MzJmNCwgMHhmZDY3MzE1OSwgMHhmYWRkYjEwYywgMHgwNTIwN2IyZiwgMHhmY2RiNDc5MywgMHgwMTU3MGI3NywgMHhmZmEyMjdlYywgMHgwMDBiYzJiMywKKyAgICAweDY3Mzk4NmFjLCAweGZjYzczMGFhLCAweGZiMmE1MTNiLCAweDA1MDA1YjgyLCAweGZjZTUxY2NiLCAweDAxNTVjNjc4LCAweGZmYTE5OTU3LCAweDAwMGMxNGJiLAorICAgIDB4NjZjODA0MTMsIDB4ZmMyOWY2NzAsIDB4ZmI3NmE5ZGQsIDB4MDRkZmZjYjYsIDB4ZmNlZjM0ZTEsIDB4MDE1NDVhM2MsIDB4ZmZhMTFhY2IsIDB4MDAwYzYyNDQsCisgICAgMHg2NjUyYjM5MiwgMHhmYjhmODdiZCwgMHhmYmMyYjJlNCwgMHgwNGJmNjM2OSwgMHhmY2Y5OGRiZSwgMHgwMTUyYzc4MywgMHhmZmEwYWMxMSwgMHgwMDBjYWI1YywKKyAgICAweDY1ZDk5ZGQ1LCAweGZhZjdlOTYzLCAweGZjMGU2NDYxLCAweDA0OWU5NDMzLCAweGZkMDQyNTRhLCAweDAxNTEwZjEzLCAweGZmYTA0Y2YwLCAweDAwMGNmMDEyLAorICAgIDB4NjU1Y2NiZDMsIDB4ZmE2MzFmZWYsIDB4ZmM1OWI2ODUsIDB4MDQ3ZDkzYTgsIDB4ZmQwZWY5NjksIDB4MDE0ZjMxYjIsIDB4ZmY5ZmZkMmMsIDB4MDAwZDMwNzUsCisgICAgMHg2NGRjNDZjMywgMHhmOWQxMmZhYiwgMHhmY2E0YTE5ZiwgMHgwNDVjNjY1NCwgMHhmZDFhMDgwMSwgMHgwMTRkMzAyOSwgMHhmZjlmYmM4OSwgMHgwMDBkNmM5NywKKyAgICAweDY0NTgxODIzLCAweGY5NDIxYzlkLCAweGZjZWYxZTIwLCAweDA0M2IxMGJkLCAweGZkMjU0ZWY0LCAweDAxNGIwYjQ1LCAweGZmOWY4YWM5LCAweDAwMGRhNDg2LAorICAgIDB4NjNkMDQ5YjQsIDB4ZjhiNWVhODcsIDB4ZmQzOTI0OTgsIDB4MDQxOTk3NjAsIDB4ZmQzMGNjMjQsIDB4MDE0OGMzZDIsIDB4ZmY5ZjY3YWUsIDB4MDAwZGQ4NTQsCisgICAgMHg2MzQ0ZTU3OCwgMHhmODJjOWNlNywgMHhmZDgyYWRiYSwgMHgwM2Y3ZmViNCwgMHhmZDNjN2Q3MywgMHgwMTQ2NWE5ZiwgMHhmZjlmNTJmNywgMHgwMDBlMDgxMiwKKyAgICAweDYyYjVmNWIyLCAweGY3YTYzNmZhLCAweGZkY2JiMjVhLCAweDAzZDY0YjI3LCAweGZkNDg2MGMyLCAweDAxNDNkMDdmLCAweGZmOWY0YzY1LCAweDAwMGUzM2QzLAorICAgIDB4NjIyMzg0ZTgsIDB4ZjcyMmJiYjUsIDB4ZmUxNDJiNmUsIDB4MDNiNDgxMWQsIDB4ZmQ1NDczZjMsIDB4MDE0MTI2NDMsIDB4ZmY5ZjUzYjQsIDB4MDAwZTViYTcsCisgICAgMHg2MThkOWRkYywgMHhmNmEyMmRjZiwgMHhmZTVjMTIwZiwgMHgwMzkyYTRmNCwgMHhmZDYwYjRlNywgMHgwMTNlNWNjMCwgMHhmZjlmNjhhMSwgMHgwMDBlN2ZhMSwKKyAgICAweDYwZjQ0YjkxLCAweGY2MjQ4ZmI2LCAweGZlYTM1Zjc5LCAweDAzNzBiYWZjLCAweGZkNmQyMTgwLCAweDAxM2I3NGNhLCAweGZmOWY4YWU5LCAweDAwMGU5ZmQ1LAorICAgIDB4NjA1Nzk5NDcsIDB4ZjVhOWUzOTgsIDB4ZmVlYTBkMGMsIDB4MDM0ZWM3N2YsIDB4ZmQ3OWI3YTEsIDB4MDEzODZmM2EsIDB4ZmY5ZmJhNDcsIDB4MDAwZWJjNTQsCisgICAgMHg1ZmI3OTI3OCwgMHhmNTMyMmI2MSwgMHhmZjMwMTQ0YSwgMHgwMzJjY2ViYiwgMHhmZDg2NzUyZSwgMHgwMTM1NGNlNywgMHhmZjlmZjY3NCwgMHgwMDBlZDUzMywKKyAgICAweDVmMTQ0MmRjLCAweGY0YmQ2OGI2LCAweGZmNzU2ZWRjLCAweDAzMGFkNGUxLCAweGZkOTM1ODBkLCAweDAxMzIwZWE5LCAweGZmYTAzZjJiLCAweDAwMGVlYTg0LAorICAgIDB4NWU2ZGI2NjUsIDB4ZjQ0YjljZmUsIDB4ZmZiYTE2OGQsIDB4MDJlOGRlMTksIDB4ZmRhMDVlMjMsIDB4MDEyZWI1NWEsIDB4ZmZhMDk0MjUsIDB4MDAwZWZjNWMsCisgICAgMHg1ZGMzZjkzYywgMHhmM2RjYzk1OSwgMHhmZmZlMDU0ZSwgMHgwMmM2ZWU3ZiwgMHhmZGFkODU1YiwgMHgwMTJiNDFkMywgMHhmZmEwZjUxOSwgMHgwMDBmMGFjZSwKKyAgICAweDVkMTcxN2M0LCAweGYzNzBlZWE5LCAweDAwNDEzNTM2LCAweDAyYTUwYTIyLCAweGZkYmFjYjllLCAweDAxMjdiNGYxLCAweGZmYTE2MWJmLCAweDAwMGYxNWVmLAorICAgIDB4NWM2NzFlOTYsIDB4ZjMwODBkOGMsIDB4MDA4M2EwODEsIDB4MDI4MzM1MDYsIDB4ZmRjODJlZGIsIDB4MDEyNDBmOGUsIDB4ZmZhMWQ5Y2YsIDB4MDAwZjFkZDIsCisgICAgMHg1YmI0MWE4MCwgMHhmMmEyMjY1ZSwgMHgwMGM1NDE5MCwgMHgwMjYxNzMyMSwgMHhmZGQ1YWQwMSwgMHgwMTIwNTI4NSwgMHhmZmEyNWNmZSwgMHgwMDBmMjI4ZCwKKyAgICAweDVhZmUxODg2LCAweGYyM2YzOTNiLCAweDAxMDYxMmViLCAweDAyM2ZjODVjLCAweGZkZTM0NDAzLCAweDAxMWM3ZWIyLCAweGZmYTJlYjA0LCAweDAwMGYyNDM0LAorICAgIDB4NWE0NTI1ZGYsIDB4ZjFkZjQ1ZmQsIDB4MDE0NjBmNDEsIDB4MDIxZTM4OTEsIDB4ZmRmMGYxZDYsIDB4MDExODk0ZjAsIDB4ZmZhMzgzOTUsIDB4MDAwZjIyZGMsCisgICAgMHg1OTg5NGZmMywgMHhmMTgyNGMzZSwgMHgwMTg1MzE2NSwgMHgwMWZjYzc4ZiwgMHhmZGZlYjQ3NSwgMHgwMTE0OTYxYiwgMHhmZmE0MjY2OCwgMHgwMDBmMWU5OSwKKyAgICAweDU4Y2FhNDViLCAweGYxMjg0YjU4LCAweDAxYzM3NDUyLCAweDAxZGI3OTE0LCAweGZlMGM4OWRiLCAweDAxMTA4MzBmLCAweGZmYTRkMzMyLCAweDAwMGYxNzgxLAorICAgIDB4NTgwOTMwZTEsIDB4ZjBkMTQyNjcsIDB4MDIwMGQzMmMsIDB4MDFiYTUwZDIsIDB4ZmUxYTcwMDksIDB4MDEwYzVjYTYsIDB4ZmZhNTg5YTYsIDB4MDAwZjBkYTgsCisgICAgMHg1NzQ1MDM3YywgMHhmMDdkMzA0MywgMHgwMjNkNDkzYywgMHgwMTk5NTI2YiwgMHhmZTI4NjUwNSwgMHgwMTA4MjNiYSwgMHhmZmE2NDk3YywgMHgwMDBmMDEyNSwKKyAgICAweDU2N2UyYTUxLCAweGYwMmMxMzhhLCAweDAyNzhkMWYyLCAweDAxNzg4MTcwLCAweGZlMzY2NmQ1LCAweDAxMDNkOTI3LCAweGZmYTcxMjY2LCAweDAwMGVmMjBiLAorICAgIDB4NTViNGIzYWYsIDB4ZWZkZGVhOWEsIDB4MDJiMzY4ZTYsIDB4MDE1N2UxNjYsIDB4ZmU0NDczODksIDB4MDBmZjdkYzQsIDB4ZmZhN2U0MWEsIDB4MDAwZWUwNzAsCisgICAgMHg1NGU4YWUxMywgMHhlZjkyYjM5MywgMHgwMmVkMDlkNywgMHgwMTM3NzViZiwgMHhmZTUyODkzMSwgMHgwMGZiMTI2YiwgMHhmZmE4YmU0YywgMHgwMDBlY2M2OSwKKyAgICAweDU0MWEyODFlLCAweGVmNGE2YzU4LCAweDAzMjViMGFkLCAweDAxMTc0MWRmLCAweGZlNjBhNWU1LCAweDAwZjY5N2YzLCAweGZmYTlhMGIxLCAweDAwMGViNjBiLAorICAgIDB4NTM0OTMwOWUsIDB4ZWYwNTEyOTAsIDB4MDM1ZDU5NzcsIDB4MDBmNzQ5MWEsIDB4ZmU2ZWM3YzAsIDB4MDBmMjBmMzIsIDB4ZmZhYThhZmUsIDB4MDAwZTlkNmIsCisgICAgMHg1Mjc1ZDY4NCwgMHhlZWMyYTNhMywgMHgwMzk0MDA2YSwgMHgwMGQ3OGViMywgMHhmZTdjZWNlMiwgMHgwMGVkNzhmZiwgMHhmZmFiN2NlNywgMHgwMDBlODI5ZSwKKyAgICAweDUxYTAyOGU4LCAweGVlODMxY2MzLCAweDAzYzlhMWU1LCAweDAwYjgxNWRhLCAweGZlOGIxMzczLCAweDAwZThkNjJkLCAweGZmYWM3NjIxLCAweDAwMGU2NWJhLAorICAgIDB4NTBjODM3MDQsIDB4ZWU0NjdhZTEsIDB4MDNmZTNhNmYsIDB4MDA5OGUxYjMsIDB4ZmU5OTM5OWYsIDB4MDBlNDI3OGYsIDB4ZmZhZDc2NjIsIDB4MDAwZTQ2ZDMsCisgICAgMHg0ZmVlMTAzNywgMHhlZTBjYmFiOSwgMHgwNDMxYzZiNSwgMHgwMDc5ZjU0YywgMHhmZWE3NWQ5NywgMHgwMGRmNmRmNywgMHhmZmFlN2Q1ZiwgMHgwMDBlMjVmZCwKKyAgICAweDRmMTFjM2ZlLCAweGVkZDVkOGNhLCAweDA0NjQ0MzhjLCAweDAwNWI1M2E0LCAweGZlYjU3ZDkyLCAweDAwZGFhYTM0LCAweGZmYWY4YWNkLCAweDAwMGUwMzRmLAorICAgIDB4NGUzMzYxZjcsIDB4ZWRhMWQxNWMsIDB4MDQ5NWFkZjIsIDB4MDAzY2ZmYTksIDB4ZmVjMzk3Y2YsIDB4MDBkNWRkMTYsIDB4ZmZiMDllNjMsIDB4MDAwZGRlZGIsCisgICAgMHg0ZDUyZjlkZiwgMHhlZDcwYTA3ZCwgMHgwNGM2MDMwZCwgMHgwMDFlZmMzNSwgMHhmZWQxYWE5MiwgMHgwMGQxMDc2OSwgMHhmZmIxYjdkOCwgMHgwMDBkYjhiNywKKyAgICAweDRjNzA5YjhlLCAweGVkNDI0MjA1LCAweDA0ZjU0MDI5LCAweDAwMDE0YzEyLCAweGZlZGZiNDI1LCAweDAwY2MyOWY3LCAweGZmYjJkNmUxLCAweDAwMGQ5MGY2LAorICAgIDB4NGI4YzU2ZjgsIDB4ZWQxNmIxOTYsIDB4MDUyMzYyYmEsIDB4ZmZlM2YxZjcsIDB4ZmVlZGIyZGEsIDB4MDBjNzQ1OGEsIDB4ZmZiM2ZiMzcsIDB4MDAwZDY3YWUsCisgICAgMHg0YWE2M2MyYywgMHhlY2VkZWE5OSwgMHgwNTUwNjg1ZCwgMHhmZmM2ZjA4YSwgMHhmZWZiYTUwOCwgMHgwMGMyNWFlOCwgMHhmZmI1MjQ5MCwgMHgwMDBkM2NmMSwKKyAgICAweDQ5YmU1YjUwLCAweGVjYzdlODQ1LCAweDA1N2M0ZWQ0LCAweGZmYWE0YTVkLCAweGZmMDk4OTBmLCAweDAwYmQ2YWQ3LCAweGZmYjY1MmE3LCAweDAwMGQxMGQ1LAorICAgIDB4NDhkNGM0YTIsIDB4ZWNhNGE1OWIsIDB4MDVhNzE0MGIsIDB4ZmY4ZTAxZjEsIDB4ZmYxNzVkNTMsIDB4MDBiODc2MTksIDB4ZmZiNzg1MzMsIDB4MDAwY2UzNmIsCisgICAgMHg0N2U5ODg3NCwgMHhlYzg0MWQ2OCwgMHgwNWQwYjYxMiwgMHhmZjcyMTliMywgMHhmZjI1MjA0MiwgMHgwMGIzN2Q3MCwgMHhmZmI4YmJlZCwgMHgwMDBjYjRjOCwKKyAgICAweDQ2ZmNiNzJkLCAweGVjNjY0YTQ4LCAweDA1ZjkzMzI0LCAweGZmNTY5M2ZlLCAweGZmMzJkMDRmLCAweDAwYWU4MTk4LCAweGZmYjlmNjkxLCAweDAwMGM4NGZmLAorICAgIDB4NDYwZTYxNDgsIDB4ZWM0YjI2YTIsIDB4MDYyMDg5OWUsIDB4ZmYzYjczMWIsIDB4ZmY0MDZiZjgsIDB4MDBhOTgzNGUsIDB4ZmZiYjM0ZDgsIDB4MDAwYzU0MjIsCisgICAgMHg0NTFlOTc1MCwgMHhlYzMyYWNiMCwgMHgwNjQ2YjgwOCwgMHhmZjIwYjkzZSwgMHhmZjRkZjFiZSwgMHgwMGE0ODM0YywgMHhmZmJjNzY3ZiwgMHgwMDBjMjI0NSwKKyAgICAweDQ0MmQ2OWRlLCAweGVjMWNkNjc3LCAweDA2NmJiZDBkLCAweGZmMDY2ODg5LCAweGZmNWI2MDJjLCAweDAwOWY4MjQ5LCAweGZmYmRiYjQyLCAweDAwMGJlZjc5LAorICAgIDB4NDMzYWU5OWMsIDB4ZWMwOTlkY2YsIDB4MDY4Zjk3ODEsIDB4ZmVlYzgzMGQsIDB4ZmY2OGI1ZDUsIDB4MDA5YTgwZjgsIDB4ZmZiZjAyZGQsIDB4MDAwYmJiZDIsCisgICAgMHg0MjQ3MjczZiwgMHhlYmY4ZmM2NCwgMHgwNmIyNDY1YiwgMHhmZWQzMGFjNSwgMHhmZjc1ZjE1MywgMHgwMDk1ODAwYywgMHhmZmMwNGQwZiwgMHgwMDBiODc2MCwKKyAgICAweDQxNTIzMzg5LCAweGViZWFlYmFmLCAweDA2ZDNjOGJiLCAweGZlYmEwMTk5LCAweGZmODMxMTQ4LCAweDAwOTA4MDM0LCAweGZmYzE5OTk2LCAweDAwMGI1MjM1LAorICAgIDB4NDA1YzFmNDMsIDB4ZWJkZjY1MDAsIDB4MDZmNDFkZTMsIDB4ZmVhMTY5NjAsIDB4ZmY5MDE0NWUsIDB4MDA4YjgyMWIsIDB4ZmZjMmU4MzIsIDB4MDAwYjFjNjQsCisgICAgMHgzZjY0ZmI0MCwgMHhlYmQ2NjE3YiwgMHgwNzEzNDUzZCwgMHhmZTg5NDNkYywgMHhmZjljZjk0NywgMHgwMDg2ODY2YiwgMHhmZmM0MzhhMywgMHgwMDBhZTVmYywKKyAgICAweDNlNmNkODViLCAweGViY2ZkYTE5LCAweDA3MzEzZTU2LCAweGZlNzE5MmJkLCAweGZmYTliZWJlLCAweDAwODE4ZGNiLCAweGZmYzU4YWFhLCAweDAwMGFhZjBmLAorICAgIDB4M2Q3M2M3NzIsIDB4ZWJjYmM3YTcsIDB4MDc0ZTA4ZTAsIDB4ZmU1YTU3OWQsIDB4ZmZiNjYzODYsIDB4MDA3Yzk4ZGUsIDB4ZmZjNmRlMDksIDB4MDAwYTc3YWMsCisgICAgMHgzYzc5ZDk2OCwgMHhlYmNhMjJjYywgMHgwNzY5YTRiMiwgMHhmZTQzOTQwNywgMHhmZmMyZTY2OSwgMHgwMDc3YTg0NSwgMHhmZmM4MzI4NSwgMHgwMDBhM2ZlNSwKKyAgICAweDNiN2YxZjIzLCAweGViY2FlNDA1LCAweDA3ODQxMWM3LCAweGZlMmQ0OTZmLCAweGZmY2Y0NjNhLCAweDAwNzJiYzlkLCAweGZmYzk4N2UwLCAweDAwMGEwN2M5LAorICAgIDB4M2E4M2E5ODksIDB4ZWJjZTAzYWEsIDB4MDc5ZDUwM2IsIDB4ZmUxNzc5MzcsIDB4ZmZkYjgxZDYsIDB4MDA2ZGQ2ODAsIDB4ZmZjYWRkZTEsIDB4MDAwOWNmNjcsCisgICAgMHgzOTg3ODk3ZiwgMHhlYmQzNzllYiwgMHgwN2I1NjA1MSwgMHhmZTAyMjRiMCwgMHhmZmU3OTgyMCwgMHgwMDY4ZjY4NywgMHhmZmNjMzQ0YywgMHgwMDA5OTZjZSwKKyAgICAweDM4OGFjZmU5LCAweGViZGIzZWQ1LCAweDA3Y2M0MjZjLCAweGZkZWQ0ZDEzLCAweGZmZjM4ODA2LCAweDAwNjQxZDQ0LCAweGZmY2Q4YWViLCAweDAwMDk1ZTBlLAorICAgIDB4Mzc4ZDhkYTgsIDB4ZWJlNTRhNGYsIDB4MDdlMWY3MTIsIDB4ZmRkOGYzOGIsIDB4ZmZmZjUwN2IsIDB4MDA1ZjRiNGEsIDB4ZmZjZWUxODMsIDB4MDAwOTI1MzUsCisgICAgMHgzNjhmZDM5NywgMHhlYmYxOTQxZiwgMHgwN2Y2N2VlYywgMHhmZGM1MTkyZCwgMHgwMDBhZjA3ZiwgMHgwMDVhODEyNSwgMHhmZmQwMzdlMCwgMHgwMDA4ZWM1MCwKKyAgICAweDM1OTFiMjhiLCAweGVjMDAxM2U4LCAweDA4MDlkYWMzLCAweGZkYjFiZWZjLCAweDAwMTY2NzE4LCAweDAwNTViZjYwLCAweGZmZDE4ZGNjLCAweDAwMDhiMzZlLAorICAgIDB4MzQ5MzNiNTAsIDB4ZWMxMGMxMmMsIDB4MDgxYzBiODQsIDB4ZmQ5ZWU1ZTcsIDB4MDAyMWIzNTUsIDB4MDA1MTA2ODIsIDB4ZmZkMmUzMTEsIDB4MDAwODdhOWMsCisgICAgMHgzMzk0N2VhYiwgMHhlYzIzOTM0ZiwgMHgwODJkMTIzOSwgMHhmZDhjOGVjYywgMHgwMDJjZDQ0ZCwgMHgwMDRjNTcwZiwgMHhmZmQ0Mzc3ZCwgMHgwMDA4NDFlOCwKKyAgICAweDMyOTU4ZDU1LCAweGVjMzg4MTk0LCAweDA4M2NmMDEwLCAweGZkN2FiYTc0LCAweDAwMzdjOTIyLCAweDAwNDdiMTg2LCAweGZmZDU4YWRlLCAweDAwMDgwOTVkLAorICAgIDB4MzE5Njc3ZmEsIDB4ZWM0ZjgzMjIsIDB4MDg0YmE2NTQsIDB4ZmQ2OTY5OTgsIDB4MDA0MjkwZmMsIDB4MDA0MzE2NjYsIDB4ZmZkNmRkMDIsIDB4MDAwN2QxMDgsCisgICAgMHgzMDk3NGYzYiwgMHhlYzY4OGYwMiwgMHgwODU5MzY3MSwgMHhmZDU4OWNkYywgMHgwMDRkMmIwZSwgMHgwMDNlODYyOCwgMHhmZmQ4MmRiYSwgMHgwMDA3OThmNSwKKyAgICAweDJmOTgyM2E4LCAweGVjODM5YzIyLCAweDA4NjVhMWYxLCAweGZkNDg1NGQzLCAweDAwNTc5NjkxLCAweDAwM2EwMTQxLCAweGZmZDk3Y2Q2LCAweDAwMDc2MTMwLAorICAgIDB4MmU5OTA1YzEsIDB4ZWNhMGExNTYsIDB4MDg3MGVhN2UsIDB4ZmQzODkxZmQsIDB4MDA2MWQyY2EsIDB4MDAzNTg4MjQsIDB4ZmZkYWNhMmEsIDB4MDAwNzI5YzQsCisgICAgMHgyZDlhMDVmNCwgMHhlY2JmOTU1OCwgMHgwODdiMTFkZSwgMHhmZDI5NTRjOCwgMHgwMDZiZGYwNSwgMHgwMDMxMWI0MSwgMHhmZmRjMTU4OCwgMHgwMDA2ZjJiYiwKKyAgICAweDJjOWIzNDllLCAweGVjZTA2ZWNiLCAweDA4ODQxOWY2LCAweGZkMWE5ZDkxLCAweDAwNzViYTk1LCAweDAwMmNiYjAzLCAweGZmZGQ1ZWM2LCAweDAwMDZiYzIxLAorICAgIDB4MmI5Y2EyMDMsIDB4ZWQwMzI0MzksIDB4MDg4YzA0YzgsIDB4ZmQwYzZjYTIsIDB4MDA3ZjY0ZGEsIDB4MDAyODY3ZDIsIDB4ZmZkZWE1YmIsIDB4MDAwNjg1ZmYsCisgICAgMHgyYTllNWU1NywgMHhlZDI3YWMxNiwgMHgwODkyZDQ3MCwgMHhmY2ZlYzIzMywgMHgwMDg4ZGQzOCwgMHgwMDI0MjIxMywgMHhmZmRmZWEzYywgMHgwMDA2NTA1ZiwKKyAgICAweDI5YTA3OWIyLCAweGVkNGRmY2MyLCAweDA4OTg4YjJhLCAweGZjZjE5ZTZiLCAweDAwOTIyMzFlLCAweDAwMWZlYTI3LCAweGZmZTEyYzIyLCAweDAwMDYxYjRiLAorICAgIDB4MjhhMzA0MTYsIDB4ZWQ3NjBjODgsIDB4MDg5ZDJiNGEsIDB4ZmNlNTAxNjEsIDB4MDA5YjM2MDUsIDB4MDAxYmMwNmIsIDB4ZmZlMjZiNDgsIDB4MDAwNWU2Y2IsCisgICAgMHgyN2E2MGQ2YSwgMHhlZDlmZDFhMiwgMHgwOGEwYjc0MCwgMHhmY2Q4ZWIxNywgMHgwMGE0MTU2YiwgMHgwMDE3YTUzYiwgMHhmZmUzYTc4OCwgMHgwMDA1YjJlOCwKKyAgICAweDI2YTlhNTdiLCAweGVkY2I0MjM3LCAweDA4YTMzMTk2LCAweGZjY2Q1YjgyLCAweDAwYWNjMGRhLCAweDAwMTM5OGVjLCAweGZmZTRlMGJmLCAweDAwMDU3ZmFhLAorICAgIDB4MjVhZGRiZjksIDB4ZWRmODU0NWIsIDB4MDhhNDljZjAsIDB4ZmNjMjUyODUsIDB4MDBiNTM3ZTEsIDB4MDAwZjliZDIsIDB4ZmZlNjE2YzgsIDB4MDAwNTRkMWEsCisgICAgMHgyNGIyYzA3NSwgMHhlZTI2ZmUxNywgMHgwOGE0ZmMwZCwgMHhmY2I3Y2ZmMCwgMHgwMGJkN2ExYywgMHgwMDBiYWUzYywgMHhmZmU3NDk4NCwgMHgwMDA1MWIzZSwKKyAgICAweDIzYjg2MjYzLCAweGVlNTczNTYyLCAweDA4YTQ1MWMwLCAweGZjYWRkMzg2LCAweDAwYzU4NzJhLCAweDAwMDdkMDc1LCAweGZmZTg3OGQzLCAweDAwMDRlYTFkLAorICAgIDB4MjJiZWQxMTYsIDB4ZWU4OGYwMjYsIDB4MDhhMmEwZjgsIDB4ZmNhNDVjZjcsIDB4MDBjZDVlYjcsIDB4MDAwNDAyYzgsIDB4ZmZlOWE0OTQsIDB4MDAwNGI5YzAsCisgICAgMHgyMWM2MWJjMCwgMHhlZWJjMjQ0NCwgMHgwODlmZWNiYiwgMHhmYzliNmJlNSwgMHgwMGQ1MDA3NSwgMHgwMDAwNDU3OSwgMHhmZmVhY2NhYSwgMHgwMDA0OGEyYiwKKyAgICAweDIwY2U1MTZmLCAweGVlZjBjNzhkLCAweDA4OWMzODI0LCAweGZjOTJmZmUxLCAweDAwZGM2YzFlLCAweGZmZmM5OGM5LCAweGZmZWJmMGZhLCAweDAwMDQ1YjY1LAorICAgIDB4MWZkNzgxMGYsIDB4ZWYyNmNmY2EsIDB4MDg5Nzg2NjYsIDB4ZmM4YjE4NmQsIDB4MDBlM2ExNzUsIDB4ZmZmOGZjZjcsIDB4ZmZlZDExNjYsIDB4MDAwNDJkNzQsCisgICAgMHgxZWUxYjk2NSwgMHhlZjVlMzJiZCwgMHgwODkxZGFjOCwgMHhmYzgzYjRmYywgMHgwMGVhYTA0NSwgMHhmZmY1NzIzZCwgMHhmZmVlMmRkNywgMHgwMDA0MDA1ZSwKKyAgICAweDFkZWQwOTExLCAweGVmOTZlNjFjLCAweDA4OGIzOGE5LCAweGZjN2NkNGYwLCAweDAwZjE2ODYxLCAweGZmZjFmOGQyLCAweGZmZWY0NjMyLCAweDAwMDNkNDI2LAorICAgIDB4MWNmOTdlOGIsIDB4ZWZkMGRmOWEsIDB4MDg4M2EzNzgsIDB4ZmM3Njc3OWUsIDB4MDBmN2Y5YTMsIDB4ZmZlZTkwZWIsIDB4ZmZmMDVhNjAsIDB4MDAwM2E4ZDIsCisgICAgMHgxYzA3MjgyMywgMHhmMDBjMTRlMSwgMHgwODdiMWViYywgMHhmYzcwOWM0ZCwgMHgwMGZlNTNlZiwgMHhmZmViM2FiOCwgMHhmZmYxNmE0YSwgMHgwMDAzN2U2NSwKKyAgICAweDFiMTYxM2ZmLCAweGYwNDg3Yjk4LCAweDA4NzFhZTBkLCAweGZjNmI0MjMzLCAweDAxMDQ3NzJlLCAweGZmZTdmNjY2LCAweGZmZjI3NWRiLCAweDAwMDM1NGU1LAorICAgIDB4MWEyNjUwMWIsIDB4ZjA4NjA5NjIsIDB4MDg2NzU1MTYsIDB4ZmM2NjY4N2EsIDB4MDEwYTYzNTMsIDB4ZmZlNGM0MWUsIDB4ZmZmMzdkMDAsIDB4MDAwMzJjNTQsCisgICAgMHgxOTM3ZWE0NywgMHhmMGM0YjNlMCwgMHgwODVjMTc5NCwgMHhmYzYyMGUzZCwgMHgwMTEwMTg1OCwgMHhmZmUxYTQwOCwgMHhmZmY0N2ZhNSwgMHgwMDAzMDRiNywKKyAgICAweDE4NGFmMDI1LCAweGYxMDQ3MGIwLCAweDA4NGZmOTU3LCAweGZjNWUzMjhjLCAweDAxMTU5NjNkLCAweGZmZGU5NjQ2LCAweGZmZjU3ZGI4LCAweDAwMDJkZTBlLAorICAgIDB4MTc1ZjZmMmIsIDB4ZjE0NTM1NzEsIDB4MDg0MmZlM2QsIDB4ZmM1YWQ0NjUsIDB4MDExYWRkMGIsIDB4ZmZkYjlhZjgsIDB4ZmZmNjc3MjksIDB4MDAwMmI4NWYsCisgICAgMHgxNjc1NzQ5ZSwgMHhmMTg2ZjdjMCwgMHgwODM1MmEzNSwgMHhmYzU3ZjJiZSwgMHgwMTFmZWNkMywgMHhmZmQ4YjIzYiwgMHhmZmY3NmJlOSwgMHgwMDAyOTNhYSwKKyAgICAweDE1OGQwZDk1LCAweGYxYzlhZDQwLCAweDA4MjY4MTNlLCAweGZjNTU4YzdjLCAweDAxMjRjNWFiLCAweGZmZDVkYzI4LCAweGZmZjg1YmU4LCAweDAwMDI2ZmYyLAorICAgIDB4MTRhNjQ2ZjYsIDB4ZjIwZDRiOTIsIDB4MDgxNzA3NjcsIDB4ZmM1M2EwN2IsIDB4MDEyOTY3YjEsIDB4ZmZkMzE4ZDYsIDB4ZmZmOTQ3MWIsIDB4MDAwMjRkMzksCisgICAgMHgxM2MxMmQ3MywgMHhmMjUxYzg1ZCwgMHgwODA2YzBjYiwgMHhmYzUyMmQ4OCwgMHgwMTJkZDMwYSwgMHhmZmQwNjg1OCwgMHhmZmZhMmQ3NCwgMHgwMDAyMmI3ZiwKKyAgICAweDEyZGRjZDhmLCAweGYyOTcxOTRkLCAweDA3ZjViMTkzLCAweGZjNTEzMjY2LCAweDAxMzIwN2U0LCAweGZmY2RjYWJlLCAweGZmZmIwZWU5LCAweDAwMDIwYWM3LAorICAgIDB4MTFmYzMzOTUsIDB4ZjJkZDM0MTEsIDB4MDdlM2RkZjcsIDB4ZmM1MGFkY2MsIDB4MDEzNjA2NzAsIDB4ZmZjYjQwMTQsIDB4ZmZmYmViNzAsIDB4MDAwMWViMTAsCisgICAgMHgxMTFjNmJhMCwgMHhmMzI0MGU2MSwgMHgwN2QxNGEzOCwgMHhmYzUwOWU2NCwgMHgwMTM5Y2VlOSwgMHhmZmM4Yzg2NiwgMHhmZmZjYzMwMCwgMHgwMDAxY2M1YywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZDFiZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuY3BwCkBAIC0wLDAgKzEsMTkxIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvRmxpbmdlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJBdWRpb0h3RGV2aWNlLmgiCisjaW5jbHVkZSAiQXVkaW9TdHJlYW1PdXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBdWRpb1N0cmVhbU91dDo6QXVkaW9TdHJlYW1PdXQoQXVkaW9Id0RldmljZSAqZGV2LCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKKyAgICAgICAgOiBhdWRpb0h3RGV2KGRldikKKyAgICAgICAgLCBzdHJlYW0oTlVMTCkKKyAgICAgICAgLCBmbGFncyhmbGFncykKKyAgICAgICAgLCBtRnJhbWVzV3JpdHRlbigwKQorICAgICAgICAsIG1GcmFtZXNXcml0dGVuQXRTdGFuZGJ5KDApCisgICAgICAgICwgbVJlbmRlclBvc2l0aW9uKDApCisgICAgICAgICwgbVJhdGVNdWx0aXBsaWVyKDEpCisgICAgICAgICwgbUhhbEZvcm1hdElzTGluZWFyUGNtKGZhbHNlKQorICAgICAgICAsIG1IYWxGcmFtZVNpemUoMCkKK3sKK30KKworYXVkaW9faHdfZGV2aWNlX3QgKkF1ZGlvU3RyZWFtT3V0Ojpod0RldigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGF1ZGlvSHdEZXYtPmh3RGV2aWNlKCk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3RyZWFtT3V0OjpnZXRSZW5kZXJQb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzKQoreworICAgIGlmIChzdHJlYW0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBoYWxQb3NpdGlvbiA9IDA7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RyZWFtLT5nZXRfcmVuZGVyX3Bvc2l0aW9uKHN0cmVhbSwgJmhhbFBvc2l0aW9uKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLy8gTWFpbnRhaW4gYSA2NC1iaXQgcmVuZGVyIHBvc2l0aW9uIHVzaW5nIHRoZSAzMi1iaXQgcmVzdWx0IGZyb20gdGhlIEhBTC4KKyAgICAvLyBUaGlzIGRlbHRhIGNhbGN1bGF0aW9uIHJlbGllcyBvbiB0aGUgYXJpdGhtZXRpYyBvdmVyZmxvdyBiZWhhdmlvcgorICAgIC8vIG9mIGludGVnZXJzLiBGb3IgZXhhbXBsZSAoMTAwIC0gMHhGRkZGRkZGMCkgPSAxMTYuCisgICAgdWludDMyX3QgdHJ1bmNhdGVkUG9zaXRpb24gPSAodWludDMyX3QpbVJlbmRlclBvc2l0aW9uOworICAgIGludDMyX3QgZGVsdGFIYWxQb3NpdGlvbiA9IChpbnQzMl90KShoYWxQb3NpdGlvbiAtIHRydW5jYXRlZFBvc2l0aW9uKTsKKyAgICBpZiAoZGVsdGFIYWxQb3NpdGlvbiA+IDApIHsKKyAgICAgICAgbVJlbmRlclBvc2l0aW9uICs9IGRlbHRhSGFsUG9zaXRpb247CisgICAgfQorICAgIC8vIFNjYWxlIGZyb20gSEFMIHNhbXBsZSByYXRlIHRvIGFwcGxpY2F0aW9uIHJhdGUuCisgICAgKmZyYW1lcyA9IG1SZW5kZXJQb3NpdGlvbiAvIG1SYXRlTXVsdGlwbGllcjsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vIHJldHVybiBib3R0b20gMzItYml0cyBvZiB0aGUgcmVuZGVyIHBvc2l0aW9uCitzdGF0dXNfdCBBdWRpb1N0cmVhbU91dDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmZyYW1lcykKK3sKKyAgICB1aW50NjRfdCBwb3NpdGlvbjY0ID0gMDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRSZW5kZXJQb3NpdGlvbigmcG9zaXRpb242NCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAqZnJhbWVzID0gKHVpbnQzMl90KXBvc2l0aW9uNjQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvU3RyZWFtT3V0OjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkKK3sKKyAgICBpZiAoc3RyZWFtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgdWludDY0X3QgaGFsUG9zaXRpb24gPSAwOworICAgIHN0YXR1c190IHN0YXR1cyA9IHN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihzdHJlYW0sICZoYWxQb3NpdGlvbiwgdGltZXN0YW1wKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLy8gQWRqdXN0IGZvciBzdGFuZGJ5IHVzaW5nIEhBTCByYXRlIGZyYW1lcy4KKyAgICAvLyBPbmx5IGFwcGx5IHRoaXMgY29ycmVjdGlvbiBpZiB0aGUgSEFMIGlzIGdldHRpbmcgUENNIGZyYW1lcy4KKyAgICBpZiAobUhhbEZvcm1hdElzTGluZWFyUGNtKSB7CisgICAgICAgIHVpbnQ2NF90IGFkanVzdGVkUG9zaXRpb24gPSAoaGFsUG9zaXRpb24gPD0gbUZyYW1lc1dyaXR0ZW5BdFN0YW5kYnkpID8KKyAgICAgICAgICAgICAgICAwIDogKGhhbFBvc2l0aW9uIC0gbUZyYW1lc1dyaXR0ZW5BdFN0YW5kYnkpOworICAgICAgICAvLyBTY2FsZSBmcm9tIEhBTCBzYW1wbGUgcmF0ZSB0byBhcHBsaWNhdGlvbiByYXRlLgorICAgICAgICAqZnJhbWVzID0gYWRqdXN0ZWRQb3NpdGlvbiAvIG1SYXRlTXVsdGlwbGllcjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBGb3Igb2ZmbG9hZGVkIE1QMyBhbmQgb3RoZXIgY29tcHJlc3NlZCBmb3JtYXRzLgorICAgICAgICAqZnJhbWVzID0gaGFsUG9zaXRpb247CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9TdHJlYW1PdXQ6Om9wZW4oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcykKK3sKKyAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm91dFN0cmVhbTsKKyAgICBpbnQgc3RhdHVzID0gaHdEZXYoKS0+b3Blbl9vdXRwdXRfc3RyZWFtKAorICAgICAgICAgICAgaHdEZXYoKSwKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgIGRldmljZXMsCisgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgIGNvbmZpZywKKyAgICAgICAgICAgICZvdXRTdHJlYW0sCisgICAgICAgICAgICBhZGRyZXNzKTsKKyAgICBBTE9HVigiQXVkaW9TdHJlYW1PdXQ6Om9wZW4oKSwgSEFMIG9wZW5fb3V0cHV0X3N0cmVhbSByZXR1cm5lZCAiCisgICAgICAgICAgICAiICVwLCBzYW1wbGVSYXRlICVkLCBGb3JtYXQgJSN4LCAiCisgICAgICAgICAgICAiY2hhbm5lbE1hc2sgJSN4LCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgb3V0U3RyZWFtLAorICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAorICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBzdGF0dXMpOworCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBzdHJlYW0gPSBvdXRTdHJlYW07CisgICAgICAgIG1IYWxGb3JtYXRJc0xpbmVhclBjbSA9IGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpOworICAgICAgICBBTE9HSSgiQXVkaW9TdHJlYW1PdXQ6Om9wZW4oKSwgbUhhbEZvcm1hdElzTGluZWFyUGNtID0gJWQiLCAoaW50KW1IYWxGb3JtYXRJc0xpbmVhclBjbSk7CisgICAgICAgIG1IYWxGcmFtZVNpemUgPSBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUoc3RyZWFtKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCithdWRpb19mb3JtYXRfdCBBdWRpb1N0cmVhbU91dDo6Z2V0Rm9ybWF0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmc3RyZWFtLT5jb21tb24pOworfQorCit1aW50MzJfdCBBdWRpb1N0cmVhbU91dDo6Z2V0U2FtcGxlUmF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmc3RyZWFtLT5jb21tb24pOworfQorCithdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb1N0cmVhbU91dDo6Z2V0Q2hhbm5lbE1hc2soKSBjb25zdAoreworICAgIHJldHVybiBzdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJnN0cmVhbS0+Y29tbW9uKTsKK30KKworaW50IEF1ZGlvU3RyZWFtT3V0OjpmbHVzaCgpCit7CisgICAgQUxPR19BU1NFUlQoc3RyZWFtICE9IE5VTEwpOworICAgIG1SZW5kZXJQb3NpdGlvbiA9IDA7CisgICAgbUZyYW1lc1dyaXR0ZW4gPSAwOworICAgIG1GcmFtZXNXcml0dGVuQXRTdGFuZGJ5ID0gMDsKKyAgICBpZiAoc3RyZWFtLT5mbHVzaCAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBzdHJlYW0tPmZsdXNoKHN0cmVhbSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworaW50IEF1ZGlvU3RyZWFtT3V0OjpzdGFuZGJ5KCkKK3sKKyAgICBBTE9HX0FTU0VSVChzdHJlYW0gIT0gTlVMTCk7CisgICAgbVJlbmRlclBvc2l0aW9uID0gMDsKKyAgICBtRnJhbWVzV3JpdHRlbkF0U3RhbmRieSA9IG1GcmFtZXNXcml0dGVuOworICAgIHJldHVybiBzdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZzdHJlYW0tPmNvbW1vbik7Cit9CisKK3NzaXplX3QgQXVkaW9TdHJlYW1PdXQ6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IG51bUJ5dGVzKQoreworICAgIEFMT0dfQVNTRVJUKHN0cmVhbSAhPSBOVUxMKTsKKyAgICBzc2l6ZV90IGJ5dGVzV3JpdHRlbiA9IHN0cmVhbS0+d3JpdGUoc3RyZWFtLCBidWZmZXIsIG51bUJ5dGVzKTsKKyAgICBpZiAoYnl0ZXNXcml0dGVuID4gMCAmJiBtSGFsRnJhbWVTaXplID4gMCkgeworICAgICAgICBtRnJhbWVzV3JpdHRlbiArPSBieXRlc1dyaXR0ZW4gLyBtSGFsRnJhbWVTaXplOworICAgIH0KKyAgICByZXR1cm4gYnl0ZXNXcml0dGVuOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YTIyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX1NUUkVBTV9PVVRfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX1NUUkVBTV9PVVRfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworI2luY2x1ZGUgIkF1ZGlvU3RyZWFtT3V0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9Id0RldmljZTsKKworLyoqCisgKiBNYW5hZ2VkIGFjY2VzcyB0byBhIEhBTCBvdXRwdXQgc3RyZWFtLgorICovCitjbGFzcyBBdWRpb1N0cmVhbU91dCB7CitwdWJsaWM6CisvLyBBdWRpb1N0cmVhbU91dCBpcyBpbW11dGFibGUsIHNvIGl0cyBmaWVsZHMgYXJlIGNvbnN0LgorLy8gRm9yIGVtcGhhc2lzLCB3ZSBjb3VsZCBhbHNvIG1ha2UgYWxsIHBvaW50ZXJzIHRvIHRoZW0gYmUgImNvbnN0ICoiLAorLy8gYnV0IHRoYXQgd291bGQgY2x1dHRlciB0aGUgY29kZSB1bm5lY2Vzc2FyaWx5LgorICAgIEF1ZGlvSHdEZXZpY2UgKiBjb25zdCBhdWRpb0h3RGV2OworICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtOworICAgIGNvbnN0IGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzOworCisgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2KCkgY29uc3Q7CisKKyAgICBBdWRpb1N0cmVhbU91dChBdWRpb0h3RGV2aWNlICpkZXYsIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcyk7CisKKyAgICB2aXJ0dWFsIH5BdWRpb1N0cmVhbU91dCgpIHsgfQorCisgICAgLy8gR2V0IHRoZSBib3R0b20gMzItYml0cyBvZiB0aGUgNjQtYml0IHJlbmRlciBwb3NpdGlvbi4KKyAgICBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZnJhbWVzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDY0X3QgKmZyYW1lcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKKworICAgIC8qKgorICAgICogV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4gUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgb3IgYQorICAgICogbmVnYXRpdmUgc3RhdHVzX3QuIElmIGF0IGxlYXN0IG9uZSBmcmFtZSB3YXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkgcHJpb3IgdG8gdGhlIGVycm9yLAorICAgICogaXQgaXMgc3VnZ2VzdGVkIHRoYXQgdGhlIGRyaXZlciByZXR1cm4gdGhhdCBzdWNjZXNzZnVsIChzaG9ydCkgYnl0ZSBjb3VudAorICAgICogYW5kIHRoZW4gcmV0dXJuIGFuIGVycm9yIGluIHRoZSBzdWJzZXF1ZW50IGNhbGwuCisgICAgKgorICAgICogSWYgc2V0X2NhbGxiYWNrKCkgaGFzIHByZXZpb3VzbHkgYmVlbiBjYWxsZWQgdG8gZW5hYmxlIG5vbi1ibG9ja2luZyBtb2RlCisgICAgKiB0aGUgd3JpdGUoKSBpcyBub3QgYWxsb3dlZCB0byBibG9jay4gSXQgbXVzdCB3cml0ZSBvbmx5IHRoZSBudW1iZXIgb2YKKyAgICAqIGJ5dGVzIHRoYXQgY3VycmVudGx5IGZpdCBpbiB0aGUgZHJpdmVyL2hhcmR3YXJlIGJ1ZmZlciBhbmQgdGhlbiByZXR1cm4KKyAgICAqIHRoaXMgYnl0ZSBjb3VudC4gSWYgdGhpcyBpcyBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCB3cml0ZSBzaXplIHRoZQorICAgICogY2FsbGJhY2sgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiBtb3JlIHNwYWNlIGlzIGF2YWlsYWJsZSBpbiB0aGUKKyAgICAqIGRyaXZlci9oYXJkd2FyZSBidWZmZXIuCisgICAgKi8KKyAgICB2aXJ0dWFsIHNzaXplX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBmcmFtZSBzaXplIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIEF1ZGlvRmxpbmdlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRGcmFtZVNpemUoKSBjb25zdCB7IHJldHVybiBtSGFsRnJhbWVTaXplOyB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGZvcm1hdCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBBdWRpb0ZsaW5nZXIuCisgICAgICovCisgICAgdmlydHVhbCBhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFRoZSBIQUwgbWF5IGJlIHJ1bm5pbmcgYXQgYSBoaWdoZXIgc2FtcGxlIHJhdGUgaWYsIGZvciBleGFtcGxlLCBwbGF5aW5nIHdyYXBwZWQgRUFDMy4KKyAgICAgKiBAcmV0dXJuIHNhbXBsZSByYXRlIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIEF1ZGlvRmxpbmdlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFRoZSBIQUwgaXMgaW4gc3RlcmVvIG1vZGUgd2hlbiBwbGF5aW5nIG11bHRpLWNoYW5uZWwgY29tcHJlc3NlZCBhdWRpbyBvdmVyIEhETUkuCisgICAgICogQHJldHVybiBjaGFubmVsIG1hc2sgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgQXVkaW9GbGluZ2VyLgorICAgICAqLworICAgIHZpcnR1YWwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgZ2V0Q2hhbm5lbE1hc2soKSBjb25zdDsKKworCisgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOworCitwcm90ZWN0ZWQ6CisgICAgdWludDY0X3QgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW47IC8vIHJlc2V0IGJ5IGZsdXNoCisgICAgdWludDY0X3QgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW5BdFN0YW5kYnk7CisgICAgdWludDY0X3QgICAgICAgICAgICAgbVJlbmRlclBvc2l0aW9uOyAvLyByZXNldCBieSBmbHVzaCBvciBzdGFuZGJ5CisgICAgaW50ICAgICAgICAgICAgICAgICAgbVJhdGVNdWx0aXBsaWVyOworICAgIGJvb2wgICAgICAgICAgICAgICAgIG1IYWxGb3JtYXRJc0xpbmVhclBjbTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICBtSGFsRnJhbWVTaXplOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9BVURJT19TVFJFQU1fT1VUX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9CdWZmZXJQcm92aWRlcnMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0J1ZmZlclByb3ZpZGVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThiZTIwNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9CdWZmZXJQcm92aWRlcnMuY3BwCkBAIC0wLDAgKzEsNTQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQcm92aWRlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2Rvd25taXguaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAiQnVmZmVyUHJvdmlkZXJzLmgiCisKKyNpZm5kZWYgQVJSQVlfU0laRQorI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkvc2l6ZW9mKCh4KVswXSkpCisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIGlubGluZSBUIG1pbihjb25zdCBUJiBhLCBjb25zdCBUJiBiKQoreworICAgIHJldHVybiBhIDwgYiA/IGEgOiBiOworfQorCitDb3B5QnVmZmVyUHJvdmlkZXI6OkNvcHlCdWZmZXJQcm92aWRlcihzaXplX3QgaW5wdXRGcmFtZVNpemUsCisgICAgICAgIHNpemVfdCBvdXRwdXRGcmFtZVNpemUsIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6CisgICAgICAgIG1JbnB1dEZyYW1lU2l6ZShpbnB1dEZyYW1lU2l6ZSksCisgICAgICAgIG1PdXRwdXRGcmFtZVNpemUob3V0cHV0RnJhbWVTaXplKSwKKyAgICAgICAgbUxvY2FsQnVmZmVyRnJhbWVDb3VudChidWZmZXJGcmFtZUNvdW50KSwKKyAgICAgICAgbUxvY2FsQnVmZmVyRGF0YShOVUxMKSwKKyAgICAgICAgbUNvbnN1bWVkKDApCit7CisgICAgQUxPR1YoIkNvcHlCdWZmZXJQcm92aWRlciglcCkoJXp1LCAlenUsICV6dSkiLCB0aGlzLAorICAgICAgICAgICAgaW5wdXRGcmFtZVNpemUsIG91dHB1dEZyYW1lU2l6ZSwgYnVmZmVyRnJhbWVDb3VudCk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpbnB1dEZyYW1lU2l6ZSA8IG91dHB1dEZyYW1lU2l6ZSAmJiBidWZmZXJGcmFtZUNvdW50ID09IDAsCisgICAgICAgICAgICAiUmVxdWlyZXMgbG9jYWwgYnVmZmVyIGlmIGlucHV0RnJhbWVTaXplKCV6dSkgPCBvdXRwdXRGcmFtZVNpemUoJXp1KSIsCisgICAgICAgICAgICBpbnB1dEZyYW1lU2l6ZSwgb3V0cHV0RnJhbWVTaXplKTsKKyAgICBpZiAobUxvY2FsQnVmZmVyRnJhbWVDb3VudCkgeworICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbUxvY2FsQnVmZmVyRGF0YSwgMzIsIG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQgKiBtT3V0cHV0RnJhbWVTaXplKTsKKyAgICB9CisgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKK30KKworQ29weUJ1ZmZlclByb3ZpZGVyOjp+Q29weUJ1ZmZlclByb3ZpZGVyKCkKK3sKKyAgICBBTE9HVigifkNvcHlCdWZmZXJQcm92aWRlciglcCkiLCB0aGlzKTsKKyAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ICE9IDApIHsKKyAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOworICAgIH0KKyAgICBmcmVlKG1Mb2NhbEJ1ZmZlckRhdGEpOworfQorCitzdGF0dXNfdCBDb3B5QnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyLAorICAgICAgICBpbnQ2NF90IHB0cykKK3sKKyAgICAvL0FMT0dWKCJDb3B5QnVmZmVyUHJvdmlkZXIoJXApOjpnZXROZXh0QnVmZmVyKCVwICglenUpLCAlbGxkKSIsCisgICAgLy8gICAgICAgIHRoaXMsIHBCdWZmZXIsIHBCdWZmZXItPmZyYW1lQ291bnQsIHB0cyk7CisgICAgaWYgKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2tCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcihwQnVmZmVyLCBwdHMpOworICAgICAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgICAgICBjb3B5RnJhbWVzKHBCdWZmZXItPnJhdywgcEJ1ZmZlci0+cmF3LCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gcEJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrQnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIsIHB0cyk7CisgICAgICAgIC8vIEF0IG9uZSB0aW1lIGFuIHVwc3RyZWFtIGJ1ZmZlciBwcm92aWRlciBoYWQKKyAgICAgICAgLy8gcmVzID09IE9LIGFuZCBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCwgZG9lc24ndCBzZWVtIHRvIGhhcHBlbiBub3cgNy8xOC8yMDE0LgorICAgICAgICAvLworICAgICAgICAvLyBCeSBBUEkgc3BlYywgaWYgcmVzICE9IE9LLCB0aGVuIG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwLgorICAgICAgICAvLyBidXQgdGhlcmUgbWF5IGJlIGltcHJvcGVyIGltcGxlbWVudGF0aW9ucy4KKyAgICAgICAgQUxPR19BU1NFUlQocmVzID09IE9LIHx8IG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSyB8fCBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCkgeyAvLyBub3QgbmVlZGVkIGJ5IEFQSSBzcGVjLCBidXQgdG8gYmUgc2FmZS4KKyAgICAgICAgICAgIHBCdWZmZXItPnJhdyA9IE5VTEw7CisgICAgICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgbUNvbnN1bWVkID0gMDsKKyAgICB9CisgICAgQUxPR19BU1NFUlQobUNvbnN1bWVkIDwgbUJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICBzaXplX3QgY291bnQgPSBtaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCwgbUJ1ZmZlci5mcmFtZUNvdW50IC0gbUNvbnN1bWVkKTsKKyAgICBjb3VudCA9IG1pbihjb3VudCwgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgcEJ1ZmZlci0+cmF3ID0gbUxvY2FsQnVmZmVyRGF0YTsKKyAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gY291bnQ7CisgICAgY29weUZyYW1lcyhwQnVmZmVyLT5yYXcsICh1aW50OF90KiltQnVmZmVyLnJhdyArIG1Db25zdW1lZCAqIG1JbnB1dEZyYW1lU2l6ZSwKKyAgICAgICAgICAgIHBCdWZmZXItPmZyYW1lQ291bnQpOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDb3B5QnVmZmVyUHJvdmlkZXI6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyKQoreworICAgIC8vQUxPR1YoIkNvcHlCdWZmZXJQcm92aWRlciglcCk6OnJlbGVhc2VCdWZmZXIoJXAoJXp1KSkiLAorICAgIC8vICAgICAgICB0aGlzLCBwQnVmZmVyLCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICBpZiAobUxvY2FsQnVmZmVyRnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKHBCdWZmZXIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIExPR19BTFdBWVNfRkFUQUxfSUYocEJ1ZmZlci0+ZnJhbWVDb3VudCA9PSAwLCAiSW52YWxpZCBmcmFtZWNvdW50Iik7CisgICAgbUNvbnN1bWVkICs9IHBCdWZmZXItPmZyYW1lQ291bnQ7IC8vIFRPRE86IHVwZGF0ZSBmb3IgZWZmaWNpZW5jeSB0byByZXVzZSBleGlzdGluZyBjb250ZW50CisgICAgaWYgKG1Db25zdW1lZCAhPSAwICYmIG1Db25zdW1lZCA+PSBtQnVmZmVyLmZyYW1lQ291bnQpIHsKKyAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOworICAgICAgICBBTE9HX0FTU0VSVChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCk7CisgICAgfQorICAgIHBCdWZmZXItPnJhdyA9IE5VTEw7CisgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Cit9CisKK3ZvaWQgQ29weUJ1ZmZlclByb3ZpZGVyOjpyZXNldCgpCit7CisgICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCAhPSAwKSB7CisgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKKyAgICB9CisgICAgbUNvbnN1bWVkID0gMDsKK30KKworRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IHNlc3Npb25JZCwgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpICogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGlucHV0Q2hhbm5lbE1hc2spLAorICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpICogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG91dHB1dENoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgIGJ1ZmZlckZyYW1lQ291bnQpICAvLyBzZXQgYnVmZmVyRnJhbWVDb3VudCB0byAwIHRvIGRvIGluLXBsYWNlCit7CisgICAgQUxPR1YoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCVwKSglI3gsICUjeCwgJSN4ICV1ICVkKSIsCisgICAgICAgICAgICB0aGlzLCBpbnB1dENoYW5uZWxNYXNrLCBvdXRwdXRDaGFubmVsTWFzaywgZm9ybWF0LAorICAgICAgICAgICAgc2FtcGxlUmF0ZSwgc2Vzc2lvbklkKTsKKyAgICBpZiAoIXNJc011bHRpY2hhbm5lbENhcGFibGUKKyAgICAgICAgICAgIHx8IEVmZmVjdENyZWF0ZSgmc0R3bm1GeERlc2MudXVpZCwKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICBTRVNTSU9OX0lEX0lOVkFMSURfQU5EX0lHTk9SRUQsCisgICAgICAgICAgICAgICAgICAgICZtRG93bm1peEhhbmRsZSkgIT0gMCkgeworICAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZXJyb3IgY3JlYXRpbmcgZG93bm1peGVyIGVmZmVjdCIpOworICAgICAgICAgbURvd25taXhIYW5kbGUgPSBOVUxMOworICAgICAgICAgcmV0dXJuOworICAgICB9CisgICAgIC8vIGNoYW5uZWwgaW5wdXQgY29uZmlndXJhdGlvbiB3aWxsIGJlIG92ZXJyaWRkZW4gcGVyLXRyYWNrCisgICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gaW5wdXRDaGFubmVsTWFzazsgICAvLyBGSVhNRTogU2hvdWxkIGJlIGJpdHMKKyAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gb3V0cHV0Q2hhbm5lbE1hc2s7IC8vIEZJWE1FOiBzaG91bGQgYmUgYml0cworICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBmb3JtYXQ7CisgICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBmb3JtYXQ7CisgICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBzYW1wbGVSYXRlOworICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKKyAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURTsKKyAgICAgLy8gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgcHJvdmlkZXIsIGFuZCBmcmFtZSBjb3VudCB3aWxsIG5vdCBiZSB1c2VkIGFzIHRoZSBkb3dubWl4IGVmZmVjdAorICAgICAvLyBwcm9jZXNzKCkgZnVuY3Rpb24gaXMgY2FsbGVkIGRpcmVjdGx5IChzZWUgRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoKSkKKyAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfU01QX1JBVEUgfCBFRkZFQ1RfQ09ORklHX0NIQU5ORUxTIHwKKyAgICAgICAgICAgICBFRkZFQ1RfQ09ORklHX0ZPUk1BVCB8IEVGRkVDVF9DT05GSUdfQUNDX01PREU7CisgICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5tYXNrID0gbURvd25taXhDb25maWcuaW5wdXRDZmcubWFzazsKKworICAgICBpbnQgY21kU3RhdHVzOworICAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YoaW50KTsKKworICAgICAvLyBDb25maWd1cmUgZG93bm1peGVyCisgICAgIHN0YXR1c190IHN0YXR1cyA9ICgqbURvd25taXhIYW5kbGUpLT5jb21tYW5kKG1Eb3dubWl4SGFuZGxlLAorICAgICAgICAgICAgIEVGRkVDVF9DTURfU0VUX0NPTkZJRyAvKmNtZENvZGUqLywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgLypjbWRTaXplKi8sCisgICAgICAgICAgICAgJm1Eb3dubWl4Q29uZmlnIC8qcENtZERhdGEqLywKKyAgICAgICAgICAgICAmcmVwbHlTaXplLCAmY21kU3RhdHVzIC8qcFJlcGx5RGF0YSovKTsKKyAgICAgaWYgKHN0YXR1cyAhPSAwIHx8IGNtZFN0YXR1cyAhPSAwKSB7CisgICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBlcnJvciAlZCBjbWRTdGF0dXMgJWQgd2hpbGUgY29uZmlndXJpbmcgZG93bm1peGVyIiwKKyAgICAgICAgICAgICAgICAgc3RhdHVzLCBjbWRTdGF0dXMpOworICAgICAgICAgRWZmZWN0UmVsZWFzZShtRG93bm1peEhhbmRsZSk7CisgICAgICAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7CisgICAgICAgICByZXR1cm47CisgICAgIH0KKworICAgICAvLyBFbmFibGUgZG93bm1peGVyCisgICAgIHJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOworICAgICBzdGF0dXMgPSAoKm1Eb3dubWl4SGFuZGxlKS0+Y29tbWFuZChtRG93bm1peEhhbmRsZSwKKyAgICAgICAgICAgICBFRkZFQ1RfQ01EX0VOQUJMRSAvKmNtZENvZGUqLywgMCAvKmNtZFNpemUqLywgTlVMTCAvKnBDbWREYXRhKi8sCisgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmNtZFN0YXR1cyAvKnBSZXBseURhdGEqLyk7CisgICAgIGlmIChzdGF0dXMgIT0gMCB8fCBjbWRTdGF0dXMgIT0gMCkgeworICAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZXJyb3IgJWQgY21kU3RhdHVzICVkIHdoaWxlIGVuYWJsaW5nIGRvd25taXhlciIsCisgICAgICAgICAgICAgICAgIHN0YXR1cywgY21kU3RhdHVzKTsKKyAgICAgICAgIEVmZmVjdFJlbGVhc2UobURvd25taXhIYW5kbGUpOworICAgICAgICAgbURvd25taXhIYW5kbGUgPSBOVUxMOworICAgICAgICAgcmV0dXJuOworICAgICB9CisKKyAgICAgLy8gU2V0IGRvd25taXggdHlwZQorICAgICAvLyBwYXJhbWV0ZXIgc2l6ZSByb3VuZGVkIGZvciBwYWRkaW5nIG9uIDMyYml0IGJvdW5kYXJ5CisgICAgIGNvbnN0IGludCBwc2l6ZVBhZGRlZCA9ICgoc2l6ZW9mKGRvd25taXhfcGFyYW1zX3QpIC0gMSkvc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpOworICAgICBjb25zdCBpbnQgZG93bm1peFBhcmFtU2l6ZSA9CisgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHBzaXplUGFkZGVkICsgc2l6ZW9mKGRvd25taXhfdHlwZV90KTsKKyAgICAgZWZmZWN0X3BhcmFtX3QgKiBjb25zdCBwYXJhbSA9IChlZmZlY3RfcGFyYW1fdCAqKSBtYWxsb2MoZG93bm1peFBhcmFtU2l6ZSk7CisgICAgIHBhcmFtLT5wc2l6ZSA9IHNpemVvZihkb3dubWl4X3BhcmFtc190KTsKKyAgICAgY29uc3QgZG93bm1peF9wYXJhbXNfdCBkb3dubWl4UGFyYW0gPSBET1dOTUlYX1BBUkFNX1RZUEU7CisgICAgIG1lbWNweShwYXJhbS0+ZGF0YSwgJmRvd25taXhQYXJhbSwgcGFyYW0tPnBzaXplKTsKKyAgICAgY29uc3QgZG93bm1peF90eXBlX3QgZG93bm1peFR5cGUgPSBET1dOTUlYX1RZUEVfRk9MRDsKKyAgICAgcGFyYW0tPnZzaXplID0gc2l6ZW9mKGRvd25taXhfdHlwZV90KTsKKyAgICAgbWVtY3B5KHBhcmFtLT5kYXRhICsgcHNpemVQYWRkZWQsICZkb3dubWl4VHlwZSwgcGFyYW0tPnZzaXplKTsKKyAgICAgcmVwbHlTaXplID0gc2l6ZW9mKGludCk7CisgICAgIHN0YXR1cyA9ICgqbURvd25taXhIYW5kbGUpLT5jb21tYW5kKG1Eb3dubWl4SGFuZGxlLAorICAgICAgICAgICAgIEVGRkVDVF9DTURfU0VUX1BBUkFNIC8qIGNtZENvZGUgKi8sIGRvd25taXhQYXJhbVNpemUgLyogY21kU2l6ZSAqLywKKyAgICAgICAgICAgICBwYXJhbSAvKnBDbWREYXRhKi8sICZyZXBseVNpemUsICZjbWRTdGF0dXMgLypwUmVwbHlEYXRhKi8pOworICAgICBmcmVlKHBhcmFtKTsKKyAgICAgaWYgKHN0YXR1cyAhPSAwIHx8IGNtZFN0YXR1cyAhPSAwKSB7CisgICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBlcnJvciAlZCBjbWRTdGF0dXMgJWQgd2hpbGUgc2V0dGluZyBkb3dubWl4IHR5cGUiLAorICAgICAgICAgICAgICAgICBzdGF0dXMsIGNtZFN0YXR1cyk7CisgICAgICAgICBFZmZlY3RSZWxlYXNlKG1Eb3dubWl4SGFuZGxlKTsKKyAgICAgICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorICAgICBBTE9HVigiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBkb3dubWl4IHR5cGUgc2V0IHRvICVkIiwgKGludCkgZG93bm1peFR5cGUpOworfQorCitEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6fkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkKK3sKKyAgICBBTE9HVigifkRvd25taXhlckJ1ZmZlclByb3ZpZGVyICglcCkiLCB0aGlzKTsKKyAgICBFZmZlY3RSZWxlYXNlKG1Eb3dubWl4SGFuZGxlKTsKKyAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7Cit9CisKK3ZvaWQgRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpCit7CisgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXM7CisgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdyA9IGNvbnN0X2Nhc3Q8dm9pZCAqPihzcmMpOworICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lczsKKyAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdyA9IGRzdDsKKyAgICAvLyBtYXkgYmUgaW4tcGxhY2UgaWYgc3JjID09IGRzdC4KKyAgICBzdGF0dXNfdCByZXMgPSAoKm1Eb3dubWl4SGFuZGxlKS0+cHJvY2VzcyhtRG93bm1peEhhbmRsZSwKKyAgICAgICAgICAgICZtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIsICZtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYnVmZmVyKTsKKyAgICBBTE9HRV9JRihyZXMgIT0gT0ssICJEb3dubWl4QnVmZmVyUHJvdmlkZXIgZXJyb3IgJWQiLCByZXMpOworfQorCisvKiBjYWxsIG9uY2UgaW4gYSBwdGhyZWFkX29uY2UgaGFuZGxlci4gKi8KKy8qc3RhdGljKi8gc3RhdHVzX3QgRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmluaXQoKQoreworICAgIC8vIGZpbmQgbXVsdGljaGFubmVsIGRvd25taXggZWZmZWN0IGlmIHdlIGhhdmUgdG8gcGxheSBtdWx0aWNoYW5uZWwgY29udGVudAorICAgIHVpbnQzMl90IG51bUVmZmVjdHMgPSAwOworICAgIGludCByZXQgPSBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoJm51bUVmZmVjdHMpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBBTE9HRSgiQXVkaW9NaXhlcigpIGVycm9yICVkIHF1ZXJ5aW5nIG51bWJlciBvZiBlZmZlY3RzIiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEFMT0dWKCJFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoKSBudW1FZmZlY3RzPSVkIiwgbnVtRWZmZWN0cyk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwIDsgaSA8IG51bUVmZmVjdHMgOyBpKyspIHsKKyAgICAgICAgaWYgKEVmZmVjdFF1ZXJ5RWZmZWN0KGksICZzRHdubUZ4RGVzYykgPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoImVmZmVjdCAlZCBpcyBjYWxsZWQgJXMiLCBpLCBzRHdubUZ4RGVzYy5uYW1lKTsKKyAgICAgICAgICAgIGlmIChtZW1jbXAoJnNEd25tRnhEZXNjLnR5cGUsIEVGRkVDVF9VSUlEX0RPV05NSVgsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBlZmZlY3QgXCIlc1wiIGZyb20gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgc0R3bm1GeERlc2MubmFtZSwgc0R3bm1GeERlc2MuaW1wbGVtZW50b3IpOworICAgICAgICAgICAgICAgIHNJc011bHRpY2hhbm5lbENhcGFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dXX0lGKCFzSXNNdWx0aWNoYW5uZWxDYXBhYmxlLCAidW5hYmxlIHRvIGZpbmQgZG93bm1peCBlZmZlY3QiKTsKKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworLypzdGF0aWMqLyBib29sIERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpzSXNNdWx0aWNoYW5uZWxDYXBhYmxlID0gZmFsc2U7CisvKnN0YXRpYyovIGVmZmVjdF9kZXNjcmlwdG9yX3QgRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OnNEd25tRnhEZXNjOworCitSZW1peEJ1ZmZlclByb3ZpZGVyOjpSZW1peEJ1ZmZlclByb3ZpZGVyKGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6CisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkKKyAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soaW5wdXRDaGFubmVsTWFzayksCisgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG91dHB1dENoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgICAgICBidWZmZXJGcmFtZUNvdW50KSwKKyAgICAgICAgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICBtU2FtcGxlU2l6ZShhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpLAorICAgICAgICBtSW5wdXRDaGFubmVscyhhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soaW5wdXRDaGFubmVsTWFzaykpLAorICAgICAgICBtT3V0cHV0Q2hhbm5lbHMoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG91dHB1dENoYW5uZWxNYXNrKSkKK3sKKyAgICBBTE9HVigiUmVtaXhCdWZmZXJQcm92aWRlciglcCkoJSN4LCAlI3gsICUjeCkgJXp1ICV6dSIsCisgICAgICAgICAgICB0aGlzLCBmb3JtYXQsIGlucHV0Q2hhbm5lbE1hc2ssIG91dHB1dENoYW5uZWxNYXNrLAorICAgICAgICAgICAgbUlucHV0Q2hhbm5lbHMsIG1PdXRwdXRDaGFubmVscyk7CisgICAgKHZvaWQpIG1lbWNweV9ieV9pbmRleF9hcnJheV9pbml0aWFsaXphdGlvbl9mcm9tX2NoYW5uZWxfbWFzaygKKyAgICAgICAgICAgIG1JZHhBcnksIEFSUkFZX1NJWkUobUlkeEFyeSksIG91dHB1dENoYW5uZWxNYXNrLCBpbnB1dENoYW5uZWxNYXNrKTsKK30KKwordm9pZCBSZW1peEJ1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQoreworICAgIG1lbWNweV9ieV9pbmRleF9hcnJheShkc3QsIG1PdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgIHNyYywgbUlucHV0Q2hhbm5lbHMsIG1JZHhBcnksIG1TYW1wbGVTaXplLCBmcmFtZXMpOworfQorCitSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOjpSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKGludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBpbnB1dEZvcm1hdCwgYXVkaW9fZm9ybWF0X3Qgb3V0cHV0Rm9ybWF0LAorICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgorICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShpbnB1dEZvcm1hdCksCisgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShvdXRwdXRGb3JtYXQpLAorICAgICAgICAgICAgICAgIGJ1ZmZlckZyYW1lQ291bnQpLAorICAgICAgICBtQ2hhbm5lbENvdW50KGNoYW5uZWxDb3VudCksCisgICAgICAgIG1JbnB1dEZvcm1hdChpbnB1dEZvcm1hdCksCisgICAgICAgIG1PdXRwdXRGb3JtYXQob3V0cHV0Rm9ybWF0KQoreworICAgIEFMT0dWKCJSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKCVwKSgldSwgJSN4LCAlI3gpIiwKKyAgICAgICAgICAgIHRoaXMsIGNoYW5uZWxDb3VudCwgaW5wdXRGb3JtYXQsIG91dHB1dEZvcm1hdCk7Cit9CisKK3ZvaWQgUmVmb3JtYXRCdWZmZXJQcm92aWRlcjo6Y29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGRzdCwgbU91dHB1dEZvcm1hdCwgc3JjLCBtSW5wdXRGb3JtYXQsIGZyYW1lcyAqIG1DaGFubmVsQ291bnQpOworfQorCitUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOjpUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyKGludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIHVpbnQzMl90IHNhbXBsZVJhdGUsIGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpIDoKKyAgICAgICAgbUNoYW5uZWxDb3VudChjaGFubmVsQ291bnQpLAorICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLAorICAgICAgICBtRnJhbWVTaXplKGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSksCisgICAgICAgIG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQoMCksCisgICAgICAgIG1Mb2NhbEJ1ZmZlckRhdGEoTlVMTCksCisgICAgICAgIG1SZW1haW5pbmcoMCksCisgICAgICAgIG1Tb25pY1N0cmVhbShzb25pY0NyZWF0ZVN0cmVhbShzYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50KSksCisgICAgICAgIG1GYWxsYmFja0ZhaWxFcnJvclNob3duKGZhbHNlKSwKKyAgICAgICAgbUF1ZGlvUGxheWJhY2tSYXRlVmFsaWQoZmFsc2UpCit7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtU29uaWNTdHJlYW0gPT0gTlVMTCwKKyAgICAgICAgICAgICJUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyIGNhbid0IGFsbG9jYXRlIFNvbmljIHN0cmVhbSIpOworCisgICAgc2V0UGxheWJhY2tSYXRlKHBsYXliYWNrUmF0ZSk7CisgICAgQUxPR1YoIlRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIoJXApKCV1LCAlI3gsICV1ICVmICVmICVkICVkKSIsCisgICAgICAgICAgICB0aGlzLCBjaGFubmVsQ291bnQsIGZvcm1hdCwgc2FtcGxlUmF0ZSwgcGxheWJhY2tSYXRlLm1TcGVlZCwKKyAgICAgICAgICAgIHBsYXliYWNrUmF0ZS5tUGl0Y2gsIHBsYXliYWNrUmF0ZS5tU3RyZXRjaE1vZGUsIHBsYXliYWNrUmF0ZS5tRmFsbGJhY2tNb2RlKTsKKyAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSAwOworfQorCitUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOjp+VGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcigpCit7CisgICAgQUxPR1YoIn5UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyKCVwKSIsIHRoaXMpOworICAgIHNvbmljRGVzdHJveVN0cmVhbShtU29uaWNTdHJlYW0pOworICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgIT0gMCkgeworICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CisgICAgfQorICAgIGZyZWUobUxvY2FsQnVmZmVyRGF0YSk7Cit9CisKK3N0YXR1c190IFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlciwgaW50NjRfdCBwdHMpCit7CisgICAgQUxPR1YoIlRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIoJXApOjpnZXROZXh0QnVmZmVyKCVwICglenUpLCAlbGxkKSIsCisgICAgICAgICAgICB0aGlzLCBwQnVmZmVyLCBwQnVmZmVyLT5mcmFtZUNvdW50LCBwdHMpOworCisgICAgLy8gQllQQVNTCisgICAgLy9yZXR1cm4gbVRyYWNrQnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIocEJ1ZmZlciwgcHRzKTsKKworICAgIC8vIGNoZWNrIGlmIHByZXZpb3VzbHkgcHJvY2Vzc2VkIGRhdGEgaXMgc3VmZmljaWVudC4KKyAgICBpZiAocEJ1ZmZlci0+ZnJhbWVDb3VudCA8PSBtUmVtYWluaW5nKSB7CisgICAgICAgIEFMT0dWKCJwcmV2aW91cyBzdWZmaWNpZW50Iik7CisgICAgICAgIHBCdWZmZXItPnJhdyA9IG1Mb2NhbEJ1ZmZlckRhdGE7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyBkbyB3ZSBuZWVkIHRvIHJlc2l6ZSBvdXIgYnVmZmVyPworICAgIGlmIChwQnVmZmVyLT5mcmFtZUNvdW50ID4gbUxvY2FsQnVmZmVyRnJhbWVDb3VudCkgeworICAgICAgICB2b2lkICpuZXdtZW07CisgICAgICAgIGlmIChwb3NpeF9tZW1hbGlnbigmbmV3bWVtLCAzMiwgcEJ1ZmZlci0+ZnJhbWVDb3VudCAqIG1GcmFtZVNpemUpID09IE9LKSB7CisgICAgICAgICAgICBpZiAobVJlbWFpbmluZyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG5ld21lbSwgbUxvY2FsQnVmZmVyRGF0YSwgbVJlbWFpbmluZyAqIG1GcmFtZVNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShtTG9jYWxCdWZmZXJEYXRhKTsKKyAgICAgICAgICAgIG1Mb2NhbEJ1ZmZlckRhdGEgPSBuZXdtZW07CisgICAgICAgICAgICBtTG9jYWxCdWZmZXJGcmFtZUNvdW50ID0gcEJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIG5lZWQgdG8gZmV0Y2ggbW9yZSBkYXRhCisgICAgY29uc3Qgc2l6ZV90IG91dHB1dERlc2lyZWQgPSBwQnVmZmVyLT5mcmFtZUNvdW50IC0gbVJlbWFpbmluZzsKKyAgICBzaXplX3QgZHN0QXZhaWxhYmxlOworICAgIGRvIHsKKyAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gbVBsYXliYWNrUmF0ZS5tU3BlZWQgPT0gQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTk9STUFMCisgICAgICAgICAgICAgICAgPyBvdXRwdXREZXNpcmVkIDogb3V0cHV0RGVzaXJlZCAqIG1QbGF5YmFja1JhdGUubVNwZWVkICsgMTsKKworICAgICAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2tCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlciwgcHRzKTsKKworICAgICAgICBBTE9HX0FTU0VSVChyZXMgPT0gT0sgfHwgbUJ1ZmZlci5mcmFtZUNvdW50ID09IDApOworICAgICAgICBpZiAocmVzICE9IE9LIHx8IG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSB7IC8vIG5vdCBuZWVkZWQgYnkgQVBJIHNwZWMsIGJ1dCB0byBiZSBzYWZlLgorICAgICAgICAgICAgQUxPR1YoInVwc3RyZWFtIHByb3ZpZGVyIGNhbm5vdCBwcm92aWRlIGRhdGEiKTsKKyAgICAgICAgICAgIGlmIChtUmVtYWluaW5nID09IDApIHsKKyAgICAgICAgICAgICAgICBwQnVmZmVyLT5yYXcgPSBOVUxMOworICAgICAgICAgICAgICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyByZXR1cm4gcGFydGlhbCBjb3VudAorICAgICAgICAgICAgICAgIHBCdWZmZXItPnJhdyA9IG1Mb2NhbEJ1ZmZlckRhdGE7CisgICAgICAgICAgICAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IG1SZW1haW5pbmc7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdGltZS1zdHJldGNoIHRoZSBkYXRhCisgICAgICAgIGRzdEF2YWlsYWJsZSA9IG1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50IC0gbVJlbWFpbmluZywgb3V0cHV0RGVzaXJlZCk7CisgICAgICAgIHNpemVfdCBzcmNBdmFpbGFibGUgPSBtQnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgIHByb2Nlc3NGcmFtZXMoKHVpbnQ4X3QqKW1Mb2NhbEJ1ZmZlckRhdGEgKyBtUmVtYWluaW5nICogbUZyYW1lU2l6ZSwgJmRzdEF2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICBtQnVmZmVyLnJhdywgJnNyY0F2YWlsYWJsZSk7CisKKyAgICAgICAgLy8gcmVsZWFzZSBhbGwgZGF0YSBjb25zdW1lZAorICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBzcmNBdmFpbGFibGU7CisgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKKyAgICB9IHdoaWxlIChkc3RBdmFpbGFibGUgPT0gMCk7IC8vIHRyeSB1bnRpbCB3ZSBnZXQgb3V0cHV0IGRhdGEgb3IgdXBzdHJlYW0gcHJvdmlkZXIgZmFpbHMuCisKKyAgICAvLyB1cGRhdGUgYnVmZmVyIHZhcnMgd2l0aCB0aGUgYWN0dWFsIGRhdGEgcHJvY2Vzc2VkIGFuZCByZXR1cm4gd2l0aCBidWZmZXIKKyAgICBtUmVtYWluaW5nICs9IGRzdEF2YWlsYWJsZTsKKworICAgIHBCdWZmZXItPnJhdyA9IG1Mb2NhbEJ1ZmZlckRhdGE7CisgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IG1SZW1haW5pbmc7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIpCit7CisgICAgQUxPR1YoIlRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIoJXApOjpyZWxlYXNlQnVmZmVyKCVwICglenUpKSIsCisgICAgICAgdGhpcywgcEJ1ZmZlciwgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisKKyAgICAvLyBCWVBBU1MKKyAgICAvL3JldHVybiBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcihwQnVmZmVyKTsKKworICAgIC8vIExPR19BTFdBWVNfRkFUQUxfSUYocEJ1ZmZlci0+ZnJhbWVDb3VudCA9PSAwLCAiSW52YWxpZCBmcmFtZWNvdW50Iik7CisgICAgaWYgKHBCdWZmZXItPmZyYW1lQ291bnQgPCBtUmVtYWluaW5nKSB7CisgICAgICAgIG1lbWNweShtTG9jYWxCdWZmZXJEYXRhLAorICAgICAgICAgICAgICAgICh1aW50OF90KiltTG9jYWxCdWZmZXJEYXRhICsgcEJ1ZmZlci0+ZnJhbWVDb3VudCAqIG1GcmFtZVNpemUsCisgICAgICAgICAgICAgICAgKG1SZW1haW5pbmcgLSBwQnVmZmVyLT5mcmFtZUNvdW50KSAqIG1GcmFtZVNpemUpOworICAgICAgICBtUmVtYWluaW5nIC09IHBCdWZmZXItPmZyYW1lQ291bnQ7CisgICAgfSBlbHNlIGlmIChwQnVmZmVyLT5mcmFtZUNvdW50ID09IG1SZW1haW5pbmcpIHsKKyAgICAgICAgbVJlbWFpbmluZyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiUmVsZWFzaW5nIG1vcmUgZnJhbWVzKCV6dSkgdGhhbiBhdmFpbGFibGUoJXp1KSIsCisgICAgICAgICAgICAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCwgbVJlbWFpbmluZyk7CisgICAgfQorCisgICAgcEJ1ZmZlci0+cmF3ID0gTlVMTDsKKyAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKK30KKwordm9pZCBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOjpyZXNldCgpCit7CisgICAgbVJlbWFpbmluZyA9IDA7Cit9CisKK3N0YXR1c190IFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6OnNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKQoreworICAgIG1QbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7CisgICAgbUZhbGxiYWNrRmFpbEVycm9yU2hvd24gPSBmYWxzZTsKKyAgICBzb25pY1NldFNwZWVkKG1Tb25pY1N0cmVhbSwgbVBsYXliYWNrUmF0ZS5tU3BlZWQpOworICAgIC8vVE9ETzogcGl0Y2ggaXMgaWdub3JlZCBmb3Igbm93CisgICAgLy9UT0RPOiBvcHRpbWl6ZTogaWYgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUsIGRvbid0IGRvIGFueSBleHRyYSBjb21wdXRhdGlvbi4KKworICAgIG1BdWRpb1BsYXliYWNrUmF0ZVZhbGlkID0gaXNBdWRpb1BsYXliYWNrUmF0ZVZhbGlkKG1QbGF5YmFja1JhdGUpOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOjpwcm9jZXNzRnJhbWVzKHZvaWQgKmRzdEJ1ZmZlciwgc2l6ZV90ICpkc3RGcmFtZXMsCisgICAgICAgIGNvbnN0IHZvaWQgKnNyY0J1ZmZlciwgc2l6ZV90ICpzcmNGcmFtZXMpCit7CisgICAgQUxPR1YoInByb2Nlc3NGcmFtZXMoJXp1ICV6dSkgIHJlbWFpbmluZyglenUpIiwgKmRzdEZyYW1lcywgKnNyY0ZyYW1lcywgbVJlbWFpbmluZyk7CisgICAgLy8gTm90ZSBkc3RGcmFtZXMgaXMgdGhlIHJlcXVpcmVkIG51bWJlciBvZiBmcmFtZXMuCisKKyAgICAvLyBFbnN1cmUgY29uc3VtcHRpb24gZnJvbSBzcmMgaXMgYXMgZXhwZWN0ZWQuCisgICAgLy9UT0RPOiBhZGQgbG9naWMgdG8gdHJhY2sgInZlcnkgYWNjdXJhdGUiIGNvbnN1bXB0aW9uIHJlbGF0ZWQgdG8gc3BlZWQsIG9yaWdpbmFsIHNhbXBsaW5nCisgICAgLy9yYXRlLCBhY3R1YWwgZnJhbWVzIHByb2Nlc3NlZC4KKyAgICBjb25zdCBzaXplX3QgdGFyZ2V0U3JjID0gKmRzdEZyYW1lcyAqIG1QbGF5YmFja1JhdGUubVNwZWVkOworICAgIGlmICgqc3JjRnJhbWVzIDwgdGFyZ2V0U3JjKSB7IC8vIGxpbWl0IGRzdCBmcmFtZXMgdG8gdGhhdCBwb3NzaWJsZQorICAgICAgICAqZHN0RnJhbWVzID0gKnNyY0ZyYW1lcyAvIG1QbGF5YmFja1JhdGUubVNwZWVkOworICAgIH0gZWxzZSBpZiAoKnNyY0ZyYW1lcyA+IHRhcmdldFNyYyArIDEpIHsKKyAgICAgICAgKnNyY0ZyYW1lcyA9IHRhcmdldFNyYyArIDE7CisgICAgfQorCisgICAgaWYgKCFtQXVkaW9QbGF5YmFja1JhdGVWYWxpZCkgeworICAgICAgICAvL2ZhbGxiYWNrIG1vZGUKKyAgICAgICAgaWYgKCpkc3RGcmFtZXMgPiAwKSB7CisgICAgICAgICAgICBzd2l0Y2gobVBsYXliYWNrUmF0ZS5tRmFsbGJhY2tNb2RlKSB7CisgICAgICAgICAgICBjYXNlIEFVRElPX1RJTUVTVFJFVENIX0ZBTExCQUNLX0NVVF9SRVBFQVQ6CisgICAgICAgICAgICAgICAgaWYgKCpkc3RGcmFtZXMgPD0gKnNyY0ZyYW1lcykgeworICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3B5U2l6ZSA9IG1GcmFtZVNpemUgKiAqZHN0RnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3RCdWZmZXIsIHNyY0J1ZmZlciwgY29weVNpemUpOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAvLyBjeWNsaWNhbGx5IHJlcGVhdCB0aGUgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGNvdW50ID0gMDsgY291bnQgPCAqZHN0RnJhbWVzOyBjb3VudCArPSAqc3JjRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZW1haW5pbmcgPSBtaW4oKnNyY0ZyYW1lcywgKmRzdEZyYW1lcyAtIGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90Kilkc3RCdWZmZXIgKyBtRnJhbWVTaXplICogY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLCBtRnJhbWVTaXplICogcmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFVRElPX1RJTUVTVFJFVENIX0ZBTExCQUNLX0RFRkFVTFQ6CisgICAgICAgICAgICBjYXNlIEFVRElPX1RJTUVTVFJFVENIX0ZBTExCQUNLX01VVEU6CisgICAgICAgICAgICAgICAgbWVtc2V0KGRzdEJ1ZmZlciwwLCBtRnJhbWVTaXplICogKmRzdEZyYW1lcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFVRElPX1RJTUVTVFJFVENIX0ZBTExCQUNLX0ZBSUw6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmKCFtRmFsbGJhY2tGYWlsRXJyb3JTaG93bikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiaW52YWxpZCBwYXJhbWV0ZXJzIGluIFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgZmFsbGJhY2tNb2RlOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tSYXRlLm1GYWxsYmFja01vZGUpOworICAgICAgICAgICAgICAgICAgICBtRmFsbGJhY2tGYWlsRXJyb3JTaG93biA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChtRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIGlmIChzb25pY1dyaXRlRmxvYXRUb1N0cmVhbShtU29uaWNTdHJlYW0sIChmbG9hdCopc3JjQnVmZmVyLCAqc3JjRnJhbWVzKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInNvbmljV3JpdGVGbG9hdFRvU3RyZWFtIGNhbm5vdCByZWFsbG9jIik7CisgICAgICAgICAgICAgICAgKnNyY0ZyYW1lcyA9IDA7IC8vIGNhbm5vdCBjb25zdW1lIGFsbCBvZiBzcmNCdWZmZXIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkc3RGcmFtZXMgPSBzb25pY1JlYWRGbG9hdEZyb21TdHJlYW0obVNvbmljU3RyZWFtLCAoZmxvYXQqKWRzdEJ1ZmZlciwgKmRzdEZyYW1lcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIGlmIChzb25pY1dyaXRlU2hvcnRUb1N0cmVhbShtU29uaWNTdHJlYW0sIChzaG9ydCopc3JjQnVmZmVyLCAqc3JjRnJhbWVzKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInNvbmljV3JpdGVTaG9ydFRvU3RyZWFtIGNhbm5vdCByZWFsbG9jIik7CisgICAgICAgICAgICAgICAgKnNyY0ZyYW1lcyA9IDA7IC8vIGNhbm5vdCBjb25zdW1lIGFsbCBvZiBzcmNCdWZmZXIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkc3RGcmFtZXMgPSBzb25pY1JlYWRTaG9ydEZyb21TdHJlYW0obVNvbmljU3RyZWFtLCAoc2hvcnQqKWRzdEJ1ZmZlciwgKmRzdEZyYW1lcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIGNvdWxkIGFsc28gYmUgY2F1Z2h0IG9uIGNvbnN0cnVjdGlvbgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiaW52YWxpZCBmb3JtYXQgJSN4IGZvciBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyIiwgbUZvcm1hdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQnVmZmVyUHJvdmlkZXJzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQnVmZmVyUHJvdmlkZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJjODk1YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9CdWZmZXJQcm92aWRlcnMuaApAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9CVUZGRVJfUFJPVklERVJTX0gKKyNkZWZpbmUgQU5EUk9JRF9CVUZGRVJfUFJPVklERVJTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHNvbmljLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyIDogcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXIgeworcHVibGljOgorICAgIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIoKSA6IG1UcmFja0J1ZmZlclByb3ZpZGVyKE5VTEwpIHsgfQorCisgICAgdmlydHVhbCB+UGFzc3RocnVCdWZmZXJQcm92aWRlcigpIHsgfQorCisgICAgLy8gY2FsbCB0aGlzIHRvIHJlbGVhc2UgdGhlIGJ1ZmZlciB0byB0aGUgdXBzdHJlYW0gcHJvdmlkZXIuCisgICAgLy8gdHJlYXQgaXQgYXMgYW4gYXVkaW8gZGlzY29udGludWl0eSBmb3IgZnV0dXJlIHNhbXBsZXMuCisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCkgeyB9CisKKyAgICAvLyBzZXQgdGhlIHVwc3RyZWFtIGJ1ZmZlciBwcm92aWRlci4gQ29uc2lkZXIgY2FsbGluZyAicmVzZXQiIGJlZm9yZSB0aGlzIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBzZXRCdWZmZXJQcm92aWRlcihBdWRpb0J1ZmZlclByb3ZpZGVyICpwKSB7CisgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyID0gcDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBBdWRpb0J1ZmZlclByb3ZpZGVyICptVHJhY2tCdWZmZXJQcm92aWRlcjsKK307CisKKy8vIEJhc2UgQXVkaW9CdWZmZXJQcm92aWRlciBjbGFzcyB1c2VkIGZvciBEb3duTWl4ZXJCdWZmZXJQcm92aWRlciwgUmVtaXhCdWZmZXJQcm92aWRlciwKKy8vIGFuZCBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLgorLy8gSXQgaGFuZGxlcyBhIHByaXZhdGUgYnVmZmVyIGZvciB1c2UgaW4gY29udmVydGluZyBmb3JtYXQgb3IgY2hhbm5lbCBtYXNrcyBmcm9tIHRoZQorLy8gaW5wdXQgZGF0YSB0byBhIGZvcm0gYWNjZXB0YWJsZSBieSB0aGUgbWl4ZXIuCisvLyBUT0RPOiBNYWtlIGEgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgd2hlbiBpbnRlZ2VycyBhcmUgZW50aXJlbHkgcmVtb3ZlZCBmcm9tIHRoZQorLy8gcHJvY2Vzc2luZyBwaXBlbGluZS4KK2NsYXNzIENvcHlCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICAvLyBVc2UgYSBwcml2YXRlIGJ1ZmZlciBvZiBidWZmZXJGcmFtZUNvdW50IGZyYW1lcyAoZWFjaCBmcmFtZSBpcyBvdXRwdXRGcmFtZVNpemUgYnl0ZXMpLgorICAgIC8vIElmIGJ1ZmZlckZyYW1lQ291bnQgaXMgMCwgbm8gcHJpdmF0ZSBidWZmZXIgaXMgY3JlYXRlZCBhbmQgaW4tcGxhY2UgbW9kaWZpY2F0aW9uIG9mCisgICAgLy8gdGhlIHVwc3RyZWFtIGJ1ZmZlciBwcm92aWRlcidzIGJ1ZmZlcnMgaXMgcGVyZm9ybWVkIGJ5IGNvcHlGcmFtZXMoKS4KKyAgICBDb3B5QnVmZmVyUHJvdmlkZXIoc2l6ZV90IGlucHV0RnJhbWVTaXplLCBzaXplX3Qgb3V0cHV0RnJhbWVTaXplLAorICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpOworICAgIHZpcnR1YWwgfkNvcHlCdWZmZXJQcm92aWRlcigpOworCisgICAgLy8gT3ZlcnJpZGVzIEF1ZGlvQnVmZmVyUHJvdmlkZXIgbWV0aG9kcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIgKmJ1ZmZlciwgaW50NjRfdCBwdHMpOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEJ1ZmZlciAqYnVmZmVyKTsKKworICAgIC8vIE92ZXJyaWRlcyBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyCisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBzdXBwbGllZCBieSB0aGUgZGVyaXZlZCBjbGFzcy4gIEl0IGNvbnZlcnRzCisgICAgLy8gI2ZyYW1lcyBpbiB0aGUgKnNyYyBwb2ludGVyIHRvIHRoZSAqZHN0IHBvaW50ZXIuICBJdCBpcyBwdWJsaWMgYmVjYXVzZQorICAgIC8vIHNvbWUgcHJvdmlkZXJzIHdpbGwgYWxsb3cgdGhpcyB0byB3b3JrIG9uIGFyYml0cmFyeSBidWZmZXJzIG91dHNpZGUKKyAgICAvLyBvZiB0aGUgaW50ZXJuYWwgYnVmZmVycy4KKyAgICB2aXJ0dWFsIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUlucHV0RnJhbWVTaXplOworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1PdXRwdXRGcmFtZVNpemU7Citwcml2YXRlOgorICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBtQnVmZmVyOworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAqbUxvY2FsQnVmZmVyRGF0YTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICBtQ29uc3VtZWQ7Cit9OworCisvLyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciBkZXJpdmVzIGZyb20gQ29weUJ1ZmZlclByb3ZpZGVyIHRvIHByb3ZpZGUKKy8vIHBvc2l0aW9uIGRlcGVuZGVudCBkb3dubWl4aW5nIGJ5IGFuIEF1ZGlvIEVmZmVjdC4KK2NsYXNzIERvd25taXhlckJ1ZmZlclByb3ZpZGVyIDogcHVibGljIENvcHlCdWZmZXJQcm92aWRlciB7CitwdWJsaWM6CisgICAgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IHNlc3Npb25JZCwgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpOworICAgIHZpcnR1YWwgfkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCk7CisgICAgLy9PdmVycmlkZXMKKyAgICB2aXJ0dWFsIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcyk7CisKKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtRG93bm1peEhhbmRsZSAhPSBOVUxMOyB9CisgICAgc3RhdGljIHN0YXR1c190IGluaXQoKTsKKyAgICBzdGF0aWMgYm9vbCBpc011bHRpY2hhbm5lbENhcGFibGUoKSB7IHJldHVybiBzSXNNdWx0aWNoYW5uZWxDYXBhYmxlOyB9CisKK3Byb3RlY3RlZDoKKyAgICBlZmZlY3RfaGFuZGxlX3QgICAgbURvd25taXhIYW5kbGU7CisgICAgZWZmZWN0X2NvbmZpZ190ICAgIG1Eb3dubWl4Q29uZmlnOworCisgICAgLy8gZWZmZWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBkb3dubWl4ZXIgdXNlZCBieSB0aGUgbWl4ZXIKKyAgICBzdGF0aWMgZWZmZWN0X2Rlc2NyaXB0b3JfdCBzRHdubUZ4RGVzYzsKKyAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciBhIGRvd25taXggZWZmZWN0IGhhcyBiZWVuIGZvdW5kIGFuZCBpcyB1c2FibGUgYnkgdGhpcyBtaXhlcgorICAgIHN0YXRpYyBib29sICAgICAgICAgICAgICAgIHNJc011bHRpY2hhbm5lbENhcGFibGU7CisgICAgLy8gRklYTUU6IHNob3VsZCB3ZSBhbGxvdyBlZmZlY3RzIG91dHNpZGUgb2YgdGhlIGZyYW1ld29yaz8KKyAgICAvLyBXZSBuZWVkIHRvIGhlcmUuIEEgc3BlY2lhbCBpb0lkIHRoYXQgbXVzdCBiZSA8PSAtMiBzbyBpdCBkb2VzIG5vdCBtYXAgdG8gYSBzZXNzaW9uLgorICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IFNFU1NJT05fSURfSU5WQUxJRF9BTkRfSUdOT1JFRCA9IC0yOworfTsKKworLy8gUmVtaXhCdWZmZXJQcm92aWRlciBkZXJpdmVzIGZyb20gQ29weUJ1ZmZlclByb3ZpZGVyIHRvIHBlcmZvcm0gYW4KKy8vIHVwbWl4IG9yIGRvd25taXggdG8gdGhlIHByb3BlciBjaGFubmVsIGNvdW50IGFuZCBtYXNrLgorY2xhc3MgUmVtaXhCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBDb3B5QnVmZmVyUHJvdmlkZXIgeworcHVibGljOgorICAgIFJlbWl4QnVmZmVyUHJvdmlkZXIoYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCk7CisgICAgLy9PdmVycmlkZXMKKyAgICB2aXJ0dWFsIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcyk7CisKK3Byb3RlY3RlZDoKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1TYW1wbGVTaXplOworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1JbnB1dENoYW5uZWxzOworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1PdXRwdXRDaGFubmVsczsKKyAgICBpbnQ4X3QgICAgICAgICAgICAgICBtSWR4QXJ5W3NpemVvZih1aW50MzJfdCkgKiA4XTsgLy8gMzIgYml0cyA9PiBjaGFubmVsIGluZGljZXMKK307CisKKy8vIFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgZGVyaXZlcyBmcm9tIENvcHlCdWZmZXJQcm92aWRlciB0byBjb252ZXJ0IHRoZSBpbnB1dCBkYXRhCisvLyB0byBhbiBhY2NlcHRhYmxlIG1peGVyIGlucHV0IGZvcm1hdCB0eXBlLgorY2xhc3MgUmVmb3JtYXRCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBDb3B5QnVmZmVyUHJvdmlkZXIgeworcHVibGljOgorICAgIFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoaW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBpbnB1dEZvcm1hdCwgYXVkaW9fZm9ybWF0X3Qgb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpOworICAgIHZpcnR1YWwgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKTsKKworcHJvdGVjdGVkOgorICAgIGNvbnN0IHVpbnQzMl90ICAgICAgIG1DaGFubmVsQ291bnQ7CisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbUlucHV0Rm9ybWF0OworICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1PdXRwdXRGb3JtYXQ7Cit9OworCisvLyBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyIGRlcml2ZXMgZnJvbSBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyIGZvciB0aW1lIHN0cmV0Y2hpbmcKK2NsYXNzIFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgUGFzc3RocnVCdWZmZXJQcm92aWRlciB7CitwdWJsaWM6CisgICAgVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcihpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpOworICAgIHZpcnR1YWwgflRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIoKTsKKworICAgIC8vIE92ZXJyaWRlcyBBdWRpb0J1ZmZlclByb3ZpZGVyIG1ldGhvZHMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcik7CisKKyAgICAvLyBPdmVycmlkZXMgUGFzc3RocnVCdWZmZXJQcm92aWRlcgorICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSk7CisKKyAgICAvLyBwcm9jZXNzZXMgZnJhbWVzCisgICAgLy8gZHN0QnVmZmVyIGlzIHdoZXJlIHRvIHBsYWNlIHRoZSBkYXRhCisgICAgLy8gZHN0RnJhbWVzIFtpbi9vdXRdIGlzIHRoZSBkZXNpcmVkIGZyYW1lcyAocmV0dXJuIHdpdGggYWN0dWFsIHBsYWNlZCBpbiBidWZmZXIpCisgICAgLy8gc3JjQnVmZmVyIGlzIHRoZSBzb3VyY2UgZGF0YQorICAgIC8vIHNyY0ZyYW1lcyBbaW4vb3V0XSBpcyB0aGUgYXZhaWxhYmxlIHNvdXJjZSBmcmFtZXMgKHJldHVybiB3aXRoIGNvbnN1bWVkKQorICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzRnJhbWVzKHZvaWQgKmRzdEJ1ZmZlciwgc2l6ZV90ICpkc3RGcmFtZXMsCisgICAgICAgICAgICBjb25zdCB2b2lkICpzcmNCdWZmZXIsIHNpemVfdCAqc3JjRnJhbWVzKTsKKworcHJvdGVjdGVkOgorICAgIGNvbnN0IHVpbnQzMl90ICAgICAgIG1DaGFubmVsQ291bnQ7CisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKKyAgICBjb25zdCB1aW50MzJfdCAgICAgICBtU2FtcGxlUmF0ZTsgLy8gY29uc3QgZm9yIG5vdyAoVE9ETyBjaGFuZ2UgdGhpcykKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtRnJhbWVTaXplOworICAgIEF1ZGlvUGxheWJhY2tSYXRlICAgIG1QbGF5YmFja1JhdGU7CisKK3ByaXZhdGU6CisgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIG1CdWZmZXI7ICAgICAgICAgIC8vIGZvciB1cHN0cmVhbSByZXF1ZXN0CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgbUxvY2FsQnVmZmVyRnJhbWVDb3VudDsgIC8vIHNpemUgb2YgbG9jYWwgYnVmZmVyCisgICAgdm9pZCAgICAgICAgICAgICAgICAqbUxvY2FsQnVmZmVyRGF0YTsgICAgICAgIC8vIGludGVybmFsbHkgYWxsb2NhdGVkIGJ1ZmZlciBmb3IgZGF0YSByZXR1cm5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjYWxsZXIKKyAgICBzaXplX3QgICAgICAgICAgICAgICBtUmVtYWluaW5nOyAgICAgICAgICAgICAgLy8gcmVtYWluaW5nIGRhdGEgaW4gbG9jYWwgYnVmZmVyCisgICAgc29uaWNTdHJlYW0gICAgICAgICAgbVNvbmljU3RyZWFtOyAgICAgICAgICAgIC8vIGhhbmRsZSB0byBzb25pYyB0aW1lc3RyZXRjaCBvYmplY3QKKyAgICAvL0ZJWE1FOiB0aGlzIGRlcGVuZGVuY3kgc2hvdWxkIGJlIGFic3RyYWN0ZWQgb3V0CisgICAgYm9vbCAgICAgICAgICAgICAgICAgbUZhbGxiYWNrRmFpbEVycm9yU2hvd247IC8vIGxvZyBmYWxsYmFjayBlcnJvciBvbmx5IG9uY2UKKyAgICBib29sICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5YmFja1JhdGVWYWxpZDsgLy8gZmxhZyBmb3IgY3VycmVudCBwYXJhbWV0ZXJzIHZhbGlkaXR5Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0JVRkZFUl9QUk9WSURFUlNfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0NvbmZpZ3VyYXRpb24uaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Db25maWd1cmF0aW9uLmgKaW5kZXggNmE4YWViMS4uODQ1Njk3YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0NvbmZpZ3VyYXRpb24uaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQ29uZmlndXJhdGlvbi5oCkBAIC0yOSw5ICsyOSw4IEBACiAvLyB1bmNvbW1lbnQgdG8gZGlzcGxheSBDUFUgbG9hZCBhZGp1c3RlZCBmb3IgQ1BVIGZyZXF1ZW5jeQogLy8jZGVmaW5lIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogCi0vLyB1bmNvbW1lbnQgdG8gZW5hYmxlIGZhc3QgbWl4ZXIgdG8gdGFrZSBwZXJmb3JtYW5jZSBzYW1wbGVzIGZvciBsYXRlciBzdGF0aXN0aWNhbCBhbmFseXNpcwotI2RlZmluZSBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLS8vIEZJWE1FIHJlbmFtZSB0byBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCisvLyB1bmNvbW1lbnQgdG8gZW5hYmxlIGZhc3QgdGhyZWFkcyB0byB0YWtlIHBlcmZvcm1hbmNlIHNhbXBsZXMgZm9yIGxhdGVyIHN0YXRpc3RpY2FsIGFuYWx5c2lzCisjZGVmaW5lIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKIAogLy8gdW5jb21tZW50IGZvciBkZWJ1Z2dpbmcgdGltaW5nIHByb2JsZW1zIHJlbGF0ZWQgdG8gU3RhdGVRdWV1ZTo6cHVzaCgpCiAvLyNkZWZpbmUgU1RBVEVfUVVFVUVfRFVNUApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCmluZGV4IDJkZDZmZjUuLmY4N2I4ZjU3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCkBAIC0zMzUsMTMgKzMzNSwyMSBAQAogCiAgICAgLy8gVE9ETzogaGFuZGxlIGNvbmZpZ3VyYXRpb24gb2YgZWZmZWN0cyByZXBsYWNpbmcgdHJhY2sgcHJvY2VzcwogICAgIGNoYW5uZWxNYXNrID0gdGhyZWFkLT5jaGFubmVsTWFzaygpOworICAgIG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbE1hc2s7CiAKICAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewogICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTzsKICAgICB9IGVsc2UgewogICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbE1hc2s7CisgICAgICAgIC8vIFRPRE86IFVwZGF0ZSB0aGlzIGxvZ2ljIHdoZW4gbXVsdGljaGFubmVsIGVmZmVjdHMgYXJlIGltcGxlbWVudGVkLgorICAgICAgICAvLyBGb3Igb2ZmbG9hZGVkIHRyYWNrcyBjb25zaWRlciBtb25vIG91dHB1dCBhcyBzdGVyZW8gZm9yIHByb3BlciBlZmZlY3QgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgaWYgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pIHsKKyAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICAgICAgICAgIEFMT0dWKCJPdmVycmlkaW5nIGVmZmVjdCBpbnB1dCBhbmQgb3V0cHV0IGFzIFNURVJFTyIpOworICAgICAgICB9CiAgICAgfQotICAgIG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbE1hc2s7CisKICAgICBtQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIG1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gdGhyZWFkLT5zYW1wbGVSYXRlKCk7CkBAIC0xOTgyLDQgKzE5OTAsNCBAQAogICAgIH0KIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCmluZGV4IDk2MTNlMjYuLjFiYmE1ZjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcApAQCAtMjksMTggKzI5LDE4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLypzdGF0aWMqLyBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlIEZhc3RDYXB0dXJlOjppbml0aWFsOworLypzdGF0aWMqLyBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlIEZhc3RDYXB0dXJlOjpzSW5pdGlhbDsKIAogRmFzdENhcHR1cmU6OkZhc3RDYXB0dXJlKCkgOiBGYXN0VGhyZWFkKCksCi0gICAgaW5wdXRTb3VyY2UoTlVMTCksIGlucHV0U291cmNlR2VuKDApLCBwaXBlU2luayhOVUxMKSwgcGlwZVNpbmtHZW4oMCksCi0gICAgcmVhZEJ1ZmZlcihOVUxMKSwgcmVhZEJ1ZmZlclN0YXRlKC0xKSwgZm9ybWF0KEZvcm1hdF9JbnZhbGlkKSwgc2FtcGxlUmF0ZSgwKSwKLSAgICAvLyBkdW1teUR1bXBTdGF0ZQotICAgIHRvdGFsTmF0aXZlRnJhbWVzUmVhZCgwKQorICAgIG1JbnB1dFNvdXJjZShOVUxMKSwgbUlucHV0U291cmNlR2VuKDApLCBtUGlwZVNpbmsoTlVMTCksIG1QaXBlU2lua0dlbigwKSwKKyAgICBtUmVhZEJ1ZmZlcihOVUxMKSwgbVJlYWRCdWZmZXJTdGF0ZSgtMSksIG1Gb3JtYXQoRm9ybWF0X0ludmFsaWQpLCBtU2FtcGxlUmF0ZSgwKSwKKyAgICAvLyBtRHVtbXlEdW1wU3RhdGUKKyAgICBtVG90YWxOYXRpdmVGcmFtZXNSZWFkKDApCiB7Ci0gICAgcHJldmlvdXMgPSAmaW5pdGlhbDsKLSAgICBjdXJyZW50ID0gJmluaXRpYWw7CisgICAgbVByZXZpb3VzID0gJnNJbml0aWFsOworICAgIG1DdXJyZW50ID0gJnNJbml0aWFsOwogCi0gICAgbUR1bW15RHVtcFN0YXRlID0gJmR1bW15RHVtcFN0YXRlOworICAgIG1EdW1teUR1bXBTdGF0ZSA9ICZtRHVtbXlGYXN0Q2FwdHVyZUR1bXBTdGF0ZTsKIH0KIAogRmFzdENhcHR1cmU6On5GYXN0Q2FwdHVyZSgpCkBAIC02MywxMyArNjMsMTMgQEAKIAogdm9pZCBGYXN0Q2FwdHVyZTo6b25JZGxlKCkKIHsKLSAgICBwcmVJZGxlID0gKihjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICopY3VycmVudDsKLSAgICBjdXJyZW50ID0gJnByZUlkbGU7CisgICAgbVByZUlkbGUgPSAqKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiltQ3VycmVudDsKKyAgICBtQ3VycmVudCA9ICZtUHJlSWRsZTsKIH0KIAogdm9pZCBGYXN0Q2FwdHVyZTo6b25FeGl0KCkKIHsKLSAgICBkZWxldGVbXSByZWFkQnVmZmVyOworICAgIGZyZWUobVJlYWRCdWZmZXIpOwogfQogCiBib29sIEZhc3RDYXB0dXJlOjppc1N1YkNsYXNzQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgY29tbWFuZCkKQEAgLTg2LDY4ICs4Niw2OSBAQAogCiB2b2lkIEZhc3RDYXB0dXJlOjpvblN0YXRlQ2hhbmdlKCkKIHsKLSAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICopIHRoaXMtPmN1cnJlbnQ7Ci0gICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqIGNvbnN0IHByZXZpb3VzID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgdGhpcy0+cHJldmlvdXM7Ci0gICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdENhcHR1cmVEdW1wU3RhdGUgKikgdGhpcy0+ZHVtcFN0YXRlOworICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgbUN1cnJlbnQ7CisgICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqIGNvbnN0IHByZXZpb3VzID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgbVByZXZpb3VzOworICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RDYXB0dXJlRHVtcFN0YXRlICopIG1EdW1wU3RhdGU7CiAgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBjdXJyZW50LT5tRnJhbWVDb3VudDsKIAogICAgIGJvb2wgZWl0aGVyQ2hhbmdlZCA9IGZhbHNlOwogCiAgICAgLy8gY2hlY2sgZm9yIGNoYW5nZSBpbiBpbnB1dCBIQUwgY29uZmlndXJhdGlvbgotICAgIE5CQUlPX0Zvcm1hdCBwcmV2aW91c0Zvcm1hdCA9IGZvcm1hdDsKLSAgICBpZiAoY3VycmVudC0+bUlucHV0U291cmNlR2VuICE9IGlucHV0U291cmNlR2VuKSB7Ci0gICAgICAgIGlucHV0U291cmNlID0gY3VycmVudC0+bUlucHV0U291cmNlOwotICAgICAgICBpbnB1dFNvdXJjZUdlbiA9IGN1cnJlbnQtPm1JbnB1dFNvdXJjZUdlbjsKLSAgICAgICAgaWYgKGlucHV0U291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOwotICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IDA7CisgICAgTkJBSU9fRm9ybWF0IHByZXZpb3VzRm9ybWF0ID0gbUZvcm1hdDsKKyAgICBpZiAoY3VycmVudC0+bUlucHV0U291cmNlR2VuICE9IG1JbnB1dFNvdXJjZUdlbikgeworICAgICAgICBtSW5wdXRTb3VyY2UgPSBjdXJyZW50LT5tSW5wdXRTb3VyY2U7CisgICAgICAgIG1JbnB1dFNvdXJjZUdlbiA9IGN1cnJlbnQtPm1JbnB1dFNvdXJjZUdlbjsKKyAgICAgICAgaWYgKG1JbnB1dFNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBtRm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7CisgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IDA7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3JtYXQgPSBpbnB1dFNvdXJjZS0+Zm9ybWF0KCk7Ci0gICAgICAgICAgICBzYW1wbGVSYXRlID0gRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGNoYW5uZWxDb3VudCA9PSAxIHx8IGNoYW5uZWxDb3VudCA9PSAyKTsKKyAgICAgICAgICAgIG1Gb3JtYXQgPSBtSW5wdXRTb3VyY2UtPmZvcm1hdCgpOworICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBGb3JtYXRfc2FtcGxlUmF0ZShtRm9ybWF0KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQobUZvcm1hdCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChjaGFubmVsQ291bnQgPj0gMSAmJiBjaGFubmVsQ291bnQgPD0gRkNDXzgpOwogICAgICAgICB9Ci0gICAgICAgIGR1bXBTdGF0ZS0+bVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgICAgICBkdW1wU3RhdGUtPm1TYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgICAgIGVpdGhlckNoYW5nZWQgPSB0cnVlOwogICAgIH0KIAogICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgaW4gcGlwZQotICAgIGlmIChjdXJyZW50LT5tUGlwZVNpbmtHZW4gIT0gcGlwZVNpbmtHZW4pIHsKLSAgICAgICAgcGlwZVNpbmsgPSBjdXJyZW50LT5tUGlwZVNpbms7Ci0gICAgICAgIHBpcGVTaW5rR2VuID0gY3VycmVudC0+bVBpcGVTaW5rR2VuOworICAgIGlmIChjdXJyZW50LT5tUGlwZVNpbmtHZW4gIT0gbVBpcGVTaW5rR2VuKSB7CisgICAgICAgIG1QaXBlU2luayA9IGN1cnJlbnQtPm1QaXBlU2luazsKKyAgICAgICAgbVBpcGVTaW5rR2VuID0gY3VycmVudC0+bVBpcGVTaW5rR2VuOwogICAgICAgICBlaXRoZXJDaGFuZ2VkID0gdHJ1ZTsKICAgICB9CiAKICAgICAvLyBpbnB1dCBzb3VyY2UgYW5kIHBpcGUgc2luayBtdXN0IGJlIGNvbXBhdGlibGUKLSAgICBpZiAoZWl0aGVyQ2hhbmdlZCAmJiBpbnB1dFNvdXJjZSAhPSBOVUxMICYmIHBpcGVTaW5rICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR19BU1NFUlQoRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBwaXBlU2luay0+Zm9ybWF0KCkpKTsKKyAgICBpZiAoZWl0aGVyQ2hhbmdlZCAmJiBtSW5wdXRTb3VyY2UgIT0gTlVMTCAmJiBtUGlwZVNpbmsgIT0gTlVMTCkgeworICAgICAgICBBTE9HX0FTU0VSVChGb3JtYXRfaXNFcXVhbChtRm9ybWF0LCBtUGlwZVNpbmstPmZvcm1hdCgpKSk7CiAgICAgfQogCi0gICAgaWYgKCghRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBwcmV2aW91c0Zvcm1hdCkpIHx8IChmcmFtZUNvdW50ICE9IHByZXZpb3VzLT5tRnJhbWVDb3VudCkpIHsKLSAgICAgICAgLy8gRklYTUUgdG8gYXZvaWQgcHJpb3JpdHkgaW52ZXJzaW9uLCBkb24ndCBkZWxldGUgaGVyZQotICAgICAgICBkZWxldGVbXSByZWFkQnVmZmVyOwotICAgICAgICByZWFkQnVmZmVyID0gTlVMTDsKLSAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwICYmIHNhbXBsZVJhdGUgPiAwKSB7CisgICAgaWYgKCghRm9ybWF0X2lzRXF1YWwobUZvcm1hdCwgcHJldmlvdXNGb3JtYXQpKSB8fCAoZnJhbWVDb3VudCAhPSBwcmV2aW91cy0+bUZyYW1lQ291bnQpKSB7CisgICAgICAgIC8vIEZJWE1FIHRvIGF2b2lkIHByaW9yaXR5IGludmVyc2lvbiwgZG9uJ3QgZnJlZSBoZXJlCisgICAgICAgIGZyZWUobVJlYWRCdWZmZXIpOworICAgICAgICBtUmVhZEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCAmJiBtU2FtcGxlUmF0ZSA+IDApIHsKICAgICAgICAgICAgIC8vIEZJWE1FIG5ldyBtYXkgYmxvY2sgZm9yIHVuYm91bmRlZCB0aW1lIGF0IGludGVybmFsIG11dGV4IG9mIHRoZSBoZWFwCiAgICAgICAgICAgICAvLyAgICAgICBpbXBsZW1lbnRhdGlvbjsgaXQgd291bGQgYmUgYmV0dGVyIHRvIGhhdmUgbm9ybWFsIGNhcHR1cmUgdGhyZWFkIGFsbG9jYXRlIGZvcgogICAgICAgICAgICAgLy8gICAgICAgdXMgdG8gYXZvaWQgYmxvY2tpbmcgaGVyZSBhbmQgdG8gcHJldmVudCBwb3NzaWJsZSBwcmlvcml0eSBpbnZlcnNpb24KLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKLSAgICAgICAgICAgIC8vIEZJWE1FIGZyYW1lU2l6ZQotICAgICAgICAgICAgcmVhZEJ1ZmZlciA9IG5ldyBzaG9ydFtmcmFtZUNvdW50ICogY2hhbm5lbENvdW50XTsKLSAgICAgICAgICAgIG1lbXNldChyZWFkQnVmZmVyLCAwLCBmcmFtZUNvdW50ICogY2hhbm5lbENvdW50ICogc2l6ZW9mKHJlYWRCdWZmZXJbMF0pKTsKLSAgICAgICAgICAgIHBlcmlvZE5zID0gKGZyYW1lQ291bnQgKiAxMDAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMS4wMAotICAgICAgICAgICAgdW5kZXJydW5OcyA9IChmcmFtZUNvdW50ICogMTc1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAvLyAxLjc1Ci0gICAgICAgICAgICBvdmVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgIC8vIDAuNTAKLSAgICAgICAgICAgIGZvcmNlTnMgPSAoZnJhbWVDb3VudCAqIDk1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAgLy8gMC45NQotICAgICAgICAgICAgd2FybXVwTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAvLyAwLjUwCisgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IGZyYW1lQ291bnQgKiBGb3JtYXRfZnJhbWVTaXplKG1Gb3JtYXQpOworICAgICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1SZWFkQnVmZmVyLCAzMiwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBtZW1zZXQobVJlYWRCdWZmZXIsIDAsIGJ1ZmZlclNpemUpOyAvLyBpZiBwb3NpeF9tZW1hbGlnbiBmYWlscywgd2lsbCBzZWd2IGhlcmUuCisgICAgICAgICAgICBtUGVyaW9kTnMgPSAoZnJhbWVDb3VudCAqIDEwMDAwMDAwMDBMTCkgLyBtU2FtcGxlUmF0ZTsgICAgICAvLyAxLjAwCisgICAgICAgICAgICBtVW5kZXJydW5OcyA9IChmcmFtZUNvdW50ICogMTc1MDAwMDAwMExMKSAvIG1TYW1wbGVSYXRlOyAgICAvLyAxLjc1CisgICAgICAgICAgICBtT3ZlcnJ1bk5zID0gKGZyYW1lQ291bnQgKiA1MDAwMDAwMDBMTCkgLyBtU2FtcGxlUmF0ZTsgICAgICAvLyAwLjUwCisgICAgICAgICAgICBtRm9yY2VOcyA9IChmcmFtZUNvdW50ICogOTUwMDAwMDAwTEwpIC8gbVNhbXBsZVJhdGU7ICAgICAgICAvLyAwLjk1CisgICAgICAgICAgICBtV2FybXVwTnNNaW4gPSAoZnJhbWVDb3VudCAqIDc1MDAwMDAwMExMKSAvIG1TYW1wbGVSYXRlOyAgICAvLyAwLjc1CisgICAgICAgICAgICBtV2FybXVwTnNNYXggPSAoZnJhbWVDb3VudCAqIDEyNTAwMDAwMDBMTCkgLyBtU2FtcGxlUmF0ZTsgICAvLyAxLjI1CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwZXJpb2ROcyA9IDA7Ci0gICAgICAgICAgICB1bmRlcnJ1bk5zID0gMDsKLSAgICAgICAgICAgIG92ZXJydW5OcyA9IDA7Ci0gICAgICAgICAgICBmb3JjZU5zID0gMDsKLSAgICAgICAgICAgIHdhcm11cE5zID0gMDsKKyAgICAgICAgICAgIG1QZXJpb2ROcyA9IDA7CisgICAgICAgICAgICBtVW5kZXJydW5OcyA9IDA7CisgICAgICAgICAgICBtT3ZlcnJ1bk5zID0gMDsKKyAgICAgICAgICAgIG1Gb3JjZU5zID0gMDsKKyAgICAgICAgICAgIG1XYXJtdXBOc01pbiA9IDA7CisgICAgICAgICAgICBtV2FybXVwTnNNYXggPSBMT05HX01BWDsKICAgICAgICAgfQotICAgICAgICByZWFkQnVmZmVyU3RhdGUgPSAtMTsKKyAgICAgICAgbVJlYWRCdWZmZXJTdGF0ZSA9IC0xOwogICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKICAgICB9CiAKQEAgLTE1NSw0NCArMTU2LDQzIEBACiAKIHZvaWQgRmFzdENhcHR1cmU6Om9uV29yaygpCiB7Ci0gICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqKSB0aGlzLT5jdXJyZW50OwotICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RDYXB0dXJlRHVtcFN0YXRlICopIHRoaXMtPmR1bXBTdGF0ZTsKLSAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSB0aGlzLT5jb21tYW5kOworICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgbUN1cnJlbnQ7CisgICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdENhcHR1cmVEdW1wU3RhdGUgKikgbUR1bXBTdGF0ZTsKKyAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSBtQ29tbWFuZDsKICAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OwogCiAgICAgaWYgKChjb21tYW5kICYgRmFzdENhcHR1cmVTdGF0ZTo6UkVBRCkgLyomJiBpc1dhcm0qLykgewotICAgICAgICBBTE9HX0FTU0VSVChpbnB1dFNvdXJjZSAhPSBOVUxMKTsKLSAgICAgICAgQUxPR19BU1NFUlQocmVhZEJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgQUxPR19BU1NFUlQobUlucHV0U291cmNlICE9IE5VTEwpOworICAgICAgICBBTE9HX0FTU0VSVChtUmVhZEJ1ZmZlciAhPSBOVUxMKTsKICAgICAgICAgZHVtcFN0YXRlLT5tUmVhZFNlcXVlbmNlKys7CiAgICAgICAgIEFUUkFDRV9CRUdJTigicmVhZCIpOwotICAgICAgICBzc2l6ZV90IGZyYW1lc1JlYWQgPSBpbnB1dFNvdXJjZS0+cmVhZChyZWFkQnVmZmVyLCBmcmFtZUNvdW50LAorICAgICAgICBzc2l6ZV90IGZyYW1lc1JlYWQgPSBtSW5wdXRTb3VyY2UtPnJlYWQobVJlYWRCdWZmZXIsIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMpOwogICAgICAgICBBVFJBQ0VfRU5EKCk7CiAgICAgICAgIGR1bXBTdGF0ZS0+bVJlYWRTZXF1ZW5jZSsrOwogICAgICAgICBpZiAoZnJhbWVzUmVhZCA+PSAwKSB7CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChzaXplX3QpIGZyYW1lc1JlYWQgPiBmcmFtZUNvdW50KTsKLSAgICAgICAgICAgIHRvdGFsTmF0aXZlRnJhbWVzUmVhZCArPSBmcmFtZXNSZWFkOwotICAgICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVzUmVhZCA9IHRvdGFsTmF0aXZlRnJhbWVzUmVhZDsKLSAgICAgICAgICAgIHJlYWRCdWZmZXJTdGF0ZSA9IGZyYW1lc1JlYWQ7CisgICAgICAgICAgICBtVG90YWxOYXRpdmVGcmFtZXNSZWFkICs9IGZyYW1lc1JlYWQ7CisgICAgICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZXNSZWFkID0gbVRvdGFsTmF0aXZlRnJhbWVzUmVhZDsKKyAgICAgICAgICAgIG1SZWFkQnVmZmVyU3RhdGUgPSBmcmFtZXNSZWFkOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZHVtcFN0YXRlLT5tUmVhZEVycm9ycysrOwotICAgICAgICAgICAgcmVhZEJ1ZmZlclN0YXRlID0gMDsKKyAgICAgICAgICAgIG1SZWFkQnVmZmVyU3RhdGUgPSAwOwogICAgICAgICB9CiAgICAgICAgIC8vIEZJWE1FIHJlbmFtZSB0byBhdHRlbXB0ZWRJTwotICAgICAgICBhdHRlbXB0ZWRXcml0ZSA9IHRydWU7CisgICAgICAgIG1BdHRlbXB0ZWRXcml0ZSA9IHRydWU7CiAgICAgfQogCiAgICAgaWYgKGNvbW1hbmQgJiBGYXN0Q2FwdHVyZVN0YXRlOjpXUklURSkgewotICAgICAgICBBTE9HX0FTU0VSVChwaXBlU2luayAhPSBOVUxMKTsKLSAgICAgICAgQUxPR19BU1NFUlQocmVhZEJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgaWYgKHJlYWRCdWZmZXJTdGF0ZSA8IDApIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKLSAgICAgICAgICAgIC8vIEZJWE1FIGZyYW1lU2l6ZQotICAgICAgICAgICAgbWVtc2V0KHJlYWRCdWZmZXIsIDAsIGZyYW1lQ291bnQgKiBjaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpKTsKLSAgICAgICAgICAgIHJlYWRCdWZmZXJTdGF0ZSA9IGZyYW1lQ291bnQ7CisgICAgICAgIEFMT0dfQVNTRVJUKG1QaXBlU2luayAhPSBOVUxMKTsKKyAgICAgICAgQUxPR19BU1NFUlQobVJlYWRCdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIGlmIChtUmVhZEJ1ZmZlclN0YXRlIDwgMCkgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChtRm9ybWF0KTsKKyAgICAgICAgICAgIG1lbXNldChtUmVhZEJ1ZmZlciwgMCwgZnJhbWVDb3VudCAqIEZvcm1hdF9mcmFtZVNpemUobUZvcm1hdCkpOworICAgICAgICAgICAgbVJlYWRCdWZmZXJTdGF0ZSA9IGZyYW1lQ291bnQ7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHJlYWRCdWZmZXJTdGF0ZSA+IDApIHsKLSAgICAgICAgICAgIHNzaXplX3QgZnJhbWVzV3JpdHRlbiA9IHBpcGVTaW5rLT53cml0ZShyZWFkQnVmZmVyLCByZWFkQnVmZmVyU3RhdGUpOworICAgICAgICBpZiAobVJlYWRCdWZmZXJTdGF0ZSA+IDApIHsKKyAgICAgICAgICAgIHNzaXplX3QgZnJhbWVzV3JpdHRlbiA9IG1QaXBlU2luay0+d3JpdGUobVJlYWRCdWZmZXIsIG1SZWFkQnVmZmVyU3RhdGUpOwogICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBzdXBwb3J0cyBhdCBtb3N0IG9uZSBmYXN0IGNhcHR1cmUgY2xpZW50LgogICAgICAgICAgICAgLy8gICAgICAgVG8gaGFuZGxlIG11bHRpcGxlIGNsaWVudHMgdGhpcyBjb3VsZCBiZSBjb252ZXJ0ZWQgdG8gYW4gYXJyYXksCiAgICAgICAgICAgICAvLyAgICAgICBvciB3aXRoIGEgbG90IG1vcmUgd29yayB0aGUgY29udHJvbCBibG9jayBjb3VsZCBiZSBzaGFyZWQgYnkgYWxsIGNsaWVudHMuCkBAIC0yMTEsMTMgKzIxMSw0IEBACiAgICAgfQogfQogCi1GYXN0Q2FwdHVyZUR1bXBTdGF0ZTo6RmFzdENhcHR1cmVEdW1wU3RhdGUoKSA6IEZhc3RUaHJlYWREdW1wU3RhdGUoKSwKLSAgICBtUmVhZFNlcXVlbmNlKDApLCBtRnJhbWVzUmVhZCgwKSwgbVJlYWRFcnJvcnMoMCksIG1TYW1wbGVSYXRlKDApLCBtRnJhbWVDb3VudCgwKQotewotfQotCi1GYXN0Q2FwdHVyZUR1bXBTdGF0ZTo6fkZhc3RDYXB0dXJlRHVtcFN0YXRlKCkKLXsKLX0KLQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5oCmluZGV4IGU1MzViOWQuLmUyNThhNGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5oCkBAIC0yMCwyMyArMjAsMTIgQEAKICNpbmNsdWRlICJGYXN0VGhyZWFkLmgiCiAjaW5jbHVkZSAiU3RhdGVRdWV1ZS5oIgogI2luY2x1ZGUgIkZhc3RDYXB0dXJlU3RhdGUuaCIKKyNpbmNsdWRlICJGYXN0Q2FwdHVyZUR1bXBTdGF0ZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHR5cGVkZWYgU3RhdGVRdWV1ZTxGYXN0Q2FwdHVyZVN0YXRlPiBGYXN0Q2FwdHVyZVN0YXRlUXVldWU7CiAKLXN0cnVjdCBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSA6IEZhc3RUaHJlYWREdW1wU3RhdGUgewotICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlKCk7Ci0gICAgLyp2aXJ0dWFsKi8gfkZhc3RDYXB0dXJlRHVtcFN0YXRlKCk7Ci0KLSAgICAvLyBGSVhNRSBieSByZW5hbWluZywgY291bGQgcHVsbCB1cCBtYW55IG9mIHRoZXNlIHRvIEZhc3RUaHJlYWREdW1wU3RhdGUKLSAgICB1aW50MzJfdCBtUmVhZFNlcXVlbmNlOyAgICAgLy8gaW5jcmVtZW50ZWQgYmVmb3JlIGFuZCBhZnRlciBlYWNoIHJlYWQoKQotICAgIHVpbnQzMl90IG1GcmFtZXNSZWFkOyAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHJlYWQgc3VjY2Vzc2Z1bGx5Ci0gICAgdWludDMyX3QgbVJlYWRFcnJvcnM7ICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiByZWFkKCkgZXJyb3JzCi0gICAgdWludDMyX3QgbVNhbXBsZVJhdGU7Ci0gICAgc2l6ZV90ICAgbUZyYW1lQ291bnQ7Ci19OwotCiBjbGFzcyBGYXN0Q2FwdHVyZSA6IHB1YmxpYyBGYXN0VGhyZWFkIHsKIAogcHVibGljOgpAQCAtNTcsMTkgKzQ2LDIxIEBACiAgICAgdmlydHVhbCB2b2lkIG9uU3RhdGVDaGFuZ2UoKTsKICAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrKCk7CiAKLSAgICBzdGF0aWMgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSBpbml0aWFsOwotICAgIEZhc3RDYXB0dXJlU3RhdGUgcHJlSWRsZTsgLy8gY29weSBvZiBzdGF0ZSBiZWZvcmUgd2Ugd2VudCBpbnRvIGlkbGUKKyAgICBzdGF0aWMgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSBzSW5pdGlhbDsKKworICAgIEZhc3RDYXB0dXJlU3RhdGUgICAgbVByZUlkbGU7ICAgLy8gY29weSBvZiBzdGF0ZSBiZWZvcmUgd2Ugd2VudCBpbnRvIGlkbGUKICAgICAvLyBGSVhNRSBieSByZW5hbWluZywgY291bGQgcHVsbCB1cCBtYW55IG9mIHRoZXNlIHRvIEZhc3RUaHJlYWQKLSAgICBOQkFJT19Tb3VyY2UgKmlucHV0U291cmNlOwotICAgIGludCBpbnB1dFNvdXJjZUdlbjsKLSAgICBOQkFJT19TaW5rICpwaXBlU2luazsKLSAgICBpbnQgcGlwZVNpbmtHZW47Ci0gICAgc2hvcnQgKnJlYWRCdWZmZXI7Ci0gICAgc3NpemVfdCByZWFkQnVmZmVyU3RhdGU7ICAgIC8vIG51bWJlciBvZiBpbml0aWFsaXplZCBmcmFtZXMgaW4gcmVhZEJ1ZmZlciwgb3IgLTEgdG8gY2xlYXIKLSAgICBOQkFJT19Gb3JtYXQgZm9ybWF0OwotICAgIHVuc2lnbmVkIHNhbXBsZVJhdGU7Ci0gICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgZHVtbXlEdW1wU3RhdGU7Ci0gICAgdWludDMyX3QgdG90YWxOYXRpdmVGcmFtZXNSZWFkOyAvLyBjb3BpZWQgdG8gZHVtcFN0YXRlLT5tRnJhbWVzUmVhZAorICAgIE5CQUlPX1NvdXJjZSogICAgICAgbUlucHV0U291cmNlOworICAgIGludCAgICAgICAgICAgICAgICAgbUlucHV0U291cmNlR2VuOworICAgIE5CQUlPX1NpbmsqICAgICAgICAgbVBpcGVTaW5rOworICAgIGludCAgICAgICAgICAgICAgICAgbVBpcGVTaW5rR2VuOworICAgIHZvaWQqICAgICAgICAgICAgICAgbVJlYWRCdWZmZXI7CisgICAgc3NpemVfdCAgICAgICAgICAgICBtUmVhZEJ1ZmZlclN0YXRlOyAgIC8vIG51bWJlciBvZiBpbml0aWFsaXplZCBmcmFtZXMgaW4gcmVhZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgLTEgdG8gY2xlYXIKKyAgICBOQkFJT19Gb3JtYXQgICAgICAgIG1Gb3JtYXQ7CisgICAgdW5zaWduZWQgICAgICAgICAgICBtU2FtcGxlUmF0ZTsKKyAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSBtRHVtbXlGYXN0Q2FwdHVyZUR1bXBTdGF0ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1JlYWQ7IC8vIGNvcGllZCB0byBkdW1wU3RhdGUtPm1GcmFtZXNSZWFkCiAKIH07ICAvLyBjbGFzcyBGYXN0Q2FwdHVyZQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVEdW1wU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlRHVtcFN0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2VlYmE1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlRHVtcFN0YXRlLmNwcApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJGYXN0Q2FwdHVyZUR1bXBTdGF0ZSIKKy8vZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkZhc3RDYXB0dXJlRHVtcFN0YXRlLmgiCisjaW5jbHVkZSAiRmFzdENhcHR1cmVTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0Zhc3RDYXB0dXJlRHVtcFN0YXRlOjpGYXN0Q2FwdHVyZUR1bXBTdGF0ZSgpIDogRmFzdFRocmVhZER1bXBTdGF0ZSgpLAorICAgIG1SZWFkU2VxdWVuY2UoMCksIG1GcmFtZXNSZWFkKDApLCBtUmVhZEVycm9ycygwKSwgbVNhbXBsZVJhdGUoMCksIG1GcmFtZUNvdW50KDApCit7Cit9CisKK0Zhc3RDYXB0dXJlRHVtcFN0YXRlOjp+RmFzdENhcHR1cmVEdW1wU3RhdGUoKQoreworfQorCit2b2lkIEZhc3RDYXB0dXJlRHVtcFN0YXRlOjpkdW1wKGludCBmZCkgY29uc3QKK3sKKyAgICBpZiAobUNvbW1hbmQgPT0gRmFzdENhcHR1cmVTdGF0ZTo6SU5JVElBTCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBGYXN0Q2FwdHVyZSBub3QgaW5pdGlhbGl6ZWRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGRvdWJsZSBtZWFzdXJlZFdhcm11cE1zID0gKG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyAqIDEwMDAuMCkgKworICAgICAgICAgICAgKG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgLyAxMDAwMDAwLjApOworICAgIGRvdWJsZSBwZXJpb2RTZWMgPSAoZG91YmxlKSBtRnJhbWVDb3VudCAvIG1TYW1wbGVSYXRlOworICAgIGRwcmludGYoZmQsICIgIEZhc3RDYXB0dXJlIGNvbW1hbmQ9JXMgcmVhZFNlcXVlbmNlPSV1IGZyYW1lc1JlYWQ9JXVcbiIKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICByZWFkRXJyb3JzPSV1IHNhbXBsZVJhdGU9JXUgZnJhbWVDb3VudD0lenVcbiIKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cD0lLjNnIG1zLCB3YXJtdXBDeWNsZXM9JXUgcGVyaW9kPSUuMmYgbXNcbiIsCisgICAgICAgICAgICAgICAgRmFzdENhcHR1cmVTdGF0ZTo6Y29tbWFuZFRvU3RyaW5nKG1Db21tYW5kKSwgbVJlYWRTZXF1ZW5jZSwgbUZyYW1lc1JlYWQsCisgICAgICAgICAgICAgICAgbVJlYWRFcnJvcnMsIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbWVhc3VyZWRXYXJtdXBNcywgbVdhcm11cEN5Y2xlcywKKyAgICAgICAgICAgICAgICBwZXJpb2RTZWMgKiAxZTMpOworfQorCit9ICAgLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlRHVtcFN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVEdW1wU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjljNGMzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlRHVtcFN0YXRlLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfRFVNUF9TVEFURV9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9DQVBUVVJFX0RVTVBfU1RBVEVfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgIkZhc3RUaHJlYWREdW1wU3RhdGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgRmFzdENhcHR1cmVEdW1wU3RhdGUgOiBGYXN0VGhyZWFkRHVtcFN0YXRlIHsKKyAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSgpOworICAgIC8qdmlydHVhbCovIH5GYXN0Q2FwdHVyZUR1bXBTdGF0ZSgpOworCisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7ICAgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHN0YWJsZSBjb3B5LCBub3QgdGhlIG9yaWdpbmFsCisKKyAgICAvLyBGSVhNRSBieSByZW5hbWluZywgY291bGQgcHVsbCB1cCBtYW55IG9mIHRoZXNlIHRvIEZhc3RUaHJlYWREdW1wU3RhdGUKKyAgICB1aW50MzJfdCBtUmVhZFNlcXVlbmNlOyAgICAgLy8gaW5jcmVtZW50ZWQgYmVmb3JlIGFuZCBhZnRlciBlYWNoIHJlYWQoKQorICAgIHVpbnQzMl90IG1GcmFtZXNSZWFkOyAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHJlYWQgc3VjY2Vzc2Z1bGx5CisgICAgdWludDMyX3QgbVJlYWRFcnJvcnM7ICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiByZWFkKCkgZXJyb3JzCisgICAgdWludDMyX3QgbVNhbXBsZVJhdGU7CisgICAgc2l6ZV90ICAgbUZyYW1lQ291bnQ7Cit9OworCit9ICAgLy8gYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fRkFTVF9DQVBUVVJFX0RVTVBfU1RBVEVfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuY3BwCmluZGV4IDFkMDI5YjcuLmM0ZDVlNDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5jcHAKQEAgLTI3LDQgKzI3LDE5IEBACiB7CiB9CiAKKy8vIHN0YXRpYworY29uc3QgY2hhciAqRmFzdENhcHR1cmVTdGF0ZTo6Y29tbWFuZFRvU3RyaW5nKENvbW1hbmQgY29tbWFuZCkKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBGYXN0VGhyZWFkU3RhdGU6OmNvbW1hbmRUb1N0cmluZyhjb21tYW5kKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisgICAgc3dpdGNoIChjb21tYW5kKSB7CisgICAgY2FzZSBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEOiAgICAgICAgcmV0dXJuICJSRUFEIjsKKyAgICBjYXNlIEZhc3RDYXB0dXJlU3RhdGU6OldSSVRFOiAgICAgICByZXR1cm4gIldSSVRFIjsKKyAgICBjYXNlIEZhc3RDYXB0dXJlU3RhdGU6OlJFQURfV1JJVEU6ICByZXR1cm4gIlJFQURfV1JJVEUiOworICAgIH0KKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyIsIF9fZnVuY19fKTsKK30KKwogfSAgIC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oCmluZGV4IDI5Yzg2NWEuLjliY2EyZDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaApAQCAtMjksMjEgKzI5LDIzIEBACiAgICAgLyp2aXJ0dWFsKi8gfkZhc3RDYXB0dXJlU3RhdGUoKTsKIAogICAgIC8vIGFsbCBwb2ludGVyIGZpZWxkcyB1c2UgcmF3IHBvaW50ZXJzOyBvYmplY3RzIGFyZSBvd25lZCBhbmQgcmVmLWNvdW50ZWQgYnkgUmVjb3JkVGhyZWFkCi0gICAgTkJBSU9fU291cmNlICAgICptSW5wdXRTb3VyY2U7ICAgICAgLy8gSEFMIGlucHV0IGRldmljZSwgbXVzdCBhbHJlYWR5IGJlIG5lZ290aWF0ZWQKKyAgICBOQkFJT19Tb3VyY2UqICAgbUlucHV0U291cmNlOyAgICAgICAvLyBIQUwgaW5wdXQgZGV2aWNlLCBtdXN0IGFscmVhZHkgYmUgbmVnb3RpYXRlZAogICAgIC8vIEZJWE1FIGJ5IHJlbmFtaW5nLCBjb3VsZCBwdWxsIHVwIHRoZXNlIGZpZWxkcyB0byBGYXN0VGhyZWFkU3RhdGUKICAgICBpbnQgICAgICAgICAgICAgbUlucHV0U291cmNlR2VuOyAgICAvLyBpbmNyZW1lbnQgd2hlbiBtSW5wdXRTb3VyY2UgaXMgYXNzaWduZWQKLSAgICBOQkFJT19TaW5rICAgICAgKm1QaXBlU2luazsgICAgICAgICAvLyBhZnRlciByZWFkaW5nIGZyb20gaW5wdXQgc291cmNlLCB3cml0ZSB0byB0aGlzIHBpcGUgc2luaworICAgIE5CQUlPX1NpbmsqICAgICBtUGlwZVNpbms7ICAgICAgICAgIC8vIGFmdGVyIHJlYWRpbmcgZnJvbSBpbnB1dCBzb3VyY2UsIHdyaXRlIHRvIHRoaXMgcGlwZSBzaW5rCiAgICAgaW50ICAgICAgICAgICAgIG1QaXBlU2lua0dlbjsgICAgICAgLy8gaW5jcmVtZW50IHdoZW4gbVBpcGVTaW5rIGlzIGFzc2lnbmVkCiAgICAgc2l6ZV90ICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBwZXIgZmFzdCBjYXB0dXJlIGJ1ZmZlcgotICAgIGF1ZGlvX3RyYWNrX2NibGtfdCAgKm1DYmxrOyAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSBzaW5nbGUgZmFzdCBjbGllbnQsIG9yIE5VTEwKKyAgICBhdWRpb190cmFja19jYmxrX3QqIG1DYmxrOyAgICAgICAgICAvLyBjb250cm9sIGJsb2NrIGZvciB0aGUgc2luZ2xlIGZhc3QgY2xpZW50LCBvciBOVUxMCiAKICAgICAvLyBFeHRlbmRzIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZAogICAgIHN0YXRpYyBjb25zdCBDb21tYW5kCiAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYWxzbyBwcm9jZXNzIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgYW5kIGNhbiBiZSAib3IiZWQ6Ci0gICAgICAgIFJFQUQgPSAweDgsICAgICAgICAgICAgIC8vIHJlYWQgZnJvbSBpbnB1dCBzb3VyY2UKLSAgICAgICAgV1JJVEUgPSAweDEwLCAgICAgICAgICAgLy8gd3JpdGUgdG8gcGlwZSBzaW5rCi0gICAgICAgIFJFQURfV1JJVEUgPSAweDE4OyAgICAgIC8vIHJlYWQgZnJvbSBpbnB1dCBzb3VyY2UgYW5kIHdyaXRlIHRvIHBpcGUgc2luaworICAgICAgICBSRUFEID0gMHg4LCAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgZnJvbSBpbnB1dCBzb3VyY2UKKyAgICAgICAgV1JJVEUgPSAweDEwLCAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0byBwaXBlIHNpbmsKKyAgICAgICAgUkVBRF9XUklURSA9IDB4MTg7ICAgICAgICAgICAgICAvLyByZWFkIGZyb20gaW5wdXQgc291cmNlIGFuZCB3cml0ZSB0byBwaXBlIHNpbmsKIAorICAgIC8vIG5ldmVyIHJldHVybnMgTlVMTDsgYXNzZXJ0cyBpZiBjb21tYW5kIGlzIGludmFsaWQKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29tbWFuZFRvU3RyaW5nKENvbW1hbmQgY29tbWFuZCk7CiB9OyAgLy8gc3RydWN0IEZhc3RDYXB0dXJlU3RhdGUKIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCmluZGV4IDI2NzhjYmYuLjQ1YzY4YjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCkBAIC0yNywxMCArMjcsMTEgQEAKIAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKICNpbmNsdWRlIDxjcHVzdGF0cy9DZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzLmg+CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAjaW5jbHVkZSA8Y3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuaD4KQEAgLTQ0LDE1ICs0NSwxNSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8qc3RhdGljKi8gY29uc3QgRmFzdE1peGVyU3RhdGUgRmFzdE1peGVyOjppbml0aWFsOworLypzdGF0aWMqLyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBGYXN0TWl4ZXI6OnNJbml0aWFsOwogCiBGYXN0TWl4ZXI6OkZhc3RNaXhlcigpIDogRmFzdFRocmVhZCgpLAotICAgIHNsb3BOcygwKSwKLSAgICAvLyBmYXN0VHJhY2tOYW1lcwotICAgIC8vIGdlbmVyYXRpb25zCi0gICAgb3V0cHV0U2luayhOVUxMKSwKLSAgICBvdXRwdXRTaW5rR2VuKDApLAotICAgIG1peGVyKE5VTEwpLAorICAgIG1TbG9wTnMoMCksCisgICAgLy8gbUZhc3RUcmFja05hbWVzCisgICAgLy8gbUdlbmVyYXRpb25zCisgICAgbU91dHB1dFNpbmsoTlVMTCksCisgICAgbU91dHB1dFNpbmtHZW4oMCksCisgICAgbU1peGVyKE5VTEwpLAogICAgIG1TaW5rQnVmZmVyKE5VTEwpLAogICAgIG1TaW5rQnVmZmVyU2l6ZSgwKSwKICAgICBtU2lua0NoYW5uZWxDb3VudChGQ0NfMiksCkBAIC02MCwzMCArNjEsMzAgQEAKICAgICBtTWl4ZXJCdWZmZXJTaXplKDApLAogICAgIG1NaXhlckJ1ZmZlckZvcm1hdChBVURJT19GT1JNQVRfUENNXzE2X0JJVCksCiAgICAgbU1peGVyQnVmZmVyU3RhdGUoVU5ERUZJTkVEKSwKLSAgICBmb3JtYXQoRm9ybWF0X0ludmFsaWQpLAotICAgIHNhbXBsZVJhdGUoMCksCi0gICAgZmFzdFRyYWNrc0dlbigwKSwKLSAgICB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4oMCksCisgICAgbUZvcm1hdChGb3JtYXRfSW52YWxpZCksCisgICAgbVNhbXBsZVJhdGUoMCksCisgICAgbUZhc3RUcmFja3NHZW4oMCksCisgICAgbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbigwKSwKICAgICAvLyB0aW1lc3RhbXAKLSAgICBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkKDApICAgLy8gdGhlID0gMCBpcyB0byBzaWxlbmNlIHRoZSBjb21waWxlcgorICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkKDApICAgLy8gdGhlID0gMCBpcyB0byBzaWxlbmNlIHRoZSBjb21waWxlcgogewotICAgIC8vIEZJWE1FIHBhc3MgaW5pdGlhbCBhcyBwYXJhbWV0ZXIgdG8gYmFzZSBjbGFzcyBjb25zdHJ1Y3RvciwgYW5kIG1ha2UgaXQgc3RhdGljIGxvY2FsCi0gICAgcHJldmlvdXMgPSAmaW5pdGlhbDsKLSAgICBjdXJyZW50ID0gJmluaXRpYWw7CisgICAgLy8gRklYTUUgcGFzcyBzSW5pdGlhbCBhcyBwYXJhbWV0ZXIgdG8gYmFzZSBjbGFzcyBjb25zdHJ1Y3RvciwgYW5kIG1ha2UgaXQgc3RhdGljIGxvY2FsCisgICAgbVByZXZpb3VzID0gJnNJbml0aWFsOworICAgIG1DdXJyZW50ID0gJnNJbml0aWFsOwogCi0gICAgbUR1bW15RHVtcFN0YXRlID0gJmR1bW15RHVtcFN0YXRlOworICAgIG1EdW1teUR1bXBTdGF0ZSA9ICZtRHVtbXlGYXN0TWl4ZXJEdW1wU3RhdGU7CiAgICAgLy8gVE9ETzogQWRkIGNoYW5uZWwgbWFzayB0byBOQkFJT19Gb3JtYXQuCiAgICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIGNoYW5uZWwgbWFzayBtdXN0IGJlIGEgdmFsaWQgcG9zaXRpb25hbCBjaGFubmVsIG1hc2suCiAgICAgbVNpbmtDaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChtU2lua0NoYW5uZWxDb3VudCk7CiAKICAgICB1bnNpZ25lZCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3M7ICsraSkgewotICAgICAgICBmYXN0VHJhY2tOYW1lc1tpXSA9IC0xOwotICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IDA7CisgICAgICAgIG1GYXN0VHJhY2tOYW1lc1tpXSA9IC0xOworICAgICAgICBtR2VuZXJhdGlvbnNbaV0gPSAwOwogICAgIH0KLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICBvbGRMb2FkLnR2X3NlYyA9IDA7Ci0gICAgb2xkTG9hZC50dl9uc2VjID0gMDsKKyNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCisgICAgbU9sZExvYWQudHZfc2VjID0gMDsKKyAgICBtT2xkTG9hZC50dl9uc2VjID0gMDsKICNlbmRpZgogfQogCkBAIC0xMDMsMjAgKzEwNCwyMCBAQAogCiB2b2lkIEZhc3RNaXhlcjo6c2V0TG9nKE5CTG9nOjpXcml0ZXIgKmxvZ1dyaXRlcikKIHsKLSAgICBpZiAobWl4ZXIgIT0gTlVMTCkgewotICAgICAgICBtaXhlci0+c2V0TG9nKGxvZ1dyaXRlcik7CisgICAgaWYgKG1NaXhlciAhPSBOVUxMKSB7CisgICAgICAgIG1NaXhlci0+c2V0TG9nKGxvZ1dyaXRlcik7CiAgICAgfQogfQogCiB2b2lkIEZhc3RNaXhlcjo6b25JZGxlKCkKIHsKLSAgICBwcmVJZGxlID0gKihjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKWN1cnJlbnQ7Ci0gICAgY3VycmVudCA9ICZwcmVJZGxlOworICAgIG1QcmVJZGxlID0gKihjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKW1DdXJyZW50OworICAgIG1DdXJyZW50ID0gJm1QcmVJZGxlOwogfQogCiB2b2lkIEZhc3RNaXhlcjo6b25FeGl0KCkKIHsKLSAgICBkZWxldGUgbWl4ZXI7CisgICAgZGVsZXRlIG1NaXhlcjsKICAgICBmcmVlKG1NaXhlckJ1ZmZlcik7CiAgICAgZnJlZShtU2lua0J1ZmZlcik7CiB9CkBAIC0xMzUsODIgKzEzNiw4OCBAQAogCiB2b2lkIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSgpCiB7Ci0gICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIHRoaXMtPmN1cnJlbnQ7Ci0gICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBwcmV2aW91cyA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSB0aGlzLT5wcmV2aW91czsKLSAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIHRoaXMtPmR1bXBTdGF0ZTsKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgbUN1cnJlbnQ7CisgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBwcmV2aW91cyA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSBtUHJldmlvdXM7CisgICAgRmFzdE1peGVyRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RNaXhlckR1bXBTdGF0ZSAqKSBtRHVtcFN0YXRlOwogICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CiAKICAgICAvLyBoYW5kbGUgc3RhdGUgY2hhbmdlIGhlcmUsIGJ1dCBzaW5jZSB3ZSB3YW50IHRvIGRpZmYgdGhlIHN0YXRlLAotICAgIC8vIHdlJ3JlIHByZXBhcmVkIGZvciBwcmV2aW91cyA9PSAmaW5pdGlhbCB0aGUgZmlyc3QgdGltZSB0aHJvdWdoCisgICAgLy8gd2UncmUgcHJlcGFyZWQgZm9yIHByZXZpb3VzID09ICZzSW5pdGlhbCB0aGUgZmlyc3QgdGltZSB0aHJvdWdoCiAgICAgdW5zaWduZWQgcHJldmlvdXNUcmFja01hc2s7CiAKICAgICAvLyBjaGVjayBmb3IgY2hhbmdlIGluIG91dHB1dCBIQUwgY29uZmlndXJhdGlvbgotICAgIE5CQUlPX0Zvcm1hdCBwcmV2aW91c0Zvcm1hdCA9IGZvcm1hdDsKLSAgICBpZiAoY3VycmVudC0+bU91dHB1dFNpbmtHZW4gIT0gb3V0cHV0U2lua0dlbikgewotICAgICAgICBvdXRwdXRTaW5rID0gY3VycmVudC0+bU91dHB1dFNpbms7Ci0gICAgICAgIG91dHB1dFNpbmtHZW4gPSBjdXJyZW50LT5tT3V0cHV0U2lua0dlbjsKLSAgICAgICAgaWYgKG91dHB1dFNpbmsgPT0gTlVMTCkgewotICAgICAgICAgICAgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7Ci0gICAgICAgICAgICBzYW1wbGVSYXRlID0gMDsKKyAgICBOQkFJT19Gb3JtYXQgcHJldmlvdXNGb3JtYXQgPSBtRm9ybWF0OworICAgIGlmIChjdXJyZW50LT5tT3V0cHV0U2lua0dlbiAhPSBtT3V0cHV0U2lua0dlbikgeworICAgICAgICBtT3V0cHV0U2luayA9IGN1cnJlbnQtPm1PdXRwdXRTaW5rOworICAgICAgICBtT3V0cHV0U2lua0dlbiA9IGN1cnJlbnQtPm1PdXRwdXRTaW5rR2VuOworICAgICAgICBpZiAobU91dHB1dFNpbmsgPT0gTlVMTCkgeworICAgICAgICAgICAgbUZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOworICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSAwOwogICAgICAgICAgICAgbVNpbmtDaGFubmVsQ291bnQgPSAwOwogICAgICAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvcm1hdCA9IG91dHB1dFNpbmstPmZvcm1hdCgpOwotICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCk7Ci0gICAgICAgICAgICBtU2lua0NoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKKyAgICAgICAgICAgIG1Gb3JtYXQgPSBtT3V0cHV0U2luay0+Zm9ybWF0KCk7CisgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKG1Gb3JtYXQpOworICAgICAgICAgICAgbVNpbmtDaGFubmVsQ291bnQgPSBGb3JtYXRfY2hhbm5lbENvdW50KG1Gb3JtYXQpOwogICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtU2lua0NoYW5uZWxDb3VudCA+IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMpOwogCiAgICAgICAgICAgICAvLyBUT0RPOiBBZGQgY2hhbm5lbCBtYXNrIHRvIE5CQUlPX0Zvcm1hdAogICAgICAgICAgICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIGNoYW5uZWwgbWFzayBtdXN0IGJlIGEgdmFsaWQgcG9zaXRpb25hbCBjaGFubmVsIG1hc2suCiAgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG1TaW5rQ2hhbm5lbENvdW50KTsKICAgICAgICAgfQotICAgICAgICBkdW1wU3RhdGUtPm1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgICAgZHVtcFN0YXRlLT5tU2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgIH0KIAotICAgIGlmICgoIUZvcm1hdF9pc0VxdWFsKGZvcm1hdCwgcHJldmlvdXNGb3JtYXQpKSB8fCAoZnJhbWVDb3VudCAhPSBwcmV2aW91cy0+bUZyYW1lQ291bnQpKSB7CisgICAgaWYgKCghRm9ybWF0X2lzRXF1YWwobUZvcm1hdCwgcHJldmlvdXNGb3JtYXQpKSB8fCAoZnJhbWVDb3VudCAhPSBwcmV2aW91cy0+bUZyYW1lQ291bnQpKSB7CiAgICAgICAgIC8vIEZJWE1FIHRvIGF2b2lkIHByaW9yaXR5IGludmVyc2lvbiwgZG9uJ3QgZGVsZXRlIGhlcmUKLSAgICAgICAgZGVsZXRlIG1peGVyOwotICAgICAgICBtaXhlciA9IE5VTEw7CisgICAgICAgIGRlbGV0ZSBtTWl4ZXI7CisgICAgICAgIG1NaXhlciA9IE5VTEw7CiAgICAgICAgIGZyZWUobU1peGVyQnVmZmVyKTsKICAgICAgICAgbU1peGVyQnVmZmVyID0gTlVMTDsKICAgICAgICAgZnJlZShtU2lua0J1ZmZlcik7CiAgICAgICAgIG1TaW5rQnVmZmVyID0gTlVMTDsKLSAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwICYmIHNhbXBsZVJhdGUgPiAwKSB7CisgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCAmJiBtU2FtcGxlUmF0ZSA+IDApIHsKKyAgICAgICAgICAgIC8vIFRoZSBtaXhlciBwcm9kdWNlcyBlaXRoZXIgMTYgYml0IFBDTSBvciBmbG9hdCBvdXRwdXQsIHNlbGVjdAorICAgICAgICAgICAgLy8gZmxvYXQgb3V0cHV0IGlmIHRoZSBIQUwgc3VwcG9ydHMgaGlnaGVyIHRoYW4gMTYgYml0IHByZWNpc2lvbi4KKyAgICAgICAgICAgIG1NaXhlckJ1ZmZlckZvcm1hdCA9IG1Gb3JtYXQubUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCA/CisgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIDogQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKICAgICAgICAgICAgIC8vIEZJWE1FIG5ldyBtYXkgYmxvY2sgZm9yIHVuYm91bmRlZCB0aW1lIGF0IGludGVybmFsIG11dGV4IG9mIHRoZSBoZWFwCiAgICAgICAgICAgICAvLyAgICAgICBpbXBsZW1lbnRhdGlvbjsgaXQgd291bGQgYmUgYmV0dGVyIHRvIGhhdmUgbm9ybWFsIG1peGVyIGFsbG9jYXRlIGZvciB1cwogICAgICAgICAgICAgLy8gICAgICAgdG8gYXZvaWQgYmxvY2tpbmcgaGVyZSBhbmQgdG8gcHJldmVudCBwb3NzaWJsZSBwcmlvcml0eSBpbnZlcnNpb24KLSAgICAgICAgICAgIG1peGVyID0gbmV3IEF1ZGlvTWl4ZXIoZnJhbWVDb3VudCwgc2FtcGxlUmF0ZSwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzKTsKKyAgICAgICAgICAgIG1NaXhlciA9IG5ldyBBdWRpb01peGVyKGZyYW1lQ291bnQsIG1TYW1wbGVSYXRlLCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3MpOwogICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG1peGVyRnJhbWVTaXplID0gbVNpbmtDaGFubmVsQ291bnQKICAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1NaXhlckJ1ZmZlckZvcm1hdCk7CiAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJTaXplID0gbWl4ZXJGcmFtZVNpemUgKiBmcmFtZUNvdW50OwogICAgICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1NaXhlckJ1ZmZlciwgMzIsIG1NaXhlckJ1ZmZlclNpemUpOwogICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpbmtGcmFtZVNpemUgPSBtU2lua0NoYW5uZWxDb3VudAotICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0Lm1Gb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdC5tRm9ybWF0KTsKICAgICAgICAgICAgIGlmIChzaW5rRnJhbWVTaXplID4gbWl4ZXJGcmFtZVNpemUpIHsgLy8gbmVlZCBhIHNpbmsgYnVmZmVyCiAgICAgICAgICAgICAgICAgbVNpbmtCdWZmZXJTaXplID0gc2lua0ZyYW1lU2l6ZSAqIGZyYW1lQ291bnQ7CiAgICAgICAgICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1TaW5rQnVmZmVyLCAzMiwgbVNpbmtCdWZmZXJTaXplKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBlcmlvZE5zID0gKGZyYW1lQ291bnQgKiAxMDAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMS4wMAotICAgICAgICAgICAgdW5kZXJydW5OcyA9IChmcmFtZUNvdW50ICogMTc1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAvLyAxLjc1Ci0gICAgICAgICAgICBvdmVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgIC8vIDAuNTAKLSAgICAgICAgICAgIGZvcmNlTnMgPSAoZnJhbWVDb3VudCAqIDk1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAgLy8gMC45NQotICAgICAgICAgICAgd2FybXVwTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAvLyAwLjUwCisgICAgICAgICAgICBtUGVyaW9kTnMgPSAoZnJhbWVDb3VudCAqIDEwMDAwMDAwMDBMTCkgLyBtU2FtcGxlUmF0ZTsgICAgLy8gMS4wMAorICAgICAgICAgICAgbVVuZGVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDE3NTAwMDAwMDBMTCkgLyBtU2FtcGxlUmF0ZTsgIC8vIDEuNzUKKyAgICAgICAgICAgIG1PdmVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIG1TYW1wbGVSYXRlOyAgICAvLyAwLjUwCisgICAgICAgICAgICBtRm9yY2VOcyA9IChmcmFtZUNvdW50ICogOTUwMDAwMDAwTEwpIC8gbVNhbXBsZVJhdGU7ICAgICAgLy8gMC45NQorICAgICAgICAgICAgbVdhcm11cE5zTWluID0gKGZyYW1lQ291bnQgKiA3NTAwMDAwMDBMTCkgLyBtU2FtcGxlUmF0ZTsgIC8vIDAuNzUKKyAgICAgICAgICAgIG1XYXJtdXBOc01heCA9IChmcmFtZUNvdW50ICogMTI1MDAwMDAwMExMKSAvIG1TYW1wbGVSYXRlOyAvLyAxLjI1CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwZXJpb2ROcyA9IDA7Ci0gICAgICAgICAgICB1bmRlcnJ1bk5zID0gMDsKLSAgICAgICAgICAgIG92ZXJydW5OcyA9IDA7Ci0gICAgICAgICAgICBmb3JjZU5zID0gMDsKLSAgICAgICAgICAgIHdhcm11cE5zID0gMDsKKyAgICAgICAgICAgIG1QZXJpb2ROcyA9IDA7CisgICAgICAgICAgICBtVW5kZXJydW5OcyA9IDA7CisgICAgICAgICAgICBtT3ZlcnJ1bk5zID0gMDsKKyAgICAgICAgICAgIG1Gb3JjZU5zID0gMDsKKyAgICAgICAgICAgIG1XYXJtdXBOc01pbiA9IDA7CisgICAgICAgICAgICBtV2FybXVwTnNNYXggPSBMT05HX01BWDsKICAgICAgICAgfQogICAgICAgICBtTWl4ZXJCdWZmZXJTdGF0ZSA9IFVOREVGSU5FRDsKICNpZiAhTE9HX05ERUJVRwogICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzOyArK2kpIHsKLSAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gLTE7CisgICAgICAgICAgICBtRmFzdFRyYWNrTmFtZXNbaV0gPSAtMTsKICAgICAgICAgfQogI2VuZGlmCiAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVjb25maWd1cmUgYWxsIGFjdGl2ZSB0cmFja3MKICAgICAgICAgcHJldmlvdXNUcmFja01hc2sgPSAwOwotICAgICAgICBmYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW4gLSAxOworICAgICAgICBtRmFzdFRyYWNrc0dlbiA9IGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuIC0gMTsKICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcHJldmlvdXNUcmFja01hc2sgPSBwcmV2aW91cy0+bVRyYWNrTWFzazsKQEAgLTIxOSw3ICsyMjYsNyBAQAogICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgaW4gYWN0aXZlIHRyYWNrIHNldAogICAgIGNvbnN0IHVuc2lnbmVkIGN1cnJlbnRUcmFja01hc2sgPSBjdXJyZW50LT5tVHJhY2tNYXNrOwogICAgIGR1bXBTdGF0ZS0+bVRyYWNrTWFzayA9IGN1cnJlbnRUcmFja01hc2s7Ci0gICAgaWYgKGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuICE9IGZhc3RUcmFja3NHZW4pIHsKKyAgICBpZiAoY3VycmVudC0+bUZhc3RUcmFja3NHZW4gIT0gbUZhc3RUcmFja3NHZW4pIHsKICAgICAgICAgQUxPR19BU1NFUlQobU1peGVyQnVmZmVyICE9IE5VTEwpOwogICAgICAgICBpbnQgbmFtZTsKIApAQCAtMjMwLDE2ICsyMzcsMTYgQEAKICAgICAgICAgICAgIHJlbW92ZWRUcmFja3MgJj0gfigxIDw8IGkpOwogICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07CiAgICAgICAgICAgICBBTE9HX0FTU0VSVChmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlciA9PSBOVUxMKTsKLSAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOworICAgICAgICAgICAgaWYgKG1NaXhlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IG1GYXN0VHJhY2tOYW1lc1tpXTsKICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICAgICAgICAgIG1peGVyLT5kZWxldGVUcmFja05hbWUobmFtZSk7CisgICAgICAgICAgICAgICAgbU1peGVyLT5kZWxldGVUcmFja05hbWUobmFtZSk7CiAgICAgICAgICAgICB9CiAjaWYgIUxPR19OREVCVUcKLSAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gLTE7CisgICAgICAgICAgICBtRmFzdFRyYWNrTmFtZXNbaV0gPSAtMTsKICNlbmRpZgogICAgICAgICAgICAgLy8gZG9uJ3QgcmVzZXQgdHJhY2sgZHVtcCBzdGF0ZSwgc2luY2Ugb3RoZXIgc2lkZSBpcyBpZ25vcmluZyBpdAotICAgICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOworICAgICAgICAgICAgbUdlbmVyYXRpb25zW2ldID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKICAgICAgICAgfQogCiAgICAgICAgIC8vIG5vdyBwcm9jZXNzIGFkZGVkIHRyYWNrcwpAQCAtMjQ5LDI5ICsyNTYsMjkgQEAKICAgICAgICAgICAgIGFkZGVkVHJhY2tzICY9IH4oMSA8PCBpKTsKICAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOwogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciAqYnVmZmVyUHJvdmlkZXIgPSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlcjsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGJ1ZmZlclByb3ZpZGVyICE9IE5VTEwgJiYgZmFzdFRyYWNrTmFtZXNbaV0gPT0gLTEpOwotICAgICAgICAgICAgaWYgKG1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gbWl4ZXItPmdldFRyYWNrTmFtZShmYXN0VHJhY2stPm1DaGFubmVsTWFzaywKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKGJ1ZmZlclByb3ZpZGVyICE9IE5VTEwgJiYgbUZhc3RUcmFja05hbWVzW2ldID09IC0xKTsKKyAgICAgICAgICAgIGlmIChtTWl4ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG5hbWUgPSBtTWl4ZXItPmdldFRyYWNrTmFtZShmYXN0VHJhY2stPm1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUZvcm1hdCwgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gbmFtZTsKLSAgICAgICAgICAgICAgICBtaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLAorICAgICAgICAgICAgICAgIG1GYXN0VHJhY2tOYW1lc1tpXSA9IG5hbWU7CisgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBidWZmZXJQcm92aWRlcik7CisgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLAogICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTWl4ZXJCdWZmZXIpOwogICAgICAgICAgICAgICAgIC8vIG5ld2x5IGFsbG9jYXRlZCB0cmFjayBuYW1lcyBkZWZhdWx0IHRvIGZ1bGwgc2NhbGUgdm9sdW1lCi0gICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKiltTWl4ZXJCdWZmZXJGb3JtYXQpOwotICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKKyAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Rk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLAogICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW1TaW5rQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7CisgICAgICAgICAgICAgICAgbU1peGVyLT5lbmFibGUobmFtZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CisgICAgICAgICAgICBtR2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOwogICAgICAgICB9CiAKICAgICAgICAgLy8gZmluYWxseSBwcm9jZXNzIChwb3RlbnRpYWxseSkgbW9kaWZpZWQgdHJhY2tzOyB0aGVzZSB1c2UgdGhlIHNhbWUgc2xvdApAQCAtMjgxLDM4ICsyODgsMzggQEAKICAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihtb2RpZmllZFRyYWNrcyk7CiAgICAgICAgICAgICBtb2RpZmllZFRyYWNrcyAmPSB+KDEgPDwgaSk7CiAgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1HZW5lcmF0aW9uICE9IGdlbmVyYXRpb25zW2ldKSB7CisgICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tR2VuZXJhdGlvbiAhPSBtR2VuZXJhdGlvbnNbaV0pIHsKICAgICAgICAgICAgICAgICAvLyB0aGlzIHRyYWNrIHdhcyBhY3R1YWxseSBtb2RpZmllZAogICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7CiAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOworICAgICAgICAgICAgICAgIGlmIChtTWl4ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gbUZhc3RUcmFja05hbWVzW2ldOwogICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgYnVmZmVyUHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIGJ1ZmZlclByb3ZpZGVyKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGYgPSBBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FUOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJmYpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCisgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlJFTU9WRSwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1NaXhlckJ1ZmZlckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1DaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbVNpbmtDaGFubmVsTWFzayk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZW5hYmxlZAogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CisgICAgICAgICAgICAgICAgbUdlbmVyYXRpb25zW2ldID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbjsKKyAgICAgICAgbUZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbjsKIAogICAgICAgICBkdW1wU3RhdGUtPm1OdW1UcmFja3MgPSBwb3Bjb3VudChjdXJyZW50VHJhY2tNYXNrKTsKICAgICB9CkBAIC0zMjAsMTIgKzMyNywxMiBAQAogCiB2b2lkIEZhc3RNaXhlcjo6b25Xb3JrKCkKIHsKLSAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgdGhpcy0+Y3VycmVudDsKLSAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIHRoaXMtPmR1bXBTdGF0ZTsKLSAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCBjb21tYW5kID0gdGhpcy0+Y29tbWFuZDsKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgbUN1cnJlbnQ7CisgICAgRmFzdE1peGVyRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RNaXhlckR1bXBTdGF0ZSAqKSBtRHVtcFN0YXRlOworICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSBtQ29tbWFuZDsKICAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OwogCi0gICAgaWYgKChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6Ok1JWCkgJiYgKG1peGVyICE9IE5VTEwpICYmIGlzV2FybSkgeworICAgIGlmICgoY29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpNSVgpICYmIChtTWl4ZXIgIT0gTlVMTCkgJiYgbUlzV2FybSkgewogICAgICAgICBBTE9HX0FTU0VSVChtTWl4ZXJCdWZmZXIgIT0gTlVMTCk7CiAgICAgICAgIC8vIGZvciBlYWNoIHRyYWNrLCB1cGRhdGUgdm9sdW1lIGFuZCBjaGVjayBmb3IgdW5kZXJydW4KICAgICAgICAgdW5zaWduZWQgY3VycmVudFRyYWNrTWFzayA9IGN1cnJlbnQtPm1UcmFja01hc2s7CkBAIC0zMzUsOSArMzQyLDkgQEAKICAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOwogCiAgICAgICAgICAgICAvLyBSZWZyZXNoIHRoZSBwZXItdHJhY2sgdGltZXN0YW1wCi0gICAgICAgICAgICBpZiAodGltZXN0YW1wU3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBpZiAobVRpbWVzdGFtcFN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9Ci0gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQ7CisgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOwogICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrRnJhbWVzV3JpdHRlbiA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5mcmFtZXNSZWxlYXNlZCgpOwogICAgICAgICAgICAgICAgIC8vIENhbid0IHByb3ZpZGUgYW4gQXVkaW9UaW1lc3RhbXAgYmVmb3JlIGZpcnN0IGZyYW1lIHByZXNlbnRlZCwKICAgICAgICAgICAgICAgICAvLyBvciBkdXJpbmcgdGhlIGJyaWVmIDMyLWJpdCB3cmFwYXJvdW5kIHdpbmRvdwpAQCAtMzQ1LDIwICszNTIsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lc3RhbXAgcGVyVHJhY2tUaW1lc3RhbXA7CiAgICAgICAgICAgICAgICAgICAgIHBlclRyYWNrVGltZXN0YW1wLm1Qb3NpdGlvbiA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tGcmFtZXNXcml0dGVuIC0gdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOwotICAgICAgICAgICAgICAgICAgICBwZXJUcmFja1RpbWVzdGFtcC5tVGltZSA9IHRpbWVzdGFtcC5tVGltZTsKKyAgICAgICAgICAgICAgICAgICAgcGVyVHJhY2tUaW1lc3RhbXAubVRpbWUgPSBtVGltZXN0YW1wLm1UaW1lOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlci0+b25UaW1lc3RhbXAocGVyVHJhY2tUaW1lc3RhbXApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaW50IG5hbWUgPSBmYXN0VHJhY2tOYW1lc1tpXTsKKyAgICAgICAgICAgIGludCBuYW1lID0gbUZhc3RUcmFja05hbWVzW2ldOwogICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKICAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXItPmdldFZvbHVtZUxSKCk7CiAgICAgICAgICAgICAgICAgZmxvYXQgdmxmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpOwogICAgICAgICAgICAgICAgIGZsb2F0IHZyZiA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSk7CiAKLSAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7Ci0gICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOworICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7CisgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmdnJmKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIEZJWE1FIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIGZyYW1lc1JlYWR5KCkgZm9yIGZhc3QgdHJhY2tzCiAgICAgICAgICAgICAvLyB0YWtlcyBhIHRyeUxvY2ssIHdoaWNoIGNhbiBibG9jawpAQCAtMzc5LDQzICszODYsNDQgQEAKICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRW1wdHkrKzsKICAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQgPSBVTkRFUlJVTl9FTVBUWTsKLSAgICAgICAgICAgICAgICAgICAgbWl4ZXItPmRpc2FibGUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+ZGlzYWJsZShuYW1lKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBtaXhpbmcgcGFydGlhbCBidWZmZXIKICAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubVBhcnRpYWwrKzsKICAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQgPSBVTkRFUlJVTl9QQVJUSUFMOwotICAgICAgICAgICAgICAgICAgICBtaXhlci0+ZW5hYmxlKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPmVuYWJsZShuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1GdWxsKys7CiAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQgPSBVTkRFUlJVTl9GVUxMOwotICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7CisgICAgICAgICAgICAgICAgbU1peGVyLT5lbmFibGUobmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmdER1bXAtPm1VbmRlcnJ1bnMgPSB1bmRlcnJ1bnM7CiAgICAgICAgICAgICBmdER1bXAtPm1GcmFtZXNSZWFkeSA9IGZyYW1lc1JlYWR5OwogICAgICAgICB9CiAKICAgICAgICAgaW50NjRfdCBwdHM7Ci0gICAgICAgIGlmIChvdXRwdXRTaW5rID09IE5VTEwgfHwgKE9LICE9IG91dHB1dFNpbmstPmdldE5leHRXcml0ZVRpbWVzdGFtcCgmcHRzKSkpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRTaW5rID09IE5VTEwgfHwgKE9LICE9IG1PdXRwdXRTaW5rLT5nZXROZXh0V3JpdGVUaW1lc3RhbXAoJnB0cykpKSB7CiAgICAgICAgICAgICBwdHMgPSBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUzsKICAgICAgICAgfQogCiAgICAgICAgIC8vIHByb2Nlc3MoKSBpcyBDUFUtYm91bmQKLSAgICAgICAgbWl4ZXItPnByb2Nlc3MocHRzKTsKKyAgICAgICAgbU1peGVyLT5wcm9jZXNzKHB0cyk7CiAgICAgICAgIG1NaXhlckJ1ZmZlclN0YXRlID0gTUlYRUQ7CiAgICAgfSBlbHNlIGlmIChtTWl4ZXJCdWZmZXJTdGF0ZSA9PSBNSVhFRCkgewogICAgICAgICBtTWl4ZXJCdWZmZXJTdGF0ZSA9IFVOREVGSU5FRDsKICAgICB9CiAgICAgLy9ib29sIGRpZEZ1bGxXcml0ZSA9IGZhbHNlOyAgICAvLyBkdW1wc3lzIGNvdWxkIGRpc3BsYXkgYSBjb3VudCBvZiBwYXJ0aWFsIHdyaXRlcwotICAgIGlmICgoY29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpXUklURSkgJiYgKG91dHB1dFNpbmsgIT0gTlVMTCkgJiYgKG1NaXhlckJ1ZmZlciAhPSBOVUxMKSkgeworICAgIGlmICgoY29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpXUklURSkgJiYgKG1PdXRwdXRTaW5rICE9IE5VTEwpICYmIChtTWl4ZXJCdWZmZXIgIT0gTlVMTCkpIHsKICAgICAgICAgaWYgKG1NaXhlckJ1ZmZlclN0YXRlID09IFVOREVGSU5FRCkgewogICAgICAgICAgICAgbWVtc2V0KG1NaXhlckJ1ZmZlciwgMCwgbU1peGVyQnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJTdGF0ZSA9IFpFUk9FRDsKICAgICAgICAgfQorICAgICAgICAvLyBwcmVwYXJlIHRoZSBidWZmZXIgdXNlZCB0byB3cml0ZSB0byBzaW5rCiAgICAgICAgIHZvaWQgKmJ1ZmZlciA9IG1TaW5rQnVmZmVyICE9IE5VTEwgPyBtU2lua0J1ZmZlciA6IG1NaXhlckJ1ZmZlcjsKLSAgICAgICAgaWYgKGZvcm1hdC5tRm9ybWF0ICE9IG1NaXhlckJ1ZmZlckZvcm1hdCkgeyAvLyBzaW5rIGZvcm1hdCBub3QgdGhlIHNhbWUgYXMgbWl4ZXIgZm9ybWF0Ci0gICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgZm9ybWF0Lm1Gb3JtYXQsIG1NaXhlckJ1ZmZlciwgbU1peGVyQnVmZmVyRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50ICogRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpKTsKKyAgICAgICAgaWYgKG1Gb3JtYXQubUZvcm1hdCAhPSBtTWl4ZXJCdWZmZXJGb3JtYXQpIHsgLy8gc2luayBmb3JtYXQgbm90IHRoZSBzYW1lIGFzIG1peGVyIGZvcm1hdAorICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChidWZmZXIsIG1Gb3JtYXQubUZvcm1hdCwgbU1peGVyQnVmZmVyLCBtTWl4ZXJCdWZmZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgKiBGb3JtYXRfY2hhbm5lbENvdW50KG1Gb3JtYXQpKTsKICAgICAgICAgfQogICAgICAgICAvLyBpZiBub24tTlVMTCwgdGhlbiBkdXBsaWNhdGUgd3JpdGUoKSB0byB0aGlzIG5vbi1ibG9ja2luZyBzaW5rCiAgICAgICAgIE5CQUlPX1NpbmsqIHRlZVNpbms7CkBAIC00MjYsMjUyICs0MzQsMzQgQEAKICAgICAgICAgLy8gICAgICAgYnV0IHRoaXMgY29kZSBzaG91bGQgYmUgbW9kaWZpZWQgdG8gaGFuZGxlIGJvdGggbm9uLWJsb2NraW5nIGFuZCBibG9ja2luZyBzaW5rcwogICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7CiAgICAgICAgIEFUUkFDRV9CRUdJTigid3JpdGUiKTsKLSAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gb3V0cHV0U2luay0+d3JpdGUoYnVmZmVyLCBmcmFtZUNvdW50KTsKKyAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gbU91dHB1dFNpbmstPndyaXRlKGJ1ZmZlciwgZnJhbWVDb3VudCk7CiAgICAgICAgIEFUUkFDRV9FTkQoKTsKICAgICAgICAgZHVtcFN0YXRlLT5tV3JpdGVTZXF1ZW5jZSsrOwogICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiA+PSAwKSB7CiAgICAgICAgICAgICBBTE9HX0FTU0VSVCgoc2l6ZV90KSBmcmFtZXNXcml0dGVuIDw9IGZyYW1lQ291bnQpOwotICAgICAgICAgICAgdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuICs9IGZyYW1lc1dyaXR0ZW47Ci0gICAgICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZXNXcml0dGVuID0gdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuOworICAgICAgICAgICAgbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbiArPSBmcmFtZXNXcml0dGVuOworICAgICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVzV3JpdHRlbiA9IG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW47CiAgICAgICAgICAgICAvL2lmICgoc2l6ZV90KSBmcmFtZXNXcml0dGVuID09IGZyYW1lQ291bnQpIHsKICAgICAgICAgICAgIC8vICAgIGRpZEZ1bGxXcml0ZSA9IHRydWU7CiAgICAgICAgICAgICAvL30KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlRXJyb3JzKys7CiAgICAgICAgIH0KLSAgICAgICAgYXR0ZW1wdGVkV3JpdGUgPSB0cnVlOworICAgICAgICBtQXR0ZW1wdGVkV3JpdGUgPSB0cnVlOwogICAgICAgICAvLyBGSVhNRSBjb3VudCAjIG9mIHdyaXRlcyBibG9ja2VkIGV4Y2Vzc2l2ZWx5LCBDUFUgdXNhZ2UsIGV0Yy4gZm9yIGR1bXAKIAotICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBvdXRwdXRTaW5rLT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKLSAgICAgICAgaWYgKHRpbWVzdGFtcFN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgdWludDMyX3QgdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQgPSB0aW1lc3RhbXAubVBvc2l0aW9uOwotICAgICAgICAgICAgaWYgKHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkIDw9IHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbikgewotICAgICAgICAgICAgICAgIG5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPQotICAgICAgICAgICAgICAgICAgICB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gLSB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZDsKKyAgICAgICAgbVRpbWVzdGFtcFN0YXR1cyA9IG1PdXRwdXRTaW5rLT5nZXRUaW1lc3RhbXAobVRpbWVzdGFtcCk7CisgICAgICAgIGlmIChtVGltZXN0YW1wU3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICB1aW50MzJfdCB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA9IG1UaW1lc3RhbXAubVBvc2l0aW9uOworICAgICAgICAgICAgaWYgKHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkIDw9IG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4pIHsKKyAgICAgICAgICAgICAgICBtTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9CisgICAgICAgICAgICAgICAgICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gLSB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gSEFMIHJlcG9ydGVkIHRoYXQgbW9yZSBmcmFtZXMgd2VyZSBwcmVzZW50ZWQgdGhhbiB3ZXJlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wU3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLUZhc3RNaXhlckR1bXBTdGF0ZTo6RmFzdE1peGVyRHVtcFN0YXRlKAotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgICAgICB1aW50MzJfdCBzYW1wbGluZ04KLSNlbmRpZgotICAgICAgICApIDogRmFzdFRocmVhZER1bXBTdGF0ZSgpLAotICAgIG1Xcml0ZVNlcXVlbmNlKDApLCBtRnJhbWVzV3JpdHRlbigwKSwKLSAgICBtTnVtVHJhY2tzKDApLCBtV3JpdGVFcnJvcnMoMCksCi0gICAgbVNhbXBsZVJhdGUoMCksIG1GcmFtZUNvdW50KDApLAotICAgIG1UcmFja01hc2soMCkKLXsKLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICBpbmNyZWFzZVNhbXBsaW5nTihzYW1wbGluZ04pOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLXZvaWQgRmFzdE1peGVyRHVtcFN0YXRlOjppbmNyZWFzZVNhbXBsaW5nTih1aW50MzJfdCBzYW1wbGluZ04pCi17Ci0gICAgaWYgKHNhbXBsaW5nTiA8PSBtU2FtcGxpbmdOIHx8IHNhbXBsaW5nTiA+IGtTYW1wbGluZ04gfHwgcm91bmR1cChzYW1wbGluZ04pICE9IHNhbXBsaW5nTikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHVpbnQzMl90IGFkZGl0aW9uYWwgPSBzYW1wbGluZ04gLSBtU2FtcGxpbmdOOwotICAgIC8vIHNhbXBsZSBhcnJheXMgYXJlbid0IGFjY2Vzc2VkIGF0b21pY2FsbHkgd2l0aCByZXNwZWN0IHRvIHRoZSBib3VuZHMsCi0gICAgLy8gc28gY2xlYXJpbmcgcmVkdWNlcyBjaGFuY2UgZm9yIGR1bXBzeXMgdG8gcmVhZCByYW5kb20gdW5pbml0aWFsaXplZCBzYW1wbGVzCi0gICAgbWVtc2V0KCZtTW9ub3RvbmljTnNbbVNhbXBsaW5nTl0sIDAsIHNpemVvZihtTW9ub3RvbmljTnNbMF0pICogYWRkaXRpb25hbCk7Ci0gICAgbWVtc2V0KCZtTG9hZE5zW21TYW1wbGluZ05dLCAwLCBzaXplb2YobUxvYWROc1swXSkgKiBhZGRpdGlvbmFsKTsKLSNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICBtZW1zZXQoJm1DcHVrSHpbbVNhbXBsaW5nTl0sIDAsIHNpemVvZihtQ3B1a0h6WzBdKSAqIGFkZGl0aW9uYWwpOwotI2VuZGlmCi0gICAgbVNhbXBsaW5nTiA9IHNhbXBsaW5nTjsKLX0KLSNlbmRpZgotCi1GYXN0TWl4ZXJEdW1wU3RhdGU6On5GYXN0TWl4ZXJEdW1wU3RhdGUoKQotewotfQotCi0vLyBoZWxwZXIgZnVuY3Rpb24gY2FsbGVkIGJ5IHFzb3J0KCkKLXN0YXRpYyBpbnQgY29tcGFyZV91aW50MzJfdChjb25zdCB2b2lkICpwYSwgY29uc3Qgdm9pZCAqcGIpCi17Ci0gICAgdWludDMyX3QgYSA9ICooY29uc3QgdWludDMyX3QgKilwYTsKLSAgICB1aW50MzJfdCBiID0gKihjb25zdCB1aW50MzJfdCAqKXBiOwotICAgIGlmIChhIDwgYikgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChhID4gYikgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLXZvaWQgRmFzdE1peGVyRHVtcFN0YXRlOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBpZiAobUNvbW1hbmQgPT0gRmFzdE1peGVyU3RhdGU6OklOSVRJQUwpIHsKLSAgICAgICAgZHByaW50ZihmZCwgIiAgRmFzdE1peGVyIG5vdCBpbml0aWFsaXplZFxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZGVmaW5lIENPTU1BTkRfTUFYIDMyCi0gICAgY2hhciBzdHJpbmdbQ09NTUFORF9NQVhdOwotICAgIHN3aXRjaCAobUNvbW1hbmQpIHsKLSAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpJTklUSUFMOgotICAgICAgICBzdHJjcHkoc3RyaW5nLCAiSU5JVElBTCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRToKLSAgICAgICAgc3RyY3B5KHN0cmluZywgIkhPVF9JRExFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6OkNPTERfSURMRToKLSAgICAgICAgc3RyY3B5KHN0cmluZywgIkNPTERfSURMRSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpFWElUOgotICAgICAgICBzdHJjcHkoc3RyaW5nLCAiRVhJVCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpNSVg6Ci0gICAgICAgIHN0cmNweShzdHJpbmcsICJNSVgiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6V1JJVEU6Ci0gICAgICAgIHN0cmNweShzdHJpbmcsICJXUklURSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpNSVhfV1JJVEU6Ci0gICAgICAgIHN0cmNweShzdHJpbmcsICJNSVhfV1JJVEUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgc25wcmludGYoc3RyaW5nLCBDT01NQU5EX01BWCwgIiVkIiwgbUNvbW1hbmQpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZG91YmxlIG1lYXN1cmVkV2FybXVwTXMgPSAobU1lYXN1cmVkV2FybXVwVHMudHZfc2VjICogMTAwMC4wKSArCi0gICAgICAgICAgICAobU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyAvIDEwMDAwMDAuMCk7Ci0gICAgZG91YmxlIG1peFBlcmlvZFNlYyA9IChkb3VibGUpIG1GcmFtZUNvdW50IC8gKGRvdWJsZSkgbVNhbXBsZVJhdGU7Ci0gICAgZHByaW50ZihmZCwgIiAgRmFzdE1peGVyIGNvbW1hbmQ9JXMgd3JpdGVTZXF1ZW5jZT0ldSBmcmFtZXNXcml0dGVuPSV1XG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG51bVRyYWNrcz0ldSB3cml0ZUVycm9ycz0ldSB1bmRlcnJ1bnM9JXUgb3ZlcnJ1bnM9JXVcbiIKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICAgc2FtcGxlUmF0ZT0ldSBmcmFtZUNvdW50PSV6dSBtZWFzdXJlZFdhcm11cD0lLjNnIG1zLCB3YXJtdXBDeWNsZXM9JXVcbiIKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICAgbWl4UGVyaW9kPSUuMmYgbXNcbiIsCi0gICAgICAgICAgICAgICAgIHN0cmluZywgbVdyaXRlU2VxdWVuY2UsIG1GcmFtZXNXcml0dGVuLAotICAgICAgICAgICAgICAgICBtTnVtVHJhY2tzLCBtV3JpdGVFcnJvcnMsIG1VbmRlcnJ1bnMsIG1PdmVycnVucywKLSAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1GcmFtZUNvdW50LCBtZWFzdXJlZFdhcm11cE1zLCBtV2FybXVwQ3ljbGVzLAotICAgICAgICAgICAgICAgICBtaXhQZXJpb2RTZWMgKiAxZTMpOwotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgIC8vIGZpbmQgdGhlIGludGVydmFsIG9mIHZhbGlkIHNhbXBsZXMKLSAgICB1aW50MzJfdCBib3VuZHMgPSBtQm91bmRzOwotICAgIHVpbnQzMl90IG5ld2VzdE9wZW4gPSBib3VuZHMgJiAweEZGRkY7Ci0gICAgdWludDMyX3Qgb2xkZXN0Q2xvc2VkID0gYm91bmRzID4+IDE2OwotICAgIHVpbnQzMl90IG4gPSAobmV3ZXN0T3BlbiAtIG9sZGVzdENsb3NlZCkgJiAweEZGRkY7Ci0gICAgaWYgKG4gPiBtU2FtcGxpbmdOKSB7Ci0gICAgICAgIEFMT0dFKCJ0b28gbWFueSBzYW1wbGVzICV1Iiwgbik7Ci0gICAgICAgIG4gPSBtU2FtcGxpbmdOOwotICAgIH0KLSAgICAvLyBzdGF0aXN0aWNzIGZvciBtb25vdG9uaWMgKHdhbGwgY2xvY2spIHRpbWUsIHRocmVhZCByYXcgQ1BVIGxvYWQgaW4gdGltZSwgQ1BVIGNsb2NrIGZyZXF1ZW5jeSwKLSAgICAvLyBhbmQgYWRqdXN0ZWQgQ1BVIGxvYWQgaW4gTUh6IG5vcm1hbGl6ZWQgZm9yIENQVSBjbG9jayBmcmVxdWVuY3kKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIHdhbGwsIGxvYWROczsKLSNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIGtIeiwgbG9hZE1IejsKLSAgICB1aW50MzJfdCBwcmV2aW91c0NwdWtIeiA9IDA7Ci0jZW5kaWYKLSAgICAvLyBBc3N1bWluZyBhIG5vcm1hbCBkaXN0cmlidXRpb24gZm9yIGN5Y2xlIHRpbWVzLCB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9uIGVpdGhlciBzaWRlIG9mCi0gICAgLy8gdGhlIG1lYW4gYWNjb3VudCBmb3IgOTkuNzMlIG9mIHRoZSBwb3B1bGF0aW9uLiAgU28gaWYgd2UgdGFrZSBlYWNoIHRhaWwgdG8gYmUgMS8xMDAwIG9mIHRoZQotICAgIC8vIHNhbXBsZSBzZXQsIHdlIGdldCA5OS44JSBjb21iaW5lZCwgb3IgY2xvc2UgdG8gdGhyZWUgc3RhbmRhcmQgZGV2aWF0aW9ucy4KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1RhaWxEZW5vbWluYXRvciA9IDEwMDA7Ci0gICAgdWludDMyX3QgKnRhaWwgPSBuID49IGtUYWlsRGVub21pbmF0b3IgPyBuZXcgdWludDMyX3Rbbl0gOiBOVUxMOwotICAgIC8vIGxvb3Agb3ZlciBhbGwgdGhlIHNhbXBsZXMKLSAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbjsgKytqKSB7Ci0gICAgICAgIHNpemVfdCBpID0gb2xkZXN0Q2xvc2VkKysgJiAobVNhbXBsaW5nTiAtIDEpOwotICAgICAgICB1aW50MzJfdCB3YWxsTnMgPSBtTW9ub3RvbmljTnNbaV07Ci0gICAgICAgIGlmICh0YWlsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHRhaWxbal0gPSB3YWxsTnM7Ci0gICAgICAgIH0KLSAgICAgICAgd2FsbC5zYW1wbGUod2FsbE5zKTsKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlTG9hZE5zID0gbUxvYWROc1tpXTsKLSAgICAgICAgbG9hZE5zLnNhbXBsZShzYW1wbGVMb2FkTnMpOwotI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgICAgICB1aW50MzJfdCBzYW1wbGVDcHVrSHogPSBtQ3B1a0h6W2ldOwotICAgICAgICAvLyBza2lwIGJhZCBrSHogc2FtcGxlcwotICAgICAgICBpZiAoKHNhbXBsZUNwdWtIeiAmIH4weEYpICE9IDApIHsKLSAgICAgICAgICAgIGtIei5zYW1wbGUoc2FtcGxlQ3B1a0h6ID4+IDQpOwotICAgICAgICAgICAgaWYgKHNhbXBsZUNwdWtIeiA9PSBwcmV2aW91c0NwdWtIeikgewotICAgICAgICAgICAgICAgIGRvdWJsZSBtZWdhY3ljbGVzID0gKGRvdWJsZSkgc2FtcGxlTG9hZE5zICogKGRvdWJsZSkgKHNhbXBsZUNwdWtIeiA+PiA0KSAqIDFlLTEyOwotICAgICAgICAgICAgICAgIGRvdWJsZSBhZGpNSHogPSBtZWdhY3ljbGVzIC8gbWl4UGVyaW9kU2VjOyAgLy8gX25vdF8gd2FsbE5zICogMWU5Ci0gICAgICAgICAgICAgICAgbG9hZE1Iei5zYW1wbGUoYWRqTUh6KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcmV2aW91c0NwdWtIeiA9IHNhbXBsZUNwdWtIejsKLSNlbmRpZgotICAgIH0KLSAgICBpZiAobikgewotICAgICAgICBkcHJpbnRmKGZkLCAiICBTaW1wbGUgbW92aW5nIHN0YXRpc3RpY3Mgb3ZlciBsYXN0ICUuMWYgc2Vjb25kczpcbiIsCi0gICAgICAgICAgICAgICAgICAgIHdhbGwubigpICogbWl4UGVyaW9kU2VjKTsKLSAgICAgICAgZHByaW50ZihmZCwgIiAgICB3YWxsIGNsb2NrIHRpbWUgaW4gbXMgcGVyIG1peCBjeWNsZTpcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgIG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgd2FsbC5tZWFuKCkqMWUtNiwgd2FsbC5taW5pbXVtKCkqMWUtNiwgd2FsbC5tYXhpbXVtKCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgd2FsbC5zdGRkZXYoKSoxZS02KTsKLSAgICAgICAgZHByaW50ZihmZCwgIiAgICByYXcgQ1BVIGxvYWQgaW4gdXMgcGVyIG1peCBjeWNsZTpcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgbG9hZE5zLm1lYW4oKSoxZS0zLCBsb2FkTnMubWluaW11bSgpKjFlLTMsIGxvYWROcy5tYXhpbXVtKCkqMWUtMywKLSAgICAgICAgICAgICAgICAgICAgbG9hZE5zLnN0ZGRldigpKjFlLTMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRwcmludGYoZmQsICIgIE5vIEZhc3RNaXhlciBzdGF0aXN0aWNzIGF2YWlsYWJsZSBjdXJyZW50bHlcbiIpOwotICAgIH0KLSNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICBkcHJpbnRmKGZkLCAiICBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIE1IejpcbiIKLSAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICBrSHoubWVhbigpKjFlLTMsIGtIei5taW5pbXVtKCkqMWUtMywga0h6Lm1heGltdW0oKSoxZS0zLCBrSHouc3RkZGV2KCkqMWUtMyk7Ci0gICAgZHByaW50ZihmZCwgIiAgYWRqdXN0ZWQgQ1BVIGxvYWQgaW4gTUh6IChpLmUuIG5vcm1hbGl6ZWQgZm9yIENQVSBjbG9jayBmcmVxdWVuY3kpOlxuIgotICAgICAgICAgICAgICAgICIgICAgbWVhbj0lLjFmIG1pbj0lLjFmIG1heD0lLjFmIHN0ZGRldj0lLjFmXG4iLAotICAgICAgICAgICAgICAgIGxvYWRNSHoubWVhbigpLCBsb2FkTUh6Lm1pbmltdW0oKSwgbG9hZE1Iei5tYXhpbXVtKCksIGxvYWRNSHouc3RkZGV2KCkpOwotI2VuZGlmCi0gICAgaWYgKHRhaWwgIT0gTlVMTCkgewotICAgICAgICBxc29ydCh0YWlsLCBuLCBzaXplb2YodWludDMyX3QpLCBjb21wYXJlX3VpbnQzMl90KTsKLSAgICAgICAgLy8gYXNzdW1lIHNhbWUgbnVtYmVyIG9mIHRhaWwgc2FtcGxlcyBvbiBlYWNoIHNpZGUsIGxlZnQgYW5kIHJpZ2h0Ci0gICAgICAgIHVpbnQzMl90IGNvdW50ID0gbiAvIGtUYWlsRGVub21pbmF0b3I7Ci0gICAgICAgIENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MgbGVmdCwgcmlnaHQ7Ci0gICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBsZWZ0LnNhbXBsZSh0YWlsW2ldKTsKLSAgICAgICAgICAgIHJpZ2h0LnNhbXBsZSh0YWlsW24gLSAoaSArIDEpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZHByaW50ZihmZCwgIiAgRGlzdHJpYnV0aW9uIG9mIG1peCBjeWNsZSB0aW1lcyBpbiBtcyBmb3IgdGhlIHRhaWxzICg+IH4zIHN0ZGRldiBvdXRsaWVycyk6XG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgbGVmdCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgICByaWdodCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgIGxlZnQubWVhbigpKjFlLTYsIGxlZnQubWluaW11bSgpKjFlLTYsIGxlZnQubWF4aW11bSgpKjFlLTYsIGxlZnQuc3RkZGV2KCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQubWVhbigpKjFlLTYsIHJpZ2h0Lm1pbmltdW0oKSoxZS02LCByaWdodC5tYXhpbXVtKCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQuc3RkZGV2KCkqMWUtNik7Ci0gICAgICAgIGRlbGV0ZVtdIHRhaWw7Ci0gICAgfQotI2VuZGlmCi0gICAgLy8gVGhlIGFjdGl2ZSB0cmFjayBtYXNrIGFuZCB0cmFjayBzdGF0ZXMgYXJlIHVwZGF0ZWQgbm9uLWF0b21pY2FsbHkuCi0gICAgLy8gU28gaWYgd2UgcmVsaWVkIG9uIGlzQWN0aXZlIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGRpc3BsYXksCi0gICAgLy8gdGhlbiB3ZSBtaWdodCBkaXNwbGF5IGFuIG9ic29sZXRlIHRyYWNrIG9yIG9taXQgYW4gYWN0aXZlIHRyYWNrLgotICAgIC8vIEluc3RlYWQgd2UgYWx3YXlzIGRpc3BsYXkgYWxsIHRyYWNrcywgd2l0aCBhbiBpbmRpY2F0aW9uCi0gICAgLy8gb2Ygd2hldGhlciB3ZSB0aGluayB0aGUgdHJhY2sgaXMgYWN0aXZlLgotICAgIHVpbnQzMl90IHRyYWNrTWFzayA9IG1UcmFja01hc2s7Ci0gICAgZHByaW50ZihmZCwgIiAgRmFzdCB0cmFja3M6IGtNYXhGYXN0VHJhY2tzPSV1IGFjdGl2ZU1hc2s9JSN4XG4iLAotICAgICAgICAgICAgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzLCB0cmFja01hc2spOwotICAgIGRwcmludGYoZmQsICIgIEluZGV4IEFjdGl2ZSBGdWxsIFBhcnRpYWwgRW1wdHkgIFJlY2VudCBSZWFkeVxuIik7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrczsgKytpLCB0cmFja01hc2sgPj49IDEpIHsKLSAgICAgICAgYm9vbCBpc0FjdGl2ZSA9IHRyYWNrTWFzayAmIDE7Ci0gICAgICAgIGNvbnN0IEZhc3RUcmFja0R1bXAgKmZ0RHVtcCA9ICZtVHJhY2tzW2ldOwotICAgICAgICBjb25zdCBGYXN0VHJhY2tVbmRlcnJ1bnMmIHVuZGVycnVucyA9IGZ0RHVtcC0+bVVuZGVycnVuczsKLSAgICAgICAgY29uc3QgY2hhciAqbW9zdFJlY2VudDsKLSAgICAgICAgc3dpdGNoICh1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCkgewotICAgICAgICBjYXNlIFVOREVSUlVOX0ZVTEw6Ci0gICAgICAgICAgICBtb3N0UmVjZW50ID0gImZ1bGwiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVU5ERVJSVU5fUEFSVElBTDoKLSAgICAgICAgICAgIG1vc3RSZWNlbnQgPSAicGFydGlhbCI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBVTkRFUlJVTl9FTVBUWToKLSAgICAgICAgICAgIG1vc3RSZWNlbnQgPSAiZW1wdHkiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBtb3N0UmVjZW50ID0gIj8iOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZHByaW50ZihmZCwgIiAgJTV1ICU2cyAlNHUgJTd1ICU1dSAlN3MgJTV6dVxuIiwgaSwgaXNBY3RpdmUgPyAieWVzIiA6ICJubyIsCi0gICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1GdWxsKSAmIFVOREVSUlVOX01BU0ssCi0gICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1QYXJ0aWFsKSAmIFVOREVSUlVOX01BU0ssCi0gICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1FbXB0eSkgJiBVTkRFUlJVTl9NQVNLLAotICAgICAgICAgICAgICAgIG1vc3RSZWNlbnQsIGZ0RHVtcC0+bUZyYW1lc1JlYWR5KTsKLSAgICB9Ci19Ci0KIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCmluZGV4IGZkZThjMmIuLjA2YTY4ZmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKQEAgLTE3LDExICsxNyw3IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9ICiAKLSNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgotI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlICJGYXN0VGhyZWFkLmgiCi0jaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CiAjaW5jbHVkZSAiU3RhdGVRdWV1ZS5oIgogI2luY2x1ZGUgIkZhc3RNaXhlclN0YXRlLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyRHVtcFN0YXRlLmgiCkBAIC01MiwzNiArNDgsMzkgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25TdGF0ZUNoYW5nZSgpOwogICAgIHZpcnR1YWwgdm9pZCBvbldvcmsoKTsKIAotICAgIC8vIEZJWE1FIHRoZXNlIGZvcm1lciBsb2NhbCB2YXJpYWJsZXMgbmVlZCBjb21tZW50cyBhbmQgdG8gYmUgcmVuYW1lZCB0byBoYXZlICJtIiBwcmVmaXgKLSAgICBzdGF0aWMgY29uc3QgRmFzdE1peGVyU3RhdGUgaW5pdGlhbDsKLSAgICBGYXN0TWl4ZXJTdGF0ZSBwcmVJZGxlOyAvLyBjb3B5IG9mIHN0YXRlIGJlZm9yZSB3ZSB3ZW50IGludG8gaWRsZQotICAgIGxvbmcgc2xvcE5zOyAgICAgICAgLy8gYWNjdW11bGF0ZWQgdGltZSB3ZSd2ZSB3b2tlbiB1cCB0b28gZWFybHkgKD4gMCkgb3IgdG9vIGxhdGUgKDwgMCkKLSAgICBpbnQgZmFzdFRyYWNrTmFtZXNbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsgLy8gaGFuZGxlcyB1c2VkIGJ5IG1peGVyIHRvIGlkZW50aWZ5IHRyYWNrcwotICAgIGludCBnZW5lcmF0aW9uc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOyAgICAvLyBsYXN0IG9ic2VydmVkIG1GYXN0VHJhY2tzW2ldLm1HZW5lcmF0aW9uCi0gICAgTkJBSU9fU2luayAqb3V0cHV0U2luazsKLSAgICBpbnQgb3V0cHV0U2lua0dlbjsKLSAgICBBdWRpb01peGVyKiBtaXhlcjsKKyAgICAvLyBGSVhNRSB0aGVzZSBmb3JtZXIgbG9jYWwgdmFyaWFibGVzIG5lZWQgY29tbWVudHMKKyAgICBzdGF0aWMgY29uc3QgRmFzdE1peGVyU3RhdGUgc0luaXRpYWw7CisKKyAgICBGYXN0TWl4ZXJTdGF0ZSAgbVByZUlkbGU7ICAgLy8gY29weSBvZiBzdGF0ZSBiZWZvcmUgd2Ugd2VudCBpbnRvIGlkbGUKKyAgICBsb25nICAgICAgICAgICAgbVNsb3BOczsgICAgLy8gYWNjdW11bGF0ZWQgdGltZSB3ZSd2ZSB3b2tlbiB1cCB0b28gZWFybHkgKD4gMCkgb3IgdG9vIGxhdGUgKDwgMCkKKyAgICBpbnQgICAgICAgICAgICAgbUZhc3RUcmFja05hbWVzW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXMgdXNlZCBieSBtaXhlciB0byBpZGVudGlmeSB0cmFja3MKKyAgICBpbnQgICAgICAgICAgICAgbUdlbmVyYXRpb25zW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhc3Qgb2JzZXJ2ZWQgbUZhc3RUcmFja3NbaV0ubUdlbmVyYXRpb24KKyAgICBOQkFJT19TaW5rKiAgICAgbU91dHB1dFNpbms7CisgICAgaW50ICAgICAgICAgICAgIG1PdXRwdXRTaW5rR2VuOworICAgIEF1ZGlvTWl4ZXIqICAgICBtTWl4ZXI7CiAKICAgICAvLyBtU2lua0J1ZmZlciBhdWRpbyBmb3JtYXQgaXMgc3RvcmVkIGluIGZvcm1hdC5tRm9ybWF0LgotICAgIHZvaWQqIG1TaW5rQnVmZmVyOyAgICAgICAgICAgICAgICAgIC8vIHVzZWQgZm9yIG1peGVyIG91dHB1dCBmb3JtYXQgdHJhbnNsYXRpb24KKyAgICB2b2lkKiAgICAgICAgICAgbVNpbmtCdWZmZXI7ICAgICAgICAvLyB1c2VkIGZvciBtaXhlciBvdXRwdXQgZm9ybWF0IHRyYW5zbGF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc2luayBmb3JtYXQgaXMgZGlmZmVyZW50IHRoYW4gbWl4ZXIgb3V0cHV0LgotICAgIHNpemVfdCBtU2lua0J1ZmZlclNpemU7Ci0gICAgdWludDMyX3QgbVNpbmtDaGFubmVsQ291bnQ7CisgICAgc2l6ZV90ICAgICAgICAgIG1TaW5rQnVmZmVyU2l6ZTsKKyAgICB1aW50MzJfdCAgICAgICAgbVNpbmtDaGFubmVsQ291bnQ7CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbVNpbmtDaGFubmVsTWFzazsKLSAgICB2b2lkKiBtTWl4ZXJCdWZmZXI7ICAgICAgICAgICAgICAgICAvLyBtaXhlciBvdXRwdXQgYnVmZmVyLgotICAgIHNpemVfdCBtTWl4ZXJCdWZmZXJTaXplOwotICAgIGF1ZGlvX2Zvcm1hdF90IG1NaXhlckJ1ZmZlckZvcm1hdDsgIC8vIG1peGVyIG91dHB1dCBmb3JtYXQ6IEFVRElPX0ZPUk1BVF9QQ01fKDE2X0JJVHxGTE9BVCkuCisgICAgdm9pZCogICAgICAgICAgIG1NaXhlckJ1ZmZlcjsgICAgICAgLy8gbWl4ZXIgb3V0cHV0IGJ1ZmZlci4KKyAgICBzaXplX3QgICAgICAgICAgbU1peGVyQnVmZmVyU2l6ZTsKKyAgICBhdWRpb19mb3JtYXRfdCAgbU1peGVyQnVmZmVyRm9ybWF0OyAvLyBtaXhlciBvdXRwdXQgZm9ybWF0OiBBVURJT19GT1JNQVRfUENNXygxNl9CSVR8RkxPQVQpLgogCiAgICAgZW51bSB7VU5ERUZJTkVELCBNSVhFRCwgWkVST0VEfSBtTWl4ZXJCdWZmZXJTdGF0ZTsKLSAgICBOQkFJT19Gb3JtYXQgZm9ybWF0OwotICAgIHVuc2lnbmVkIHNhbXBsZVJhdGU7Ci0gICAgaW50IGZhc3RUcmFja3NHZW47Ci0gICAgRmFzdE1peGVyRHVtcFN0YXRlIGR1bW15RHVtcFN0YXRlOwotICAgIHVpbnQzMl90IHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbjsgIC8vIGNvcGllZCB0byBkdW1wU3RhdGUtPm1GcmFtZXNXcml0dGVuCisgICAgTkJBSU9fRm9ybWF0ICAgIG1Gb3JtYXQ7CisgICAgdW5zaWduZWQgICAgICAgIG1TYW1wbGVSYXRlOworICAgIGludCAgICAgICAgICAgICBtRmFzdFRyYWNrc0dlbjsKKyAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgbUR1bW15RmFzdE1peGVyRHVtcFN0YXRlOworICAgIHVpbnQzMl90ICAgICAgICBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuOyAgLy8gY29waWVkIHRvIGR1bXBTdGF0ZS0+bUZyYW1lc1dyaXR0ZW4KIAogICAgIC8vIG5leHQgMiBmaWVsZHMgYXJlIHZhbGlkIG9ubHkgd2hlbiB0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IKLSAgICBBdWRpb1RpbWVzdGFtcCB0aW1lc3RhbXA7Ci0gICAgdWludDMyX3QgbmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKKyAgICBBdWRpb1RpbWVzdGFtcCAgbVRpbWVzdGFtcDsKKyAgICB1aW50MzJfdCAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQ7CiAKIH07ICAvLyBjbGFzcyBGYXN0TWl4ZXIKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTA5NDJiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkZhc3RNaXhlckR1bXBTdGF0ZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCisjaW5jbHVkZSA8Y3B1c3RhdHMvQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcy5oPgorI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUworI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CisjZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPHV0aWxzL0RlYnVnLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiRmFzdE1peGVyRHVtcFN0YXRlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworRmFzdE1peGVyRHVtcFN0YXRlOjpGYXN0TWl4ZXJEdW1wU3RhdGUoKSA6IEZhc3RUaHJlYWREdW1wU3RhdGUoKSwKKyAgICBtV3JpdGVTZXF1ZW5jZSgwKSwgbUZyYW1lc1dyaXR0ZW4oMCksCisgICAgbU51bVRyYWNrcygwKSwgbVdyaXRlRXJyb3JzKDApLAorICAgIG1TYW1wbGVSYXRlKDApLCBtRnJhbWVDb3VudCgwKSwKKyAgICBtVHJhY2tNYXNrKDApCit7Cit9CisKK0Zhc3RNaXhlckR1bXBTdGF0ZTo6fkZhc3RNaXhlckR1bXBTdGF0ZSgpCit7Cit9CisKKy8vIGhlbHBlciBmdW5jdGlvbiBjYWxsZWQgYnkgcXNvcnQoKQorc3RhdGljIGludCBjb21wYXJlX3VpbnQzMl90KGNvbnN0IHZvaWQgKnBhLCBjb25zdCB2b2lkICpwYikKK3sKKyAgICB1aW50MzJfdCBhID0gKihjb25zdCB1aW50MzJfdCAqKXBhOworICAgIHVpbnQzMl90IGIgPSAqKGNvbnN0IHVpbnQzMl90ICopcGI7CisgICAgaWYgKGEgPCBiKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKGEgPiBiKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKwordm9pZCBGYXN0TWl4ZXJEdW1wU3RhdGU6OmR1bXAoaW50IGZkKSBjb25zdAoreworICAgIGlmIChtQ29tbWFuZCA9PSBGYXN0TWl4ZXJTdGF0ZTo6SU5JVElBTCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBGYXN0TWl4ZXIgbm90IGluaXRpYWxpemVkXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkb3VibGUgbWVhc3VyZWRXYXJtdXBNcyA9IChtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgKiAxMDAwLjApICsKKyAgICAgICAgICAgIChtTWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjIC8gMTAwMDAwMC4wKTsKKyAgICBkb3VibGUgbWl4UGVyaW9kU2VjID0gKGRvdWJsZSkgbUZyYW1lQ291bnQgLyBtU2FtcGxlUmF0ZTsKKyAgICBkcHJpbnRmKGZkLCAiICBGYXN0TWl4ZXIgY29tbWFuZD0lcyB3cml0ZVNlcXVlbmNlPSV1IGZyYW1lc1dyaXR0ZW49JXVcbiIKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgbnVtVHJhY2tzPSV1IHdyaXRlRXJyb3JzPSV1IHVuZGVycnVucz0ldSBvdmVycnVucz0ldVxuIgorICAgICAgICAgICAgICAgICIgICAgICAgICAgICBzYW1wbGVSYXRlPSV1IGZyYW1lQ291bnQ9JXp1IG1lYXN1cmVkV2FybXVwPSUuM2cgbXMsIHdhcm11cEN5Y2xlcz0ldVxuIgorICAgICAgICAgICAgICAgICIgICAgICAgICAgICBtaXhQZXJpb2Q9JS4yZiBtc1xuIiwKKyAgICAgICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZTo6Y29tbWFuZFRvU3RyaW5nKG1Db21tYW5kKSwgbVdyaXRlU2VxdWVuY2UsIG1GcmFtZXNXcml0dGVuLAorICAgICAgICAgICAgICAgIG1OdW1UcmFja3MsIG1Xcml0ZUVycm9ycywgbVVuZGVycnVucywgbU92ZXJydW5zLAorICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbWVhc3VyZWRXYXJtdXBNcywgbVdhcm11cEN5Y2xlcywKKyAgICAgICAgICAgICAgICBtaXhQZXJpb2RTZWMgKiAxZTMpOworI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKKyAgICAvLyBmaW5kIHRoZSBpbnRlcnZhbCBvZiB2YWxpZCBzYW1wbGVzCisgICAgdWludDMyX3QgYm91bmRzID0gbUJvdW5kczsKKyAgICB1aW50MzJfdCBuZXdlc3RPcGVuID0gYm91bmRzICYgMHhGRkZGOworICAgIHVpbnQzMl90IG9sZGVzdENsb3NlZCA9IGJvdW5kcyA+PiAxNjsKKyAgICB1aW50MzJfdCBuID0gKG5ld2VzdE9wZW4gLSBvbGRlc3RDbG9zZWQpICYgMHhGRkZGOworICAgIGlmIChuID4gbVNhbXBsaW5nTikgeworICAgICAgICBBTE9HRSgidG9vIG1hbnkgc2FtcGxlcyAldSIsIG4pOworICAgICAgICBuID0gbVNhbXBsaW5nTjsKKyAgICB9CisgICAgLy8gc3RhdGlzdGljcyBmb3IgbW9ub3RvbmljICh3YWxsIGNsb2NrKSB0aW1lLCB0aHJlYWQgcmF3IENQVSBsb2FkIGluIHRpbWUsIENQVSBjbG9jayBmcmVxdWVuY3ksCisgICAgLy8gYW5kIGFkanVzdGVkIENQVSBsb2FkIGluIE1IeiBub3JtYWxpemVkIGZvciBDUFUgY2xvY2sgZnJlcXVlbmN5CisgICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyB3YWxsLCBsb2FkTnM7CisjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCisgICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyBrSHosIGxvYWRNSHo7CisgICAgdWludDMyX3QgcHJldmlvdXNDcHVrSHogPSAwOworI2VuZGlmCisgICAgLy8gQXNzdW1pbmcgYSBub3JtYWwgZGlzdHJpYnV0aW9uIGZvciBjeWNsZSB0aW1lcywgdGhyZWUgc3RhbmRhcmQgZGV2aWF0aW9ucyBvbiBlaXRoZXIgc2lkZSBvZgorICAgIC8vIHRoZSBtZWFuIGFjY291bnQgZm9yIDk5LjczJSBvZiB0aGUgcG9wdWxhdGlvbi4gIFNvIGlmIHdlIHRha2UgZWFjaCB0YWlsIHRvIGJlIDEvMTAwMCBvZiB0aGUKKyAgICAvLyBzYW1wbGUgc2V0LCB3ZSBnZXQgOTkuOCUgY29tYmluZWQsIG9yIGNsb3NlIHRvIHRocmVlIHN0YW5kYXJkIGRldmlhdGlvbnMuCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtUYWlsRGVub21pbmF0b3IgPSAxMDAwOworICAgIHVpbnQzMl90ICp0YWlsID0gbiA+PSBrVGFpbERlbm9taW5hdG9yID8gbmV3IHVpbnQzMl90W25dIDogTlVMTDsKKyAgICAvLyBsb29wIG92ZXIgYWxsIHRoZSBzYW1wbGVzCisgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG47ICsraikgeworICAgICAgICBzaXplX3QgaSA9IG9sZGVzdENsb3NlZCsrICYgKG1TYW1wbGluZ04gLSAxKTsKKyAgICAgICAgdWludDMyX3Qgd2FsbE5zID0gbU1vbm90b25pY05zW2ldOworICAgICAgICBpZiAodGFpbCAhPSBOVUxMKSB7CisgICAgICAgICAgICB0YWlsW2pdID0gd2FsbE5zOworICAgICAgICB9CisgICAgICAgIHdhbGwuc2FtcGxlKHdhbGxOcyk7CisgICAgICAgIHVpbnQzMl90IHNhbXBsZUxvYWROcyA9IG1Mb2FkTnNbaV07CisgICAgICAgIGxvYWROcy5zYW1wbGUoc2FtcGxlTG9hZE5zKTsKKyNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlQ3B1a0h6ID0gbUNwdWtIeltpXTsKKyAgICAgICAgLy8gc2tpcCBiYWQga0h6IHNhbXBsZXMKKyAgICAgICAgaWYgKChzYW1wbGVDcHVrSHogJiB+MHhGKSAhPSAwKSB7CisgICAgICAgICAgICBrSHouc2FtcGxlKHNhbXBsZUNwdWtIeiA+PiA0KTsKKyAgICAgICAgICAgIGlmIChzYW1wbGVDcHVrSHogPT0gcHJldmlvdXNDcHVrSHopIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgbWVnYWN5Y2xlcyA9IChkb3VibGUpIHNhbXBsZUxvYWROcyAqIChkb3VibGUpIChzYW1wbGVDcHVrSHogPj4gNCkgKiAxZS0xMjsKKyAgICAgICAgICAgICAgICBkb3VibGUgYWRqTUh6ID0gbWVnYWN5Y2xlcyAvIG1peFBlcmlvZFNlYzsgIC8vIF9ub3RfIHdhbGxOcyAqIDFlOQorICAgICAgICAgICAgICAgIGxvYWRNSHouc2FtcGxlKGFkak1Ieik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJldmlvdXNDcHVrSHogPSBzYW1wbGVDcHVrSHo7CisjZW5kaWYKKyAgICB9CisgICAgaWYgKG4pIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgU2ltcGxlIG1vdmluZyBzdGF0aXN0aWNzIG92ZXIgbGFzdCAlLjFmIHNlY29uZHM6XG4iLAorICAgICAgICAgICAgICAgICAgICB3YWxsLm4oKSAqIG1peFBlcmlvZFNlYyk7CisgICAgICAgIGRwcmludGYoZmQsICIgICAgd2FsbCBjbG9jayB0aW1lIGluIG1zIHBlciBtaXggY3ljbGU6XG4iCisgICAgICAgICAgICAgICAgICAgICIgICAgICBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCisgICAgICAgICAgICAgICAgICAgIHdhbGwubWVhbigpKjFlLTYsIHdhbGwubWluaW11bSgpKjFlLTYsIHdhbGwubWF4aW11bSgpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgIHdhbGwuc3RkZGV2KCkqMWUtNik7CisgICAgICAgIGRwcmludGYoZmQsICIgICAgcmF3IENQVSBsb2FkIGluIHVzIHBlciBtaXggY3ljbGU6XG4iCisgICAgICAgICAgICAgICAgICAgICIgICAgICBtZWFuPSUuMGYgbWluPSUuMGYgbWF4PSUuMGYgc3RkZGV2PSUuMGZcbiIsCisgICAgICAgICAgICAgICAgICAgIGxvYWROcy5tZWFuKCkqMWUtMywgbG9hZE5zLm1pbmltdW0oKSoxZS0zLCBsb2FkTnMubWF4aW11bSgpKjFlLTMsCisgICAgICAgICAgICAgICAgICAgIGxvYWROcy5zdGRkZXYoKSoxZS0zKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBGYXN0TWl4ZXIgc3RhdGlzdGljcyBhdmFpbGFibGUgY3VycmVudGx5XG4iKTsKKyAgICB9CisjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCisgICAgZHByaW50ZihmZCwgIiAgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBNSHo6XG4iCisgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMGYgbWluPSUuMGYgbWF4PSUuMGYgc3RkZGV2PSUuMGZcbiIsCisgICAgICAgICAgICAgICAga0h6Lm1lYW4oKSoxZS0zLCBrSHoubWluaW11bSgpKjFlLTMsIGtIei5tYXhpbXVtKCkqMWUtMywga0h6LnN0ZGRldigpKjFlLTMpOworICAgIGRwcmludGYoZmQsICIgIGFkanVzdGVkIENQVSBsb2FkIGluIE1IeiAoaS5lLiBub3JtYWxpemVkIGZvciBDUFUgY2xvY2sgZnJlcXVlbmN5KTpcbiIKKyAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4xZiBtaW49JS4xZiBtYXg9JS4xZiBzdGRkZXY9JS4xZlxuIiwKKyAgICAgICAgICAgICAgICBsb2FkTUh6Lm1lYW4oKSwgbG9hZE1Iei5taW5pbXVtKCksIGxvYWRNSHoubWF4aW11bSgpLCBsb2FkTUh6LnN0ZGRldigpKTsKKyNlbmRpZgorICAgIGlmICh0YWlsICE9IE5VTEwpIHsKKyAgICAgICAgcXNvcnQodGFpbCwgbiwgc2l6ZW9mKHVpbnQzMl90KSwgY29tcGFyZV91aW50MzJfdCk7CisgICAgICAgIC8vIGFzc3VtZSBzYW1lIG51bWJlciBvZiB0YWlsIHNhbXBsZXMgb24gZWFjaCBzaWRlLCBsZWZ0IGFuZCByaWdodAorICAgICAgICB1aW50MzJfdCBjb3VudCA9IG4gLyBrVGFpbERlbm9taW5hdG9yOworICAgICAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIGxlZnQsIHJpZ2h0OworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgbGVmdC5zYW1wbGUodGFpbFtpXSk7CisgICAgICAgICAgICByaWdodC5zYW1wbGUodGFpbFtuIC0gKGkgKyAxKV0pOworICAgICAgICB9CisgICAgICAgIGRwcmludGYoZmQsICIgIERpc3RyaWJ1dGlvbiBvZiBtaXggY3ljbGUgdGltZXMgaW4gbXMgZm9yIHRoZSB0YWlscyAiCisgICAgICAgICAgICAgICAgICAgICIoPiB+MyBzdGRkZXYgb3V0bGllcnMpOlxuIgorICAgICAgICAgICAgICAgICAgICAiICAgIGxlZnQgdGFpbDogbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iCisgICAgICAgICAgICAgICAgICAgICIgICAgcmlnaHQgdGFpbDogbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAorICAgICAgICAgICAgICAgICAgICBsZWZ0Lm1lYW4oKSoxZS02LCBsZWZ0Lm1pbmltdW0oKSoxZS02LCBsZWZ0Lm1heGltdW0oKSoxZS02LCBsZWZ0LnN0ZGRldigpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgIHJpZ2h0Lm1lYW4oKSoxZS02LCByaWdodC5taW5pbXVtKCkqMWUtNiwgcmlnaHQubWF4aW11bSgpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgIHJpZ2h0LnN0ZGRldigpKjFlLTYpOworICAgICAgICBkZWxldGVbXSB0YWlsOworICAgIH0KKyNlbmRpZgorICAgIC8vIFRoZSBhY3RpdmUgdHJhY2sgbWFzayBhbmQgdHJhY2sgc3RhdGVzIGFyZSB1cGRhdGVkIG5vbi1hdG9taWNhbGx5LgorICAgIC8vIFNvIGlmIHdlIHJlbGllZCBvbiBpc0FjdGl2ZSB0byBkZWNpZGUgd2hldGhlciB0byBkaXNwbGF5LAorICAgIC8vIHRoZW4gd2UgbWlnaHQgZGlzcGxheSBhbiBvYnNvbGV0ZSB0cmFjayBvciBvbWl0IGFuIGFjdGl2ZSB0cmFjay4KKyAgICAvLyBJbnN0ZWFkIHdlIGFsd2F5cyBkaXNwbGF5IGFsbCB0cmFja3MsIHdpdGggYW4gaW5kaWNhdGlvbgorICAgIC8vIG9mIHdoZXRoZXIgd2UgdGhpbmsgdGhlIHRyYWNrIGlzIGFjdGl2ZS4KKyAgICB1aW50MzJfdCB0cmFja01hc2sgPSBtVHJhY2tNYXNrOworICAgIGRwcmludGYoZmQsICIgIEZhc3QgdHJhY2tzOiBrTWF4RmFzdFRyYWNrcz0ldSBhY3RpdmVNYXNrPSUjeFxuIiwKKyAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrcywgdHJhY2tNYXNrKTsKKyAgICBkcHJpbnRmKGZkLCAiICBJbmRleCBBY3RpdmUgRnVsbCBQYXJ0aWFsIEVtcHR5ICBSZWNlbnQgUmVhZHlcbiIpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3M7ICsraSwgdHJhY2tNYXNrID4+PSAxKSB7CisgICAgICAgIGJvb2wgaXNBY3RpdmUgPSB0cmFja01hc2sgJiAxOworICAgICAgICBjb25zdCBGYXN0VHJhY2tEdW1wICpmdER1bXAgPSAmbVRyYWNrc1tpXTsKKyAgICAgICAgY29uc3QgRmFzdFRyYWNrVW5kZXJydW5zJiB1bmRlcnJ1bnMgPSBmdER1bXAtPm1VbmRlcnJ1bnM7CisgICAgICAgIGNvbnN0IGNoYXIgKm1vc3RSZWNlbnQ7CisgICAgICAgIHN3aXRjaCAodW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQpIHsKKyAgICAgICAgY2FzZSBVTkRFUlJVTl9GVUxMOgorICAgICAgICAgICAgbW9zdFJlY2VudCA9ICJmdWxsIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFVOREVSUlVOX1BBUlRJQUw6CisgICAgICAgICAgICBtb3N0UmVjZW50ID0gInBhcnRpYWwiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVU5ERVJSVU5fRU1QVFk6CisgICAgICAgICAgICBtb3N0UmVjZW50ID0gImVtcHR5IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbW9zdFJlY2VudCA9ICI/IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRwcmludGYoZmQsICIgICU1dSAlNnMgJTR1ICU3dSAlNXUgJTdzICU1enVcbiIsIGksIGlzQWN0aXZlID8gInllcyIgOiAibm8iLAorICAgICAgICAgICAgICAgICh1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRnVsbCkgJiBVTkRFUlJVTl9NQVNLLAorICAgICAgICAgICAgICAgICh1bmRlcnJ1bnMubUJpdEZpZWxkcy5tUGFydGlhbCkgJiBVTkRFUlJVTl9NQVNLLAorICAgICAgICAgICAgICAgICh1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRW1wdHkpICYgVU5ERVJSVU5fTUFTSywKKyAgICAgICAgICAgICAgICBtb3N0UmVjZW50LCBmdER1bXAtPm1GcmFtZXNSZWFkeSk7CisgICAgfQorfQorCit9ICAgLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCmluZGV4IDZhMWU0NjQ5Li5hYzE1ZTdjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCkBAIC0xNyw3ICsxNywxMCBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfRFVNUF9TVEFURV9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9EVU1QX1NUQVRFX0gKIAorI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJGYXN0VGhyZWFkRHVtcFN0YXRlLmgiCisjaW5jbHVkZSAiRmFzdE1peGVyU3RhdGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC01MiwyMiArNTUsMTIgQEAKIHN0cnVjdCBGYXN0VHJhY2tEdW1wIHsKICAgICBGYXN0VHJhY2tEdW1wKCkgOiBtRnJhbWVzUmVhZHkoMCkgeyB9CiAgICAgLyp2aXJ0dWFsKi8gfkZhc3RUcmFja0R1bXAoKSB7IH0KLSAgICBGYXN0VHJhY2tVbmRlcnJ1bnMgbVVuZGVycnVuczsKLSAgICBzaXplX3QgbUZyYW1lc1JlYWR5OyAgICAgICAgLy8gbW9zdCByZWNlbnQgdmFsdWUgb25seTsgbm8gbG9uZy10ZXJtIHN0YXRpc3RpY3Mga2VwdAorICAgIEZhc3RUcmFja1VuZGVycnVucyAgbVVuZGVycnVuczsKKyAgICBzaXplX3QgICAgICAgICAgICAgIG1GcmFtZXNSZWFkeTsgICAgICAgIC8vIG1vc3QgcmVjZW50IHZhbHVlIG9ubHk7IG5vIGxvbmctdGVybSBzdGF0aXN0aWNzIGtlcHQKIH07CiAKLS8vIFRoZSBGYXN0TWl4ZXJEdW1wU3RhdGUga2VlcHMgYSBjYWNoZSBvZiBGYXN0TWl4ZXIgc3RhdGlzdGljcyB0aGF0IGNhbiBiZSBsb2dnZWQgYnkgZHVtcHN5cy4KLS8vIEVhY2ggaW5kaXZpZHVhbCBuYXRpdmUgd29yZC1zaXplZCBmaWVsZCBpcyBhY2Nlc3NlZCBhdG9taWNhbGx5LiAgQnV0IHRoZQotLy8gb3ZlcmFsbCBzdHJ1Y3R1cmUgaXMgbm9uLWF0b21pYywgdGhhdCBpcyB0aGVyZSBtYXkgYmUgYW4gaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIGZpZWxkcy4KLS8vIE5vIGJhcnJpZXJzIG9yIGxvY2tzIGFyZSB1c2VkIGZvciBlaXRoZXIgd3JpdGluZyBvciByZWFkaW5nLgotLy8gT25seSBQT0QgdHlwZXMgYXJlIHBlcm1pdHRlZCwgYW5kIHRoZSBjb250ZW50cyBzaG91bGRuJ3QgYmUgdHJ1c3RlZCAoaS5lLiBkbyByYW5nZSBjaGVja3MpLgotLy8gSXQgaGFzIGEgZGlmZmVyZW50IGxpZmV0aW1lIHRoYW4gdGhlIEZhc3RNaXhlciwgYW5kIHNvIGl0IGNhbid0IGJlIGEgbWVtYmVyIG9mIEZhc3RNaXhlci4KIHN0cnVjdCBGYXN0TWl4ZXJEdW1wU3RhdGUgOiBGYXN0VGhyZWFkRHVtcFN0YXRlIHsKLSAgICBGYXN0TWl4ZXJEdW1wU3RhdGUoCi0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ04gPSBrU2FtcGxpbmdOZm9yTG93UmFtRGV2aWNlCi0jZW5kaWYKLSAgICAgICAgICAgICk7CisgICAgRmFzdE1peGVyRHVtcFN0YXRlKCk7CiAgICAgLyp2aXJ0dWFsKi8gfkZhc3RNaXhlckR1bXBTdGF0ZSgpOwogCiAgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7ICAgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHN0YWJsZSBjb3B5LCBub3QgdGhlIG9yaWdpbmFsCkBAIC04MCwxNCArNzMsNiBAQAogICAgIHNpemVfdCAgIG1GcmFtZUNvdW50OwogICAgIHVpbnQzMl90IG1UcmFja01hc2s7ICAgICAgICAvLyBtYXNrIG9mIGFjdGl2ZSB0cmFja3MKICAgICBGYXN0VHJhY2tEdW1wICAgbVRyYWNrc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOwotCi0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgLy8gQ29tcGlsZS10aW1lIGNvbnN0YW50IGZvciBhICJsb3cgUkFNIGRldmljZSIsIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04uCi0gICAgLy8gVGhpcyB2YWx1ZSB3YXMgY2hvc2VuIHN1Y2ggdGhhdCBlYWNoIGFycmF5IHVzZXMgMSBzbWFsbCBwYWdlICg0IEtieXRlcykuCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGluZ05mb3JMb3dSYW1EZXZpY2UgPSAweDQwMDsKLSAgICAvLyBJbmNyZWFzZSBzYW1wbGluZyB3aW5kb3cgYWZ0ZXIgY29uc3RydWN0aW9uLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSBrU2FtcGxpbmdOCi0gICAgdm9pZCAgICBpbmNyZWFzZVNhbXBsaW5nTih1aW50MzJfdCBzYW1wbGluZ04pOwotI2VuZGlmCiB9OwogCiB9ICAgLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAKaW5kZXggM2FhOGRhZC4uYThjMjYzNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwCkBAIC0zOSw0ICszOSwxOSBAQAogewogfQogCisvLyBzdGF0aWMKK2NvbnN0IGNoYXIgKkZhc3RNaXhlclN0YXRlOjpjb21tYW5kVG9TdHJpbmcoQ29tbWFuZCBjb21tYW5kKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IEZhc3RUaHJlYWRTdGF0ZTo6Y29tbWFuZFRvU3RyaW5nKGNvbW1hbmQpOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KKyAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpNSVg6ICAgICAgIHJldHVybiAiTUlYIjsKKyAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpXUklURTogICAgIHJldHVybiAiV1JJVEUiOworICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6Ok1JWF9XUklURTogcmV0dXJuICJNSVhfV1JJVEUiOworICAgIH0KKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyIsIF9fZnVuY19fKTsKK30KKwogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCmluZGV4IDY2MWM5Y2EuLjkxNjUxNGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCkBAIC03Myw2ICs3Myw5IEBACiAKICAgICAvLyBUaGlzIG1pZ2h0IGJlIGEgb25lLXRpbWUgY29uZmlndXJhdGlvbiByYXRoZXIgdGhhbiBwZXItc3RhdGUKICAgICBOQkFJT19TaW5rKiBtVGVlU2luazsgICAgICAgLy8gaWYgbm9uLU5VTEwsIHRoZW4gZHVwbGljYXRlIHdyaXRlKClzIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKKworICAgIC8vIG5ldmVyIHJldHVybnMgTlVMTDsgYXNzZXJ0cyBpZiBjb21tYW5kIGlzIGludmFsaWQKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29tbWFuZFRvU3RyaW5nKENvbW1hbmQgY29tbWFuZCk7CiB9OyAgLy8gc3RydWN0IEZhc3RNaXhlclN0YXRlCiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwCmluZGV4IDIxNmRhY2UuLjVjYTU3OWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKQEAgLTI1LDU0ICsyNSw1OCBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSAiRmFzdFRocmVhZC5oIgorI2luY2x1ZGUgIkZhc3RUaHJlYWREdW1wU3RhdGUuaCIKIAogI2RlZmluZSBGQVNUX0RFRkFVTFRfTlMgICAgOTk5OTk5OTk5TCAgIC8vIH4xIHNlYzogZGVmYXVsdCB0aW1lIHRvIHNsZWVwCiAjZGVmaW5lIEZBU1RfSE9UX0lETEVfTlMgICAgIDEwMDAwMDBMICAgLy8gMSBtczogdGltZSB0byBzbGVlcCB3aGlsZSBob3QgaWRsaW5nCi0jZGVmaW5lIE1JTl9XQVJNVVBfQ1lDTEVTICAgICAgICAgIDIgICAgLy8gbWluaW11bSBudW1iZXIgb2YgbG9vcCBjeWNsZXMgdG8gd2FpdCBmb3Igd2FybXVwCisjZGVmaW5lIE1JTl9XQVJNVVBfQ1lDTEVTICAgICAgICAgIDIgICAgLy8gbWluaW11bSBudW1iZXIgb2YgY29uc2VjdXRpdmUgaW4tcmFuZ2UgbG9vcCBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB3YWl0IGZvciB3YXJtdXAKICNkZWZpbmUgTUFYX1dBUk1VUF9DWUNMRVMgICAgICAgICAxMCAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBsb29wIGN5Y2xlcyB0byB3YWl0IGZvciB3YXJtdXAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBGYXN0VGhyZWFkOjpGYXN0VGhyZWFkKCkgOiBUaHJlYWQoZmFsc2UgLypjYW5DYWxsSmF2YSovKSwKLSAgICAvLyByZS1pbml0aWFsaXplZCB0byAmaW5pdGlhbCBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcgotICAgICBwcmV2aW91cyhOVUxMKSwgY3VycmVudChOVUxMKSwKLSAgICAvKiBvbGRUcyh7MCwgMH0pLCAqLwotICAgIG9sZFRzVmFsaWQoZmFsc2UpLAotICAgIHNsZWVwTnMoLTEpLAotICAgIHBlcmlvZE5zKDApLAotICAgIHVuZGVycnVuTnMoMCksCi0gICAgb3ZlcnJ1bk5zKDApLAotICAgIGZvcmNlTnMoMCksCi0gICAgd2FybXVwTnMoMCksCi0gICAgLy8gcmUtaW5pdGlhbGl6ZWQgdG8gJmR1bW15RHVtcFN0YXRlIGJ5IHN1YmNsYXNzIGNvbnN0cnVjdG9yCisgICAgLy8gcmUtaW5pdGlhbGl6ZWQgdG8gJnNJbml0aWFsIGJ5IHN1YmNsYXNzIGNvbnN0cnVjdG9yCisgICAgbVByZXZpb3VzKE5VTEwpLCBtQ3VycmVudChOVUxMKSwKKyAgICAvKiBtT2xkVHMoezAsIDB9KSwgKi8KKyAgICBtT2xkVHNWYWxpZChmYWxzZSksCisgICAgbVNsZWVwTnMoLTEpLAorICAgIG1QZXJpb2ROcygwKSwKKyAgICBtVW5kZXJydW5OcygwKSwKKyAgICBtT3ZlcnJ1bk5zKDApLAorICAgIG1Gb3JjZU5zKDApLAorICAgIG1XYXJtdXBOc01pbigwKSwKKyAgICBtV2FybXVwTnNNYXgoTE9OR19NQVgpLAorICAgIC8vIHJlLWluaXRpYWxpemVkIHRvICZtRHVtbXlTdWJjbGFzc0R1bXBTdGF0ZSBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcgogICAgIG1EdW1teUR1bXBTdGF0ZShOVUxMKSwKLSAgICBkdW1wU3RhdGUoTlVMTCksCi0gICAgaWdub3JlTmV4dE92ZXJydW4odHJ1ZSksCi0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgLy8gb2xkTG9hZAotICAgIG9sZExvYWRWYWxpZChmYWxzZSksCi0gICAgYm91bmRzKDApLAotICAgIGZ1bGwoZmFsc2UpLAotICAgIC8vIHRjdQorICAgIG1EdW1wU3RhdGUoTlVMTCksCisgICAgbUlnbm9yZU5leHRPdmVycnVuKHRydWUpLAorI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKKyAgICAvLyBtT2xkTG9hZAorICAgIG1PbGRMb2FkVmFsaWQoZmFsc2UpLAorICAgIG1Cb3VuZHMoMCksCisgICAgbUZ1bGwoZmFsc2UpLAorICAgIC8vIG1UY3UKICNlbmRpZgotICAgIGNvbGRHZW4oMCksCi0gICAgaXNXYXJtKGZhbHNlKSwKLSAgICAvKiBtZWFzdXJlZFdhcm11cFRzKHswLCAwfSksICovCi0gICAgd2FybXVwQ3ljbGVzKDApLAotICAgIC8vIGR1bW15TG9nV3JpdGVyCi0gICAgbG9nV3JpdGVyKCZkdW1teUxvZ1dyaXRlciksCi0gICAgdGltZXN0YW1wU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKSwKKyAgICBtQ29sZEdlbigwKSwKKyAgICBtSXNXYXJtKGZhbHNlKSwKKyAgICAvKiBtTWVhc3VyZWRXYXJtdXBUcyh7MCwgMH0pLCAqLworICAgIG1XYXJtdXBDeWNsZXMoMCksCisgICAgbVdhcm11cENvbnNlY3V0aXZlSW5SYW5nZUN5Y2xlcygwKSwKKyAgICAvLyBtRHVtbXlMb2dXcml0ZXIKKyAgICBtTG9nV3JpdGVyKCZtRHVtbXlMb2dXcml0ZXIpLAorICAgIG1UaW1lc3RhbXBTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pLAogCi0gICAgY29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OklOSVRJQUwpLAorICAgIG1Db21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6SU5JVElBTCksCiAjaWYgMAogICAgIGZyYW1lQ291bnQoMCksCiAjZW5kaWYKLSAgICBhdHRlbXB0ZWRXcml0ZShmYWxzZSkKKyAgICBtQXR0ZW1wdGVkV3JpdGUoZmFsc2UpCiB7Ci0gICAgb2xkVHMudHZfc2VjID0gMDsKLSAgICBvbGRUcy50dl9uc2VjID0gMDsKLSAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYyA9IDA7Ci0gICAgbWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID0gMDsKKyAgICBtT2xkVHMudHZfc2VjID0gMDsKKyAgICBtT2xkVHMudHZfbnNlYyA9IDA7CisgICAgbU1lYXN1cmVkV2FybXVwVHMudHZfc2VjID0gMDsKKyAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID0gMDsKIH0KIAogRmFzdFRocmVhZDo6fkZhc3RUaHJlYWQoKQpAQCAtODQsMzQgKzg4LDM0IEBACiAgICAgZm9yICg7OykgewogCiAgICAgICAgIC8vIGVpdGhlciBuYW5vc2xlZXAsIHNjaGVkX3lpZWxkLCBvciBidXN5IHdhaXQKLSAgICAgICAgaWYgKHNsZWVwTnMgPj0gMCkgewotICAgICAgICAgICAgaWYgKHNsZWVwTnMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoc2xlZXBOcyA8IDEwMDAwMDAwMDApOwotICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyByZXEgPSB7MCwgc2xlZXBOc307CisgICAgICAgIGlmIChtU2xlZXBOcyA+PSAwKSB7CisgICAgICAgICAgICBpZiAobVNsZWVwTnMgPiAwKSB7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobVNsZWVwTnMgPCAxMDAwMDAwMDAwKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgcmVxID0gezAsIG1TbGVlcE5zfTsKICAgICAgICAgICAgICAgICBuYW5vc2xlZXAoJnJlcSwgTlVMTCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHNjaGVkX3lpZWxkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gZGVmYXVsdCB0byBsb25nIHNsZWVwIGZvciBuZXh0IGN5Y2xlCi0gICAgICAgIHNsZWVwTnMgPSBGQVNUX0RFRkFVTFRfTlM7CisgICAgICAgIG1TbGVlcE5zID0gRkFTVF9ERUZBVUxUX05TOwogCiAgICAgICAgIC8vIHBvbGwgZm9yIHN0YXRlIGNoYW5nZQogICAgICAgICBjb25zdCBGYXN0VGhyZWFkU3RhdGUgKm5leHQgPSBwb2xsKCk7CiAgICAgICAgIGlmIChuZXh0ID09IE5VTEwpIHsKICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIHVzZSB0aGUgZGVmYXVsdCBpbml0aWFsIHN0YXRlIHVudGlsIGEgcmVhbCBzdGF0ZSBpcyBhdmFpbGFibGUKLSAgICAgICAgICAgIC8vIEZJWE1FICZpbml0aWFsIG5vdCBhdmFpbGFibGUsIHNob3VsZCBzYXZlIGFkZHJlc3MgZWFybGllcgotICAgICAgICAgICAgLy9BTE9HX0FTU0VSVChjdXJyZW50ID09ICZpbml0aWFsICYmIHByZXZpb3VzID09ICZpbml0aWFsKTsKLSAgICAgICAgICAgIG5leHQgPSBjdXJyZW50OworICAgICAgICAgICAgLy8gRklYTUUgJnNJbml0aWFsIG5vdCBhdmFpbGFibGUsIHNob3VsZCBzYXZlIGFkZHJlc3MgZWFybGllcgorICAgICAgICAgICAgLy9BTE9HX0FTU0VSVChtQ3VycmVudCA9PSAmc0luaXRpYWwgJiYgcHJldmlvdXMgPT0gJnNJbml0aWFsKTsKKyAgICAgICAgICAgIG5leHQgPSBtQ3VycmVudDsKICAgICAgICAgfQogCi0gICAgICAgIGNvbW1hbmQgPSBuZXh0LT5tQ29tbWFuZDsKLSAgICAgICAgaWYgKG5leHQgIT0gY3VycmVudCkgeworICAgICAgICBtQ29tbWFuZCA9IG5leHQtPm1Db21tYW5kOworICAgICAgICBpZiAobmV4dCAhPSBtQ3VycmVudCkgewogCiAgICAgICAgICAgICAvLyBBcyBzb29uIGFzIHBvc3NpYmxlIG9mIGxlYXJuaW5nIG9mIGEgbmV3IGR1bXAgYXJlYSwgc3RhcnQgdXNpbmcgaXQKLSAgICAgICAgICAgIGR1bXBTdGF0ZSA9IG5leHQtPm1EdW1wU3RhdGUgIT0gTlVMTCA/IG5leHQtPm1EdW1wU3RhdGUgOiBtRHVtbXlEdW1wU3RhdGU7Ci0gICAgICAgICAgICBsb2dXcml0ZXIgPSBuZXh0LT5tTkJMb2dXcml0ZXIgIT0gTlVMTCA/IG5leHQtPm1OQkxvZ1dyaXRlciA6ICZkdW1teUxvZ1dyaXRlcjsKLSAgICAgICAgICAgIHNldExvZyhsb2dXcml0ZXIpOworICAgICAgICAgICAgbUR1bXBTdGF0ZSA9IG5leHQtPm1EdW1wU3RhdGUgIT0gTlVMTCA/IG5leHQtPm1EdW1wU3RhdGUgOiBtRHVtbXlEdW1wU3RhdGU7CisgICAgICAgICAgICBtTG9nV3JpdGVyID0gbmV4dC0+bU5CTG9nV3JpdGVyICE9IE5VTEwgPyBuZXh0LT5tTkJMb2dXcml0ZXIgOiAmbUR1bW15TG9nV3JpdGVyOworICAgICAgICAgICAgc2V0TG9nKG1Mb2dXcml0ZXIpOwogCiAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGFsd2F5cyBoYXZlIGEgdmFsaWQgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyAobm9uLWlkbGUpIHN0YXRlLgogICAgICAgICAgICAgLy8gSG93ZXZlciwgdGhlIHN0YXRlIHF1ZXVlIG9ubHkgZ3VhcmFudGVlcyBhY2Nlc3MgdG8gY3VycmVudCBhbmQgcHJldmlvdXMgc3RhdGVzLgpAQCAtMTIyLDM3ICsxMjYsMzggQEAKICAgICAgICAgICAgIC8vICBub24taWRsZSAtPiBpZGxlICAgICAgICB1cGRhdGUgcHJldmlvdXMgZnJvbSBjb3B5IG9mIGN1cnJlbnQKICAgICAgICAgICAgIC8vICBpZGxlICAgICAtPiBpZGxlICAgICAgICBkb24ndCB1cGRhdGUgcHJldmlvdXMKICAgICAgICAgICAgIC8vICBpZGxlICAgICAtPiBub24taWRsZSAgICBkb24ndCB1cGRhdGUgcHJldmlvdXMKLSAgICAgICAgICAgIGlmICghKGN1cnJlbnQtPm1Db21tYW5kICYgRmFzdFRocmVhZFN0YXRlOjpJRExFKSkgewotICAgICAgICAgICAgICAgIGlmIChjb21tYW5kICYgRmFzdFRocmVhZFN0YXRlOjpJRExFKSB7CisgICAgICAgICAgICBpZiAoIShtQ3VycmVudC0+bUNvbW1hbmQgJiBGYXN0VGhyZWFkU3RhdGU6OklETEUpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db21tYW5kICYgRmFzdFRocmVhZFN0YXRlOjpJRExFKSB7CiAgICAgICAgICAgICAgICAgICAgIG9uSWRsZSgpOwotICAgICAgICAgICAgICAgICAgICBvbGRUc1ZhbGlkID0gZmFsc2U7Ci0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgICAgICAgICAgICAgICAgIG9sZExvYWRWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtT2xkVHNWYWxpZCA9IGZhbHNlOworI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKKyAgICAgICAgICAgICAgICAgICAgbU9sZExvYWRWYWxpZCA9IGZhbHNlOwogI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbUlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50OworICAgICAgICAgICAgICAgIG1QcmV2aW91cyA9IG1DdXJyZW50OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VycmVudCA9IG5leHQ7CisgICAgICAgICAgICBtQ3VycmVudCA9IG5leHQ7CiAgICAgICAgIH0KICNpZiAhTE9HX05ERUJVRwogICAgICAgICBuZXh0ID0gTlVMTDsgICAgLy8gbm90IHJlZmVyZW5jZWQgYWdhaW4KICNlbmRpZgogCi0gICAgICAgIGR1bXBTdGF0ZS0+bUNvbW1hbmQgPSBjb21tYW5kOworICAgICAgICBtRHVtcFN0YXRlLT5tQ29tbWFuZCA9IG1Db21tYW5kOwogCisgICAgICAgIC8vIEZJWE1FIHdoYXQgZG9lcyB0aGlzIGNvbW1lbnQgbWVhbj8KICAgICAgICAgLy8gPDwgY3VycmVudCwgcHJldmlvdXMsIGNvbW1hbmQsIGR1bXBTdGF0ZSA+PgogCi0gICAgICAgIHN3aXRjaCAoY29tbWFuZCkgeworICAgICAgICBzd2l0Y2ggKG1Db21tYW5kKSB7CiAgICAgICAgIGNhc2UgRmFzdFRocmVhZFN0YXRlOjpJTklUSUFMOgogICAgICAgICBjYXNlIEZhc3RUaHJlYWRTdGF0ZTo6SE9UX0lETEU6Ci0gICAgICAgICAgICBzbGVlcE5zID0gRkFTVF9IT1RfSURMRV9OUzsKKyAgICAgICAgICAgIG1TbGVlcE5zID0gRkFTVF9IT1RfSURMRV9OUzsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBjYXNlIEZhc3RUaHJlYWRTdGF0ZTo6Q09MRF9JRExFOgogICAgICAgICAgICAgLy8gb25seSBwZXJmb3JtIGEgY29sZCBpZGxlIGNvbW1hbmQgb25jZQogICAgICAgICAgICAgLy8gRklYTUUgY29uc2lkZXIgY2hlY2tpbmcgcHJldmlvdXMgc3RhdGUgYW5kIG9ubHkgcGVyZm9ybSBpZiBwcmV2aW91cyAhPSBDT0xEX0lETEUKLSAgICAgICAgICAgIGlmIChjdXJyZW50LT5tQ29sZEdlbiAhPSBjb2xkR2VuKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCAqY29sZEZ1dGV4QWRkciA9IGN1cnJlbnQtPm1Db2xkRnV0ZXhBZGRyOworICAgICAgICAgICAgaWYgKG1DdXJyZW50LT5tQ29sZEdlbiAhPSBtQ29sZEdlbikgeworICAgICAgICAgICAgICAgIGludDMyX3QgKmNvbGRGdXRleEFkZHIgPSBtQ3VycmVudC0+bUNvbGRGdXRleEFkZHI7CiAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoY29sZEZ1dGV4QWRkciAhPSBOVUxMKTsKICAgICAgICAgICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2RlYyhjb2xkRnV0ZXhBZGRyKTsKICAgICAgICAgICAgICAgICBpZiAob2xkIDw9IDApIHsKQEAgLTE2NCw0MSArMTY5LDQyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIFRoaXMgbWF5IGJlIG92ZXJseSBjb25zZXJ2YXRpdmU7IHRoZXJlIGNvdWxkIGJlIHRpbWVzIHRoYXQgdGhlIG5vcm1hbCBtaXhlcgogICAgICAgICAgICAgICAgIC8vIHJlcXVlc3RzIHN1Y2ggYSBicmllZiBjb2xkIGlkbGUgdGhhdCBpdCBkb2Vzbid0IHJlcXVpcmUgcmVzZXR0aW5nIHRoaXMgZmxhZy4KLSAgICAgICAgICAgICAgICBpc1dhcm0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYyA9IDA7Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID0gMDsKLSAgICAgICAgICAgICAgICB3YXJtdXBDeWNsZXMgPSAwOwotICAgICAgICAgICAgICAgIHNsZWVwTnMgPSAtMTsKLSAgICAgICAgICAgICAgICBjb2xkR2VuID0gY3VycmVudC0+bUNvbGRHZW47Ci0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgICAgICAgICAgICAgYm91bmRzID0gMDsKLSAgICAgICAgICAgICAgICBmdWxsID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbUlzV2FybSA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyA9IDA7CisgICAgICAgICAgICAgICAgbU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA9IDA7CisgICAgICAgICAgICAgICAgbVdhcm11cEN5Y2xlcyA9IDA7CisgICAgICAgICAgICAgICAgbVdhcm11cENvbnNlY3V0aXZlSW5SYW5nZUN5Y2xlcyA9IDA7CisgICAgICAgICAgICAgICAgbVNsZWVwTnMgPSAtMTsKKyAgICAgICAgICAgICAgICBtQ29sZEdlbiA9IG1DdXJyZW50LT5tQ29sZEdlbjsKKyNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCisgICAgICAgICAgICAgICAgbUJvdW5kcyA9IDA7CisgICAgICAgICAgICAgICAgbUZ1bGwgPSBmYWxzZTsKICNlbmRpZgotICAgICAgICAgICAgICAgIG9sZFRzVmFsaWQgPSAhY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZvbGRUcyk7Ci0gICAgICAgICAgICAgICAgdGltZXN0YW1wU3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgbU9sZFRzVmFsaWQgPSAhY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZtT2xkVHMpOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2xlZXBOcyA9IEZBU1RfSE9UX0lETEVfTlM7CisgICAgICAgICAgICAgICAgbVNsZWVwTnMgPSBGQVNUX0hPVF9JRExFX05TOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGNhc2UgRmFzdFRocmVhZFN0YXRlOjpFWElUOgogICAgICAgICAgICAgb25FeGl0KCk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFpc1N1YkNsYXNzQ29tbWFuZChjb21tYW5kKSk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFpc1N1YkNsYXNzQ29tbWFuZChtQ29tbWFuZCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICAvLyB0aGVyZSBpcyBhIG5vbi1pZGxlIHN0YXRlIGF2YWlsYWJsZSB0byB1czsgZGlkIHRoZSBzdGF0ZSBjaGFuZ2U/Ci0gICAgICAgIGlmIChjdXJyZW50ICE9IHByZXZpb3VzKSB7CisgICAgICAgIGlmIChtQ3VycmVudCAhPSBtUHJldmlvdXMpIHsKICAgICAgICAgICAgIG9uU3RhdGVDaGFuZ2UoKTsKICNpZiAxICAgLy8gRklYTUUgc2hvdWxkbid0IG5lZWQgdGhpcwogICAgICAgICAgICAgLy8gb25seSBwcm9jZXNzIHN0YXRlIGNoYW5nZSBvbmNlCi0gICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7CisgICAgICAgICAgICBtUHJldmlvdXMgPSBtQ3VycmVudDsKICNlbmRpZgogICAgICAgICB9CiAKICAgICAgICAgLy8gZG8gd29yayB1c2luZyBjdXJyZW50IHN0YXRlIGhlcmUKLSAgICAgICAgYXR0ZW1wdGVkV3JpdGUgPSBmYWxzZTsKKyAgICAgICAgbUF0dGVtcHRlZFdyaXRlID0gZmFsc2U7CiAgICAgICAgIG9uV29yaygpOwogCiAgICAgICAgIC8vIFRvIGJlIGV4YWN0bHkgcGVyaW9kaWMsIGNvbXB1dGUgdGhlIG5leHQgc2xlZXAgdGltZSBiYXNlZCBvbiBjdXJyZW50IHRpbWUuCkBAIC0yMDcsMTMgKzIxMywxMyBAQAogICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgbmV3VHM7CiAgICAgICAgIGludCByYyA9IGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmbmV3VHMpOwogICAgICAgICBpZiAocmMgPT0gMCkgewotICAgICAgICAgICAgLy9sb2dXcml0ZXItPmxvZ1RpbWVzdGFtcChuZXdUcyk7Ci0gICAgICAgICAgICBpZiAob2xkVHNWYWxpZCkgewotICAgICAgICAgICAgICAgIHRpbWVfdCBzZWMgPSBuZXdUcy50dl9zZWMgLSBvbGRUcy50dl9zZWM7Ci0gICAgICAgICAgICAgICAgbG9uZyBuc2VjID0gbmV3VHMudHZfbnNlYyAtIG9sZFRzLnR2X25zZWM7CisgICAgICAgICAgICAvL21Mb2dXcml0ZXItPmxvZ1RpbWVzdGFtcChuZXdUcyk7CisgICAgICAgICAgICBpZiAobU9sZFRzVmFsaWQpIHsKKyAgICAgICAgICAgICAgICB0aW1lX3Qgc2VjID0gbmV3VHMudHZfc2VjIC0gbU9sZFRzLnR2X3NlYzsKKyAgICAgICAgICAgICAgICBsb25nIG5zZWMgPSBuZXdUcy50dl9uc2VjIC0gbU9sZFRzLnR2X25zZWM7CiAgICAgICAgICAgICAgICAgQUxPR0VfSUYoc2VjIDwgMCB8fCAoc2VjID09IDAgJiYgbnNlYyA8IDApLAogICAgICAgICAgICAgICAgICAgICAgICAgImNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKSBmYWlsZWQ6IHdhcyAlbGQuJTA5bGQgYnV0IG5vdyAlbGQuJTA5bGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgb2xkVHMudHZfc2VjLCBvbGRUcy50dl9uc2VjLCBuZXdUcy50dl9zZWMsIG5ld1RzLnR2X25zZWMpOworICAgICAgICAgICAgICAgICAgICAgICAgbU9sZFRzLnR2X3NlYywgbU9sZFRzLnR2X25zZWMsIG5ld1RzLnR2X3NlYywgbmV3VHMudHZfbnNlYyk7CiAgICAgICAgICAgICAgICAgaWYgKG5zZWMgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIC0tc2VjOwogICAgICAgICAgICAgICAgICAgICBuc2VjICs9IDEwMDAwMDAwMDA7CkBAIC0yMjEsNjIgKzIyNyw3MCBAQAogICAgICAgICAgICAgICAgIC8vIFRvIGF2b2lkIGFuIGluaXRpYWwgdW5kZXJydW4gb24gZmFzdCB0cmFja3MgYWZ0ZXIgZXhpdGluZyBzdGFuZGJ5LAogICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBzdGFydCBwdWxsaW5nIGRhdGEgZnJvbSB0cmFja3MgYW5kIG1peGluZyB1bnRpbCB3YXJtdXAgaXMgY29tcGxldGUuCiAgICAgICAgICAgICAgICAgLy8gV2FybXVwIGlzIGNvbnNpZGVyZWQgY29tcGxldGUgYWZ0ZXIgdGhlIGVhcmxpZXIgb2Y6Ci0gICAgICAgICAgICAgICAgLy8gICAgICBNSU5fV0FSTVVQX0NZQ0xFUyB3cml0ZSgpIGF0dGVtcHRzIGFuZCBsYXN0IG9uZSBibG9ja3MgZm9yIGF0IGxlYXN0IHdhcm11cE5zCisgICAgICAgICAgICAgICAgLy8gICAgICBNSU5fV0FSTVVQX0NZQ0xFUyBjb25zZWN1dGl2ZSBpbi1yYW5nZSB3cml0ZSgpIGF0dGVtcHRzLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgIHdoZXJlICJpbi1yYW5nZSIgbWVhbnMgbVdhcm11cE5zTWluIDw9IGN5Y2xlIHRpbWUgPD0gbVdhcm11cE5zTWF4CiAgICAgICAgICAgICAgICAgLy8gICAgICBNQVhfV0FSTVVQX0NZQ0xFUyB3cml0ZSgpIGF0dGVtcHRzLgogICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgb3Zlcmx5IGNvbnNlcnZhdGl2ZSwgYnV0IHRvIGdldCBiZXR0ZXIgYWNjdXJhY3kgcmVxdWlyZXMgYSBuZXcgSEFMIEFQSS4KLSAgICAgICAgICAgICAgICBpZiAoIWlzV2FybSAmJiBhdHRlbXB0ZWRXcml0ZSkgewotICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYyArPSBzZWM7Ci0gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyArPSBuc2VjOwotICAgICAgICAgICAgICAgICAgICBpZiAobWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID49IDEwMDAwMDAwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfc2VjKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgLT0gMTAwMDAwMDAwMDsKKyAgICAgICAgICAgICAgICBpZiAoIW1Jc1dhcm0gJiYgbUF0dGVtcHRlZFdyaXRlKSB7CisgICAgICAgICAgICAgICAgICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyArPSBzZWM7CisgICAgICAgICAgICAgICAgICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgKz0gbnNlYzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPj0gMTAwMDAwMDAwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU1lYXN1cmVkV2FybXVwVHMudHZfc2VjKys7CisgICAgICAgICAgICAgICAgICAgICAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjIC09IDEwMDAwMDAwMDA7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKyt3YXJtdXBDeWNsZXM7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobnNlYyA+IHdhcm11cE5zICYmIHdhcm11cEN5Y2xlcyA+PSBNSU5fV0FSTVVQX0NZQ0xFUykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2FybXVwQ3ljbGVzID49IE1BWF9XQVJNVVBfQ1lDTEVTKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNXYXJtID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU1lYXN1cmVkV2FybXVwVHMgPSBtZWFzdXJlZFdhcm11cFRzOwotICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tV2FybXVwQ3ljbGVzID0gd2FybXVwQ3ljbGVzOworICAgICAgICAgICAgICAgICAgICArK21XYXJtdXBDeWNsZXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChtV2FybXVwTnNNaW4gPD0gbnNlYyAmJiBuc2VjIDw9IG1XYXJtdXBOc01heCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIndhcm11cCBjeWNsZSAlZCBpbiByYW5nZTogJS4wM2YgbXMiLCBtV2FybXVwQ3ljbGVzLCBuc2VjICogMWUtOSk7CisgICAgICAgICAgICAgICAgICAgICAgICArK21XYXJtdXBDb25zZWN1dGl2ZUluUmFuZ2VDeWNsZXM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigid2FybXVwIGN5Y2xlICVkIG91dCBvZiByYW5nZTogJS4wM2YgbXMiLCBtV2FybXVwQ3ljbGVzLCBuc2VjICogMWUtOSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2FybXVwQ29uc2VjdXRpdmVJblJhbmdlQ3ljbGVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKG1XYXJtdXBDb25zZWN1dGl2ZUluUmFuZ2VDeWNsZXMgPj0gTUlOX1dBUk1VUF9DWUNMRVMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1XYXJtdXBDeWNsZXMgPj0gTUFYX1dBUk1VUF9DWUNMRVMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtSXNXYXJtID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1NZWFzdXJlZFdhcm11cFRzID0gbU1lYXN1cmVkV2FybXVwVHM7CisgICAgICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tV2FybXVwQ3ljbGVzID0gbVdhcm11cEN5Y2xlczsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzbGVlcE5zID0gLTE7Ci0gICAgICAgICAgICAgICAgaWYgKGlzV2FybSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VjID4gMCB8fCBuc2VjID4gdW5kZXJydW5OcykgeworICAgICAgICAgICAgICAgIG1TbGVlcE5zID0gLTE7CisgICAgICAgICAgICAgICAgaWYgKG1Jc1dhcm0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlYyA+IDAgfHwgbnNlYyA+IG1VbmRlcnJ1bk5zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSgidW5kZXJydW4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIG9ubHkgbG9nIG9jY2FzaW9uYWxseQogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInVuZGVycnVuOiB0aW1lIHNpbmNlIGxhc3QgY3ljbGUgJWQuJTAzbGQgc2VjIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tVW5kZXJydW5zKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnNlYyA8IG92ZXJydW5OcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlnbm9yZU5leHRPdmVycnVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1VbmRlcnJ1bnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnNlYyA8IG1PdmVycnVuTnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSWdub3JlTmV4dE92ZXJydW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSWdub3JlTmV4dE92ZXJydW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb25seSBsb2cgb2NjYXNpb25hbGx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm92ZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU92ZXJydW5zKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bU92ZXJydW5zKys7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGZvcmNlcyBhIG1pbmltdW0gY3ljbGUgdGltZS4gSXQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBjb21wZW5zYXRlcyBmb3IgYW4gYXVkaW8gSEFMIHdpdGggaml0dGVyIGR1ZSB0byBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSB3b3JrcyB3aXRoIGEgdmFyaWFibGUgYnVmZmVyIGRlcHRoIGF1ZGlvIEhBTCB0aGF0IG5ldmVyIHB1bGxzIGF0IGEKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJhdGUgPCB0aGFuIG92ZXJydW5OcyBwZXIgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmF0ZSA8IHRoYW4gbU92ZXJydW5OcyBwZXIgYnVmZmVyLgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gcmVjb3ZlcnMgZnJvbSBvdmVycnVuIGltbWVkaWF0ZWx5IGFmdGVyIHVuZGVycnVuCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBkb2Vzbid0IHdvcmsgd2l0aCBhIG5vbi1ibG9ja2luZyBhdWRpbyBIQUwuCi0gICAgICAgICAgICAgICAgICAgICAgICBzbGVlcE5zID0gZm9yY2VOcyAtIG5zZWM7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2xlZXBOcyA9IG1Gb3JjZU5zIC0gbnNlYzsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBtSWdub3JlTmV4dE92ZXJydW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgICAgICBpZiAoaXNXYXJtKSB7CisjaWZkZWYgRkFTVF9USFJFQURfU1RBVElTVElDUworICAgICAgICAgICAgICAgIGlmIChtSXNXYXJtKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UgdGhlIEZJRk8gcXVldWUgYm91bmRzCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBpID0gYm91bmRzICYgKGR1bXBTdGF0ZS0+bVNhbXBsaW5nTiAtIDEpOwotICAgICAgICAgICAgICAgICAgICBib3VuZHMgPSAoYm91bmRzICYgMHhGRkZGMDAwMCkgfCAoKGJvdW5kcyArIDEpICYgMHhGRkZGKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcyArPSAweDEwMDAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEoYm91bmRzICYgKGR1bXBTdGF0ZS0+bVNhbXBsaW5nTiAtIDEpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpID0gbUJvdW5kcyAmIChtRHVtcFN0YXRlLT5tU2FtcGxpbmdOIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIG1Cb3VuZHMgPSAobUJvdW5kcyAmIDB4RkZGRjAwMDApIHwgKChtQm91bmRzICsgMSkgJiAweEZGRkYpOworICAgICAgICAgICAgICAgICAgICBpZiAobUZ1bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Cb3VuZHMgKz0gMHgxMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKG1Cb3VuZHMgJiAobUR1bXBTdGF0ZS0+bVNhbXBsaW5nTiAtIDEpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUZ1bGwgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIGRlbHRhIHZhbHVlIG9mIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKQogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtb25vdG9uaWNOcyA9IG5zZWM7CkBAIC0yODgsOSArMzAyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIG5ld0xvYWQ7CiAgICAgICAgICAgICAgICAgICAgIHJjID0gY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCwgJm5ld0xvYWQpOwogICAgICAgICAgICAgICAgICAgICBpZiAocmMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZExvYWRWYWxpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYyA9IG5ld0xvYWQudHZfc2VjIC0gb2xkTG9hZC50dl9zZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlYyA9IG5ld0xvYWQudHZfbnNlYyAtIG9sZExvYWQudHZfbnNlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtT2xkTG9hZFZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjID0gbmV3TG9hZC50dl9zZWMgLSBtT2xkTG9hZC50dl9zZWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlYyA9IG5ld0xvYWQudHZfbnNlYyAtIG1PbGRMb2FkLnR2X25zZWM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5zZWMgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tc2VjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2VjICs9IDEwMDAwMDAwMDA7CkBAIC0zMDEsNDIgKzMxNSw0MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgdGltZSB0aHJvdWdoIHRoZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTG9hZFZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT2xkTG9hZFZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9sZExvYWQgPSBuZXdMb2FkOworICAgICAgICAgICAgICAgICAgICAgICAgbU9sZExvYWQgPSBuZXdMb2FkOwogICAgICAgICAgICAgICAgICAgICB9CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHoKICAgICAgICAgICAgICAgICAgICAgaW50IGNwdU51bSA9IHNjaGVkX2dldGNwdSgpOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBrSHogPSB0Y3UuZ2V0Q3B1a0h6KGNwdU51bSk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGtIeiA9IG1UY3UuZ2V0Q3B1a0h6KGNwdU51bSk7CiAgICAgICAgICAgICAgICAgICAgIGtIeiA9IChrSHogPDwgNCkgfCAoY3B1TnVtICYgMHhGKTsKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHZhbHVlcyBpbiBGSUZPIHF1ZXVlcyBmb3IgZHVtcHN5cwogICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBzdG9yZXMgIzEsICMyLCAjMyBhcmUgbm90IGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gZWFjaCBvdGhlciwKICAgICAgICAgICAgICAgICAgICAgLy8gb3Igd2l0aCByZXNwZWN0IHRvIHN0b3JlICM0IGJlbG93Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU1vbm90b25pY05zW2ldID0gbW9ub3RvbmljTnM7Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUxvYWROc1tpXSA9IGxvYWROczsKKyAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bU1vbm90b25pY05zW2ldID0gbW9ub3RvbmljTnM7CisgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1Mb2FkTnNbaV0gPSBsb2FkTnM7CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCi0gICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUNwdWtIeltpXSA9IGtIejsKKyAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bUNwdWtIeltpXSA9IGtIejsKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHN0b3JlICM0IGlzIG5vdCBhdG9taWMgd2l0aCByZXNwZWN0IHRvIHN0b3JlcyAjMSwgIzIsICMzIGFib3ZlLCBidXQKICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5ld2VzdCBvcGVuICYgb2xkZXN0IGNsb3NlZCBoYWx2ZXMgYXJlIGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gZWFjaCBvdGhlcgotICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1Cb3VuZHMgPSBib3VuZHM7CisgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1Cb3VuZHMgPSBtQm91bmRzOwogICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfSU5UKCJjeWNsZV9tcyIsIG1vbm90b25pY05zIC8gMTAwMDAwMCk7CiAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9JTlQoImxvYWRfdXMiLCBsb2FkTnMgLyAxMDAwKTsKICAgICAgICAgICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gZmlyc3QgdGltZSB0aHJvdWdoIHRoZSBsb29wCi0gICAgICAgICAgICAgICAgb2xkVHNWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc2xlZXBOcyA9IHBlcmlvZE5zOwotICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtT2xkVHNWYWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgbVNsZWVwTnMgPSBtUGVyaW9kTnM7CisgICAgICAgICAgICAgICAgbUlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9sZFRzID0gbmV3VHM7CisgICAgICAgICAgICBtT2xkVHMgPSBuZXdUczsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIG1vbm90b25pYyBjbG9jayBpcyBicm9rZW4KLSAgICAgICAgICAgIG9sZFRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHNsZWVwTnMgPSBwZXJpb2ROczsKKyAgICAgICAgICAgIG1PbGRUc1ZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICBtU2xlZXBOcyA9IG1QZXJpb2ROczsKICAgICAgICAgfQogCiAgICAgfSAgIC8vIGZvciAoOzspCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaAppbmRleCAxMzMwMzM0Li4yZWZiNmRlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmgKQEAgLTQ4LDQyICs0OCw0NSBAQAogICAgIHZpcnR1YWwgdm9pZCBvblN0YXRlQ2hhbmdlKCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBvbldvcmsoKSA9IDA7CiAKLSAgICAvLyBGSVhNRSB0aGVzZSBmb3JtZXIgbG9jYWwgdmFyaWFibGVzIG5lZWQgY29tbWVudHMgYW5kIHRvIGJlIHJlbmFtZWQgdG8gaGF2ZSBhbiAibSIgcHJlZml4Ci0gICAgY29uc3QgRmFzdFRocmVhZFN0YXRlICpwcmV2aW91czsKLSAgICBjb25zdCBGYXN0VGhyZWFkU3RhdGUgKmN1cnJlbnQ7Ci0gICAgc3RydWN0IHRpbWVzcGVjIG9sZFRzOwotICAgIGJvb2wgb2xkVHNWYWxpZDsKLSAgICBsb25nIHNsZWVwTnM7ICAgLy8gLTE6IGJ1c3kgd2FpdCwgMDogc2NoZWRfeWllbGQsID4gMDogbmFub3NsZWVwCi0gICAgbG9uZyBwZXJpb2ROczsgICAgICAvLyBleHBlY3RlZCBwZXJpb2Q7IHRoZSB0aW1lIHJlcXVpcmVkIHRvIHJlbmRlciBvbmUgbWl4IGJ1ZmZlcgotICAgIGxvbmcgdW5kZXJydW5OczsgICAgLy8gdW5kZXJydW4gbGlrZWx5IHdoZW4gd3JpdGUgY3ljbGUgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdmFsdWUKLSAgICBsb25nIG92ZXJydW5OczsgICAgIC8vIG92ZXJydW4gbGlrZWx5IHdoZW4gd3JpdGUgY3ljbGUgaXMgbGVzcyB0aGFuIHRoaXMgdmFsdWUKLSAgICBsb25nIGZvcmNlTnM7ICAgICAgIC8vIGlmIG92ZXJydW4gZGV0ZWN0ZWQsIGZvcmNlIHRoZSB3cml0ZSBjeWNsZSB0byB0YWtlIHRoaXMgbXVjaCB0aW1lCi0gICAgbG9uZyB3YXJtdXBOczsgICAgICAvLyB3YXJtdXAgY29tcGxldGUgd2hlbiB3cml0ZSBjeWNsZSBpcyBncmVhdGVyIHRoYW4gdG8gdGhpcyB2YWx1ZQotICAgIEZhc3RUaHJlYWREdW1wU3RhdGUgKm1EdW1teUR1bXBTdGF0ZTsKLSAgICBGYXN0VGhyZWFkRHVtcFN0YXRlICpkdW1wU3RhdGU7Ci0gICAgYm9vbCBpZ25vcmVOZXh0T3ZlcnJ1bjsgIC8vIHVzZWQgdG8gaWdub3JlIGluaXRpYWwgb3ZlcnJ1biBhbmQgZmlyc3QgYWZ0ZXIgYW4gdW5kZXJydW4KLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICBzdHJ1Y3QgdGltZXNwZWMgb2xkTG9hZDsgICAgLy8gcHJldmlvdXMgdmFsdWUgb2YgY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCkKLSAgICBib29sIG9sZExvYWRWYWxpZDsgIC8vIHdoZXRoZXIgb2xkTG9hZCBpcyB2YWxpZAotICAgIHVpbnQzMl90IGJvdW5kczsKLSAgICBib29sIGZ1bGw7ICAgICAgICAgIC8vIHdoZXRoZXIgd2UgaGF2ZSBjb2xsZWN0ZWQgYXQgbGVhc3QgbVNhbXBsaW5nTiBzYW1wbGVzCisgICAgLy8gRklYTUUgdGhlc2UgZm9ybWVyIGxvY2FsIHZhcmlhYmxlcyBuZWVkIGNvbW1lbnRzCisgICAgY29uc3QgRmFzdFRocmVhZFN0YXRlKiAgbVByZXZpb3VzOworICAgIGNvbnN0IEZhc3RUaHJlYWRTdGF0ZSogIG1DdXJyZW50OworICAgIHN0cnVjdCB0aW1lc3BlYyBtT2xkVHM7CisgICAgYm9vbCAgICAgICAgICAgIG1PbGRUc1ZhbGlkOworICAgIGxvbmcgICAgICAgICAgICBtU2xlZXBOczsgICAgICAgLy8gLTE6IGJ1c3kgd2FpdCwgMDogc2NoZWRfeWllbGQsID4gMDogbmFub3NsZWVwCisgICAgbG9uZyAgICAgICAgICAgIG1QZXJpb2ROczsgICAgICAvLyBleHBlY3RlZCBwZXJpb2Q7IHRoZSB0aW1lIHJlcXVpcmVkIHRvIHJlbmRlciBvbmUgbWl4IGJ1ZmZlcgorICAgIGxvbmcgICAgICAgICAgICBtVW5kZXJydW5OczsgICAgLy8gdW5kZXJydW4gbGlrZWx5IHdoZW4gd3JpdGUgY3ljbGUgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdmFsdWUKKyAgICBsb25nICAgICAgICAgICAgbU92ZXJydW5OczsgICAgIC8vIG92ZXJydW4gbGlrZWx5IHdoZW4gd3JpdGUgY3ljbGUgaXMgbGVzcyB0aGFuIHRoaXMgdmFsdWUKKyAgICBsb25nICAgICAgICAgICAgbUZvcmNlTnM7ICAgICAgIC8vIGlmIG92ZXJydW4gZGV0ZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZSB0aGUgd3JpdGUgY3ljbGUgdG8gdGFrZSB0aGlzIG11Y2ggdGltZQorICAgIGxvbmcgICAgICAgICAgICBtV2FybXVwTnNNaW47ICAgLy8gd2FybXVwIGNvbXBsZXRlIHdoZW4gd3JpdGUgY3ljbGUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHZhbHVlCisgICAgbG9uZyAgICAgICAgICAgIG1XYXJtdXBOc01heDsgICAvLyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgdmFsdWUKKyAgICBGYXN0VGhyZWFkRHVtcFN0YXRlKiBtRHVtbXlEdW1wU3RhdGU7CisgICAgRmFzdFRocmVhZER1bXBTdGF0ZSogbUR1bXBTdGF0ZTsKKyAgICBib29sICAgICAgICAgICAgbUlnbm9yZU5leHRPdmVycnVuOyAgICAgLy8gdXNlZCB0byBpZ25vcmUgaW5pdGlhbCBvdmVycnVuIGFuZCBmaXJzdCBhZnRlciBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlcnJ1bgorI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKKyAgICBzdHJ1Y3QgdGltZXNwZWMgbU9sZExvYWQ7ICAgICAgIC8vIHByZXZpb3VzIHZhbHVlIG9mIGNsb2NrX2dldHRpbWUoQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQpCisgICAgYm9vbCAgICAgICAgICAgIG1PbGRMb2FkVmFsaWQ7ICAvLyB3aGV0aGVyIG9sZExvYWQgaXMgdmFsaWQKKyAgICB1aW50MzJfdCAgICAgICAgbUJvdW5kczsKKyAgICBib29sICAgICAgICAgICAgbUZ1bGw7ICAgICAgICAgIC8vIHdoZXRoZXIgd2UgaGF2ZSBjb2xsZWN0ZWQgYXQgbGVhc3QgbVNhbXBsaW5nTiBzYW1wbGVzCiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCi0gICAgVGhyZWFkQ3B1VXNhZ2UgdGN1OyAgICAgLy8gZm9yIHJlYWRpbmcgdGhlIGN1cnJlbnQgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHoKKyAgICBUaHJlYWRDcHVVc2FnZSAgbVRjdTsgICAgICAgICAgIC8vIGZvciByZWFkaW5nIHRoZSBjdXJyZW50IENQVSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6CiAjZW5kaWYKICNlbmRpZgotICAgIHVuc2lnbmVkIGNvbGRHZW47ICAgLy8gbGFzdCBvYnNlcnZlZCBtQ29sZEdlbgotICAgIGJvb2wgaXNXYXJtOyAgICAgICAgLy8gdHJ1ZSBtZWFucyByZWFkeSB0byBtaXgsIGZhbHNlIG1lYW5zIHdhaXQgZm9yIHdhcm11cCBiZWZvcmUgbWl4aW5nCi0gICAgc3RydWN0IHRpbWVzcGVjIG1lYXN1cmVkV2FybXVwVHM7ICAvLyBob3cgbG9uZyBkaWQgaXQgdGFrZSBmb3Igd2FybXVwIHRvIGNvbXBsZXRlCi0gICAgdWludDMyX3Qgd2FybXVwQ3ljbGVzOyAgLy8gY291bnRlciBvZiBudW1iZXIgb2YgbG9vcCBjeWNsZXMgcmVxdWlyZWQgdG8gd2FybXVwCi0gICAgTkJMb2c6OldyaXRlciBkdW1teUxvZ1dyaXRlcjsKLSAgICBOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXI7Ci0gICAgc3RhdHVzX3QgdGltZXN0YW1wU3RhdHVzOworICAgIHVuc2lnbmVkICAgICAgICBtQ29sZEdlbjsgICAgICAgLy8gbGFzdCBvYnNlcnZlZCBtQ29sZEdlbgorICAgIGJvb2wgICAgICAgICAgICBtSXNXYXJtOyAgICAgICAgLy8gdHJ1ZSBtZWFucyByZWFkeSB0byBtaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZSBtZWFucyB3YWl0IGZvciB3YXJtdXAgYmVmb3JlIG1peGluZworICAgIHN0cnVjdCB0aW1lc3BlYyBtTWVhc3VyZWRXYXJtdXBUczsgIC8vIGhvdyBsb25nIGRpZCBpdCB0YWtlIGZvciB3YXJtdXAgdG8gY29tcGxldGUKKyAgICB1aW50MzJfdCAgICAgICAgbVdhcm11cEN5Y2xlczsgIC8vIGNvdW50ZXIgb2YgbnVtYmVyIG9mIGxvb3AgY3ljbGVzIGR1cmluZyB3YXJtdXAgcGhhc2UKKyAgICB1aW50MzJfdCAgICAgICAgbVdhcm11cENvbnNlY3V0aXZlSW5SYW5nZUN5Y2xlczsgICAgLy8gbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGN5Y2xlcyBpbiByYW5nZQorICAgIE5CTG9nOjpXcml0ZXIgICBtRHVtbXlMb2dXcml0ZXI7CisgICAgTkJMb2c6OldyaXRlciogIG1Mb2dXcml0ZXI7CisgICAgc3RhdHVzX3QgICAgICAgIG1UaW1lc3RhbXBTdGF0dXM7CiAKLSAgICBGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgY29tbWFuZDsKLSNpZiAwCi0gICAgc2l6ZV90IGZyYW1lQ291bnQ7Ci0jZW5kaWYKLSAgICBib29sIGF0dGVtcHRlZFdyaXRlOworICAgIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBtQ29tbWFuZDsKKyAgICBib29sICAgICAgICAgICAgbUF0dGVtcHRlZFdyaXRlOwogCiB9OyAgLy8gY2xhc3MgRmFzdFRocmVhZAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZER1bXBTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZER1bXBTdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmNWM0YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkRHVtcFN0YXRlLmNwcApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkZhc3RUaHJlYWREdW1wU3RhdGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitGYXN0VGhyZWFkRHVtcFN0YXRlOjpGYXN0VGhyZWFkRHVtcFN0YXRlKCkgOgorICAgIG1Db21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6SU5JVElBTCksIG1VbmRlcnJ1bnMoMCksIG1PdmVycnVucygwKSwKKyAgICAvKiBtTWVhc3VyZWRXYXJtdXBUcyh7MCwgMH0pLCAqLworICAgIG1XYXJtdXBDeWNsZXMoMCkKKyNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCisgICAgLCBtU2FtcGxpbmdOKDApLCBtQm91bmRzKDApCisjZW5kaWYKK3sKKyAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgPSAwOworICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPSAwOworI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKKyAgICBpbmNyZWFzZVNhbXBsaW5nTigxKTsKKyNlbmRpZgorfQorCitGYXN0VGhyZWFkRHVtcFN0YXRlOjp+RmFzdFRocmVhZER1bXBTdGF0ZSgpCit7Cit9CisKKyNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCit2b2lkIEZhc3RUaHJlYWREdW1wU3RhdGU6OmluY3JlYXNlU2FtcGxpbmdOKHVpbnQzMl90IHNhbXBsaW5nTikKK3sKKyAgICBpZiAoc2FtcGxpbmdOIDw9IG1TYW1wbGluZ04gfHwgc2FtcGxpbmdOID4ga1NhbXBsaW5nTiB8fCByb3VuZHVwKHNhbXBsaW5nTikgIT0gc2FtcGxpbmdOKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDMyX3QgYWRkaXRpb25hbCA9IHNhbXBsaW5nTiAtIG1TYW1wbGluZ047CisgICAgLy8gc2FtcGxlIGFycmF5cyBhcmVuJ3QgYWNjZXNzZWQgYXRvbWljYWxseSB3aXRoIHJlc3BlY3QgdG8gdGhlIGJvdW5kcywKKyAgICAvLyBzbyBjbGVhcmluZyByZWR1Y2VzIGNoYW5jZSBmb3IgZHVtcHN5cyB0byByZWFkIHJhbmRvbSB1bmluaXRpYWxpemVkIHNhbXBsZXMKKyAgICBtZW1zZXQoJm1Nb25vdG9uaWNOc1ttU2FtcGxpbmdOXSwgMCwgc2l6ZW9mKG1Nb25vdG9uaWNOc1swXSkgKiBhZGRpdGlvbmFsKTsKKyAgICBtZW1zZXQoJm1Mb2FkTnNbbVNhbXBsaW5nTl0sIDAsIHNpemVvZihtTG9hZE5zWzBdKSAqIGFkZGl0aW9uYWwpOworI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUworICAgIG1lbXNldCgmbUNwdWtIelttU2FtcGxpbmdOXSwgMCwgc2l6ZW9mKG1DcHVrSHpbMF0pICogYWRkaXRpb25hbCk7CisjZW5kaWYKKyAgICBtU2FtcGxpbmdOID0gc2FtcGxpbmdOOworfQorI2VuZGlmCisKK30gICAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZER1bXBTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWREdW1wU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2UwOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWREdW1wU3RhdGUuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX0ZBU1RfVEhSRUFEX0RVTVBfU1RBVEVfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX0ZBU1RfVEhSRUFEX0RVTVBfU1RBVEVfSAorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgIkZhc3RUaHJlYWRTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRoZSBGYXN0VGhyZWFkRHVtcFN0YXRlIGtlZXBzIGEgY2FjaGUgb2YgRmFzdFRocmVhZCBzdGF0aXN0aWNzIHRoYXQgY2FuIGJlIGxvZ2dlZCBieSBkdW1wc3lzLgorLy8gRWFjaCBpbmRpdmlkdWFsIG5hdGl2ZSB3b3JkLXNpemVkIGZpZWxkIGlzIGFjY2Vzc2VkIGF0b21pY2FsbHkuICBCdXQgdGhlCisvLyBvdmVyYWxsIHN0cnVjdHVyZSBpcyBub24tYXRvbWljLCB0aGF0IGlzIHRoZXJlIG1heSBiZSBhbiBpbmNvbnNpc3RlbmN5IGJldHdlZW4gZmllbGRzLgorLy8gTm8gYmFycmllcnMgb3IgbG9ja3MgYXJlIHVzZWQgZm9yIGVpdGhlciB3cml0aW5nIG9yIHJlYWRpbmcuCisvLyBPbmx5IFBPRCB0eXBlcyBhcmUgcGVybWl0dGVkLCBhbmQgdGhlIGNvbnRlbnRzIHNob3VsZG4ndCBiZSB0cnVzdGVkIChpLmUuIGRvIHJhbmdlIGNoZWNrcykuCisvLyBJdCBoYXMgYSBkaWZmZXJlbnQgbGlmZXRpbWUgdGhhbiB0aGUgRmFzdFRocmVhZCwgYW5kIHNvIGl0IGNhbid0IGJlIGEgbWVtYmVyIG9mIEZhc3RUaHJlYWQuCitzdHJ1Y3QgRmFzdFRocmVhZER1bXBTdGF0ZSB7CisgICAgRmFzdFRocmVhZER1bXBTdGF0ZSgpOworICAgIC8qdmlydHVhbCovIH5GYXN0VGhyZWFkRHVtcFN0YXRlKCk7CisKKyAgICBGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgbUNvbW1hbmQ7ICAgLy8gY3VycmVudCBjb21tYW5kCisgICAgdWludDMyX3QgbVVuZGVycnVuczsgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiB1bmRlcnJ1bnMKKyAgICB1aW50MzJfdCBtT3ZlcnJ1bnM7ICAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIG92ZXJydW5zCisgICAgc3RydWN0IHRpbWVzcGVjIG1NZWFzdXJlZFdhcm11cFRzOyAgLy8gbWVhc3VyZWQgd2FybXVwIHRpbWUKKyAgICB1aW50MzJfdCBtV2FybXVwQ3ljbGVzOyAgICAgLy8gbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHJlcXVpcmVkIHRvIHdhcm11cAorCisjaWZkZWYgRkFTVF9USFJFQURfU1RBVElTVElDUworICAgIC8vIFJlY2VudGx5IGNvbGxlY3RlZCBzYW1wbGVzIG9mIHBlci1jeWNsZSBtb25vdG9uaWMgdGltZSwgdGhyZWFkIENQVSB0aW1lLCBhbmQgQ1BVIGZyZXF1ZW5jeS4KKyAgICAvLyBrU2FtcGxpbmdOIGlzIG1heCBzaXplIG9mIHNhbXBsaW5nIGZyYW1lIChzdGF0aXN0aWNzKSwgYW5kIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IDB4ODAwMC4KKyAgICAvLyBUaGUgc2FtcGxlIGFycmF5cyBhcmUgdmlydHVhbGx5IGFsbG9jYXRlZCBiYXNlZCBvbiB0aGlzIGNvbXBpbGUtdGltZSBjb25zdGFudCwKKyAgICAvLyBidXQgYXJlIG9ubHkgaW5pdGlhbGl6ZWQgYW5kIHVzZWQgYmFzZWQgb24gdGhlIHJ1bnRpbWUgcGFyYW1ldGVyIG1TYW1wbGluZ04uCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGluZ04gPSAweDgwMDA7CisgICAgLy8gQ29tcGlsZS10aW1lIGNvbnN0YW50IGZvciBhICJsb3cgUkFNIGRldmljZSIsIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04uCisgICAgLy8gVGhpcyB2YWx1ZSB3YXMgY2hvc2VuIHN1Y2ggdGhhdCBlYWNoIGFycmF5IHVzZXMgMSBzbWFsbCBwYWdlICg0IEtieXRlcykuCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGluZ05mb3JMb3dSYW1EZXZpY2UgPSAweDQwMDsKKyAgICAvLyBDb3JyZXNwb25kaW5nIHJ1bnRpbWUgbWF4aW11bSBzaXplIG9mIHNhbXBsZSBhcnJheXMsIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04uCisgICAgdWludDMyX3QgbVNhbXBsaW5nTjsKKyAgICAvLyBUaGUgYm91bmRzIGRlZmluZSB0aGUgaW50ZXJ2YWwgb2YgdmFsaWQgc2FtcGxlcywgYW5kIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOgorICAgIC8vICAgICAgbmV3ZXN0IG9wZW4gKGV4Y2x1ZGVkKSBlbmRwb2ludCAgID0gbG93ZXIgMTYgYml0cyBvZiBib3VuZHMsIG1vZHVsbyBOCisgICAgLy8gICAgICBvbGRlc3QgY2xvc2VkIChpbmNsdWRlZCkgZW5kcG9pbnQgPSB1cHBlciAxNiBiaXRzIG9mIGJvdW5kcywgbW9kdWxvIE4KKyAgICAvLyBOdW1iZXIgb2YgdmFsaWQgc2FtcGxlcyBpcyBuZXdlc3QgLSBvbGRlc3QuCisgICAgdWludDMyX3QgbUJvdW5kczsgICAgICAgICAgICAgICAgICAgLy8gYm91bmRzIGZvciBtTW9ub3RvbmljTnMsIG1UaHJlYWRDcHVOcywgYW5kIG1DcHVrSHoKKyAgICAvLyBUaGUgZWxlbWVudHMgaW4gdGhlICpOcyBhcnJheXMgYXJlIGluIHVuaXRzIG9mIG5hbm9zZWNvbmRzIDw9IDM5OTk5OTk5OTkuCisgICAgdWludDMyX3QgbU1vbm90b25pY05zW2tTYW1wbGluZ05dOyAgLy8gZGVsdGEgbW9ub3RvbmljICh3YWxsIGNsb2NrKSB0aW1lCisgICAgdWludDMyX3QgbUxvYWROc1trU2FtcGxpbmdOXTsgICAgICAgLy8gZGVsdGEgQ1BVIGxvYWQgaW4gdGltZQorI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUworICAgIHVpbnQzMl90IG1DcHVrSHpba1NhbXBsaW5nTl07ICAgICAgIC8vIGFic29sdXRlIENQVSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6LCBiaXRzIDAtMyBhcmUgQ1BVIworI2VuZGlmCisKKyAgICAvLyBJbmNyZWFzZSBzYW1wbGluZyB3aW5kb3cgYWZ0ZXIgY29uc3RydWN0aW9uLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSBrU2FtcGxpbmdOCisgICAgdm9pZCAgICBpbmNyZWFzZVNhbXBsaW5nTih1aW50MzJfdCBzYW1wbGluZ04pOworI2VuZGlmCisKK307ICAvLyBzdHJ1Y3QgRmFzdFRocmVhZER1bXBTdGF0ZQorCit9ICAgLy8gYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fRkFTVF9USFJFQURfRFVNUF9TVEFURV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZFN0YXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuY3BwCmluZGV4IDY5OTQ4NzIuLmFkNWYzMWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuY3BwCkBAIC0yOSwyMSArMjksMTYgQEAKIHsKIH0KIAotCi1GYXN0VGhyZWFkRHVtcFN0YXRlOjpGYXN0VGhyZWFkRHVtcFN0YXRlKCkgOgotICAgIG1Db21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6SU5JVElBTCksIG1VbmRlcnJ1bnMoMCksIG1PdmVycnVucygwKSwKLSAgICAvKiBtTWVhc3VyZWRXYXJtdXBUcyh7MCwgMH0pLCAqLwotICAgIG1XYXJtdXBDeWNsZXMoMCkKLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAsIG1TYW1wbGluZ04oMSksIG1Cb3VuZHMoMCkKLSNlbmRpZgorLy8gc3RhdGljCitjb25zdCBjaGFyICpGYXN0VGhyZWFkU3RhdGU6OmNvbW1hbmRUb1N0cmluZyhGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgY29tbWFuZCkKIHsKLSAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgPSAwOwotICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPSAwOwotfQotCi1GYXN0VGhyZWFkRHVtcFN0YXRlOjp+RmFzdFRocmVhZER1bXBTdGF0ZSgpCi17CisgICAgc3dpdGNoIChjb21tYW5kKSB7CisgICAgY2FzZSBGYXN0VGhyZWFkU3RhdGU6OklOSVRJQUw6ICAgICAgcmV0dXJuICJJTklUSUFMIjsKKyAgICBjYXNlIEZhc3RUaHJlYWRTdGF0ZTo6SE9UX0lETEU6ICAgICByZXR1cm4gIkhPVF9JRExFIjsKKyAgICBjYXNlIEZhc3RUaHJlYWRTdGF0ZTo6Q09MRF9JRExFOiAgICByZXR1cm4gIkNPTERfSURMRSI7CisgICAgY2FzZSBGYXN0VGhyZWFkU3RhdGU6OkVYSVQ6ICAgICAgICAgcmV0dXJuICJFWElUIjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5oCmluZGV4IDFhYjhhMGEuLmYxOGY4NDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZFN0YXRlLmgKQEAgLTQ2LDQzICs0NiwxMCBAQAogICAgIEZhc3RUaHJlYWREdW1wU3RhdGUqIG1EdW1wU3RhdGU7IC8vIGlmIG5vbi1OVUxMLCB0aGVuIHVwZGF0ZSBkdW1wIHN0YXRlIHBlcmlvZGljYWxseQogICAgIE5CTG9nOjpXcml0ZXIqIG1OQkxvZ1dyaXRlcjsgLy8gbm9uLWJsb2NraW5nIGxvZ2dlcgogCisgICAgLy8gcmV0dXJucyBOVUxMIGlmIGNvbW1hbmQgYmVsb25ncyB0byBhIHN1YmNsYXNzCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbW1hbmRUb1N0cmluZyhDb21tYW5kIGNvbW1hbmQpOwogfTsgIC8vIHN0cnVjdCBGYXN0VGhyZWFkU3RhdGUKIAotCi0vLyBGSVhNRSBleHRyYWN0IGNvbW1vbiBwYXJ0IG9mIGNvbW1lbnQgYXQgRmFzdE1peGVyRHVtcFN0YXRlCi1zdHJ1Y3QgRmFzdFRocmVhZER1bXBTdGF0ZSB7Ci0gICAgRmFzdFRocmVhZER1bXBTdGF0ZSgpOwotICAgIC8qdmlydHVhbCovIH5GYXN0VGhyZWFkRHVtcFN0YXRlKCk7Ci0KLSAgICBGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgbUNvbW1hbmQ7ICAgLy8gY3VycmVudCBjb21tYW5kCi0gICAgdWludDMyX3QgbVVuZGVycnVuczsgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiB1bmRlcnJ1bnMKLSAgICB1aW50MzJfdCBtT3ZlcnJ1bnM7ICAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIG92ZXJydW5zCi0gICAgc3RydWN0IHRpbWVzcGVjIG1NZWFzdXJlZFdhcm11cFRzOyAgLy8gbWVhc3VyZWQgd2FybXVwIHRpbWUKLSAgICB1aW50MzJfdCBtV2FybXVwQ3ljbGVzOyAgICAgLy8gbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHJlcXVpcmVkIHRvIHdhcm11cAotCi0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgLy8gUmVjZW50bHkgY29sbGVjdGVkIHNhbXBsZXMgb2YgcGVyLWN5Y2xlIG1vbm90b25pYyB0aW1lLCB0aHJlYWQgQ1BVIHRpbWUsIGFuZCBDUFUgZnJlcXVlbmN5LgotICAgIC8vIGtTYW1wbGluZ04gaXMgbWF4IHNpemUgb2Ygc2FtcGxpbmcgZnJhbWUgKHN0YXRpc3RpY3MpLCBhbmQgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0gMHg4MDAwLgotICAgIC8vIFRoZSBzYW1wbGUgYXJyYXlzIGFyZSB2aXJ0dWFsbHkgYWxsb2NhdGVkIGJhc2VkIG9uIHRoaXMgY29tcGlsZS10aW1lIGNvbnN0YW50LAotICAgIC8vIGJ1dCBhcmUgb25seSBpbml0aWFsaXplZCBhbmQgdXNlZCBiYXNlZCBvbiB0aGUgcnVudGltZSBwYXJhbWV0ZXIgbVNhbXBsaW5nTi4KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1NhbXBsaW5nTiA9IDB4ODAwMDsKLSAgICAvLyBDb3JyZXNwb25kaW5nIHJ1bnRpbWUgbWF4aW11bSBzaXplIG9mIHNhbXBsZSBhcnJheXMsIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04uCi0gICAgdWludDMyX3QgbVNhbXBsaW5nTjsKLSAgICAvLyBUaGUgYm91bmRzIGRlZmluZSB0aGUgaW50ZXJ2YWwgb2YgdmFsaWQgc2FtcGxlcywgYW5kIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOgotICAgIC8vICAgICAgbmV3ZXN0IG9wZW4gKGV4Y2x1ZGVkKSBlbmRwb2ludCAgID0gbG93ZXIgMTYgYml0cyBvZiBib3VuZHMsIG1vZHVsbyBOCi0gICAgLy8gICAgICBvbGRlc3QgY2xvc2VkIChpbmNsdWRlZCkgZW5kcG9pbnQgPSB1cHBlciAxNiBiaXRzIG9mIGJvdW5kcywgbW9kdWxvIE4KLSAgICAvLyBOdW1iZXIgb2YgdmFsaWQgc2FtcGxlcyBpcyBuZXdlc3QgLSBvbGRlc3QuCi0gICAgdWludDMyX3QgbUJvdW5kczsgICAgICAgICAgICAgICAgICAgLy8gYm91bmRzIGZvciBtTW9ub3RvbmljTnMsIG1UaHJlYWRDcHVOcywgYW5kIG1DcHVrSHoKLSAgICAvLyBUaGUgZWxlbWVudHMgaW4gdGhlICpOcyBhcnJheXMgYXJlIGluIHVuaXRzIG9mIG5hbm9zZWNvbmRzIDw9IDM5OTk5OTk5OTkuCi0gICAgdWludDMyX3QgbU1vbm90b25pY05zW2tTYW1wbGluZ05dOyAgLy8gZGVsdGEgbW9ub3RvbmljICh3YWxsIGNsb2NrKSB0aW1lCi0gICAgdWludDMyX3QgbUxvYWROc1trU2FtcGxpbmdOXTsgICAgICAgLy8gZGVsdGEgQ1BVIGxvYWQgaW4gdGltZQotI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgIHVpbnQzMl90IG1DcHVrSHpba1NhbXBsaW5nTl07ICAgICAgIC8vIGFic29sdXRlIENQVSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6LCBiaXRzIDAtMyBhcmUgQ1BVIwotI2VuZGlmCi0jZW5kaWYKLQotfTsgIC8vIHN0cnVjdCBGYXN0VGhyZWFkRHVtcFN0YXRlCi0KIH0gICAvLyBhbmRyb2lkCiAKICNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19GQVNUX1RIUkVBRF9TVEFURV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKaW5kZXggNGYwYzZiMS4uZjYwNzhhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcApAQCAtMjAwLDI2ICsyMDAsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRvIGNvbm5lY3Rpb25zIGJldHdlZW4gZGV2aWNlcyBhbmQgaW5wdXQgc3RyZWFtcyBmb3IgSEFMIGJlZm9yZSAzLjAKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLmV4dC5taXguaHdfbW9kdWxlID09IHNyY01vZHVsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvSHdEZXZpY2UtPnZlcnNpb24oKSA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBpbnZhbGlkIHNpbmsgdHlwZSAlZCBmb3IgZGV2aWNlIHNvdXJjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS50eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9IHNyY01vZHVsZSkgewotICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRvIGRldmljZSB0byBkZXZpY2UgY29ubmVjdGlvbiBpZiBub3Qgb24gc2FtZSBodyBtb2R1bGUKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGludmFsaWQgc2luayB0eXBlIGZvciBjcm9zcyBodyBtb2R1bGUiKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIG51bSBzb3VyY2VzID09IDIgLT0+IHJldXNlIGFuIGV4aXRpbmcgb3V0cHV0IG1peCB0byBjb25uZWN0IHRvIHRoZQotICAgICAgICAgICAgICAgIC8vIHNpbmsKKyAgICAgICAgICAgIC8vIG1hbmFnZSBwYXRjaGVzIHJlcXVpcmluZyBhIHNvZnR3YXJlIGJyaWRnZQorICAgICAgICAgICAgLy8gLSBEZXZpY2UgdG8gZGV2aWNlIEFORAorICAgICAgICAgICAgLy8gICAgLSBzb3VyY2UgSFcgbW9kdWxlICE9IGRlc3RpbmF0aW9uIEhXIG1vZHVsZSBPUgorICAgICAgICAgICAgLy8gICAgLSBhdWRpbyBIQUwgdmVyc2lvbiA8IDMuMAorICAgICAgICAgICAgLy8gICAgLSBzcGVjaWFsIHBhdGNoIHJlcXVlc3Qgd2l0aCAyIHNvdXJjZXMgKHJldXNlIG9uZSBleGlzdGluZyBvdXRwdXQgbWl4KQorICAgICAgICAgICAgaWYgKChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSAmJgorICAgICAgICAgICAgICAgICAgICAoKHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPSBzcmNNb2R1bGUpIHx8CisgICAgICAgICAgICAgICAgICAgIChhdWRpb0h3RGV2aWNlLT52ZXJzaW9uKCkgPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB8fAorICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPm51bV9zb3VyY2VzID09IDIpKSkgewogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMikgewogICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMV0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfTUlYIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9CkBAIC0yODMsNTIgKzI3NCwyOSBAQAogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoYXVkaW9Id0RldmljZS0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHBhdGNoLCAmaGFsSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSA9IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+Y3JlYXRlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbEhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CiAgICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgKmFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAocGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5hZGRyZXNzLCAiIikgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gKGNoYXIgKiljYWxsb2MoMSwgMSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudChwYXRjaCwgJmhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPnZlcnNpb24oKSA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoU3RyaW5nOChhZGRyZXNzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fSU5QVVRfU09VUkNFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgQVVESU9fUE9SVF9UWVBFX0RFVklDRSBzZXRQYXJhbWV0ZXJzICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSA9IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5jcmVhdGVfYXVkaW9fcGF0Y2goaHdEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbEhhbmRsZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGJyZWFrOwpAQCAtMzQxLDYgKzMwOSw3IEBACiAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gbGltaXQgdG8gY29ubmVjdGlvbnMgYmV0d2VlbiBkZXZpY2VzIGFuZCBvdXRwdXQgc3RyZWFtcworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBpbnZhbGlkIHNpbmsgdHlwZSAlZCBmb3IgbWl4IHNvdXJjZSIsCkBAIC0zNTMsOCArMzIyLDggQEAKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CkBAIC0zNjMsMjggKzMzMiwxNCBAQAogICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXVkaW9Id0RldmljZS0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQocGF0Y2gsICZoYWxIYW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hhciAqYWRkcmVzczsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MsICIiKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vRklYTUU6IHdlIG9ubHkgc3VwcG9ydCBhZGRyZXNzIG9uIGZpcnN0IHNpbmsgd2l0aCBIQUwgdmVyc2lvbiA8IDMuMAotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IChjaGFyICopY2FsbG9jKDEsIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKFN0cmluZzgoYWRkcmVzcykpOwotICAgICAgICAgICAgICAgIGZyZWUoYWRkcmVzcyk7CisgICAgICAgICAgICBpZiAodGhyZWFkID09IGF1ZGlvZmxpbmdlci0+cHJpbWFyeVBsYXliYWNrVGhyZWFkX2woKSkgeworICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKICAgICAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1JPVVRJTkcpLCAoaW50KXR5cGUpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+YnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2wocGFyYW0udG9TdHJpbmcoKSk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudChwYXRjaCwgJmhhbEhhbmRsZSk7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CkBAIC00NzIsNiArNDI3LDcgQEAKICAgICAvLyB0aGlzIHRyYWNrIGlzIGdpdmVuIHRoZSBzYW1lIGJ1ZmZlciBhcyB0aGUgUGF0Y2hSZWNvcmQgYnVmZmVyCiAgICAgcGF0Y2gtPm1QYXRjaFRyYWNrID0gbmV3IFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9QYXRjaC0+c291cmNlc1sxXS5leHQubWl4LnVzZWNhc2Uuc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LApAQCAtNTI1LDIyICs0ODEsMzEgQEAKICAgICBpZiAocGF0Y2gtPm1SZWNvcmRUaHJlYWQgIT0gMCkgewogICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCAhPSAwKSB7CiAgICAgICAgICAgICBwYXRjaC0+bVJlY29yZFRocmVhZC0+ZGVsZXRlUGF0Y2hSZWNvcmQocGF0Y2gtPm1QYXRjaFJlY29yZCk7Ci0gICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLmNsZWFyKCk7CiAgICAgICAgIH0KICAgICAgICAgYXVkaW9mbGluZ2VyLT5jbG9zZUlucHV0SW50ZXJuYWxfbChwYXRjaC0+bVJlY29yZFRocmVhZCk7Ci0gICAgICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLmNsZWFyKCk7CiAgICAgfQogICAgIGlmIChwYXRjaC0+bVBsYXliYWNrVGhyZWFkICE9IDApIHsKICAgICAgICAgaWYgKHBhdGNoLT5tUGF0Y2hUcmFjayAhPSAwKSB7CiAgICAgICAgICAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5kZWxldGVQYXRjaFRyYWNrKHBhdGNoLT5tUGF0Y2hUcmFjayk7Ci0gICAgICAgICAgICBwYXRjaC0+bVBhdGNoVHJhY2suY2xlYXIoKTsKICAgICAgICAgfQogICAgICAgICAvLyBpZiBudW0gc291cmNlcyA9PSAyIHdlIGFyZSByZXVzaW5nIGFuIGV4aXN0aW5nIHBsYXliYWNrIHRocmVhZCBzbyB3ZSBkbyBub3QgY2xvc2UgaXQKICAgICAgICAgaWYgKHBhdGNoLT5tQXVkaW9QYXRjaC5udW1fc291cmNlcyAhPSAyKSB7CiAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNsb3NlT3V0cHV0SW50ZXJuYWxfbChwYXRjaC0+bVBsYXliYWNrVGhyZWFkKTsKICAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGF0Y2gtPm1SZWNvcmRUaHJlYWQgIT0gMCkgeworICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCAhPSAwKSB7CisgICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQuY2xlYXIoKTsKKyAgICB9CisgICAgaWYgKHBhdGNoLT5tUGxheWJhY2tUaHJlYWQgIT0gMCkgeworICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrICE9IDApIHsKKyAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hUcmFjay5jbGVhcigpOworICAgICAgICB9CiAgICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQuY2xlYXIoKTsKICAgICB9CisKIH0KIAogLyogRGlzY29ubmVjdCBhIHBhdGNoICovCkBAIC01NzgsNDIgKzU0MywzMCBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgotICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0gc3JjTW9kdWxlKSB7CisgICAgICAgICAgICBpZiAocmVtb3ZlZFBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUgfHwKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgIGNsZWFyUGF0Y2hDb25uZWN0aW9ucyhyZW1vdmVkUGF0Y2gpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICBpZiAoYXVkaW9Id0RldmljZS0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewotICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrUmVjb3JkVGhyZWFkX2woCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSA9IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5yZWxlYXNlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLCByZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewogICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwotICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksIDApOwotICAgICAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0Ugc2V0UGFyYW1ldGVycyAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0udG9TdHJpbmcoKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChhdWRpb0h3RGV2aWNlLT52ZXJzaW9uKCkgPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZV9hdWRpb19wYXRjaChod0RldmljZSwgcmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTUlYOiB7CkBAIC02MzIsMTQgKzU4NSw3IEBACiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPnZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKLSAgICAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1JPVVRJTkcpLCAwKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CkBAIC02OTMsNSArNjM5LDQgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKaW5kZXggZWU0ODI3Ni4uN2JjNmYwYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKQEAgLTE1NiwxMCArMTU2LDYgQEAKICAgICBib29sICAgICAgICAgICAgICAgIG1SZXN1bWVUb1N0b3BwaW5nOyAvLyB0cmFjayB3YXMgcGF1c2VkIGluIHN0b3BwaW5nIHN0YXRlLgogICAgIGJvb2wgICAgICAgICAgICAgICAgbUZsdXNoSHdQZW5kaW5nOyAvLyB0cmFjayByZXF1ZXN0cyBmb3IgdGhyZWFkIGZsdXNoCiAKLSAgICAvLyBmb3IgbGFzdCBjYWxsIHRvIGdldFRpbWVzdGFtcAotICAgIGJvb2wgICAgICAgICAgICAgICAgbVByZXZpb3VzVmFsaWQ7Ci0gICAgdWludDMyX3QgICAgICAgICAgICBtUHJldmlvdXNGcmFtZXNXcml0dGVuOwotICAgIEF1ZGlvVGltZXN0YW1wICAgICAgbVByZXZpb3VzVGltZXN0YW1wOwogfTsgIC8vIGVuZCBvZiBUcmFjawogCiBjbGFzcyBUaW1lZFRyYWNrIDogcHVibGljIFRyYWNrIHsKQEAgLTI1NSw3ICsyNTEsNyBAQAogCiAgICAgY2xhc3MgQnVmZmVyIDogcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciB7CiAgICAgcHVibGljOgotICAgICAgICBpbnQxNl90ICptQnVmZmVyOworICAgICAgICB2b2lkICptQnVmZmVyOwogICAgIH07CiAKICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFRyYWNrKFBsYXliYWNrVGhyZWFkICp0aHJlYWQsCkBAIC0yNzEsNyArMjY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbiA9IDApOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgYm9vbCAgICAgICAgd3JpdGUoaW50MTZfdCogZGF0YSwgdWludDMyX3QgZnJhbWVzKTsKKyAgICAgICAgICAgIGJvb2wgICAgICAgIHdyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcyk7CiAgICAgICAgICAgICBib29sICAgICAgICBidWZmZXJRdWV1ZUVtcHR5KCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlclF1ZXVlLnNpemUoKSA9PSAwOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc0FjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIG1BY3RpdmU7IH0KICAgICBjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbVRocmVhZDsgfQpAQCAtMjk3LDYgKzI5Myw3IEBACiBwdWJsaWM6CiAKICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGNoVHJhY2soUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKaW5kZXggMjA0YTlkNi4uMjVkNmQ5NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaApAQCAtMzQsNiArMzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja190eXBlIHR5cGUpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflJlY29yZFRyYWNrKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCwgaW50IHRyaWdnZXJTZXNzaW9uKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHN0b3AoKTsKQEAgLTY2LDIxICs2Nyw2IEBACiAKICAgICBib29sICAgICAgICAgICAgICAgIG1PdmVyZmxvdzsgIC8vIG92ZXJmbG93IG9uIG1vc3QgcmVjZW50IGF0dGVtcHQgdG8gZmlsbCBjbGllbnQgYnVmZmVyCiAKLSAgICAgICAgICAgLy8gdXBkYXRlZCBieSBSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCi0gICAgICAgICAgICBBdWRpb1Jlc2FtcGxlciAgICAgICAgICAgICAgICAgICAgICAqbVJlc2FtcGxlcjsKLQotICAgICAgICAgICAgLy8gaW50ZXJsZWF2ZWQgc3RlcmVvIHBhaXJzIG9mIGZpeGVkLXBvaW50IFE0LjI3Ci0gICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbVJzbXBPdXRCdWZmZXI7Ci0gICAgICAgICAgICAvLyBjdXJyZW50IGFsbG9jYXRlZCBmcmFtZSBjb3VudCBmb3IgdGhlIGFib3ZlLCB3aGljaCBtYXkgYmUgbGFyZ2VyIHRoYW4gbmVlZGVkCi0gICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcE91dEZyYW1lQ291bnQ7Ci0KLSAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5VbnJlbDsgICAvLyB1bnJlbGVhc2VkIGZyYW1lcyByZW1haW5pbmcgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vc3QgcmVjZW50IGdldE5leHRCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZGVidWcgb25seQotCi0gICAgICAgICAgICAvLyByb2xsaW5nIGNvdW50ZXIgdGhhdCBpcyBuZXZlciBjbGVhcmVkCi0gICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluRnJvbnQ7ICAgLy8gbmV4dCBhdmFpbGFibGUgZnJhbWUKLQogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIG1TaW5rOyAgLy8gcmVmZXJlbmNlcyBjbGllbnQncyBidWZmZXIgc2luayBpbiBzaGFyZWQgbWVtb3J5CiAKICAgICAgICAgICAgIC8vIHN5bmMgZXZlbnQgdHJpZ2dlcmluZyBhY3R1YWwgYXVkaW8gY2FwdHVyZS4gRnJhbWVzIHJlYWQgYmVmb3JlIHRoaXMgZXZlbnQgd2lsbApAQCAtOTMsNyArNzksMTAgQEAKICAgICAgICAgICAgIHNzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNUb0Ryb3A7CiAKICAgICAgICAgICAgIC8vIHVzZWQgYnkgcmVzYW1wbGVyIHRvIGZpbmQgc291cmNlIGZyYW1lcwotICAgICAgICAgICAgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgKm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcjsKKyAgICAgICAgICAgIFJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyICAgICAgICAgICAgKm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcjsKKworICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgcmVjb3JkIHRocmVhZCB0byBjb252ZXJ0IGZyYW1lcyB0byBwcm9wZXIgZGVzdGluYXRpb24gZm9ybWF0CisgICAgICAgICAgICBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIgICAgICAgICAgICAgICptUmVjb3JkQnVmZmVyQ29udmVydGVyOwogfTsKIAogLy8gcGxheWJhY2sgdHJhY2ssIHVzZWQgYnkgUGF0Y2hQYW5lbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCmluZGV4IGZhZTE5YTEuLjJlNjhkYWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKQEAgLTE0LDYxICsxNCwxMTkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogCisvKiBXaGVuIHBlcmZvcm1pbmcgcGVybWlzc2lvbiBjaGVja3Mgd2UgZG8gbm90IHVzZSBwZXJtaXNzaW9uIGNhY2hlIGZvcgorICogcnVudGltZSBwZXJtaXNzaW9ucyAocHJvdGVjdGlvbiBsZXZlbCBkYW5nZXJvdXMpIGFzIHRoZXkgbWF5IGNoYW5nZSBhdAorICogcnVudGltZS4gQWxsIG90aGVyIHBlcm1pc3Npb25zIChwcm90ZWN0aW9uIGxldmVsIG5vcm1hbCBhbmQgZGFuZ2Vyb3VzKQorICogY2FuIGJlIGNhY2hlZCBhcyB0aGV5IG5ldmVyIGNoYW5nZS4gT2YgY291cnNlIGFsbCBwZXJtaXNzaW9uIGNoZWNrZWQKKyAqIGhlcmUgYXJlIHBsYXRmb3JtIGRlZmluZWQuCisgKi8KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBOb3QgdmFsaWQgdW50aWwgaW5pdGlhbGl6ZWQgYnkgQXVkaW9GbGluZ2VyIGNvbnN0cnVjdG9yLiAgSXQgd291bGQgaGF2ZSB0byBiZQogLy8gcmUtaW5pdGlhbGl6ZWQgaWYgdGhlIHByb2Nlc3MgY29udGFpbmluZyBBdWRpb0ZsaW5nZXIgc2VydmljZSBmb3JrcyAod2hpY2ggaXQgZG9lc24ndCkuCiBwaWRfdCBnZXRwaWRfY2FjaGVkOwogCi1ib29sIHJlY29yZGluZ0FsbG93ZWQoKSB7Citib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpIHsKKyAgICAvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyB0aGUgVUlEIGZyb20gdGhlIGNhbGxpbmcgSVBDIHRocmVhZCBzdGF0ZSBiZWNhdXNlIGFsbAorICAgIC8vIGNsaWVudHMgdGhhdCBwZXJmb3JtIHJlY29yZGluZyBjcmVhdGUgQXVkaW9SZWNvcmQgaW4gdGhlaXIgb3duIHByb2Nlc3NlcworICAgIC8vIGFuZCB0aGUgc3lzdGVtIGRvZXMgbm90IGNyZWF0ZSBBdWRpb1JlY29yZCBvYmplY3RzIG9uIGJlaGFsZiBvZiBhcHBzLiBUaGlzCisgICAgLy8gZGlmZmVycyBmcm9tIHBsYXliYWNrIHdoZXJlIGluIHNvbWUgc2l0dWF0aW9ucyB0aGUgc3lzdGVtIHJlY3JlYXRlcyBBdWRpb1RyYWNrCisgICAgLy8gaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGNsaWVudCdzIE1lZGlhUGxheWVyIG9uIGJlaGFsZiBvZiB0aGlzIGNsaWVudC4KKyAgICAvLyBJbiB0aGUgbGF0dGVyIGNhc2Ugd2UgaGF2ZSB0byBzdG9yZSB0aGUgY2xpZW50IFVJRCBhbmQgcGFzcyBpbiBhbG9uZyBmb3IKKyAgICAvLyBzZWN1cml0eSBjaGVja3MuCisKICAgICBpZiAoZ2V0cGlkX2NhY2hlZCA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpIHJldHVybiB0cnVlOwogICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzUmVjb3JkQXVkaW8oImFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8iKTsKLSAgICAvLyBkb24ndCB1c2UgUGVybWlzc2lvbkNhY2hlOyB0aGlzIGlzIG5vdCBhIHN5c3RlbSBwZXJtaXNzaW9uCi0gICAgYm9vbCBvayA9IGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc1JlY29yZEF1ZGlvKTsKLSAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIik7Ci0gICAgcmV0dXJuIG9rOworCisgICAgLy8gSU1QT1JUQU5UOiBEb24ndCB1c2UgUGVybWlzc2lvbkNhY2hlIC0gYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBjaGFuZ2UuCisgICAgY29uc3QgYm9vbCBvayA9IGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc1JlY29yZEF1ZGlvKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IHVpZF90IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKworICAgIC8vIFRvIHBlcm1pdCBjb21tYW5kLWxpbmUgbmF0aXZlIHRlc3RzCisgICAgaWYgKHVpZCA9PSBBSURfUk9PVCkgcmV0dXJuIHRydWU7CisKKyAgICBTdHJpbmcxNiBjaGVja2VkT3BQYWNrYWdlTmFtZSA9IG9wUGFja2FnZU5hbWU7CisKKyAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSBjYWxsaW5nIGNvZGUgaGFzIG5vIGFjY2VzcyB0byB0aGUgcGFja2FnZSBpdCBydW5zIHVuZGVyLgorICAgIC8vIEZvciBleGFtcGxlLCBjb2RlIHVzaW5nIHRoZSB3aWxoZWxtIGZyYW1ld29yaydzIE9wZW5TTC1FUyBBUElzLiBJbiB0aGlzCisgICAgLy8gY2FzZSB3ZSB3aWxsIGdldCB0aGUgcGFja2FnZXMgZm9yIHRoZSBjYWxsaW5nIFVJRCBhbmQgcGljayB0aGUgZmlyc3Qgb25lCisgICAgLy8gZm9yIGF0dHJpYnV0aW5nIHRoZSBhcHAgb3AuIFRoaXMgd2lsbCB3b3JrIGNvcnJlY3RseSBmb3IgcnVudGltZSBwZXJtaXNzaW9ucworICAgIC8vIGFzIGZvciBsZWdhY3kgYXBwcyB3ZSB3aWxsIHRvZ2dsZSB0aGUgYXBwIG9wIGZvciBhbGwgcGFja2FnZXMgaW4gdGhlIFVJRC4KKyAgICAvLyBUaGUgY2F2ZWF0IGlzIHRoYXQgdGhlIG9wZXJhdGlvbiBtYXkgYmUgYXR0cmlidXRlZCB0byB0aGUgd3JvbmcgcGFja2FnZSBhbmQKKyAgICAvLyBzdGF0cyBiYXNlZCBvbiBhcHAgb3BzIG1heSBiZSBzbGlnaHRseSBvZmYuCisgICAgaWYgKGNoZWNrZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA8PSAwKSB7CisgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoInBlcm1pc3Npb24iKSk7CisgICAgICAgIGlmIChiaW5kZXIgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBnZXQgcGVybWlzc2lvbiBzZXJ2aWNlIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzcDxJUGVybWlzc2lvbkNvbnRyb2xsZXI+IHBlcm1DdHJsID0gaW50ZXJmYWNlX2Nhc3Q8SVBlcm1pc3Npb25Db250cm9sbGVyPihiaW5kZXIpOworICAgICAgICBWZWN0b3I8U3RyaW5nMTY+IHBhY2thZ2VzOworCisgICAgICAgIHBlcm1DdHJsLT5nZXRQYWNrYWdlc0ZvclVpZCh1aWQsIHBhY2thZ2VzKTsKKworICAgICAgICBpZiAocGFja2FnZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiTm8gcGFja2FnZXMgZm9yIGNhbGxpbmcgVUlEIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tlZE9wUGFja2FnZU5hbWUgPSBwYWNrYWdlc1swXTsKKyAgICB9CisKKyAgICBBcHBPcHNNYW5hZ2VyIGFwcE9wczsKKyAgICBpZiAoYXBwT3BzLm5vdGVPcChBcHBPcHNNYW5hZ2VyOjpPUF9SRUNPUkRfQVVESU8sIHVpZCwgY2hlY2tlZE9wUGFja2FnZU5hbWUpCisgICAgICAgICAgICAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKKyAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcCBPUF9SRUNPUkRfQVVESU8iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOwogfQogCiBib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQoKSB7CiAgICAgaWYgKGdldHBpZF9jYWNoZWQgPT0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKSByZXR1cm4gdHJ1ZTsKICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVBdWRpb091dHB1dCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7Ci0gICAgLy8gZG9uJ3QgdXNlIFBlcm1pc3Npb25DYWNoZTsgdGhpcyBpcyBub3QgYSBzeXN0ZW0gcGVybWlzc2lvbgotICAgIGJvb2wgb2sgPSBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYXB0dXJlQXVkaW9PdXRwdXQpOworICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQ2FwdHVyZUF1ZGlvT3V0cHV0KTsKICAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKICAgICByZXR1cm4gb2s7CiB9CiAKIGJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkgewogICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7Ci0gICAgYm9vbCBvayA9IGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCk7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYXB0dXJlSG90d29yZEFsbG93ZWQpOwogICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7CiAgICAgcmV0dXJuIG9rOwogfQogCi1ib29sIGNhcHR1cmVGbVR1bmVyQWxsb3dlZCgpIHsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVGbVR1bmVyQWxsb3dlZCgiYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19GTV9SQURJTyIpOwotICAgIGJvb2wgb2sgPSBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYXB0dXJlRm1UdW5lckFsbG93ZWQpOwotICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0ZNX1JBRElPIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCiBib29sIHNldHRpbmdzQWxsb3dlZCgpIHsKICAgICBpZiAoZ2V0cGlkX2NhY2hlZCA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpIHJldHVybiB0cnVlOwogICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQXVkaW9TZXR0aW5ncygiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpOwotICAgIC8vIGRvbid0IHVzZSBQZXJtaXNzaW9uQ2FjaGU7IHRoaXMgaXMgbm90IGEgc3lzdGVtIHBlcm1pc3Npb24KLSAgICBib29sIG9rID0gY2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQXVkaW9TZXR0aW5ncyk7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNBdWRpb1NldHRpbmdzKTsKICAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7CiAgICAgcmV0dXJuIG9rOwogfQogCiBib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSB7CiAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKLSAgICBib29sIG9rID0gY2hlY2tDYWxsaW5nUGVybWlzc2lvbihzTW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCk7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKTsKICAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7CiAgICAgcmV0dXJuIG9rOwogfQpAQCAtNzYsNyArMTM0LDcgQEAKIGJvb2wgZHVtcEFsbG93ZWQoKSB7CiAgICAgLy8gZG9uJ3Qgb3B0aW1pemUgZm9yIHNhbWUgcGlkLCBzaW5jZSBtZWRpYXNlcnZlciBuZXZlciBkdW1wcyBpdHNlbGYKICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0R1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7Ci0gICAgLy8gT0sgdG8gdXNlIFBlcm1pc3Npb25DYWNoZTsgdGhpcyBpcyBhIHN5c3RlbSBwZXJtaXNzaW9uCisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KICAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNEdW1wKTsKICAgICAvLyBjb252ZW50aW9uIGlzIGZvciBjYWxsZXIgdG8gZHVtcCBhbiBlcnJvciBtZXNzYWdlIHRvIGZkIGluc3RlYWQgb2YgbG9nZ2luZyBoZXJlCiAgICAgLy9pZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKaW5kZXggY2UxOGE5MC4uZmJhNmRjZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCkBAIC0yMCwxMiArMjAsMTAgQEAKIAogZXh0ZXJuIHBpZF90IGdldHBpZF9jYWNoZWQ7CiAKLWJvb2wgcmVjb3JkaW5nQWxsb3dlZCgpOworYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKTsKIGJvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZCgpOwogYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQoKTsKLWJvb2wgY2FwdHVyZUZtVHVuZXJBbGxvd2VkKCk7CiBib29sIHNldHRpbmdzQWxsb3dlZCgpOwogYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCk7CiBib29sIGR1bXBBbGxvd2VkKCk7Ci0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TcGRpZlN0cmVhbU91dC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3BkaWZTdHJlYW1PdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNGEwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3BkaWZTdHJlYW1PdXQuY3BwCkBAIC0wLDAgKzEsMTI4IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvRmxpbmdlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc3BkaWYvU1BESUZFbmNvZGVyLmg+CisKKyNpbmNsdWRlICJBdWRpb0h3RGV2aWNlLmgiCisjaW5jbHVkZSAiQXVkaW9TdHJlYW1PdXQuaCIKKyNpbmNsdWRlICJTcGRpZlN0cmVhbU91dC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogSWYgdGhlIEF1ZGlvRmxpbmdlciBpcyBwcm9jZXNzaW5nIGVuY29kZWQgZGF0YSBhbmQgdGhlIEhBTCBleHBlY3RzCisgKiBQQ00gdGhlbiB3ZSBuZWVkIHRvIHdyYXAgdGhlIGRhdGEgaW4gYW4gU1BESUYgd3JhcHBlci4KKyAqLworU3BkaWZTdHJlYW1PdXQ6OlNwZGlmU3RyZWFtT3V0KEF1ZGlvSHdEZXZpY2UgKmRldiwKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQorICAgICAgICAvLyBUZWxsIHRoZSBIQUwgdGhhdCB0aGUgZGF0YSB3aWxsIGJlIGNvbXByZXNzZWQgYXVkaW8gd3JhcHBlZCBpbiBhIGRhdGEgYnVyc3QuCisgICAgICAgIDogQXVkaW9TdHJlYW1PdXQoZGV2LCAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0lFQzk1OF9OT05BVURJTykpCisgICAgICAgICwgbVNwZGlmRW5jb2Rlcih0aGlzLCBmb3JtYXQpCisgICAgICAgICwgbUFwcGxpY2F0aW9uRm9ybWF0KEFVRElPX0ZPUk1BVF9ERUZBVUxUKQorICAgICAgICAsIG1BcHBsaWNhdGlvblNhbXBsZVJhdGUoMCkKKyAgICAgICAgLCBtQXBwbGljYXRpb25DaGFubmVsTWFzaygwKQoreworfQorCitzdGF0dXNfdCBTcGRpZlN0cmVhbU91dDo6b3BlbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcykKK3sKKyAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnIGN1c3RvbUNvbmZpZyA9ICpjb25maWc7CisKKyAgICBtQXBwbGljYXRpb25Gb3JtYXQgPSBjb25maWctPmZvcm1hdDsKKyAgICBtQXBwbGljYXRpb25TYW1wbGVSYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKKyAgICBtQXBwbGljYXRpb25DaGFubmVsTWFzayA9IGNvbmZpZy0+Y2hhbm5lbF9tYXNrOworCisgICAgLy8gU29tZSBkYXRhIGJ1cnN0cyBydW4gYXQgYSBoaWdoZXIgc2FtcGxlIHJhdGUuCisgICAgLy8gVE9ETyBNb3ZlIHRoaXMgaW50byB0aGUgYXVkaW9fdXRpbHMgYXMgYSBzdGF0aWMgbWV0aG9kLgorICAgIHN3aXRjaChjb25maWctPmZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9FX0FDMzoKKyAgICAgICAgICAgIG1SYXRlTXVsdGlwbGllciA9IDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfQUMzOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFM6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUU19IRDoKKyAgICAgICAgICAgIG1SYXRlTXVsdGlwbGllciA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJFUlJPUiBTcGRpZlN0cmVhbU91dDo6b3BlbigpIHVucmVjb2duaXplZCBmb3JtYXQgMHglMDhYXG4iLAorICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGN1c3RvbUNvbmZpZy5zYW1wbGVfcmF0ZSA9IGNvbmZpZy0+c2FtcGxlX3JhdGUgKiBtUmF0ZU11bHRpcGxpZXI7CisKKyAgICBjdXN0b21Db25maWcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgY3VzdG9tQ29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKworICAgIC8vIEFsd2F5cyBwcmludCB0aGlzIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IGNvdWxkIGJlIHZlcnkgY29uZnVzaW5nIGlmIHRoZQorICAgIC8vIEhBTCBhbmQgQXVkaW9GbGluZ2VyIGFyZSB1c2luZyBkaWZmZXJlbnQgZm9ybWF0cy4KKyAgICAvLyBQcmludCBiZWZvcmUgb3BlbigpIGJlY2F1c2UgSEFMIG1heSBtb2RpZnkgY3VzdG9tQ29uZmlnLgorICAgIEFMT0dJKCJTcGRpZlN0cmVhbU91dDo6b3BlbigpIEF1ZGlvRmxpbmdlciByZXF1ZXN0ZWQiCisgICAgICAgICAgICAiIHNhbXBsZVJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCIsCisgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsCisgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzayk7CisgICAgQUxPR0koIlNwZGlmU3RyZWFtT3V0OjpvcGVuKCkgSEFMIGNvbmZpZ3VyZWQgZm9yIgorICAgICAgICAgICAgIiBzYW1wbGVSYXRlICVkLCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3giLAorICAgICAgICAgICAgY3VzdG9tQ29uZmlnLnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgY3VzdG9tQ29uZmlnLmZvcm1hdCwKKyAgICAgICAgICAgIGN1c3RvbUNvbmZpZy5jaGFubmVsX21hc2spOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TdHJlYW1PdXQ6Om9wZW4oCisgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICBkZXZpY2VzLAorICAgICAgICAgICAgJmN1c3RvbUNvbmZpZywKKyAgICAgICAgICAgIGFkZHJlc3MpOworCisgICAgQUxPR0koIlNwZGlmU3RyZWFtT3V0OjpvcGVuKCkgc3RhdHVzID0gJWQiLCBzdGF0dXMpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworaW50IFNwZGlmU3RyZWFtT3V0OjpmbHVzaCgpCit7CisgICAgbVNwZGlmRW5jb2Rlci5yZXNldCgpOworICAgIHJldHVybiBBdWRpb1N0cmVhbU91dDo6Zmx1c2goKTsKK30KKworaW50IFNwZGlmU3RyZWFtT3V0OjpzdGFuZGJ5KCkKK3sKKyAgICBtU3BkaWZFbmNvZGVyLnJlc2V0KCk7CisgICAgcmV0dXJuIEF1ZGlvU3RyZWFtT3V0OjpzdGFuZGJ5KCk7Cit9CisKK3NzaXplX3QgU3BkaWZTdHJlYW1PdXQ6OndyaXRlRGF0YUJ1cnN0KGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ5dGVzKQoreworICAgIHJldHVybiBBdWRpb1N0cmVhbU91dDo6d3JpdGUoYnVmZmVyLCBieXRlcyk7Cit9CisKK3NzaXplX3QgU3BkaWZTdHJlYW1PdXQ6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IG51bUJ5dGVzKQoreworICAgIC8vIFdyaXRlIHRvIFNQRElGIHdyYXBwZXIuIEl0IHdpbGwgY2FsbCBiYWNrIHRvIHdyaXRlRGF0YUJ1cnN0KCkuCisgICAgcmV0dXJuIG1TcGRpZkVuY29kZXIud3JpdGUoYnVmZmVyLCBudW1CeXRlcyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TcGRpZlN0cmVhbU91dC5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NwZGlmU3RyZWFtT3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3MDI1MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TcGRpZlN0cmVhbU91dC5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfU1BESUZfU1RSRUFNX09VVF9ICisjZGVmaW5lIEFORFJPSURfU1BESUZfU1RSRUFNX09VVF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSAiQXVkaW9Id0RldmljZS5oIgorI2luY2x1ZGUgIkF1ZGlvU3RyZWFtT3V0LmgiCisjaW5jbHVkZSAiU3BkaWZTdHJlYW1PdXQuaCIKKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NwZGlmL1NQRElGRW5jb2Rlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogU3RyZWFtIHRoYXQgaXMgYSBQQ00gZGF0YSBidXJzdCBpbiB0aGUgSEFMIGJ1dCBsb29rcyBsaWtlIGFuIGVuY29kZWQgc3RyZWFtCisgKiB0byB0aGUgQXVkaW9GbGluZ2VyLiBXcmFwcyBlbmNvZGVkIGRhdGEgaW4gYW4gU1BESUYgd3JhcHBlciBwZXIgSUVDNjE5NzMtMy4KKyAqLworY2xhc3MgU3BkaWZTdHJlYW1PdXQgOiBwdWJsaWMgQXVkaW9TdHJlYW1PdXQgeworcHVibGljOgorCisgICAgU3BkaWZTdHJlYW1PdXQoQXVkaW9Id0RldmljZSAqZGV2LCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisKKyAgICB2aXJ0dWFsIH5TcGRpZlN0cmVhbU91dCgpIHsgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzKTsKKworICAgIC8qKgorICAgICogV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4gUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgb3IgYQorICAgICogbmVnYXRpdmUgc3RhdHVzX3QuIElmIGF0IGxlYXN0IG9uZSBmcmFtZSB3YXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkgcHJpb3IgdG8gdGhlIGVycm9yLAorICAgICogaXQgaXMgc3VnZ2VzdGVkIHRoYXQgdGhlIGRyaXZlciByZXR1cm4gdGhhdCBzdWNjZXNzZnVsIChzaG9ydCkgYnl0ZSBjb3VudAorICAgICogYW5kIHRoZW4gcmV0dXJuIGFuIGVycm9yIGluIHRoZSBzdWJzZXF1ZW50IGNhbGwuCisgICAgKgorICAgICogSWYgc2V0X2NhbGxiYWNrKCkgaGFzIHByZXZpb3VzbHkgYmVlbiBjYWxsZWQgdG8gZW5hYmxlIG5vbi1ibG9ja2luZyBtb2RlCisgICAgKiB0aGUgd3JpdGUoKSBpcyBub3QgYWxsb3dlZCB0byBibG9jay4gSXQgbXVzdCB3cml0ZSBvbmx5IHRoZSBudW1iZXIgb2YKKyAgICAqIGJ5dGVzIHRoYXQgY3VycmVudGx5IGZpdCBpbiB0aGUgZHJpdmVyL2hhcmR3YXJlIGJ1ZmZlciBhbmQgdGhlbiByZXR1cm4KKyAgICAqIHRoaXMgYnl0ZSBjb3VudC4gSWYgdGhpcyBpcyBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCB3cml0ZSBzaXplIHRoZQorICAgICogY2FsbGJhY2sgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiBtb3JlIHNwYWNlIGlzIGF2YWlsYWJsZSBpbiB0aGUKKyAgICAqIGRyaXZlci9oYXJkd2FyZSBidWZmZXIuCisgICAgKi8KKyAgICB2aXJ0dWFsIHNzaXplX3Qgd3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgYnl0ZXMpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBmcmFtZSBzaXplIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIEF1ZGlvRmxpbmdlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRGcmFtZVNpemUoKSBjb25zdCB7IHJldHVybiBzaXplb2YoaW50OF90KTsgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBmb3JtYXQgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgQXVkaW9GbGluZ2VyLgorICAgICAqLworICAgIHZpcnR1YWwgYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUFwcGxpY2F0aW9uRm9ybWF0OyB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgSEFMIG1heSBiZSBydW5uaW5nIGF0IGEgaGlnaGVyIHNhbXBsZSByYXRlIGlmLCBmb3IgZXhhbXBsZSwgcGxheWluZyB3cmFwcGVkIEVBQzMuCisgICAgICogQHJldHVybiBzYW1wbGUgcmF0ZSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBBdWRpb0ZsaW5nZXIuCisgICAgICovCisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbUFwcGxpY2F0aW9uU2FtcGxlUmF0ZTsgfQorCisgICAgLyoqCisgICAgICogVGhlIEhBTCBpcyBpbiBzdGVyZW8gbW9kZSB3aGVuIHBsYXlpbmcgbXVsdGktY2hhbm5lbCBjb21wcmVzc2VkIGF1ZGlvIG92ZXIgSERNSS4KKyAgICAgKiBAcmV0dXJuIGNoYW5uZWwgbWFzayBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBBdWRpb0ZsaW5nZXIuCisgICAgICovCisgICAgdmlydHVhbCBhdWRpb19jaGFubmVsX21hc2tfdCBnZXRDaGFubmVsTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1BcHBsaWNhdGlvbkNoYW5uZWxNYXNrOyB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7CisKK3ByaXZhdGU6CisKKyAgICBjbGFzcyBNeVNQRElGRW5jb2RlciA6IHB1YmxpYyBTUERJRkVuY29kZXIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBNeVNQRElGRW5jb2RlcihTcGRpZlN0cmVhbU91dCAqc3BkaWZTdHJlYW1PdXQsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKKyAgICAgICAgICA6ICBTUERJRkVuY29kZXIoZm9ybWF0KQorICAgICAgICAgICwgbVNwZGlmU3RyZWFtT3V0KHNwZGlmU3RyZWFtT3V0KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHNzaXplX3Qgd3JpdGVPdXRwdXQoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtU3BkaWZTdHJlYW1PdXQtPndyaXRlRGF0YUJ1cnN0KGJ1ZmZlciwgYnl0ZXMpOworICAgICAgICB9CisgICAgcHJvdGVjdGVkOgorICAgICAgICBTcGRpZlN0cmVhbU91dCAqIGNvbnN0IG1TcGRpZlN0cmVhbU91dDsKKyAgICB9OworCisgICAgTXlTUERJRkVuY29kZXIgICAgICAgbVNwZGlmRW5jb2RlcjsKKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICBtQXBwbGljYXRpb25Gb3JtYXQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgbUFwcGxpY2F0aW9uU2FtcGxlUmF0ZTsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQXBwbGljYXRpb25DaGFubmVsTWFzazsKKworICAgIHNzaXplX3QgIHdyaXRlRGF0YUJ1cnN0KGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBieXRlcyk7CisgICAgc3NpemVfdCAgd3JpdGVJbnRlcm5hbChjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBieXRlcyk7CisKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU1BESUZfU1RSRUFNX09VVF9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggOTY4YjBmOS4uMjQ2ZjZiYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtMjMsNyArMjMsOSBAQAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KQEAgLTU0LDYgKzU2LDcgQEAKIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgogI2luY2x1ZGUgIkF1ZGlvTWl4ZXIuaCIKKyNpbmNsdWRlICJCdWZmZXJQcm92aWRlcnMuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKICNpbmNsdWRlICJGYXN0Q2FwdHVyZS5oIgogI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKQEAgLTg0LDcgKzg3LDE3IEBACiAjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCisvLyBUT0RPOiBNb3ZlIHRoZXNlIG1hY3JvL2lubGluZXMgdG8gYSBoZWFkZXIgZmlsZS4KICNkZWZpbmUgbWF4KGEsIGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbmxpbmUgVCBtaW4oY29uc3QgVCYgYSwgY29uc3QgVCYgYikKK3sKKyAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKK30KKworI2lmbmRlZiBBUlJBWV9TSVpFCisjZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZihhKSAvIHNpemVvZihhWzBdKSkKKyNlbmRpZgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTExMiwxMCArMTI1LDE1IEBACiBzdGF0aWMgY29uc3QgdWludDMyX3Qga01heFRocmVhZFNsZWVwVGltZVNoaWZ0ID0gMjsKIAogLy8gbWluaW11bSBub3JtYWwgc2luayBidWZmZXIgc2l6ZSwgZXhwcmVzc2VkIGluIG1pbGxpc2Vjb25kcyByYXRoZXIgdGhhbiBmcmFtZXMKKy8vIEZJWE1FIFRoaXMgc2hvdWxkIGJlIGJhc2VkIG9uIGV4cGVyaW1lbnRhbGx5IG9ic2VydmVkIHNjaGVkdWxpbmcgaml0dGVyCiBzdGF0aWMgY29uc3QgdWludDMyX3Qga01pbk5vcm1hbFNpbmtCdWZmZXJTaXplTXMgPSAyMDsKIC8vIG1heGltdW0gbm9ybWFsIHNpbmsgYnVmZmVyIHNpemUKIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4Tm9ybWFsU2lua0J1ZmZlclNpemVNcyA9IDI0OwogCisvLyBtaW5pbXVtIGNhcHR1cmUgYnVmZmVyIHNpemUgaW4gbWlsbGlzZWNvbmRzIHRvIF9ub3RfIG5lZWQgYSBmYXN0IGNhcHR1cmUgdGhyZWFkCisvLyBGSVhNRSBUaGlzIHNob3VsZCBiZSBiYXNlZCBvbiBleHBlcmltZW50YWxseSBvYnNlcnZlZCBzY2hlZHVsaW5nIGppdHRlcgorc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNaW5Ob3JtYWxDYXB0dXJlQnVmZmVyU2l6ZU1zID0gMTI7CisKIC8vIE9mZmxvYWRlZCBvdXRwdXQgdGhyZWFkIHN0YW5kYnkgZGVsYXk6IGFsbG93cyB0cmFjayB0cmFuc2l0aW9uIHdpdGhvdXQgZ29pbmcgdG8gc3RhbmRieQogc3RhdGljIGNvbnN0IG5zZWNzX3Qga09mZmxvYWRTdGFuZGJ5RGVsYXlOcyA9IHNlY29uZHMoMSk7CiAKQEAgLTMxNCw4ICszMzIsMjAzIEBACiAvLyAgICAgIFRocmVhZEJhc2UKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorLy8gc3RhdGljCitjb25zdCBjaGFyICpBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnRocmVhZFR5cGVUb1N0cmluZyhBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnR5cGVfdCB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgTUlYRVI6CisgICAgICAgIHJldHVybiAiTUlYRVIiOworICAgIGNhc2UgRElSRUNUOgorICAgICAgICByZXR1cm4gIkRJUkVDVCI7CisgICAgY2FzZSBEVVBMSUNBVElORzoKKyAgICAgICAgcmV0dXJuICJEVVBMSUNBVElORyI7CisgICAgY2FzZSBSRUNPUkQ6CisgICAgICAgIHJldHVybiAiUkVDT1JEIjsKKyAgICBjYXNlIE9GRkxPQUQ6CisgICAgICAgIHJldHVybiAiT0ZGTE9BRCI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgICB9Cit9CisKK1N0cmluZzggZGV2aWNlc1RvU3RyaW5nKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQoreworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWFwcGluZyB7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlczsKKyAgICAgICAgY29uc3QgY2hhciAqICAgIG1TdHJpbmc7CisgICAgfSBtYXBwaW5nc091dFtdID0geworICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFLCAgICAgICAgICAiRUFSUElFQ0UiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIsICAgICAgICAgICAiU1BFQUtFUiIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCwgICAgICJXSVJFRF9IRUFEU0VUIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUsICAgIldJUkVEX0hFQURQSE9ORSIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTywgICAgICJCTFVFVE9PVEhfU0NPIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQsICAgICAiQkxVRVRPT1RIX1NDT19IRUFEU0VUIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCwgICAgICAiQkxVRVRPT1RIX1NDT19DQVJLSVQiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQLCAgICAgICAgICAgICJCTFVFVE9PVEhfQTJEUCIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUywgIkJMVUVUT09USF9BMkRQX0hFQURQSE9ORVMiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIsICAgICJCTFVFVE9PVEhfQTJEUF9TUEVBS0VSIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCwgICAgICAgIkFVWF9ESUdJVEFMIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRE1JLCAgICAgICAgICAgICAgIkhETUkiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VULCAiQU5MR19ET0NLX0hFQURTRVQiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VULCAiREdUTF9ET0NLX0hFQURTRVQiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlksICAgICAiVVNCX0FDQ0VTU09SWSIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRSwgICAgICAgICJVU0JfREVWSUNFIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsICAgICAgIlRFTEVQSE9OWV9UWCIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfTElORSwgICAgICAgICAgICAgICJMSU5FIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQywgICAgICAgICAgIkhETUlfQVJDIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9TUERJRiwgICAgICAgICAgICAgIlNQRElGIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9GTSwgICAgICAgICAgICAgICAgIkZNIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9BVVhfTElORSwgICAgICAgICAgIkFVWF9MSU5FIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUsICAgICAgIlNQRUFLRVJfU0FGRSIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSVAsICAgICAgICAgICAgICAgICJJUCIsCisgICAgICAgIEFVRElPX0RFVklDRV9OT05FLCAgICAgICAgICAgICAgICAgICJOT05FIiwgICAgICAgICAvLyBtdXN0IGJlIGxhc3QKKyAgICB9LCBtYXBwaW5nc0luW10gPSB7CisgICAgICAgIEFVRElPX0RFVklDRV9JTl9DT01NVU5JQ0FUSU9OLCAgICAgICJDT01NVU5JQ0FUSU9OIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX0FNQklFTlQsICAgICAgICAgICAgIkFNQklFTlQiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMsICAgICAgICAiQlVJTFRJTl9NSUMiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VULCAgIkJMVUVUT09USF9TQ09fSEVBRFNFVCIsCisgICAgICAgIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULCAgICAgICJXSVJFRF9IRUFEU0VUIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX0FVWF9ESUdJVEFMLCAgICAgICAgIkFVWF9ESUdJVEFMIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwsICAgICAgICAgIlZPSUNFX0NBTEwiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYLCAgICAgICAiVEVMRVBIT05ZX1JYIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDLCAgICAgICAgICAgIkJBQ0tfTUlDIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsICAgICAgIlJFTU9URV9TVUJNSVgiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fQU5MR19ET0NLX0hFQURTRVQsICAiQU5MR19ET0NLX0hFQURTRVQiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fREdUTF9ET0NLX0hFQURTRVQsICAiREdUTF9ET0NLX0hFQURTRVQiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fVVNCX0FDQ0VTU09SWSwgICAgICAiVVNCX0FDQ0VTU09SWSIsCisgICAgICAgIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFLCAgICAgICAgICJVU0JfREVWSUNFIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSLCAgICAgICAgICAgIkZNX1RVTkVSIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX1RWX1RVTkVSLCAgICAgICAgICAgIlRWX1RVTkVSIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX0xJTkUsICAgICAgICAgICAgICAgIkxJTkUiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fU1BESUYsICAgICAgICAgICAgICAiU1BESUYiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFAsICAgICAiQkxVRVRPT1RIX0EyRFAiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fTE9PUEJBQ0ssICAgICAgICAgICAiTE9PUEJBQ0siLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fSVAsICAgICAgICAgICAgICAgICAiSVAiLAorICAgICAgICBBVURJT19ERVZJQ0VfTk9ORSwgICAgICAgICAgICAgICAgICAiTk9ORSIsICAgICAgICAgLy8gbXVzdCBiZSBsYXN0CisgICAgfTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBhdWRpb19kZXZpY2VzX3QgYWxsRGV2aWNlcyA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGNvbnN0IG1hcHBpbmcgKmVudHJ5OworICAgIGlmIChkZXZpY2VzICYgQVVESU9fREVWSUNFX0JJVF9JTikgeworICAgICAgICBkZXZpY2VzICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgICAgICBlbnRyeSA9IG1hcHBpbmdzSW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW50cnkgPSBtYXBwaW5nc091dDsKKyAgICB9CisgICAgZm9yICggOyBlbnRyeS0+bURldmljZXMgIT0gQVVESU9fREVWSUNFX05PTkU7IGVudHJ5KyspIHsKKyAgICAgICAgYWxsRGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpIChhbGxEZXZpY2VzIHwgZW50cnktPm1EZXZpY2VzKTsKKyAgICAgICAgaWYgKGRldmljZXMgJiBlbnRyeS0+bURldmljZXMpIHsKKyAgICAgICAgICAgIGlmICghcmVzdWx0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZW50cnktPm1TdHJpbmcpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChkZXZpY2VzICYgfmFsbERldmljZXMpIHsKKyAgICAgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJ8Iik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiMHglWCIsIGRldmljZXMgJiB+YWxsRGV2aWNlcyk7CisgICAgfQorICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoZW50cnktPm1TdHJpbmcpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitTdHJpbmc4IGlucHV0RmxhZ3NUb1N0cmluZyhhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQoreworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWFwcGluZyB7CisgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgICAgIG1GbGFnOworICAgICAgICBjb25zdCBjaGFyICogICAgICAgICAgICBtU3RyaW5nOworICAgIH0gbWFwcGluZ3NbXSA9IHsKKyAgICAgICAgQVVESU9fSU5QVVRfRkxBR19GQVNULCAgICAgICAgICAgICAgIkZBU1QiLAorICAgICAgICBBVURJT19JTlBVVF9GTEFHX0hXX0hPVFdPUkQsICAgICAgICAiSFdfSE9UV09SRCIsCisgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwgICAgICAgICAgICAgICJOT05FIiwgICAgICAgICAvLyBtdXN0IGJlIGxhc3QKKyAgICB9OworICAgIFN0cmluZzggcmVzdWx0OworICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgYWxsRmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkU7CisgICAgY29uc3QgbWFwcGluZyAqZW50cnk7CisgICAgZm9yIChlbnRyeSA9IG1hcHBpbmdzOyBlbnRyeS0+bUZsYWcgIT0gQVVESU9fSU5QVVRfRkxBR19OT05FOyBlbnRyeSsrKSB7CisgICAgICAgIGFsbEZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChhbGxGbGFncyB8IGVudHJ5LT5tRmxhZyk7CisgICAgICAgIGlmIChmbGFncyAmIGVudHJ5LT5tRmxhZykgeworICAgICAgICAgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChlbnRyeS0+bVN0cmluZyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZsYWdzICYgfmFsbEZsYWdzKSB7CisgICAgICAgIGlmICghcmVzdWx0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgifCIpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIjB4JVgiLCBmbGFncyAmIH5hbGxGbGFncyk7CisgICAgfQorICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoZW50cnktPm1TdHJpbmcpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitTdHJpbmc4IG91dHB1dEZsYWdzVG9TdHJpbmcoYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBtYXBwaW5nIHsKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgICAgbUZsYWc7CisgICAgICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgIG1TdHJpbmc7CisgICAgfSBtYXBwaW5nc1tdID0geworICAgICAgICBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QsICAgICAgICAgICAiRElSRUNUIiwKKyAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSwgICAgICAgICAgIlBSSU1BUlkiLAorICAgICAgICBBVURJT19PVVRQVVRfRkxBR19GQVNULCAgICAgICAgICAgICAiRkFTVCIsCisgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSLCAgICAgICJERUVQX0JVRkZFUiIsCisgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQsICJDT01QUkVTU19PRkZMT0FEIiwKKyAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HLCAgICAgIk5PTl9CTE9DS0lORyIsCisgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMsICAgICAgICJIV19BVl9TWU5DIiwKKyAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgICAgICAgICAgICAgIk5PTkUiLCAgICAgICAgIC8vIG11c3QgYmUgbGFzdAorICAgIH07CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgYWxsRmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIGNvbnN0IG1hcHBpbmcgKmVudHJ5OworICAgIGZvciAoZW50cnkgPSBtYXBwaW5nczsgZW50cnktPm1GbGFnICE9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7IGVudHJ5KyspIHsKKyAgICAgICAgYWxsRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChhbGxGbGFncyB8IGVudHJ5LT5tRmxhZyk7CisgICAgICAgIGlmIChmbGFncyAmIGVudHJ5LT5tRmxhZykgeworICAgICAgICAgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChlbnRyeS0+bVN0cmluZyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZsYWdzICYgfmFsbEZsYWdzKSB7CisgICAgICAgIGlmICghcmVzdWx0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgifCIpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIjB4JVgiLCBmbGFncyAmIH5hbGxGbGFncyk7CisgICAgfQorICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoZW50cnktPm1TdHJpbmcpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitjb25zdCBjaGFyICpzb3VyY2VUb1N0cmluZyhhdWRpb19zb3VyY2VfdCBzb3VyY2UpCit7CisgICAgc3dpdGNoIChzb3VyY2UpIHsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9ERUZBVUxUOiAgICAgICAgICAgICAgcmV0dXJuICJkZWZhdWx0IjsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9NSUM6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJtaWMiOworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSzogICAgICAgICByZXR1cm4gInZvaWNlIHVwbGluayI7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6ICAgICAgIHJldHVybiAidm9pY2UgZG93bmxpbmsiOworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NBTEw6ICAgICAgICAgICByZXR1cm4gInZvaWNlIGNhbGwiOworICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjogICAgICAgICAgICByZXR1cm4gImNhbWNvcmRlciI7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT046ICAgIHJldHVybiAidm9pY2UgcmVjb2duaXRpb24iOworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046ICByZXR1cm4gInZvaWNlIGNvbW11bmljYXRpb24iOworICAgIGNhc2UgQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVg6ICAgICAgICByZXR1cm4gInJlbW90ZSBzdWJtaXgiOworICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOiAgICAgICAgICAgICByZXR1cm4gIkZNIHR1bmVyIjsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOiAgICAgICAgICAgICAgcmV0dXJuICJob3R3b3JkIjsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgICB9Cit9CisKIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VGhyZWFkQmFzZShjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAotICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLCBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsIHR5cGVfdCB0eXBlKQorICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLCBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsIHR5cGVfdCB0eXBlLCBib29sIHN5c3RlbVJlYWR5KQogICAgIDogICBUaHJlYWQoZmFsc2UgLypjYW5DYWxsSmF2YSovKSwKICAgICAgICAgbVR5cGUodHlwZSksCiAgICAgICAgIG1BdWRpb0ZsaW5nZXIoYXVkaW9GbGluZ2VyKSwKQEAgLTMyNCwxMCArNTM3LDEzIEBACiAgICAgICAgIC8vIFJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVyc19sKCkKICAgICAgICAgLy9GSVhNRTogbVN0YW5kYnkgc2hvdWxkIGJlIHRydWUgaGVyZS4gSXMgdGhpcyBzb21lIGtpbmQgb2YgaGFjaz8KICAgICAgICAgbVN0YW5kYnkoZmFsc2UpLCBtT3V0RGV2aWNlKG91dERldmljZSksIG1JbkRldmljZShpbkRldmljZSksCisgICAgICAgIG1QcmV2T3V0RGV2aWNlKEFVRElPX0RFVklDRV9OT05FKSwgbVByZXZJbkRldmljZShBVURJT19ERVZJQ0VfTk9ORSksCiAgICAgICAgIG1BdWRpb1NvdXJjZShBVURJT19TT1VSQ0VfREVGQVVMVCksIG1JZChpZCksCiAgICAgICAgIC8vIG1OYW1lIHdpbGwgYmUgc2V0IGJ5IGNvbmNyZXRlIChub24tdmlydHVhbCkgc3ViY2xhc3MKLSAgICAgICAgbURlYXRoUmVjaXBpZW50KG5ldyBQTURlYXRoUmVjaXBpZW50KHRoaXMpKQorICAgICAgICBtRGVhdGhSZWNpcGllbnQobmV3IFBNRGVhdGhSZWNpcGllbnQodGhpcykpLAorICAgICAgICBtU3lzdGVtUmVhZHkoc3lzdGVtUmVhZHkpCiB7CisgICAgbWVtc2V0KCZtUGF0Y2gsIDAsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKIH0KIAogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjp+VGhyZWFkQmFzZSgpCkBAIC0zOTQsNiArNjEwLDExIEBACiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAKKyAgICBpZiAoZXZlbnQtPm1SZXF1aXJlc1N5c3RlbVJlYWR5ICYmICFtU3lzdGVtUmVhZHkpIHsKKyAgICAgICAgZXZlbnQtPm1XYWl0U3RhdHVzID0gZmFsc2U7CisgICAgICAgIG1QZW5kaW5nQ29uZmlnRXZlbnRzLmFkZChldmVudCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQogICAgIG1Db25maWdFdmVudHMuYWRkKGV2ZW50KTsKICAgICBBTE9HVigic2VuZENvbmZpZ0V2ZW50X2woKSBudW0gZXZlbnRzICVkIGV2ZW50ICVkIiwgbUNvbmZpZ0V2ZW50cy5zaXplKCksIGV2ZW50LT5tVHlwZSk7CiAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CkBAIC00MTIsMTkgKzYzMywyNSBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudChpbnQgZXZlbnQsIGludCBwYXJhbSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woZXZlbnQsIHBhcmFtKTsKKyAgICBzZW5kSW9Db25maWdFdmVudF9sKGV2ZW50LCBwaWQpOwogfQogCiAvLyBzZW5kSW9Db25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi12b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZElvQ29uZmlnRXZlbnRfbChpbnQgZXZlbnQsIGludCBwYXJhbSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudF9sKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKQogewotICAgIHNwPENvbmZpZ0V2ZW50PiBjb25maWdFdmVudCA9IChDb25maWdFdmVudCAqKW5ldyBJb0NvbmZpZ0V2ZW50KGV2ZW50LCBwYXJhbSk7CisgICAgc3A8Q29uZmlnRXZlbnQ+IGNvbmZpZ0V2ZW50ID0gKENvbmZpZ0V2ZW50ICopbmV3IElvQ29uZmlnRXZlbnQoZXZlbnQsIHBpZCk7CiAgICAgc2VuZENvbmZpZ0V2ZW50X2woY29uZmlnRXZlbnQpOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZFByaW9Db25maWdFdmVudChwaWRfdCBwaWQsIHBpZF90IHRpZCwgaW50MzJfdCBwcmlvKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc2VuZFByaW9Db25maWdFdmVudF9sKHBpZCwgdGlkLCBwcmlvKTsKK30KKwogLy8gc2VuZFByaW9Db25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZFByaW9Db25maWdFdmVudF9sKHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8pCiB7CkBAIC00ODUsNyArNzEyLDcgQEAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBDRkdfRVZFTlRfSU86IHsKICAgICAgICAgICAgIElvQ29uZmlnRXZlbnREYXRhICpkYXRhID0gKElvQ29uZmlnRXZlbnREYXRhICopZXZlbnQtPm1EYXRhLmdldCgpOwotICAgICAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKGRhdGEtPm1FdmVudCwgZGF0YS0+bVBhcmFtKTsKKyAgICAgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChkYXRhLT5tRXZlbnQsIGRhdGEtPm1QaWQpOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIENGR19FVkVOVF9TRVRfUEFSQU1FVEVSOiB7CiAgICAgICAgICAgICBTZXRQYXJhbWV0ZXJDb25maWdFdmVudERhdGEgKmRhdGEgPSAoU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnREYXRhICopZXZlbnQtPm1EYXRhLmdldCgpOwpAQCAtNTI0LDQ5ICs3NTEsNjMgQEAKIAogU3RyaW5nOCBjaGFubmVsTWFza1RvU3RyaW5nKGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2ssIGJvb2wgb3V0cHV0KSB7CiAgICAgU3RyaW5nOCBzOwotICAgIGlmIChvdXRwdXQpIHsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUKSBzLmFwcGVuZCgiZnJvbnQtbGVmdCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQpIHMuYXBwZW5kKCJmcm9udC1yaWdodCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKSBzLmFwcGVuZCgiZnJvbnQtY2VudGVyLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKSBzLmFwcGVuZCgibG93IGZyZXEsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfTEVGVCkgcy5hcHBlbmQoImJhY2stbGVmdCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCkgcy5hcHBlbmQoImJhY2stcmlnaHQsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlRfT0ZfQ0VOVEVSKSBzLmFwcGVuZCgiZnJvbnQtbGVmdC1vZi1jZW50ZXIsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUX09GX0NFTlRFUikgcy5hcHBlbmQoImZyb250LXJpZ2h0LW9mLWNlbnRlciwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpIHMuYXBwZW5kKCJiYWNrLWNlbnRlciwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9MRUZUKSBzLmFwcGVuZCgic2lkZS1sZWZ0LCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9TSURFX1JJR0hUKSBzLmFwcGVuZCgic2lkZS1yaWdodCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0NFTlRFUikgcy5hcHBlbmQoInRvcC1jZW50ZXIgLCIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9MRUZUKSBzLmFwcGVuZCgidG9wLWZyb250LWxlZnQsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9DRU5URVIpIHMuYXBwZW5kKCJ0b3AtZnJvbnQtY2VudGVyLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfUklHSFQpIHMuYXBwZW5kKCJ0b3AtZnJvbnQtcmlnaHQsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0xFRlQpIHMuYXBwZW5kKCJ0b3AtYmFjay1sZWZ0LCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIpIHMuYXBwZW5kKCJ0b3AtYmFjay1jZW50ZXIsICIgKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19SSUdIVCkgcy5hcHBlbmQoInRvcC1iYWNrLXJpZ2h0LCAiICk7Ci0gICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfT1VUX0FMTCkgcy5hcHBlbmQoInVua25vd24sICAiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fTEVGVCkgcy5hcHBlbmQoImxlZnQsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fUklHSFQpIHMuYXBwZW5kKCJyaWdodCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9GUk9OVCkgcy5hcHBlbmQoImZyb250LCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0JBQ0spIHMuYXBwZW5kKCJiYWNrLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0xFRlRfUFJPQ0VTU0VEKSBzLmFwcGVuZCgibGVmdC1wcm9jZXNzZWQsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fUklHSFRfUFJPQ0VTU0VEKSBzLmFwcGVuZCgicmlnaHQtcHJvY2Vzc2VkLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0ZST05UX1BST0NFU1NFRCkgcy5hcHBlbmQoImZyb250LXByb2Nlc3NlZCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9CQUNLX1BST0NFU1NFRCkgcy5hcHBlbmQoImJhY2stcHJvY2Vzc2VkLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1BSRVNTVVJFKSBzLmFwcGVuZCgicHJlc3N1cmUsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWF9BWElTKSBzLmFwcGVuZCgiWCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9ZX0FYSVMpIHMuYXBwZW5kKCJZLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1pfQVhJUykgcy5hcHBlbmQoIlosICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LKSBzLmFwcGVuZCgidm9pY2UtdXBsaW5rLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSykgcy5hcHBlbmQoInZvaWNlLWRubGluaywgIik7Ci0gICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfSU5fQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOworICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfcmVwcmVzZW50YXRpb25fdCByZXByZXNlbnRhdGlvbiA9CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKG1hc2spOworCisgICAgc3dpdGNoIChyZXByZXNlbnRhdGlvbikgeworICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTjogeworICAgICAgICBpZiAob3V0cHV0KSB7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQpIHMuYXBwZW5kKCJmcm9udC1sZWZ0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQpIHMuYXBwZW5kKCJmcm9udC1yaWdodCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUikgcy5hcHBlbmQoImZyb250LWNlbnRlciwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpIHMuYXBwZW5kKCJsb3cgZnJlcSwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfTEVGVCkgcy5hcHBlbmQoImJhY2stbGVmdCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfUklHSFQpIHMuYXBwZW5kKCJiYWNrLXJpZ2h0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVF9PRl9DRU5URVIpIHMuYXBwZW5kKCJmcm9udC1sZWZ0LW9mLWNlbnRlciwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUX09GX0NFTlRFUikgcy5hcHBlbmQoImZyb250LXJpZ2h0LW9mLWNlbnRlciwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKSBzLmFwcGVuZCgiYmFjay1jZW50ZXIsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9TSURFX0xFRlQpIHMuYXBwZW5kKCJzaWRlLWxlZnQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9TSURFX1JJR0hUKSBzLmFwcGVuZCgic2lkZS1yaWdodCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9DRU5URVIpIHMuYXBwZW5kKCJ0b3AtY2VudGVyICwiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX0xFRlQpIHMuYXBwZW5kKCJ0b3AtZnJvbnQtbGVmdCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9DRU5URVIpIHMuYXBwZW5kKCJ0b3AtZnJvbnQtY2VudGVyLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX1JJR0hUKSBzLmFwcGVuZCgidG9wLWZyb250LXJpZ2h0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfTEVGVCkgcy5hcHBlbmQoInRvcC1iYWNrLWxlZnQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIpIHMuYXBwZW5kKCJ0b3AtYmFjay1jZW50ZXIsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfUklHSFQpIHMuYXBwZW5kKCJ0b3AtYmFjay1yaWdodCwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiB+QVVESU9fQ0hBTk5FTF9PVVRfQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0xFRlQpIHMuYXBwZW5kKCJsZWZ0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9SSUdIVCkgcy5hcHBlbmQoInJpZ2h0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9GUk9OVCkgcy5hcHBlbmQoImZyb250LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9CQUNLKSBzLmFwcGVuZCgiYmFjaywgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fTEVGVF9QUk9DRVNTRUQpIHMuYXBwZW5kKCJsZWZ0LXByb2Nlc3NlZCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fUklHSFRfUFJPQ0VTU0VEKSBzLmFwcGVuZCgicmlnaHQtcHJvY2Vzc2VkLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9QUk9DRVNTRUQpIHMuYXBwZW5kKCJmcm9udC1wcm9jZXNzZWQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0JBQ0tfUFJPQ0VTU0VEKSBzLmFwcGVuZCgiYmFjay1wcm9jZXNzZWQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1BSRVNTVVJFKSBzLmFwcGVuZCgicHJlc3N1cmUsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1hfQVhJUykgcy5hcHBlbmQoIlgsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1lfQVhJUykgcy5hcHBlbmQoIlksICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1pfQVhJUykgcy5hcHBlbmQoIlosICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOSykgcy5hcHBlbmQoInZvaWNlLXVwbGluaywgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LKSBzLmFwcGVuZCgidm9pY2UtZG5saW5rLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfSU5fQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGludCBsZW4gPSBzLmxlbmd0aCgpOworICAgICAgICBpZiAobGVuID4gMikgeworICAgICAgICAgICAgY2hhciAqc3RyID0gcy5sb2NrQnVmZmVyKGxlbik7IC8vIG5lZWRlZD8KKyAgICAgICAgICAgIHMudW5sb2NrQnVmZmVyKGxlbiAtIDIpOyAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgIiwgIgorICAgICAgICB9CisgICAgICAgIHJldHVybiBzOwogICAgIH0KLSAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKLSAgICBpZiAocy5sZW5ndGgoKSA+IDIpIHsKLSAgICAgICAgY2hhciAqc3RyID0gcy5sb2NrQnVmZmVyKGxlbik7Ci0gICAgICAgIHMudW5sb2NrQnVmZmVyKGxlbiAtIDIpOworICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWDoKKyAgICAgICAgcy5hcHBlbmRGb3JtYXQoImluZGV4IG1hc2ssIGJpdHM6JSN4IiwgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKG1hc2spKTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcy5hcHBlbmRGb3JtYXQoInVua25vd24gbWFzaywgcmVwcmVzZW50YXRpb246JWQgIGJpdHM6JSN4IiwKKyAgICAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiwgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKG1hc2spKTsKKyAgICAgICAgcmV0dXJuIHM7CiAgICAgfQotICAgIHJldHVybiBzOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6ZHVtcEJhc2UoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQpAQCAtNTc3LDIwICs4MTgsMjIgQEAKIAogICAgIGJvb2wgbG9ja2VkID0gQXVkaW9GbGluZ2VyOjpkdW1wVHJ5TG9jayhtTG9jayk7CiAgICAgaWYgKCFsb2NrZWQpIHsKLSAgICAgICAgZHByaW50ZihmZCwgInRocmVhZCAlcCBtYXliZSBkZWFkIGxvY2tlZFxuIiwgdGhpcyk7CisgICAgICAgIGRwcmludGYoZmQsICJ0aHJlYWQgJXAgbWF5IGJlIGRlYWRsb2NrZWRcbiIsIHRoaXMpOwogICAgIH0KIAorICAgIGRwcmludGYoZmQsICIgIFRocmVhZCBuYW1lOiAlc1xuIiwgbVRocmVhZE5hbWUpOwogICAgIGRwcmludGYoZmQsICIgIEkvTyBoYW5kbGU6ICVkXG4iLCBtSWQpOwogICAgIGRwcmludGYoZmQsICIgIFRJRDogJWRcbiIsIGdldFRpZCgpKTsKICAgICBkcHJpbnRmKGZkLCAiICBTdGFuZGJ5OiAlc1xuIiwgbVN0YW5kYnkgPyAieWVzIiA6ICJubyIpOwotICAgIGRwcmludGYoZmQsICIgIFNhbXBsZSByYXRlOiAldVxuIiwgbVNhbXBsZVJhdGUpOworICAgIGRwcmludGYoZmQsICIgIFNhbXBsZSByYXRlOiAldSBIelxuIiwgbVNhbXBsZVJhdGUpOwogICAgIGRwcmludGYoZmQsICIgIEhBTCBmcmFtZSBjb3VudDogJXp1XG4iLCBtRnJhbWVDb3VudCk7CisgICAgZHByaW50ZihmZCwgIiAgSEFMIGZvcm1hdDogMHgleCAoJXMpXG4iLCBtSEFMRm9ybWF0LCBmb3JtYXRUb1N0cmluZyhtSEFMRm9ybWF0KSk7CiAgICAgZHByaW50ZihmZCwgIiAgSEFMIGJ1ZmZlciBzaXplOiAldSBieXRlc1xuIiwgbUJ1ZmZlclNpemUpOwotICAgIGRwcmludGYoZmQsICIgIENoYW5uZWwgQ291bnQ6ICV1XG4iLCBtQ2hhbm5lbENvdW50KTsKLSAgICBkcHJpbnRmKGZkLCAiICBDaGFubmVsIE1hc2s6IDB4JTA4eCAoJXMpXG4iLCBtQ2hhbm5lbE1hc2ssCisgICAgZHByaW50ZihmZCwgIiAgQ2hhbm5lbCBjb3VudDogJXVcbiIsIG1DaGFubmVsQ291bnQpOworICAgIGRwcmludGYoZmQsICIgIENoYW5uZWwgbWFzazogMHglMDh4ICglcylcbiIsIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgIGNoYW5uZWxNYXNrVG9TdHJpbmcobUNoYW5uZWxNYXNrLCBtVHlwZSAhPSBSRUNPUkQpLnN0cmluZygpKTsKLSAgICBkcHJpbnRmKGZkLCAiICBGb3JtYXQ6IDB4JXggKCVzKVxuIiwgbUhBTEZvcm1hdCwgZm9ybWF0VG9TdHJpbmcobUhBTEZvcm1hdCkpOwotICAgIGRwcmludGYoZmQsICIgIEZyYW1lIHNpemU6ICV6dVxuIiwgbUZyYW1lU2l6ZSk7CisgICAgZHByaW50ZihmZCwgIiAgRm9ybWF0OiAweCV4ICglcylcbiIsIG1Gb3JtYXQsIGZvcm1hdFRvU3RyaW5nKG1Gb3JtYXQpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBGcmFtZSBzaXplOiAlenUgYnl0ZXNcbiIsIG1GcmFtZVNpemUpOwogICAgIGRwcmludGYoZmQsICIgIFBlbmRpbmcgY29uZmlnIGV2ZW50czoiKTsKICAgICBzaXplX3QgbnVtQ29uZmlnID0gbUNvbmZpZ0V2ZW50cy5zaXplKCk7CiAgICAgaWYgKG51bUNvbmZpZykgewpAQCAtNjAyLDYgKzg0NSw5IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgZHByaW50ZihmZCwgIiBub25lXG4iKTsKICAgICB9CisgICAgZHByaW50ZihmZCwgIiAgT3V0cHV0IGRldmljZTogJSN4ICglcylcbiIsIG1PdXREZXZpY2UsIGRldmljZXNUb1N0cmluZyhtT3V0RGV2aWNlKS5zdHJpbmcoKSk7CisgICAgZHByaW50ZihmZCwgIiAgSW5wdXQgZGV2aWNlOiAlI3ggKCVzKVxuIiwgbUluRGV2aWNlLCBkZXZpY2VzVG9TdHJpbmcobUluRGV2aWNlKS5zdHJpbmcoKSk7CisgICAgZHByaW50ZihmZCwgIiAgQXVkaW8gc291cmNlOiAlZCAoJXMpXG4iLCBtQXVkaW9Tb3VyY2UsIHNvdXJjZVRvU3RyaW5nKG1BdWRpb1NvdXJjZSkpOwogCiAgICAgaWYgKGxvY2tlZCkgewogICAgICAgICBtTG9jay51bmxvY2soKTsKQEAgLTYzNSwxOSArODgxLDE5IEBACiBTdHJpbmcxNiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmdldFdha2VMb2NrVGFnKCkKIHsKICAgICBzd2l0Y2ggKG1UeXBlKSB7Ci0gICAgICAgIGNhc2UgTUlYRVI6Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nMTYoIkF1ZGlvTWl4Iik7Ci0gICAgICAgIGNhc2UgRElSRUNUOgotICAgICAgICAgICAgcmV0dXJuIFN0cmluZzE2KCJBdWRpb0RpcmVjdE91dCIpOwotICAgICAgICBjYXNlIERVUExJQ0FUSU5HOgotICAgICAgICAgICAgcmV0dXJuIFN0cmluZzE2KCJBdWRpb0R1cCIpOwotICAgICAgICBjYXNlIFJFQ09SRDoKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcxNigiQXVkaW9JbiIpOwotICAgICAgICBjYXNlIE9GRkxPQUQ6Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nMTYoIkF1ZGlvT2ZmbG9hZCIpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuIFN0cmluZzE2KCJBdWRpb1Vua25vd24iKTsKKyAgICBjYXNlIE1JWEVSOgorICAgICAgICByZXR1cm4gU3RyaW5nMTYoIkF1ZGlvTWl4Iik7CisgICAgY2FzZSBESVJFQ1Q6CisgICAgICAgIHJldHVybiBTdHJpbmcxNigiQXVkaW9EaXJlY3RPdXQiKTsKKyAgICBjYXNlIERVUExJQ0FUSU5HOgorICAgICAgICByZXR1cm4gU3RyaW5nMTYoIkF1ZGlvRHVwIik7CisgICAgY2FzZSBSRUNPUkQ6CisgICAgICAgIHJldHVybiBTdHJpbmcxNigiQXVkaW9JbiIpOworICAgIGNhc2UgT0ZGTE9BRDoKKyAgICAgICAgcmV0dXJuIFN0cmluZzE2KCJBdWRpb09mZmxvYWQiKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSk7CisgICAgICAgIHJldHVybiBTdHJpbmcxNigiQXVkaW9Vbmtub3duIik7CiAgICAgfQogfQogCkBAIC02NzQsNyArOTIwLDcgQEAKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgbVdha2VMb2NrVG9rZW4gPSBiaW5kZXI7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoImFjcXVpcmVXYWtlTG9ja19sKCkgJXMgc3RhdHVzICVkIiwgbU5hbWUsIHN0YXR1cyk7CisgICAgICAgIEFMT0dWKCJhY3F1aXJlV2FrZUxvY2tfbCgpICVzIHN0YXR1cyAlZCIsIG1UaHJlYWROYW1lLCBzdGF0dXMpOwogICAgIH0KIH0KIApAQCAtNjg3LDcgKzkzMyw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6cmVsZWFzZVdha2VMb2NrX2woKQogewogICAgIGlmIChtV2FrZUxvY2tUb2tlbiAhPSAwKSB7Ci0gICAgICAgIEFMT0dWKCJyZWxlYXNlV2FrZUxvY2tfbCgpICVzIiwgbU5hbWUpOworICAgICAgICBBTE9HVigicmVsZWFzZVdha2VMb2NrX2woKSAlcyIsIG1UaHJlYWROYW1lKTsKICAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gMCkgewogICAgICAgICAgICAgbVBvd2VyTWFuYWdlci0+cmVsZWFzZVdha2VMb2NrKG1XYWtlTG9ja1Rva2VuLCAwLAogICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIEZJWE1FIGZvcmNlIG9uZXdheSBjb250cmFyeSB0byAuYWlkbCAqLyk7CkBAIC03MDIsMTMgKzk0OCwxMiBAQAogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6Z2V0UG93ZXJNYW5hZ2VyX2woKSB7Ci0KLSAgICBpZiAobVBvd2VyTWFuYWdlciA9PSAwKSB7CisgICAgaWYgKG1TeXN0ZW1SZWFkeSAmJiBtUG93ZXJNYW5hZ2VyID09IDApIHsKICAgICAgICAgLy8gdXNlIGNoZWNrU2VydmljZSgpIHRvIGF2b2lkIGJsb2NraW5nIGlmIHBvd2VyIHNlcnZpY2UgaXMgbm90IHVwIHlldAogICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQogICAgICAgICAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmNoZWNrU2VydmljZShTdHJpbmcxNigicG93ZXIiKSk7CiAgICAgICAgIGlmIChiaW5kZXIgPT0gMCkgewotICAgICAgICAgICAgQUxPR1coIlRocmVhZCAlcyBjYW5ub3QgY29ubmVjdCB0byB0aGUgcG93ZXIgbWFuYWdlciBzZXJ2aWNlIiwgbU5hbWUpOworICAgICAgICAgICAgQUxPR1coIlRocmVhZCAlcyBjYW5ub3QgY29ubmVjdCB0byB0aGUgcG93ZXIgbWFuYWdlciBzZXJ2aWNlIiwgbVRocmVhZE5hbWUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVBvd2VyTWFuYWdlciA9IGludGVyZmFjZV9jYXN0PElQb3dlck1hbmFnZXI+KGJpbmRlcik7CiAgICAgICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCk7CkBAIC03MTcsNyArOTYyLDYgQEAKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnVwZGF0ZVdha2VMb2NrVWlkc19sKGNvbnN0IFNvcnRlZFZlY3RvcjxpbnQ+ICZ1aWRzKSB7Ci0KICAgICBnZXRQb3dlck1hbmFnZXJfbCgpOwogICAgIGlmIChtV2FrZUxvY2tUb2tlbiA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJubyB3YWtlIGxvY2sgdG8gdXBkYXRlISIpOwpAQCAtNzI4LDcgKzk3Miw3IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1czsKICAgICAgICAgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+dXBkYXRlV2FrZUxvY2tVaWRzKG1XYWtlTG9ja1Rva2VuLCB1aWRzLnNpemUoKSwgdWlkcy5hcnJheSgpLAogICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIEZJWE1FIGZvcmNlIG9uZXdheSBjb250cmFyeSB0byAuYWlkbCAqLyk7Ci0gICAgICAgIEFMT0dWKCJhY3F1aXJlV2FrZUxvY2tfbCgpICVzIHN0YXR1cyAlZCIsIG1OYW1lLCBzdGF0dXMpOworICAgICAgICBBTE9HVigiYWNxdWlyZVdha2VMb2NrX2woKSAlcyBzdGF0dXMgJWQiLCBtVGhyZWFkTmFtZSwgc3RhdHVzKTsKICAgICB9CiB9CiAKQEAgLTkxMiw3ICsxMTU2LDcgQEAKICAgICAvLyBtU2lua0J1ZmZlciBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggZWZmZWN0IHByb2Nlc3NpbmcgKFBDTSAxNiBzdGVyZW8pLgogICAgIGlmIChtVHlwZSA9PSBESVJFQ1QpIHsKICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdF9sKCkgQ2Fubm90IGFkZCBlZmZlY3QgJXMgb24gRGlyZWN0IG91dHB1dCB0eXBlIHRocmVhZCAlcyIsCi0gICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgbU5hbWUpOworICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIG1UaHJlYWROYW1lKTsKICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KQEAgLTkzNiw3ICsxMTgwLDggQEAKICAgICAgICAgY2FzZSBEVVBMSUNBVElORzoKICAgICAgICAgY2FzZSBSRUNPUkQ6CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0X2woKSBDYW5ub3QgYWRkIGdsb2JhbCBlZmZlY3QgJXMgb24gdGhyZWFkICVzIiwgZGVzYy0+bmFtZSwgbU5hbWUpOworICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdF9sKCkgQ2Fubm90IGFkZCBnbG9iYWwgZWZmZWN0ICVzIG9uIHRocmVhZCAlcyIsCisgICAgICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIG1UaHJlYWROYW1lKTsKICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KQEAgLTExNTgsNiArMTQwMywyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVDsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnN5c3RlbVJlYWR5KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtU3lzdGVtUmVhZHkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtU3lzdGVtUmVhZHkgPSB0cnVlOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGVuZGluZ0NvbmZpZ0V2ZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBzZW5kQ29uZmlnRXZlbnRfbChtUGVuZGluZ0NvbmZpZ0V2ZW50cy5lZGl0SXRlbUF0KGkpKTsKKyAgICB9CisgICAgbVBlbmRpbmdDb25maWdFdmVudHMuY2xlYXIoKTsKK30KKwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgIFBsYXliYWNrCkBAIC0xMTY3LDggKzE0MjYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfdCB0eXBlKQotICAgIDogICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIGRldmljZSwgQVVESU9fREVWSUNFX05PTkUsIHR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5KQorICAgIDogICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIGRldmljZSwgQVVESU9fREVWSUNFX05PTkUsIHR5cGUsIHN5c3RlbVJlYWR5KSwKICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQoMCksIG1TaW5rQnVmZmVyKE5VTEwpLAogICAgICAgICBtTWl4ZXJCdWZmZXJFbmFibGVkKEF1ZGlvRmxpbmdlcjo6a0VuYWJsZUV4dGVuZGVkUHJlY2lzaW9uKSwKICAgICAgICAgbU1peGVyQnVmZmVyKE5VTEwpLApAQCAtMTE4Nyw3ICsxNDQ3LDcgQEAKICAgICAgICAgbUxhc3RXcml0ZVRpbWUoMCksIG1OdW1Xcml0ZXMoMCksIG1OdW1EZWxheWVkV3JpdGVzKDApLCBtSW5Xcml0ZShmYWxzZSksCiAgICAgICAgIG1NaXhlclN0YXR1cyhNSVhFUl9JRExFKSwKICAgICAgICAgbU1peGVyU3RhdHVzSWdub3JpbmdGYXN0VHJhY2tzKE1JWEVSX0lETEUpLAotICAgICAgICBzdGFuZGJ5RGVsYXkoQXVkaW9GbGluZ2VyOjptU3RhbmRieVRpbWVJbk5zZWNzKSwKKyAgICAgICAgbVN0YW5kYnlEZWxheU5zKEF1ZGlvRmxpbmdlcjo6bVN0YW5kYnlUaW1lSW5Oc2VjcyksCiAgICAgICAgIG1CeXRlc1JlbWFpbmluZygwKSwKICAgICAgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCgwKSwKICAgICAgICAgbVVzZUFzeW5jV3JpdGUoZmFsc2UpLApAQCAtMTIwMSw4ICsxNDYxLDggQEAKICAgICAgICAgLy8gbUxhdGNoRCwgbUxhdGNoUSwKICAgICAgICAgbUxhdGNoRFZhbGlkKGZhbHNlKSwgbUxhdGNoUVZhbGlkKGZhbHNlKQogewotICAgIHNucHJpbnRmKG1OYW1lLCBrTmFtZUxlbmd0aCwgIkF1ZGlvT3V0XyVYIiwgaWQpOwotICAgIG1OQkxvZ1dyaXRlciA9IGF1ZGlvRmxpbmdlci0+bmV3V3JpdGVyX2woa0xvZ1NpemUsIG1OYW1lKTsKKyAgICBzbnByaW50ZihtVGhyZWFkTmFtZSwga1RocmVhZE5hbWVMZW5ndGgsICJBdWRpb091dF8lWCIsIGlkKTsKKyAgICBtTkJMb2dXcml0ZXIgPSBhdWRpb0ZsaW5nZXItPm5ld1dyaXRlcl9sKGtMb2dTaXplLCBtVGhyZWFkTmFtZSk7CiAKICAgICAvLyBBc3N1bWVzIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCBieSBBdWRpb0ZsaW5nZXIgd2l0aCBpdCdzIG1Mb2NrIGhlbGQsIGJ1dAogICAgIC8vIGl0IHdvdWxkIGJlIHNhZmVyIHRvIGV4cGxpY2l0bHkgcGFzcyBpbml0aWFsIG1hc3RlclZvbHVtZS9tYXN0ZXJNdXRlIGFzCkBAIC0xMzE1LDcgKzE1NzUsMTAgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKLSAgICBkcHJpbnRmKGZkLCAiXG5PdXRwdXQgdGhyZWFkICVwOlxuIiwgdGhpcyk7CisgICAgZHByaW50ZihmZCwgIlxuT3V0cHV0IHRocmVhZCAlcCB0eXBlICVkICglcyk6XG4iLCB0aGlzLCB0eXBlKCksIHRocmVhZFR5cGVUb1N0cmluZyh0eXBlKCkpKTsKKworICAgIGR1bXBCYXNlKGZkLCBhcmdzKTsKKwogICAgIGRwcmludGYoZmQsICIgIE5vcm1hbCBmcmFtZSBjb3VudDogJXp1XG4iLCBtTm9ybWFsRnJhbWVDb3VudCk7CiAgICAgZHByaW50ZihmZCwgIiAgTGFzdCB3cml0ZSBvY2N1cnJlZCAobXNlY3MpOiAlbGx1XG4iLCBuczJtcyhzeXN0ZW1UaW1lKCkgLSBtTGFzdFdyaXRlVGltZSkpOwogICAgIGRwcmludGYoZmQsICIgIFRvdGFsIHdyaXRlczogJWRcbiIsIG1OdW1Xcml0ZXMpOwpAQCAtMTMyNiwxNSArMTU4OSwxNyBAQAogICAgIGRwcmludGYoZmQsICIgIE1peGVyIGJ1ZmZlcjogJXBcbiIsIG1NaXhlckJ1ZmZlcik7CiAgICAgZHByaW50ZihmZCwgIiAgRWZmZWN0IGJ1ZmZlcjogJXBcbiIsIG1FZmZlY3RCdWZmZXIpOwogICAgIGRwcmludGYoZmQsICIgIEZhc3QgdHJhY2sgYXZhaWxNYXNrPSUjeFxuIiwgbUZhc3RUcmFja0F2YWlsTWFzayk7Ci0KLSAgICBkdW1wQmFzZShmZCwgYXJncyk7CisgICAgQXVkaW9TdHJlYW1PdXQgKm91dHB1dCA9IG1PdXRwdXQ7CisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBvdXRwdXQgIT0gTlVMTCA/IG91dHB1dC0+ZmxhZ3MgOiBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIFN0cmluZzggZmxhZ3NBc1N0cmluZyA9IG91dHB1dEZsYWdzVG9TdHJpbmcoZmxhZ3MpOworICAgIGRwcmludGYoZmQsICIgIEF1ZGlvU3RyZWFtT3V0OiAlcCBmbGFncyAlI3ggKCVzKVxuIiwgb3V0cHV0LCBmbGFncywgZmxhZ3NBc1N0cmluZy5zdHJpbmcoKSk7CiB9CiAKIC8vIFRocmVhZCB2aXJ0dWFscwogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Om9uRmlyc3RSZWYoKQogewotICAgIHJ1bihtTmFtZSwgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8pOworICAgIHJ1bihtVGhyZWFkTmFtZSwgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8pOwogfQogCiAvLyBUaHJlYWRCYXNlIHZpcnR1YWxzCkBAIC0xMzc4LDE5ICsxNjQzLDIyIEBACiAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAoc2hhcmVkQnVmZmVyICE9IDApCiAgICAgICAgICAgICAgICkgfHwKLSAgICAgICAgICAgICAgLy8gdXNlIGNhc2UgMjogY2FsbGJhY2sgaGFuZGxlciBhbmQgZnJhbWUgY291bnQgaXMgZGVmYXVsdCBvciBhdCBsZWFzdCBhcyBsYXJnZSBhcyBIQUwKKyAgICAgICAgICAgICAgLy8gdXNlIGNhc2UgMjogZnJhbWUgY291bnQgaXMgZGVmYXVsdCBvciBhdCBsZWFzdCBhcyBsYXJnZSBhcyBIQUwKICAgICAgICAgICAgICAgKAotICAgICAgICAgICAgICAgICh0aWQgIT0gLTEpICYmCisgICAgICAgICAgICAgICAgLy8gd2UgZm9ybWVybHkgY2hlY2tlZCBmb3IgYSBjYWxsYmFjayBoYW5kbGVyIChub24tMCB0aWQpLAorICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGF0IGlzIG5vIGxvbmdlciByZXF1aXJlZCBmb3IgVFJBTlNGRVJfT0JUQUlOIG1vZGUKICAgICAgICAgICAgICAgICAoKGZyYW1lQ291bnQgPT0gMCkgfHwKICAgICAgICAgICAgICAgICAoZnJhbWVDb3VudCA+PSBtRnJhbWVDb3VudCkpCiAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICkgJiYKICAgICAgICAgICAgIC8vIFBDTSBkYXRhCiAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYKLSAgICAgICAgICAgIC8vIGlkZW50aWNhbCBjaGFubmVsIG1hc2sgdG8gc2luaywgb3IgbW9ubyBpbiBhbmQgc3RlcmVvIHNpbmsKKyAgICAgICAgICAgIC8vIFRPRE86IGV4dHJhY3QgYXMgYSBkYXRhIGxpYnJhcnkgZnVuY3Rpb24gdGhhdCBjaGVja3MgdGhhdCBhIGNvbXB1dGF0aW9uYWxseQorICAgICAgICAgICAgLy8gZXhwZW5zaXZlIGRvd25taXhlciBpcyBub3QgcmVxdWlyZWQ6IGlzRmFzdE91dHB1dENoYW5uZWxDb252ZXJzaW9uKCkKICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBtQ2hhbm5lbE1hc2sgfHwKLSAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyB8fAorICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICYmIG1DaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gKi8pKSAmJgogICAgICAgICAgICAgLy8gaGFyZHdhcmUgc2FtcGxlIHJhdGUKICAgICAgICAgICAgIChzYW1wbGVSYXRlID09IG1TYW1wbGVSYXRlKSAmJgogICAgICAgICAgICAgLy8gbm9ybWFsIG1peGVyIGhhcyBhbiBhc3NvY2lhdGVkIGZhc3QgbWl4ZXIKQEAgLTE0MjAsMjAgKzE2ODgsMzEgQEAKICAgICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCksCiAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIHNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlLCBoYXNGYXN0TWl4ZXIoKSwgdGlkLCBtRmFzdFRyYWNrQXZhaWxNYXNrKTsKICAgICAgICAgKmZsYWdzICY9IH5JQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUOwotICAgICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIEF1ZGlvVHJhY2sgY2FsY3VsYXRpb24sIGJ1ZmZlciBkZXB0aCBpcyBmb3JjZWQKLSAgICAgICAgLy8gdG8gYmUgYXQgbGVhc3QgMiB4IHRoZSBub3JtYWwgbWl4ZXIgZnJhbWUgY291bnQgYW5kIGNvdmVyIGF1ZGlvIGhhcmR3YXJlIGxhdGVuY3kuCi0gICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgdG9vIGNvbnNlcnZhdGl2ZSwgYnV0IGxlZ2FjeSBhcHBsaWNhdGlvbiBjb2RlIG1heSBkZXBlbmQgb24gaXQuCi0gICAgICAgIC8vIElmIHlvdSBjaGFuZ2UgdGhpcyBjYWxjdWxhdGlvbiwgYWxzbyByZXZpZXcgdGhlIHN0YXJ0IHRocmVzaG9sZCB3aGljaCBpcyByZWxhdGVkLgorICAgICAgfQorICAgIH0KKyAgICAvLyBGb3Igbm9ybWFsIFBDTSBzdHJlYW1pbmcgdHJhY2tzLCB1cGRhdGUgbWluaW11bSBmcmFtZSBjb3VudC4KKyAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIEF1ZGlvVHJhY2sgY2FsY3VsYXRpb24sIGJ1ZmZlciBkZXB0aCBpcyBmb3JjZWQKKyAgICAvLyB0byBiZSBhdCBsZWFzdCAyIHggdGhlIG5vcm1hbCBtaXhlciBmcmFtZSBjb3VudCBhbmQgY292ZXIgYXVkaW8gaGFyZHdhcmUgbGF0ZW5jeS4KKyAgICAvLyBUaGlzIGlzIHByb2JhYmx5IHRvbyBjb25zZXJ2YXRpdmUsIGJ1dCBsZWdhY3kgYXBwbGljYXRpb24gY29kZSBtYXkgZGVwZW5kIG9uIGl0LgorICAgIC8vIElmIHlvdSBjaGFuZ2UgdGhpcyBjYWxjdWxhdGlvbiwgYWxzbyByZXZpZXcgdGhlIHN0YXJ0IHRocmVzaG9sZCB3aGljaCBpcyByZWxhdGVkLgorICAgIGlmICghKCpmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpCisgICAgICAgICAgICAmJiBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYgc2hhcmVkQnVmZmVyID09IDApIHsKKyAgICAgICAgLy8gdGhpcyBtdXN0IG1hdGNoIEF1ZGlvVHJhY2suY3BwIGNhbGN1bGF0ZU1pbkZyYW1lQ291bnQoKS4KKyAgICAgICAgLy8gVE9ETzogTW92ZSB0byBhIGNvbW1vbiBsaWJyYXJ5CiAgICAgICAgIHVpbnQzMl90IGxhdGVuY3lNcyA9IG1PdXRwdXQtPnN0cmVhbS0+Z2V0X2xhdGVuY3kobU91dHB1dC0+c3RyZWFtKTsKICAgICAgICAgdWludDMyX3QgbWluQnVmQ291bnQgPSBsYXRlbmN5TXMgLyAoKDEwMDAgKiBtTm9ybWFsRnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZSk7CiAgICAgICAgIGlmIChtaW5CdWZDb3VudCA8IDIpIHsKICAgICAgICAgICAgIG1pbkJ1ZkNvdW50ID0gMjsKICAgICAgICAgfQotICAgICAgICBzaXplX3QgbWluRnJhbWVDb3VudCA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbWluQnVmQ291bnQ7Ci0gICAgICAgIGlmIChmcmFtZUNvdW50IDwgbWluRnJhbWVDb3VudCkgeworICAgICAgICAvLyBGb3Igbm9ybWFsIG1peGluZyB0cmFja3MsIGlmIHNwZWVkIGlzID4gMS4wZiAobm9ybWFsKSwgQXVkaW9UcmFjaworICAgICAgICAvLyBvciB0aGUgY2xpZW50IHNob3VsZCBjb21wdXRlIGFuZCBwYXNzIGluIGEgbGFyZ2VyIGJ1ZmZlciByZXF1ZXN0LgorICAgICAgICBzaXplX3QgbWluRnJhbWVDb3VudCA9CisgICAgICAgICAgICAgICAgbWluQnVmQ291bnQgKiBzb3VyY2VGcmFtZXNOZWVkZWRXaXRoVGltZXN0cmV0Y2goCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBtTm9ybWFsRnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9OT1JNQUwgLypzcGVlZCovKTsKKyAgICAgICAgaWYgKGZyYW1lQ291bnQgPCBtaW5GcmFtZUNvdW50KSB7IC8vIGluY2x1ZGluZyBmcmFtZUNvdW50ID09IDAKICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtaW5GcmFtZUNvdW50OwogICAgICAgICB9Ci0gICAgICB9CiAgICAgfQogICAgICpwRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAKQEAgLTE3MjYsMzIgKzIwMDUsMjkgQEAKICAgICByZXR1cm4gb3V0X3M4OwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSkgewotICAgIEF1ZGlvU3lzdGVtOjpPdXRwdXREZXNjcmlwdG9yIGRlc2M7Ci0gICAgdm9pZCAqcGFyYW0yID0gTlVMTDsKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKSB7CisgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGRlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKKyAgICBBTE9HVigiUGxheWJhY2tUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZCwgdGhyZWFkICVwLCBldmVudCAlZCIsIHRoaXMsIGV2ZW50KTsKIAotICAgIEFMT0dWKCJQbGF5YmFja1RocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkLCB0aHJlYWQgJXAsIGV2ZW50ICVkLCBwYXJhbSAlZCIsIHRoaXMsIGV2ZW50LAotICAgICAgICAgICAgcGFyYW0pOworICAgIGRlc2MtPm1Jb0hhbmRsZSA9IG1JZDsKIAogICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEOgotICAgIGNhc2UgQXVkaW9TeXN0ZW06Ok9VVFBVVF9DT05GSUdfQ0hBTkdFRDoKLSAgICAgICAgZGVzYy5jaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsKLSAgICAgICAgZGVzYy5zYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKLSAgICAgICAgZGVzYy5mb3JtYXQgPSBtRm9ybWF0OwotICAgICAgICBkZXNjLmZyYW1lQ291bnQgPSBtTm9ybWFsRnJhbWVDb3VudDsgLy8gRklYTUUgc2VlCisgICAgY2FzZSBBVURJT19PVVRQVVRfT1BFTkVEOgorICAgIGNhc2UgQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEOgorICAgICAgICBkZXNjLT5tUGF0Y2ggPSBtUGF0Y2g7CisgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsKKyAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOworICAgICAgICBkZXNjLT5tRm9ybWF0ID0gbUZvcm1hdDsKKyAgICAgICAgZGVzYy0+bUZyYW1lQ291bnQgPSBtTm9ybWFsRnJhbWVDb3VudDsgLy8gRklYTUUgc2VlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0ZsaW5nZXI6OmZyYW1lQ291bnQoYXVkaW9faW9faGFuZGxlX3QpCi0gICAgICAgIGRlc2MubGF0ZW5jeSA9IGxhdGVuY3lfbCgpOwotICAgICAgICBwYXJhbTIgPSAmZGVzYzsKKyAgICAgICAgZGVzYy0+bUxhdGVuY3kgPSBsYXRlbmN5X2woKTsKICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIEF1ZGlvU3lzdGVtOjpTVFJFQU1fQ09ORklHX0NIQU5HRUQ6Ci0gICAgICAgIHBhcmFtMiA9ICZwYXJhbTsKLSAgICBjYXNlIEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ0xPU0VEOgorICAgIGNhc2UgQVVESU9fT1VUUFVUX0NMT1NFRDoKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKICAgICB9Ci0gICAgbUF1ZGlvRmxpbmdlci0+YXVkaW9Db25maWdDaGFuZ2VkKGV2ZW50LCBtSWQsIHBhcmFtMik7CisgICAgbUF1ZGlvRmxpbmdlci0+aW9Db25maWdDaGFuZ2VkKGV2ZW50LCBkZXNjLCBwaWQpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OndyaXRlQ2FsbGJhY2soKQpAQCAtMTgxMCw4ICsyMDg2LDggQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpCiB7CiAgICAgLy8gdW5mb3J0dW5hdGVseSB3ZSBoYXZlIG5vIHdheSBvZiByZWNvdmVyaW5nIGZyb20gZXJyb3JzIGhlcmUsIGhlbmNlIHRoZSBMT0dfQUxXQVlTX0ZBVEFMCi0gICAgbVNhbXBsZVJhdGUgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKLSAgICBtQ2hhbm5lbE1hc2sgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtU2FtcGxlUmF0ZSA9IG1PdXRwdXQtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBtQ2hhbm5lbE1hc2sgPSBtT3V0cHV0LT5nZXRDaGFubmVsTWFzaygpOwogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwobUNoYW5uZWxNYXNrKSkgewogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJIQUwgY2hhbm5lbCBtYXNrICUjeCBub3QgdmFsaWQgZm9yIG91dHB1dCIsIG1DaGFubmVsTWFzayk7CiAgICAgfQpAQCAtMTgyMSw4ICsyMDk3LDEyIEBACiAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrKTsKICAgICB9CiAgICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hhbm5lbE1hc2spOworCisgICAgLy8gR2V0IGFjdHVhbCBIQUwgZm9ybWF0LgogICAgIG1IQUxGb3JtYXQgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7Ci0gICAgbUZvcm1hdCA9IG1IQUxGb3JtYXQ7CisgICAgLy8gR2V0IGZvcm1hdCBmcm9tIHRoZSBzaGltLCB3aGljaCB3aWxsIGJlIGRpZmZlcmVudCB0aGFuIHRoZSBIQUwgZm9ybWF0CisgICAgLy8gaWYgcGxheWluZyBjb21wcmVzc2VkIGF1ZGlvIG92ZXIgSERNSSBwYXNzdGhyb3VnaC4KKyAgICBtRm9ybWF0ID0gbU91dHB1dC0+Z2V0Rm9ybWF0KCk7CiAgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQobUZvcm1hdCkpIHsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSEFMIGZvcm1hdCAlI3ggbm90IHZhbGlkIGZvciBvdXRwdXQiLCBtRm9ybWF0KTsKICAgICB9CkBAIC0xODMxLDcgKzIxMTEsNyBAQAogICAgICAgICBMT0dfRkFUQUwoIkhBTCBmb3JtYXQgJSN4IG5vdCBzdXBwb3J0ZWQgZm9yIG1peGVkIG91dHB1dCIsCiAgICAgICAgICAgICAgICAgbUZvcm1hdCk7CiAgICAgfQotICAgIG1GcmFtZVNpemUgPSBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobU91dHB1dC0+c3RyZWFtKTsKKyAgICBtRnJhbWVTaXplID0gbU91dHB1dC0+Z2V0RnJhbWVTaXplKCk7CiAgICAgbUJ1ZmZlclNpemUgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfYnVmZmVyX3NpemUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBtRnJhbWVDb3VudCA9IG1CdWZmZXJTaXplIC8gbUZyYW1lU2l6ZTsKICAgICBpZiAobUZyYW1lQ291bnQgJiAxNSkgewpAQCAtMTg2MCw2ICsyMTQwLDI1IEBACiAgICAgICAgICAgICBBTE9HVygiZGlyZWN0IG91dHB1dCBpbXBsZW1lbnRzIHJlc3VtZSBidXQgbm90IHBhdXNlIik7CiAgICAgICAgIH0KICAgICB9CisgICAgaWYgKCFtSHdTdXBwb3J0c1BhdXNlICYmIG1PdXRwdXQtPmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQykgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJIV19BVl9TWU5DIHJlcXVlc3RlZCBidXQgSEFMIGRvZXMgbm90IGltcGxlbWVudCBwYXVzZSBhbmQgcmVzdW1lIik7CisgICAgfQorCisgICAgaWYgKG1UeXBlID09IERVUExJQ0FUSU5HICYmIG1NaXhlckJ1ZmZlckVuYWJsZWQgJiYgbUVmZmVjdEJ1ZmZlckVuYWJsZWQpIHsKKyAgICAgICAgLy8gRm9yIGJlc3QgcHJlY2lzaW9uLCB3ZSB1c2UgZmxvYXQgaW5zdGVhZCBvZiB0aGUgYXNzb2NpYXRlZCBvdXRwdXQKKyAgICAgICAgLy8gZGV2aWNlIGZvcm1hdCAodHlwaWNhbGx5IFBDTSAxNiBiaXQpLgorCisgICAgICAgIG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgICAgICBtRnJhbWVTaXplID0gbUNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCk7CisgICAgICAgIG1CdWZmZXJTaXplID0gbUZyYW1lU2l6ZSAqIG1GcmFtZUNvdW50OworCisgICAgICAgIC8vIFRPRE86IFdlIGN1cnJlbnRseSB1c2UgdGhlIGFzc29jaWF0ZWQgb3V0cHV0IGRldmljZSBjaGFubmVsIG1hc2sgYW5kIHNhbXBsZSByYXRlLgorICAgICAgICAvLyAoMSkgUGVyaGFwcyB1c2UgdGhlIE9SZWQgY2hhbm5lbCBtYXNrIG9mIGFsbCBkb3duc3RyZWFtIE1peGVyVGhyZWFkcworICAgICAgICAvLyAoaWYgYSB2YWxpZCBtYXNrKSB0byBhdm9pZCBwcmVtYXR1cmUgZG93bm1peC4KKyAgICAgICAgLy8gKDIpIFBlcmhhcHMgdXNlIHRoZSBtYXhpbXVtIHNhbXBsZSByYXRlIG9mIGFsbCBkb3duc3RyZWFtIE1peGVyVGhyZWFkcworICAgICAgICAvLyBpbnN0ZWFkIG9mIHRoZSBvdXRwdXQgZGV2aWNlIHNhbXBsZSByYXRlIHRvIGF2b2lkIGxvc3Mgb2YgaGlnaCBmcmVxdWVuY3kgaW5mb3JtYXRpb24uCisgICAgICAgIC8vIFRoaXMgbWF5IG5lZWQgdG8gYmUgdXBkYXRlZCBhcyBNaXhlclRocmVhZC9PdXRwdXRUcmFja3MgYXJlIGFkZGVkIGFuZCBub3QgaGVyZS4KKyAgICB9CiAKICAgICAvLyBDYWxjdWxhdGUgc2l6ZSBvZiBub3JtYWwgc2luayBidWZmZXIgcmVsYXRpdmUgdG8gdGhlIEhBTCBvdXRwdXQgYnVmZmVyIHNpemUKICAgICBkb3VibGUgbXVsdGlwbGllciA9IDEuMDsKQEAgLTE5MDUsNiArMjIwNCwxMiBAQAogICAgIEFMT0dJKCJIQUwgb3V0cHV0IGJ1ZmZlciBzaXplICV1IGZyYW1lcywgbm9ybWFsIHNpbmsgYnVmZmVyIHNpemUgJXUgZnJhbWVzIiwgbUZyYW1lQ291bnQsCiAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCk7CiAKKyAgICAvLyBDaGVjayBpZiB3ZSB3YW50IHRvIHRocm90dGxlIHRoZSBwcm9jZXNzaW5nIHRvIG5vIG1vcmUgdGhhbiAyeCBub3JtYWwgcmF0ZQorICAgIG1UaHJlYWRUaHJvdHRsZSA9IHByb3BlcnR5X2dldF9ib29sKCJhZi50aHJlYWQudGhyb3R0bGUiLCB0cnVlIC8qIGRlZmF1bHRfdmFsdWUgKi8pOworICAgIG1UaHJlYWRUaHJvdHRsZVRpbWVNcyA9IDA7CisgICAgbVRocmVhZFRocm90dGxlRW5kTXMgPSAwOworICAgIG1IYWxmQnVmZmVyTXMgPSBtTm9ybWFsRnJhbWVDb3VudCAqIDEwMDAgLyAoMiAqIG1TYW1wbGVSYXRlKTsKKwogICAgIC8vIG1TaW5rQnVmZmVyIGlzIHRoZSBzaW5rIGJ1ZmZlci4gIFNpemUgaXMgYWx3YXlzIG11bHRpcGxlLW9mLTE2IGZyYW1lcy4KICAgICAvLyBPcmlnaW5hbGx5IHRoaXMgd2FzIGludDE2X3RbXSBhcnJheSwgbmVlZCB0byByZW1vdmUgbGVnYWN5IGltcGxpY2F0aW9ucy4KICAgICBmcmVlKG1TaW5rQnVmZmVyKTsKQEAgLTE5NjYsNyArMjI3MSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgICAgICB1aW50MzJfdCBmcmFtZXM7Ci0gICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtT3V0cHV0LT5zdHJlYW0sICZmcmFtZXMpOworICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5nZXRSZW5kZXJQb3NpdGlvbigmZnJhbWVzKTsKICAgICAgICAgKmRzcEZyYW1lcyA9IChzaXplX3QpZnJhbWVzOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KQEAgLTIwMDgsMTMgKzIzMTMsMTMgQEAKIH0KIAogCi1BdWRpb0ZsaW5nZXI6OkF1ZGlvU3RyZWFtT3V0KiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRPdXRwdXQoKSBjb25zdAorQXVkaW9TdHJlYW1PdXQqIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldE91dHB1dCgpIGNvbnN0CiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICByZXR1cm4gbU91dHB1dDsKIH0KIAotQXVkaW9GbGluZ2VyOjpBdWRpb1N0cmVhbU91dCogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Y2xlYXJPdXRwdXQoKQorQXVkaW9TdHJlYW1PdXQqIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmNsZWFyT3V0cHV0KCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1ZGlvU3RyZWFtT3V0ICpvdXRwdXQgPSBtT3V0cHV0OwpAQCAtMjEzNyw2ICsyNDQyLDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW47CiAgICAgICAgIH0KKyAgICAgICAgbUxhdGNoRFZhbGlkID0gZmFsc2U7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Ob3JtYWxTaW5rLT5nZXRUaW1lc3RhbXAobUxhdGNoRC5tVGltZXN0YW1wKTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgc2l6ZV90IHRvdGFsRnJhbWVzV3JpdHRlbiA9IG1Ob3JtYWxTaW5rLT5mcmFtZXNXcml0dGVuKCk7CkBAIC0yMTU5LDggKzI0NjUsNyBAQAogICAgICAgICB9CiAgICAgICAgIC8vIEZJWE1FIFdlIHNob3VsZCBoYXZlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRpbWVzdGFtcHMgZm9yIGRpcmVjdCBvdXRwdXQgdGhyZWFkcy4KICAgICAgICAgLy8gVGhleSBhcmUgdXNlZCBlLmcgZm9yIG11bHRpY2hhbm5lbCBQQ00gcGxheWJhY2sgb3ZlciBIRE1JLgotICAgICAgICBieXRlc1dyaXR0ZW4gPSBtT3V0cHV0LT5zdHJlYW0tPndyaXRlKG1PdXRwdXQtPnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbVNpbmtCdWZmZXIgKyBvZmZzZXQsIG1CeXRlc1JlbWFpbmluZyk7CisgICAgICAgIGJ5dGVzV3JpdHRlbiA9IG1PdXRwdXQtPndyaXRlKChjaGFyICopbVNpbmtCdWZmZXIgKyBvZmZzZXQsIG1CeXRlc1JlbWFpbmluZyk7CiAgICAgICAgIGlmIChtVXNlQXN5bmNXcml0ZSAmJgogICAgICAgICAgICAgICAgICgoYnl0ZXNXcml0dGVuIDwgMCkgfHwgKGJ5dGVzV3JpdHRlbiA9PSAoc3NpemVfdCltQnl0ZXNSZW1haW5pbmcpKSkgewogICAgICAgICAgICAgLy8gZG8gbm90IHdhaXQgZm9yIGFzeW5jIGNhbGxiYWNrIGluIGNhc2Ugb2YgZXJyb3Igb2YgZnVsbCB3cml0ZQpAQCAtMjIwNiw5ICsyNTExLDkgQEAKIC8qCiBUaGUgZGVyaXZlZCB2YWx1ZXMgdGhhdCBhcmUgY2FjaGVkOgogIC0gbVNpbmtCdWZmZXJTaXplIGZyb20gZnJhbWUgY291bnQgKiBmcmFtZSBzaXplCi0gLSBhY3RpdmVTbGVlcFRpbWUgZnJvbSBhY3RpdmVTbGVlcFRpbWVVcygpCi0gLSBpZGxlU2xlZXBUaW1lIGZyb20gaWRsZVNsZWVwVGltZVVzKCkKLSAtIHN0YW5kYnlEZWxheSBmcm9tIG1BY3RpdmVTbGVlcFRpbWVVcyAoRElSRUNUIG9ubHkpCisgLSBtQWN0aXZlU2xlZXBUaW1lVXMgZnJvbSBhY3RpdmVTbGVlcFRpbWVVcygpCisgLSBtSWRsZVNsZWVwVGltZVVzIGZyb20gaWRsZVNsZWVwVGltZVVzKCkKKyAtIG1TdGFuZGJ5RGVsYXlOcyBmcm9tIG1BY3RpdmVTbGVlcFRpbWVVcyAoRElSRUNUIG9ubHkpCiAgLSBtYXhQZXJpb2QgZnJvbSBmcmFtZSBjb3VudCBhbmQgc2FtcGxlIHJhdGUgKE1JWEVSIG9ubHkpCiAKIFRoZSBwYXJhbWV0ZXJzIHRoYXQgYWZmZWN0IHRoZXNlIGRlcml2ZWQgdmFsdWVzIGFyZToKQEAgLTIyMjUsOCArMjUzMCw4IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmNhY2hlUGFyYW1ldGVyc19sKCkKIHsKICAgICBtU2lua0J1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1GcmFtZVNpemU7Ci0gICAgYWN0aXZlU2xlZXBUaW1lID0gYWN0aXZlU2xlZXBUaW1lVXMoKTsKLSAgICBpZGxlU2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZVVzKCk7CisgICAgbUFjdGl2ZVNsZWVwVGltZVVzID0gYWN0aXZlU2xlZXBUaW1lVXMoKTsKKyAgICBtSWRsZVNsZWVwVGltZVVzID0gaWRsZVNsZWVwVGltZVVzKCk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6aW52YWxpZGF0ZVRyYWNrcyhhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpCkBAIC0yMzkzLDcgKzI2OTgsNyBAQAogewogICAgIFZlY3Rvcjwgc3A8VHJhY2s+ID4gdHJhY2tzVG9SZW1vdmU7CiAKLSAgICBzdGFuZGJ5VGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICBtU3RhbmRieVRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKIAogICAgIC8vIE1JWEVSCiAgICAgbnNlY3NfdCBsYXN0V2FybmluZyA9IDA7CkBAIC0yNDA1LDcgKzI3MTAsNyBAQAogICAgIGludCBsYXN0R2VuZXJhdGlvbiA9IDA7CiAKICAgICBjYWNoZVBhcmFtZXRlcnNfbCgpOwotICAgIHNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWU7CisgICAgbVNsZWVwVGltZVVzID0gbUlkbGVTbGVlcFRpbWVVczsKIAogICAgIGlmIChtVHlwZSA9PSBNSVhFUikgewogICAgICAgICBzbGVlcFRpbWVTaGlmdCA9IDA7CkBAIC0yNDY3LDE5ICsyNzcyLDI5IEBACiAgICAgICAgICAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlbGVhc2VXYWtlTG9ja19sKCk7CisgICAgICAgICAgICAgICAgYm9vbCByZWxlYXNlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBvZmZsb2FkIGRyaXZlci4gSWRlYWxseSB3ZSB3b3VsZCByZWxlYXNlCisgICAgICAgICAgICAgICAgLy8gdGhlIHdha2UgbG9jayBldmVyeSB0aW1lLCBidXQgdGhhdCBjYXVzZXMgdGhlIGxhc3Qgb2ZmbG9hZCBidWZmZXIocykgdG8gYmUKKyAgICAgICAgICAgICAgICAvLyBkcm9wcGVkIHdoaWxlIHRoZSBkZXZpY2UgaXMgb24gYmF0dGVyeSwgc28gd2UgbmVlZCB0byBob2xkIGEgd2FrZSBsb2NrIGR1cmluZworICAgICAgICAgICAgICAgIC8vIHRoZSBkcmFpbiBwaGFzZS4KKyAgICAgICAgICAgICAgICBpZiAobUJ5dGVzUmVtYWluaW5nICYmICEobURyYWluU2VxdWVuY2UgJiAxKSkgeworICAgICAgICAgICAgICAgICAgICByZWxlYXNlV2FrZUxvY2tfbCgpOworICAgICAgICAgICAgICAgICAgICByZWxlYXNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1XYWtlTG9ja1VpZHMuY2xlYXIoKTsKICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbisrOwogICAgICAgICAgICAgICAgIEFMT0dWKCJ3YWl0IGFzeW5jIGNvbXBsZXRpb24iKTsKICAgICAgICAgICAgICAgICBtV2FpdFdvcmtDVi53YWl0KG1Mb2NrKTsKICAgICAgICAgICAgICAgICBBTE9HVigiYXN5bmMgY29tcGxldGlvbi93YWtlIik7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZVdha2VMb2NrX2woKTsKLSAgICAgICAgICAgICAgICBzdGFuZGJ5VGltZSA9IHN5c3RlbVRpbWUoKSArIHN0YW5kYnlEZWxheTsKLSAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSAwOworICAgICAgICAgICAgICAgIGlmIChyZWxlYXNlZCkgeworICAgICAgICAgICAgICAgICAgICBhY3F1aXJlV2FrZUxvY2tfbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtU3RhbmRieVRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1TdGFuZGJ5RGVsYXlOczsKKyAgICAgICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSAwOwogCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKCFtQWN0aXZlVHJhY2tzLnNpemUoKSAmJiBzeXN0ZW1UaW1lKCkgPiBzdGFuZGJ5VGltZSkgfHwKKyAgICAgICAgICAgIGlmICgoIW1BY3RpdmVUcmFja3Muc2l6ZSgpICYmIHN5c3RlbVRpbWUoKSA+IG1TdGFuZGJ5VGltZU5zKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N1c3BlbmRlZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gcHV0IGF1ZGlvIGhhcmR3YXJlIGludG8gc3RhbmRieSBhZnRlciBzaG9ydCBkZWxheQogICAgICAgICAgICAgICAgIGlmIChzaG91bGRTdGFuZGJ5X2woKSkgewpAQCAtMjUxNCw4ICsyODI5LDggQEAKICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gMDsKICAgICAgICAgICAgICAgICAgICAgY2hlY2tTaWxlbnRNb2RlX2woKTsKIAotICAgICAgICAgICAgICAgICAgICBzdGFuZGJ5VGltZSA9IHN5c3RlbVRpbWUoKSArIHN0YW5kYnlEZWxheTsKLSAgICAgICAgICAgICAgICAgICAgc2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnlUaW1lTnMgPSBzeXN0ZW1UaW1lKCkgKyBtU3RhbmRieURlbGF5TnM7CisgICAgICAgICAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IG1JZGxlU2xlZXBUaW1lVXM7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUikgewogICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBUaW1lU2hpZnQgPSAwOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0yNTQ2LDE1ICsyODYxLDE1IEBACiAgICAgICAgICAgICAgICAgdGhyZWFkTG9vcF9taXgoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG1NaXhlclN0YXR1cyAhPSBNSVhFUl9EUkFJTl9UUkFDSykKICAgICAgICAgICAgICAgICAgICAgICAgICYmIChtTWl4ZXJTdGF0dXMgIT0gTUlYRVJfRFJBSU5fQUxMKSkgewotICAgICAgICAgICAgICAgIC8vIHRocmVhZExvb3Bfc2xlZXBUaW1lIHNldHMgc2xlZXBUaW1lIHRvIDAgaWYgZGF0YQorICAgICAgICAgICAgICAgIC8vIHRocmVhZExvb3Bfc2xlZXBUaW1lIHNldHMgbVNsZWVwVGltZVVzIHRvIDAgaWYgZGF0YQogICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgd3JpdHRlbiB0byBIQUwKICAgICAgICAgICAgICAgICB0aHJlYWRMb29wX3NsZWVwVGltZSgpOwotICAgICAgICAgICAgICAgIGlmIChzbGVlcFRpbWUgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtU2xlZXBUaW1lVXMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbVNpbmtCdWZmZXJTaXplOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIEVpdGhlciB0aHJlYWRMb29wX21peCgpIG9yIHRocmVhZExvb3Bfc2xlZXBUaW1lKCkgc2hvdWxkIGhhdmUgc2V0Ci0gICAgICAgICAgICAvLyBtTWl4ZXJCdWZmZXIgd2l0aCBkYXRhIGlmIG1NaXhlckJ1ZmZlclZhbGlkIGlzIHRydWUgYW5kIHNsZWVwVGltZSA9PSAwLgorICAgICAgICAgICAgLy8gbU1peGVyQnVmZmVyIHdpdGggZGF0YSBpZiBtTWl4ZXJCdWZmZXJWYWxpZCBpcyB0cnVlIGFuZCBtU2xlZXBUaW1lVXMgPT0gMC4KICAgICAgICAgICAgIC8vIE1lcmdlIG1NaXhlckJ1ZmZlciBkYXRhIGludG8gbUVmZmVjdEJ1ZmZlciAoaWYgYW55IGVmZmVjdHMgYXJlIHZhbGlkKQogICAgICAgICAgICAgLy8gb3IgbVNpbmtCdWZmZXIgKGlmIHRoZXJlIGFyZSBubyBlZmZlY3RzKS4KICAgICAgICAgICAgIC8vCkBAIC0yNTYyLDcgKzI4NzcsNyBAQAogICAgICAgICAgICAgLy8gc3VwcG9ydCBoaWdoZXIgcHJlY2lzaW9uLCB0aGlzIG5lZWRzIHRvIG1vdmUuCiAgICAgICAgICAgICAvLwogICAgICAgICAgICAgLy8gbU1peGVyQnVmZmVyVmFsaWQgaXMgb25seSBzZXQgdHJ1ZSBieSBNaXhlclRocmVhZDo6cHJlcGFyZVRyYWNrc19sKCkuCi0gICAgICAgICAgICAvLyBUT0RPIHVzZSBzbGVlcFRpbWUgPT0gMCBhcyBhbiBhZGRpdGlvbmFsIGNvbmRpdGlvbi4KKyAgICAgICAgICAgIC8vIFRPRE8gdXNlIG1TbGVlcFRpbWVVcyA9PSAwIGFzIGFuIGFkZGl0aW9uYWwgY29uZGl0aW9uLgogICAgICAgICAgICAgaWYgKG1NaXhlckJ1ZmZlclZhbGlkKSB7CiAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyID0gbUVmZmVjdEJ1ZmZlclZhbGlkID8gbUVmZmVjdEJ1ZmZlciA6IG1TaW5rQnVmZmVyOwogICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IG1FZmZlY3RCdWZmZXJWYWxpZCA/IG1FZmZlY3RCdWZmZXJGb3JtYXQgOiBtRm9ybWF0OwpAQCAtMjU3MywxNCArMjg4OCwxNCBAQAogCiAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSBtQ3VycmVudFdyaXRlTGVuZ3RoOwogICAgICAgICAgICAgaWYgKGlzU3VzcGVuZGVkKCkpIHsKLSAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSBzdXNwZW5kU2xlZXBUaW1lVXMoKTsKKyAgICAgICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSBzdXNwZW5kU2xlZXBUaW1lVXMoKTsKICAgICAgICAgICAgICAgICAvLyBzaW11bGF0ZSB3cml0ZSB0byBIQUwgd2hlbiBzdXNwZW5kZWQKICAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuICs9IG1TaW5rQnVmZmVyU2l6ZTsKICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSAwOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBvbmx5IHByb2Nlc3MgZWZmZWN0cyBpZiB3ZSdyZSBnb2luZyB0byB3cml0ZQotICAgICAgICAgICAgaWYgKHNsZWVwVGltZSA9PSAwICYmIG1UeXBlICE9IE9GRkxPQUQpIHsKKyAgICAgICAgICAgIGlmIChtU2xlZXBUaW1lVXMgPT0gMCAmJiBtVHlwZSAhPSBPRkZMT0FEKSB7CiAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RDaGFpbnMuc2l6ZSgpOyBpICsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGVmZmVjdENoYWluc1tpXS0+cHJvY2Vzc19sKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjU5OSw3ICsyOTE0LDcgQEAKICAgICAgICAgLy8gT25seSBpZiB0aGUgRWZmZWN0cyBidWZmZXIgaXMgZW5hYmxlZCBhbmQgdGhlcmUgaXMgZGF0YSBpbiB0aGUKICAgICAgICAgLy8gRWZmZWN0cyBidWZmZXIgKGJ1ZmZlciB2YWxpZCksIHdlIG5lZWQgdG8KICAgICAgICAgLy8gY29weSBpbnRvIHRoZSBzaW5rIGJ1ZmZlci4KLSAgICAgICAgLy8gVE9ETyB1c2Ugc2xlZXBUaW1lID09IDAgYXMgYW4gYWRkaXRpb25hbCBjb25kaXRpb24uCisgICAgICAgIC8vIFRPRE8gdXNlIG1TbGVlcFRpbWVVcyA9PSAwIGFzIGFuIGFkZGl0aW9uYWwgY29uZGl0aW9uLgogICAgICAgICBpZiAobUVmZmVjdEJ1ZmZlclZhbGlkKSB7CiAgICAgICAgICAgICAvL0FMT0dWKCJ3cml0aW5nIGVmZmVjdCBidWZmZXIgdG8gc2luayBidWZmZXIgZm9ybWF0ICUjeCIsIG1Gb3JtYXQpOwogICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChtU2lua0J1ZmZlciwgbUZvcm1hdCwgbUVmZmVjdEJ1ZmZlciwgbUVmZmVjdEJ1ZmZlckZvcm1hdCwKQEAgLTI2MTAsMTAgKzI5MjUsMTEgQEAKICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CiAKICAgICAgICAgaWYgKCF3YWl0aW5nQXN5bmNDYWxsYmFjaygpKSB7Ci0gICAgICAgICAgICAvLyBzbGVlcFRpbWUgPT0gMCBtZWFucyB3ZSBtdXN0IHdyaXRlIHRvIGF1ZGlvIGhhcmR3YXJlCi0gICAgICAgICAgICBpZiAoc2xlZXBUaW1lID09IDApIHsKKyAgICAgICAgICAgIC8vIG1TbGVlcFRpbWVVcyA9PSAwIG1lYW5zIHdlIG11c3Qgd3JpdGUgdG8gYXVkaW8gaGFyZHdhcmUKKyAgICAgICAgICAgIGlmIChtU2xlZXBUaW1lVXMgPT0gMCkgeworICAgICAgICAgICAgICAgIHNzaXplX3QgcmV0ID0gMDsKICAgICAgICAgICAgICAgICBpZiAobUJ5dGVzUmVtYWluaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNzaXplX3QgcmV0ID0gdGhyZWFkTG9vcF93cml0ZSgpOworICAgICAgICAgICAgICAgICAgICByZXQgPSB0aHJlYWRMb29wX3dyaXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSAwOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjYyNCwxMSArMjk0MCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9EUkFJTl9BTEwpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocmVhZExvb3BfZHJhaW4oKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSKSB7CisgICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSICYmICFtU3RhbmRieSkgewogICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBibG9ja2VkIGRldGVjdGlvbgogICAgICAgICAgICAgICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBkZWx0YSA9IG5vdyAtIG1MYXN0V3JpdGVUaW1lOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIGRlbHRhID4gbWF4UGVyaW9kKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+IG1heFBlcmlvZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbU51bURlbGF5ZWRXcml0ZXMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobm93IC0gbGFzdFdhcm5pbmcpID4ga1dhcm5pbmdUaHJvdHRsZU5zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRSQUNFX05BTUUoInVuZGVycnVuIik7CkBAIC0yNjM3LDEwICsyOTUzLDQ4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdhcm5pbmcgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobVRocmVhZFRocm90dGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19SRUFEWSAvLyB3ZSBhcmUgbWl4aW5nIChhY3RpdmUgdHJhY2tzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJldCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd3JvdGUgc29tZXRoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBMaW1pdCBNaXhlclRocmVhZCBkYXRhIHByb2Nlc3NpbmcgdG8gbm8gbW9yZSB0aGFuIHR3aWNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQgcHJvY2Vzc2luZyByYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaGVscHMgcHJldmVudCB1bmRlcnJ1bnMgd2l0aCBOdVBsYXllciBhbmQgb3RoZXIgYXBwbGljYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBtYXkgc2V0IHVwIGJ1ZmZlcnMgdGhhdCBhcmUgY2xvc2UgdG8gdGhlIG1pbmltdW0gc2l6ZSwgb3IgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWVwIGJ1ZmZlcnMsIGFuZCByZWx5IG9uIGEgZG91YmxlLWJ1ZmZlcmluZyBzbGVlcCBzdHJhdGVneSB0byBmaWxsLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB0aHJvdHRsZSBzbW9vdGhzIG91dCBzdWRkZW4gbGFyZ2UgZGF0YSBkcmFpbnMgZnJvbSB0aGUgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiB3aGVuIGl0IGNvbWVzIG91dCBvZiBzdGFuZGJ5LCB3aGljaCBvZnRlbiBjYXVzZXMgcHJvYmxlbXMgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gKDEpIG1peGVyIHRocmVhZHMgd2l0aG91dCBhIGZhc3QgbWl4ZXIgKHdoaWNoIGhhcyBpdHMgb3duIHdhcm0tdXApCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAoMikgbWluaW11bSBidWZmZXIgc2l6ZWQgdHJhY2tzIChldmVuIGlmIHRoZSB0cmFjayBpcyBmdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoZSBhcHAgd29uJ3QgZmlsbCBmYXN0IGVub3VnaCB0byBoYW5kbGUgdGhlIHN1ZGRlbiBkcmF3KS4KKworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkZWx0YU1zID0gZGVsdGEgLyAxMDAwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCB0aHJvdHRsZU1zID0gbUhhbGZCdWZmZXJNcyAtIGRlbHRhTXM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNpZ25lZCltSGFsZkJ1ZmZlck1zID49IHRocm90dGxlTXMgJiYgdGhyb3R0bGVNcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2xlZXAodGhyb3R0bGVNcyAqIDEwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBvZiB0aHJvdHRsZSBzdGFydCBvbiB2ZXJib3NlIGxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWX0lGKG1UaHJlYWRUaHJvdHRsZUVuZE1zID09IG1UaHJlYWRUaHJvdHRsZVRpbWVNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaXhlciglcCkgdGhyb3R0bGUgYmVnaW46IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXQoJXpkKSBkZWx0YU1zKCVkKSByZXF1aXJlcyBzbGVlcCAlZCBtcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCByZXQsIGRlbHRhTXMsIHRocm90dGxlTXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRUaHJvdHRsZVRpbWVNcyArPSB0aHJvdHRsZU1zOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaWZmID0gbVRocmVhZFRocm90dGxlVGltZU1zIC0gbVRocmVhZFRocm90dGxlRW5kTXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBvZiB0aHJvdHRsZSBlbmQgb24gZGVidWcgbG9nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJtaXhlciglcCkgdGhyb3R0bGUgZW5kOiB0aHJvdHRsZSB0aW1lKCV1KSIsIHRoaXMsIGRpZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkVGhyb3R0bGVFbmRNcyA9IG1UaHJlYWRUaHJvdHRsZVRpbWVNczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXNsZWVwKHNsZWVwVGltZSk7CisgICAgICAgICAgICAgICAgQVRSQUNFX0JFR0lOKCJzbGVlcCIpOworICAgICAgICAgICAgICAgIHVzbGVlcChtU2xlZXBUaW1lVXMpOworICAgICAgICAgICAgICAgIEFUUkFDRV9FTkQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yNzExLDggKzMwNjUsNyBAQAogICAgIGlmICgobVR5cGUgPT0gT0ZGTE9BRCB8fCBtVHlwZSA9PSBESVJFQ1QpCiAgICAgICAgICAgICAmJiBtT3V0cHV0ICE9IE5VTEwgJiYgbU91dHB1dC0+c3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKSB7CiAgICAgICAgIHVpbnQ2NF90IHBvc2l0aW9uNjQ7Ci0gICAgICAgIGludCByZXQgPSBtT3V0cHV0LT5zdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0sICZwb3NpdGlvbjY0LCAmdGltZXN0YW1wLm1UaW1lKTsKKyAgICAgICAgaW50IHJldCA9IG1PdXRwdXQtPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKCZwb3NpdGlvbjY0LCAmdGltZXN0YW1wLm1UaW1lKTsKICAgICAgICAgaWYgKHJldCA9PSAwKSB7CiAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gKHVpbnQzMl90KXBvc2l0aW9uNjQ7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC0yNzIxLDIxICszMDc0LDgzIEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIC8vIGlmICEmSURMRSwgaG9sZHMgdGhlIEZhc3RNaXhlciBzdGF0ZSB0byByZXN0b3JlIGFmdGVyIG5ldyBwYXJhbWV0ZXJzIHByb2Nlc3NlZAorICAgIEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIHByZXZpb3VzQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRTsKKyAgICBpZiAobUZhc3RNaXhlciAhPSAwKSB7CisgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKKyAgICAgICAgRmFzdE1peGVyU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CisgICAgICAgIGlmICghKHN0YXRlLT5tQ29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpJRExFKSkgeworICAgICAgICAgICAgcHJldmlvdXNDb21tYW5kID0gc3RhdGUtPm1Db21tYW5kOworICAgICAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdE1peGVyU3RhdGU6OkhPVF9JRExFOworICAgICAgICAgICAgc3EtPmVuZCgpOworICAgICAgICAgICAgc3EtPnB1c2goRmFzdE1peGVyU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfQUNLRUQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3EtPmVuZChmYWxzZSAvKmRpZE1vZGlmeSovKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBQbGF5YmFja1RocmVhZDo6Y3JlYXRlQXVkaW9QYXRjaF9sKHBhdGNoLCBoYW5kbGUpOworCisgICAgaWYgKCEocHJldmlvdXNDb21tYW5kICYgRmFzdE1peGVyU3RhdGU6OklETEUpKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKG1GYXN0TWl4ZXIgIT0gMCk7CisgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKKyAgICAgICAgRmFzdE1peGVyU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CisgICAgICAgIEFMT0dfQVNTRVJUKHN0YXRlLT5tQ29tbWFuZCA9PSBGYXN0TWl4ZXJTdGF0ZTo6SE9UX0lETEUpOworICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBwcmV2aW91c0NvbW1hbmQ7CisgICAgICAgIHNxLT5lbmQoKTsKKyAgICAgICAgc3EtPnB1c2goRmFzdE1peGVyU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfUFVTSEVEKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGlmIChtT3V0cHV0LT5hdWRpb0h3RGV2LT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICAvLyBzdG9yZSBuZXcgZGV2aWNlIGFuZCBzZW5kIHRvIGVmZmVjdHMKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKLSAgICAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKLSAgICAgICAgfQotICAgICAgICBtT3V0RGV2aWNlID0gdHlwZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtT3V0RGV2aWNlKTsKKworICAgIC8vIHN0b3JlIG5ldyBkZXZpY2UgYW5kIHNlbmQgdG8gZWZmZWN0cworICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgdHlwZSB8PSBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlOworICAgIH0KKworI2lmZGVmIEFERF9CQVRURVJZX0RBVEEKKyAgICAvLyB3aGVuIGNoYW5naW5nIHRoZSBhdWRpbyBvdXRwdXQgZGV2aWNlLCBjYWxsIGFkZEJhdHRlcnlEYXRhIHRvIG5vdGlmeQorICAgIC8vIHRoZSBjaGFuZ2UKKyAgICBpZiAobU91dERldmljZSAhPSB0eXBlKSB7CisgICAgICAgIHVpbnQzMl90IHBhcmFtcyA9IDA7CisgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgc3BlYWtlciBpcyBvbgorICAgICAgICBpZiAodHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgeworICAgICAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVNwZWFrZXJPbjsKICAgICAgICAgfQogCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VXaXRob3V0U3BlYWtlcgorICAgICAgICAgICAgPSBBVURJT19ERVZJQ0VfT1VUX0FMTCAmIH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIC8vIGNoZWNrIGlmIGFueSBvdGhlciBkZXZpY2UgKGV4Y2VwdCBzcGVha2VyKSBpcyBvbgorICAgICAgICBpZiAodHlwZSAmIGRldmljZVdpdGhvdXRTcGVha2VyKSB7CisgICAgICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhT3RoZXJBdWRpb0RldmljZU9uOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcmFtcyAhPSAwKSB7CisgICAgICAgICAgICBhZGRCYXR0ZXJ5RGF0YShwYXJhbXMpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wodHlwZSk7CisgICAgfQorCisgICAgLy8gbVByZXZPdXREZXZpY2UgaXMgdGhlIGxhdGVzdCBkZXZpY2Ugc2V0IGJ5IGNyZWF0ZUF1ZGlvUGF0Y2hfbCgpLiBJdCBpcyBub3Qgc2V0IHdoZW4KKyAgICAvLyB0aGUgdGhyZWFkIGlzIGNyZWF0ZWQgc28gdGhhdCB0aGUgZmlyc3QgcGF0Y2ggY3JlYXRpb24gdHJpZ2dlcnMgYW4gaW9Db25maWdDaGFuZ2VkIGNhbGxiYWNrCisgICAgYm9vbCBjb25maWdDaGFuZ2VkID0gbVByZXZPdXREZXZpY2UgIT0gdHlwZTsKKyAgICBtT3V0RGV2aWNlID0gdHlwZTsKKyAgICBtUGF0Y2ggPSAqcGF0Y2g7CisKKyAgICBpZiAobU91dHB1dC0+YXVkaW9Id0Rldi0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gbU91dHB1dC0+YXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsKICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPmNyZWF0ZV9hdWRpb19wYXRjaChod0RldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzLApAQCAtMjc0NCwxOSArMzE1OSw3NSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJjcmVhdGVBdWRpb1BhdGNoX2woKSBjYWxsZWQgb24gYSBwcmUgMy4wIEhBTCIpOworICAgICAgICBjaGFyICphZGRyZXNzOworICAgICAgICBpZiAoc3RyY21wKHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MsICIiKSAhPSAwKSB7CisgICAgICAgICAgICAvL0ZJWE1FOiB3ZSBvbmx5IHN1cHBvcnQgYWRkcmVzcyBvbiBmaXJzdCBzaW5rIHdpdGggSEFMIHZlcnNpb24gPCAzLjAKKyAgICAgICAgICAgIGFkZHJlc3MgPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkcmVzcyA9IChjaGFyICopY2FsbG9jKDEsIDEpOworICAgICAgICB9CisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoU3RyaW5nOChhZGRyZXNzKSk7CisgICAgICAgIGZyZWUoYWRkcmVzcyk7CisgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksIChpbnQpdHlwZSk7CisgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICBwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICAgICAgKmhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIH0KKyAgICBpZiAoY29uZmlnQ2hhbmdlZCkgeworICAgICAgICBtUHJldk91dERldmljZSA9IHR5cGU7CisgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6cmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgLy8gaWYgISZJRExFLCBob2xkcyB0aGUgRmFzdE1peGVyIHN0YXRlIHRvIHJlc3RvcmUgYWZ0ZXIgbmV3IHBhcmFtZXRlcnMgcHJvY2Vzc2VkCisgICAgRmFzdE1peGVyU3RhdGU6OkNvbW1hbmQgcHJldmlvdXNDb21tYW5kID0gRmFzdE1peGVyU3RhdGU6OkhPVF9JRExFOworICAgIGlmIChtRmFzdE1peGVyICE9IDApIHsKKyAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdE1peGVyLT5zcSgpOworICAgICAgICBGYXN0TWl4ZXJTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKKyAgICAgICAgaWYgKCEoc3RhdGUtPm1Db21tYW5kICYgRmFzdE1peGVyU3RhdGU6OklETEUpKSB7CisgICAgICAgICAgICBwcmV2aW91c0NvbW1hbmQgPSBzdGF0ZS0+bUNvbW1hbmQ7CisgICAgICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0TWl4ZXJTdGF0ZTo6SE9UX0lETEU7CisgICAgICAgICAgICBzcS0+ZW5kKCk7CisgICAgICAgICAgICBzcS0+cHVzaChGYXN0TWl4ZXJTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9BQ0tFRCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcS0+ZW5kKGZhbHNlIC8qZGlkTW9kaWZ5Ki8pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gUGxheWJhY2tUaHJlYWQ6OnJlbGVhc2VBdWRpb1BhdGNoX2woaGFuZGxlKTsKKworICAgIGlmICghKHByZXZpb3VzQ29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpJRExFKSkgeworICAgICAgICBBTE9HX0FTU0VSVChtRmFzdE1peGVyICE9IDApOworICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0TWl4ZXItPnNxKCk7CisgICAgICAgIEZhc3RNaXhlclN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOworICAgICAgICBBTE9HX0FTU0VSVChzdGF0ZS0+bUNvbW1hbmQgPT0gRmFzdE1peGVyU3RhdGU6OkhPVF9JRExFKTsKKyAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gcHJldmlvdXNDb21tYW5kOworICAgICAgICBzcS0+ZW5kKCk7CisgICAgICAgIHNxLT5wdXNoKEZhc3RNaXhlclN0YXRlUXVldWU6OkJMT0NLX1VOVElMX1BVU0hFRCk7CisgICAgfQorCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBtT3V0RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisKICAgICBpZiAobU91dHB1dC0+YXVkaW9Id0Rldi0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gbU91dHB1dC0+YXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsKICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPnJlbGVhc2VfYXVkaW9fcGF0Y2goaHdEZXZpY2UsIGhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJyZWxlYXNlQXVkaW9QYXRjaF9sKCkgY2FsbGVkIG9uIGEgcHJlIDMuMCBIQUwiKTsKKyAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CisgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksIDApOworICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCisgICAgICAgICAgICAgICAgcGFyYW0udG9TdHJpbmcoKS5zdHJpbmcoKSk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0yNzg0LDggKzMyNTUsOCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpNaXhlclRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB0eXBlX3QgdHlwZSkKLSAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIHR5cGUpLAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSwgdHlwZV90IHR5cGUpCisgICAgOiAgIFBsYXliYWNrVGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgZGV2aWNlLCB0eXBlLCBzeXN0ZW1SZWFkeSksCiAgICAgICAgIC8vIG1BdWRpb01peGVyIGJlbG93CiAgICAgICAgIC8vIG1GYXN0TWl4ZXIgYmVsb3cKICAgICAgICAgbUZhc3RNaXhlckZ1dGV4KDApCkBAIC0yODAwLDYgKzMyNzEsMTIgQEAKICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50KTsKICAgICBtQXVkaW9NaXhlciA9IG5ldyBBdWRpb01peGVyKG1Ob3JtYWxGcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7CiAKKyAgICBpZiAodHlwZSA9PSBEVVBMSUNBVElORykgeworICAgICAgICAvLyBUaGUgRHVwbGljYXRpbmcgdGhyZWFkIHVzZXMgdGhlIEF1ZGlvTWl4ZXIgYW5kIGRlbGl2ZXJzIGRhdGEgdG8gT3V0cHV0VHJhY2tzCisgICAgICAgIC8vIChkb3duc3RyZWFtIE1peGVyVGhyZWFkcykgaW4gRHVwbGljYXRpbmdUaHJlYWQ6OnRocmVhZExvb3Bfd3JpdGUoKS4KKyAgICAgICAgLy8gRG8gbm90IGNyZWF0ZSBvciB1c2UgbUZhc3RNaXhlciwgbU91dHB1dFNpbmssIG1QaXBlU2luaywgb3IgbU5vcm1hbFNpbmsuCisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgLy8gY3JlYXRlIGFuIE5CQUlPIHNpbmsgZm9yIHRoZSBIQUwgb3V0cHV0IHN0cmVhbSwgYW5kIG5lZ290aWF0ZQogICAgIG1PdXRwdXRTaW5rID0gbmV3IEF1ZGlvU3RyZWFtT3V0U2luayhvdXRwdXQtPnN0cmVhbSk7CiAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwpAQCAtMjg0MSw2ICszMzE4LDcgQEAKICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IG1PdXRwdXRTaW5rLT5mb3JtYXQoKTsKICAgICAgICAgTkJBSU9fRm9ybWF0IG9yaWdmb3JtYXQgPSBmb3JtYXQ7CiAgICAgICAgIC8vIGFkanVzdCBmb3JtYXQgdG8gbWF0Y2ggdGhhdCBvZiB0aGUgRmFzdCBNaXhlcgorICAgICAgICBBTE9HVigiZm9ybWF0IGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsIGZvcm1hdC5tRm9ybWF0LCBmYXN0TWl4ZXJGb3JtYXQpOwogICAgICAgICBmb3JtYXQubUZvcm1hdCA9IGZhc3RNaXhlckZvcm1hdDsKICAgICAgICAgZm9ybWF0Lm1GcmFtZVNpemUgPSBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdC5tRm9ybWF0KSAqIGZvcm1hdC5tQ2hhbm5lbENvdW50OwogCkBAIC0yOTExLDExICszMzg5LDcgQEAKICAgICAgICAgLy8gc3RhcnQgdGhlIGZhc3QgbWl4ZXIKICAgICAgICAgbUZhc3RNaXhlci0+cnVuKCJGYXN0TWl4ZXIiLCBQUklPUklUWV9VUkdFTlRfQVVESU8pOwogICAgICAgICBwaWRfdCB0aWQgPSBtRmFzdE1peGVyLT5nZXRUaWQoKTsKLSAgICAgICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eShnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlcik7Ci0gICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgQUxPR1coIlBvbGljeSBTQ0hFRF9GSUZPIHByaW9yaXR5ICVkIGlzIHVuYXZhaWxhYmxlIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGtQcmlvcml0eUZhc3RNaXhlciwgZ2V0cGlkX2NhY2hlZCwgdGlkLCBlcnIpOwotICAgICAgICB9CisgICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIpOwogCiAjaWZkZWYgQVVESU9fV0FUQ0hET0cKICAgICAgICAgLy8gY3JlYXRlIGFuZCBzdGFydCB0aGUgd2F0Y2hkb2cKQEAgLTI5MjMsMTEgKzMzOTcsNyBAQAogICAgICAgICBtQXVkaW9XYXRjaGRvZy0+c2V0RHVtcCgmbUF1ZGlvV2F0Y2hkb2dEdW1wKTsKICAgICAgICAgbUF1ZGlvV2F0Y2hkb2ctPnJ1bigiQXVkaW9XYXRjaGRvZyIsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiAgICAgICAgIHRpZCA9IG1BdWRpb1dhdGNoZG9nLT5nZXRUaWQoKTsKLSAgICAgICAgZXJyID0gcmVxdWVzdFByaW9yaXR5KGdldHBpZF9jYWNoZWQsIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyKTsKLSAgICAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiUG9saWN5IFNDSEVEX0ZJRk8gcHJpb3JpdHkgJWQgaXMgdW5hdmFpbGFibGUgZm9yIHBpZCAlZCB0aWQgJWQ7IGVycm9yICVkIiwKLSAgICAgICAgICAgICAgICAgICAga1ByaW9yaXR5RmFzdE1peGVyLCBnZXRwaWRfY2FjaGVkLCB0aWQsIGVycik7Ci0gICAgICAgIH0KKyAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlcik7CiAjZW5kaWYKIAogICAgIH0KQEAgLTMwMjAsOCArMzQ5MCwxMCBAQAogI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0TWl4ZXJTdGF0ZTo6TUlYX1dSSVRFOworI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKICAgICAgICAgICAgIG1GYXN0TWl4ZXJEdW1wU3RhdGUuaW5jcmVhc2VTYW1wbGluZ04obUF1ZGlvRmxpbmdlci0+aXNMb3dSYW1EZXZpY2UoKSA/Ci0gICAgICAgICAgICAgICAgICAgIEZhc3RNaXhlckR1bXBTdGF0ZTo6a1NhbXBsaW5nTmZvckxvd1JhbURldmljZSA6IEZhc3RNaXhlckR1bXBTdGF0ZTo6a1NhbXBsaW5nTik7CisgICAgICAgICAgICAgICAgRmFzdFRocmVhZER1bXBTdGF0ZTo6a1NhbXBsaW5nTmZvckxvd1JhbURldmljZSA6IEZhc3RUaHJlYWREdW1wU3RhdGU6OmtTYW1wbGluZ04pOworI2VuZGlmCiAgICAgICAgICAgICBzcS0+ZW5kKCk7CiAgICAgICAgICAgICBzcS0+cHVzaChGYXN0TWl4ZXJTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9QVVNIRUQpOwogICAgICAgICAgICAgaWYgKGtVc2VGYXN0TWl4ZXIgPT0gRmFzdE1peGVyX0R5bmFtaWMpIHsKQEAgLTMwODMsNyArMzU1NSw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnRocmVhZExvb3Bfc3RhbmRieSgpCiB7CiAgICAgQUxPR1YoIkF1ZGlvIGhhcmR3YXJlIGVudGVyaW5nIHN0YW5kYnksIG1peGVyICVwLCBzdXNwZW5kIGNvdW50ICVkIiwgdGhpcywgbVN1c3BlbmRlZCk7Ci0gICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1PdXRwdXQtPnN0YW5kYnkoKTsKICAgICBpZiAobVVzZUFzeW5jV3JpdGUgIT0gMCkgewogICAgICAgICAvLyBkaXNjYXJkIGFueSBwZW5kaW5nIGRyYWluIG9yIHdyaXRlIGFjayBieSBpbmNyZW1lbnRpbmcgc2VxdWVuY2UKICAgICAgICAgbVdyaXRlQWNrU2VxdWVuY2UgPSAobVdyaXRlQWNrU2VxdWVuY2UgKyAyKSAmIH4xOwpAQCAtMzEyNCwxMSArMzU5NiwxMSBAQAogICAgIC8vIE9ubHkgaW5jcmVhc2Ugc2xlZXAgdGltZSBpZiB0aGUgbWl4ZXIgaXMgcmVhZHkgZm9yIHR3byBjb25zZWN1dGl2ZSB0aW1lcyB0byBhdm9pZAogICAgIC8vIHRoYXQgYSBzdGVhZHkgc3RhdGUgb2YgYWx0ZXJuYXRpbmcgcmVhZHkvbm90IHJlYWR5IGNvbmRpdGlvbnMga2VlcHMgdGhlIHNsZWVwIHRpbWUKICAgICAvLyBzdWNoIHRoYXQgd2Ugd291bGQgdW5kZXJydW4gdGhlIGF1ZGlvIEhBTC4KLSAgICBpZiAoKHNsZWVwVGltZSA9PSAwKSAmJiAoc2xlZXBUaW1lU2hpZnQgPiAwKSkgeworICAgIGlmICgobVNsZWVwVGltZVVzID09IDApICYmIChzbGVlcFRpbWVTaGlmdCA+IDApKSB7CiAgICAgICAgIHNsZWVwVGltZVNoaWZ0LS07CiAgICAgfQotICAgIHNsZWVwVGltZSA9IDA7Ci0gICAgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBzdGFuZGJ5RGVsYXk7CisgICAgbVNsZWVwVGltZVVzID0gMDsKKyAgICBtU3RhbmRieVRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1TdGFuZGJ5RGVsYXlOczsKICAgICAvL1RPRE86IGRlbGF5IHN0YW5kYnkgd2hlbiBlZmZlY3RzIGhhdmUgYSB0YWlsCiAKIH0KQEAgLTMxMzcsMTEgKzM2MDksMTEgQEAKIHsKICAgICAvLyBJZiBubyB0cmFja3MgYXJlIHJlYWR5LCBzbGVlcCBvbmNlIGZvciB0aGUgZHVyYXRpb24gb2YgYW4gb3V0cHV0CiAgICAgLy8gYnVmZmVyIHNpemUsIHRoZW4gd3JpdGUgMHMgdG8gdGhlIG91dHB1dAotICAgIGlmIChzbGVlcFRpbWUgPT0gMCkgeworICAgIGlmIChtU2xlZXBUaW1lVXMgPT0gMCkgewogICAgICAgICBpZiAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSB7Ci0gICAgICAgICAgICBzbGVlcFRpbWUgPSBhY3RpdmVTbGVlcFRpbWUgPj4gc2xlZXBUaW1lU2hpZnQ7Ci0gICAgICAgICAgICBpZiAoc2xlZXBUaW1lIDwga01pblRocmVhZFNsZWVwVGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgc2xlZXBUaW1lID0ga01pblRocmVhZFNsZWVwVGltZVVzOworICAgICAgICAgICAgbVNsZWVwVGltZVVzID0gbUFjdGl2ZVNsZWVwVGltZVVzID4+IHNsZWVwVGltZVNoaWZ0OworICAgICAgICAgICAgaWYgKG1TbGVlcFRpbWVVcyA8IGtNaW5UaHJlYWRTbGVlcFRpbWVVcykgeworICAgICAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IGtNaW5UaHJlYWRTbGVlcFRpbWVVczsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIHJlZHVjZSBzbGVlcCB0aW1lIGluIGNhc2Ugb2YgY29uc2VjdXRpdmUgYXBwbGljYXRpb24gdW5kZXJydW5zIHRvIGF2b2lkCiAgICAgICAgICAgICAvLyBzdGFydmluZyB0aGUgYXVkaW8gSEFMLiBBcyBhY3RpdmVTbGVlcFRpbWVVcygpIGlzIGxhcmdlciB0aGFuIGEgYnVmZmVyCkBAIC0zMTUxLDcgKzM2MjMsNyBAQAogICAgICAgICAgICAgICAgIHNsZWVwVGltZVNoaWZ0Kys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lOworICAgICAgICAgICAgbVNsZWVwVGltZVVzID0gbUlkbGVTbGVlcFRpbWVVczsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobUJ5dGVzV3JpdHRlbiAhPSAwIHx8IChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpKSB7CiAgICAgICAgIC8vIGNsZWFyIG91dCBtTWl4ZXJCdWZmZXIgb3IgbVNpbmtCdWZmZXIsIHRvIGVuc3VyZSBidWZmZXJzIGFyZSBjbGVhcmVkCkBAIC0zMTYxLDcgKzM2MzMsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtU2lua0J1ZmZlclNpemUpOwogICAgICAgICB9Ci0gICAgICAgIHNsZWVwVGltZSA9IDA7CisgICAgICAgIG1TbGVlcFRpbWVVcyA9IDA7CiAgICAgICAgIEFMT0dWX0lGKG1CeXRlc1dyaXR0ZW4gPT0gMCAmJiAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSwKICAgICAgICAgICAgICAgICAiYW50aWNpcGF0ZWQgc3RhcnQiKTsKICAgICB9CkBAIC0zMzgyLDIyICszODU0LDE2IEBACiAgICAgICAgIC8vIGhlbmNlIHRoZSB0ZXN0IG9uIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZKSBtZWFuaW5nIHRoZSB0cmFjayB3YXMgbWl4ZWQKICAgICAgICAgLy8gZHVyaW5nIGxhc3Qgcm91bmQKICAgICAgICAgc2l6ZV90IGRlc2lyZWRGcmFtZXM7Ci0gICAgICAgIHVpbnQzMl90IHNyID0gdHJhY2stPnNhbXBsZVJhdGUoKTsKLSAgICAgICAgaWYgKHNyID09IG1TYW1wbGVSYXRlKSB7Ci0gICAgICAgICAgICBkZXNpcmVkRnJhbWVzID0gbU5vcm1hbEZyYW1lQ291bnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyArMSBmb3Igcm91bmRpbmcgYW5kICsxIGZvciBhZGRpdGlvbmFsIHNhbXBsZSBuZWVkZWQgZm9yIGludGVycG9sYXRpb24KLSAgICAgICAgICAgIGRlc2lyZWRGcmFtZXMgPSAobU5vcm1hbEZyYW1lQ291bnQgKiBzcikgLyBtU2FtcGxlUmF0ZSArIDEgKyAxOwotICAgICAgICAgICAgLy8gYWRkIGZyYW1lcyBhbHJlYWR5IGNvbnN1bWVkIGJ1dCBub3QgeWV0IHJlbGVhc2VkIGJ5IHRoZSByZXNhbXBsZXIKLSAgICAgICAgICAgIC8vIGJlY2F1c2UgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHkoKSB3aWxsIGluY2x1ZGUgdGhlc2UgZnJhbWVzCi0gICAgICAgICAgICBkZXNpcmVkRnJhbWVzICs9IG1BdWRpb01peGVyLT5nZXRVbnJlbGVhc2VkRnJhbWVzKHRyYWNrLT5uYW1lKCkpOwotI2lmIDAKLSAgICAgICAgICAgIC8vIHRoZSBtaW5pbXVtIHRyYWNrIGJ1ZmZlciBzaXplIGlzIG5vcm1hbGx5IHR3aWNlIHRoZSBudW1iZXIgb2YgZnJhbWVzIG5lY2Vzc2FyeQotICAgICAgICAgICAgLy8gdG8gZmlsbCBvbmUgYnVmZmVyIGFuZCB0aGUgcmVzYW1wbGVyIHNob3VsZCBub3QgbGVhdmUgbW9yZSB0aGFuIG9uZSBidWZmZXIgd29ydGgKLSAgICAgICAgICAgIC8vIG9mIHVucmVsZWFzZWQgZnJhbWVzIGFmdGVyIGVhY2ggcGFzcywgYnV0IGp1c3QgaW4gY2FzZS4uLgotICAgICAgICAgICAgQUxPR19BU1NFUlQoZGVzaXJlZEZyYW1lcyA8PSBjYmxrLT5mcmFtZUNvdW50Xyk7Ci0jZW5kaWYKLSAgICAgICAgfQorICAgICAgICBjb25zdCB1aW50MzJfdCBzYW1wbGVSYXRlID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFNhbXBsZVJhdGUoKTsKKyAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgcGxheWJhY2tSYXRlID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFBsYXliYWNrUmF0ZSgpOworCisgICAgICAgIGRlc2lyZWRGcmFtZXMgPSBzb3VyY2VGcmFtZXNOZWVkZWRXaXRoVGltZXN0cmV0Y2goCisgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgbU5vcm1hbEZyYW1lQ291bnQsIG1TYW1wbGVSYXRlLCBwbGF5YmFja1JhdGUubVNwZWVkKTsKKyAgICAgICAgLy8gVE9ETzogT05MWSBVU0VEIEZPUiBMRUdBQ1kgUkVTQU1QTEVSUywgcmVtb3ZlIHdoZW4gdGhleSBhcmUgcmVtb3ZlZC4KKyAgICAgICAgLy8gYWRkIGZyYW1lcyBhbHJlYWR5IGNvbnN1bWVkIGJ1dCBub3QgeWV0IHJlbGVhc2VkIGJ5IHRoZSByZXNhbXBsZXIKKyAgICAgICAgLy8gYmVjYXVzZSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWFkeSgpIHdpbGwgaW5jbHVkZSB0aGVzZSBmcmFtZXMKKyAgICAgICAgZGVzaXJlZEZyYW1lcyArPSBtQXVkaW9NaXhlci0+Z2V0VW5yZWxlYXNlZEZyYW1lcyh0cmFjay0+bmFtZSgpKTsKKwogICAgICAgICB1aW50MzJfdCBtaW5GcmFtZXMgPSAxOwogICAgICAgICBpZiAoKHRyYWNrLT5zaGFyZWRCdWZmZXIoKSA9PSAwKSAmJiAhdHJhY2stPmlzU3RvcHBlZCgpICYmICF0cmFjay0+aXNQYXVzaW5nKCkgJiYKICAgICAgICAgICAgICAgICAobU1peGVyU3RhdHVzSWdub3JpbmdGYXN0VHJhY2tzID09IE1JWEVSX1RSQUNLU19SRUFEWSkpIHsKQEAgLTM0MDUsNiArMzg3MSwyMyBAQAogICAgICAgICB9CiAKICAgICAgICAgc2l6ZV90IGZyYW1lc1JlYWR5ID0gdHJhY2stPmZyYW1lc1JlYWR5KCk7CisgICAgICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7CisgICAgICAgICAgICAvLyBJIHdpc2ggd2UgaGFkIGZvcm1hdHRlZCB0cmFjZSBuYW1lcworICAgICAgICAgICAgY2hhciB0cmFjZU5hbWVbMTZdOworICAgICAgICAgICAgc3RyY3B5KHRyYWNlTmFtZSwgIm5SZHkiKTsKKyAgICAgICAgICAgIGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKKyAgICAgICAgICAgIGlmIChBdWRpb01peGVyOjpUUkFDSzAgPD0gbmFtZSAmJgorICAgICAgICAgICAgICAgICAgICBuYW1lIDwgKGludCkgKEF1ZGlvTWl4ZXI6OlRSQUNLMCArIEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fVFJBQ0tTKSkgeworICAgICAgICAgICAgICAgIG5hbWUgLT0gQXVkaW9NaXhlcjo6VFJBQ0swOworICAgICAgICAgICAgICAgIHRyYWNlTmFtZVs0XSA9IChuYW1lIC8gMTApICsgJzAnOworICAgICAgICAgICAgICAgIHRyYWNlTmFtZVs1XSA9IChuYW1lICUgMTApICsgJzAnOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFjZU5hbWVbNF0gPSAnPyc7CisgICAgICAgICAgICAgICAgdHJhY2VOYW1lWzVdID0gJz8nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2VOYW1lWzZdID0gJ1wwJzsKKyAgICAgICAgICAgIEFUUkFDRV9JTlQodHJhY2VOYW1lLCBmcmFtZXNSZWFkeSk7CisgICAgICAgIH0KICAgICAgICAgaWYgKChmcmFtZXNSZWFkeSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkKICAgICAgICAgewpAQCAtMzU0Myw2ICs0MDI2LDE0IEBACiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsCiAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KXJlcVNhbXBsZVJhdGUpOworCisgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBwbGF5YmFja1JhdGUgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0UGxheWJhY2tSYXRlKCk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VElNRVNUUkVUQ0gsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UExBWUJBQ0tfUkFURSwKKyAgICAgICAgICAgICAgICAmcGxheWJhY2tSYXRlKTsKKwogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlIHRyYWNrLgogICAgICAgICAgICAgICoKQEAgLTM1OTUsNiArNDA4Niw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkgPCBkZXNpcmVkRnJhbWVzICYmICF0cmFjay0+aXNTdG9wcGVkKCkgJiYgIXRyYWNrLT5pc1BhdXNlZCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInRyYWNrKCVwKSB1bmRlcnJ1biwgIGZyYW1lc1JlYWR5KCV6dSkgPCBmcmFtZXNEZXNpcmVkKCV6ZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2ssIGZyYW1lc1JlYWR5LCBkZXNpcmVkRnJhbWVzKTsKICAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcyhkZXNpcmVkRnJhbWVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGNsZWFyIGVmZmVjdCBjaGFpbiBpbnB1dCBidWZmZXIgaWYgYW4gYWN0aXZlIHRyYWNrIHVuZGVycnVucyB0byBhdm9pZCBzZW5kaW5nCkBAIC0zODEyLDcgKzQzMDUsNyBAQAogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVdpdGhvdXRTcGVha2VyCiAgICAgICAgICAgICAgICAgPSBBVURJT19ERVZJQ0VfT1VUX0FMTCAmIH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CiAgICAgICAgICAgICAvLyBjaGVjayBpZiBhbnkgb3RoZXIgZGV2aWNlIChleGNlcHQgc3BlYWtlcikgaXMgb24KLSAgICAgICAgICAgIGlmICh2YWx1ZSAmIGRldmljZVdpdGhvdXRTcGVha2VyICkgeworICAgICAgICAgICAgaWYgKHZhbHVlICYgZGV2aWNlV2l0aG91dFNwZWFrZXIpIHsKICAgICAgICAgICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhT3RoZXJBdWRpb0RldmljZU9uOwogICAgICAgICAgICAgfQogCkBAIC0zODM2LDcgKzQzMjksNyBAQAogICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwogICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgewotICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgICAgICAgICAgbU91dHB1dC0+c3RhbmRieSgpOwogICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7CiAgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCkBAIC0zODU0LDcgKzQzNDcsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtVHJhY2tzW2ldLT5tTmFtZSA9IG5hbWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ09ORklHX0NIQU5HRUQpOworICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zODc5LDcgKzQzNzIsNyBAQAogICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgUGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOwotCisgICAgZHByaW50ZihmZCwgIiAgVGhyZWFkIHRocm90dGxlIHRpbWUgKG1zZWNzKTogJXVcbiIsIG1UaHJlYWRUaHJvdHRsZVRpbWVNcyk7CiAgICAgZHByaW50ZihmZCwgIiAgQXVkaW9NaXhlciB0cmFja3M6IDB4JTA4eFxuIiwgbUF1ZGlvTWl4ZXItPnRyYWNrTmFtZXMoKSk7CiAKICAgICAvLyBNYWtlIGEgbm9uLWF0b21pYyBjb3B5IG9mIGZhc3QgbWl4ZXIgZHVtcCBzdGF0ZSBzbyBpdCB3b24ndCBjaGFuZ2UgdW5kZXJuZWF0aCB1cwpAQCAtMzkzMiwxNiArNDQyNSwxNiBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6RGlyZWN0T3V0cHV0VGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKLSAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi0gICAgOiAgIFBsYXliYWNrVGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgZGV2aWNlLCBESVJFQ1QpCisgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQorICAgIDogICBQbGF5YmFja1RocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSwgRElSRUNULCBzeXN0ZW1SZWFkeSkKICAgICAgICAgLy8gbUxlZnRWb2xGbG9hdCwgbVJpZ2h0Vm9sRmxvYXQKIHsKIH0KIAogQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OkRpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCiAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UsCi0gICAgICAgIFRocmVhZEJhc2U6OnR5cGVfdCB0eXBlKQotICAgIDogICBQbGF5YmFja1RocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSwgdHlwZSkKKyAgICAgICAgVGhyZWFkQmFzZTo6dHlwZV90IHR5cGUsIGJvb2wgc3lzdGVtUmVhZHkpCisgICAgOiAgIFBsYXliYWNrVGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgZGV2aWNlLCB0eXBlLCBzeXN0ZW1SZWFkeSkKICAgICAgICAgLy8gbUxlZnRWb2xGbG9hdCwgbVJpZ2h0Vm9sRmxvYXQKIHsKIH0KQEAgLTM5OTgsNiArNDQ5MSwyNCBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6b25BZGROZXdUcmFja19sKCkKK3sKKyAgICBzcDxUcmFjaz4gcHJldmlvdXNUcmFjayA9IG1QcmV2aW91c1RyYWNrLnByb21vdGUoKTsKKyAgICBzcDxUcmFjaz4gbGF0ZXN0VHJhY2sgPSBtTGF0ZXN0QWN0aXZlVHJhY2sucHJvbW90ZSgpOworCisgICAgaWYgKHByZXZpb3VzVHJhY2sgIT0gMCAmJiBsYXRlc3RUcmFjayAhPSAwKSB7CisgICAgICAgIGlmIChtVHlwZSA9PSBESVJFQ1QpIHsKKyAgICAgICAgICAgIGlmIChwcmV2aW91c1RyYWNrLmdldCgpICE9IGxhdGVzdFRyYWNrLmdldCgpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSAvKiBtVHlwZSA9PSBPRkZMT0FEICovIHsKKyAgICAgICAgICAgIGlmIChwcmV2aW91c1RyYWNrLT5zZXNzaW9uSWQoKSAhPSBsYXRlc3RUcmFjay0+c2Vzc2lvbklkKCkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBQbGF5YmFja1RocmVhZDo6b25BZGROZXdUcmFja19sKCk7Cit9CiAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Om1peGVyX3N0YXRlIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woCiAgICAgVmVjdG9yPCBzcDxUcmFjaz4gPiAqdHJhY2tzVG9SZW1vdmUKQEAgLTQwMDcsNyArNDUxOCw2IEBACiAgICAgbWl4ZXJfc3RhdGUgbWl4ZXJTdGF0dXMgPSBNSVhFUl9JRExFOwogICAgIGJvb2wgZG9Id1BhdXNlID0gZmFsc2U7CiAgICAgYm9vbCBkb0h3UmVzdW1lID0gZmFsc2U7Ci0gICAgYm9vbCBmbHVzaFBlbmRpbmcgPSBmYWxzZTsKIAogICAgIC8vIGZpbmQgb3V0IHdoaWNoIHRyYWNrcyBuZWVkIHRvIGJlIHByb2Nlc3NlZAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewpAQCAtNDAxNyw2ICs0NTI3LDEyIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCisgICAgICAgIGlmICh0LT5pc0ludmFsaWQoKSkgeworICAgICAgICAgICAgQUxPR1coIkFuIGludmFsaWRhdGVkIHRyYWNrIHNob3VsZG4ndCBiZSBpbiBhY3RpdmUgbGlzdCIpOworICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKICAgICAgICAgVHJhY2sqIGNvbnN0IHRyYWNrID0gdC5nZXQoKTsKICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gdHJhY2stPmNibGsoKTsKICAgICAgICAgLy8gT25seSBjb25zaWRlciBsYXN0IHRyYWNrIHN0YXJ0ZWQgZm9yIHZvbHVtZSBhbmQgbWl4ZXIgc3RhdGUgY29udHJvbC4KQEAgLTQwMjYsOSArNDU0Miw5IEBACiAgICAgICAgIHNwPFRyYWNrPiBsID0gbUxhdGVzdEFjdGl2ZVRyYWNrLnByb21vdGUoKTsKICAgICAgICAgYm9vbCBsYXN0ID0gbC5nZXQoKSA9PSB0cmFjazsKIAotICAgICAgICBpZiAobUh3U3VwcG9ydHNQYXVzZSAmJiB0cmFjay0+aXNQYXVzaW5nKCkpIHsKKyAgICAgICAgaWYgKHRyYWNrLT5pc1BhdXNpbmcoKSkgewogICAgICAgICAgICAgdHJhY2stPnNldFBhdXNlZCgpOwotICAgICAgICAgICAgaWYgKGxhc3QgJiYgIW1Id1BhdXNlZCkgeworICAgICAgICAgICAgaWYgKG1Id1N1cHBvcnRzUGF1c2UgJiYgbGFzdCAmJiAhbUh3UGF1c2VkKSB7CiAgICAgICAgICAgICAgICAgZG9Id1BhdXNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBtSHdQYXVzZWQgPSB0cnVlOwogICAgICAgICAgICAgfQpAQCAtNDAzNiwxNSArNDU1MiwxMyBAQAogICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5pc0ZsdXNoUGVuZGluZygpKSB7CiAgICAgICAgICAgICB0cmFjay0+Zmx1c2hBY2soKTsKICAgICAgICAgICAgIGlmIChsYXN0KSB7Ci0gICAgICAgICAgICAgICAgZmx1c2hQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtSHdTdXBwb3J0c1BhdXNlICYmIHRyYWNrLT5pc1Jlc3VtZVBlbmRpbmcoKSl7CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmlzUmVzdW1lUGVuZGluZygpKSB7CiAgICAgICAgICAgICB0cmFjay0+cmVzdW1lQWNrKCk7Ci0gICAgICAgICAgICBpZiAobGFzdCkgewotICAgICAgICAgICAgICAgIGlmIChtSHdQYXVzZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgZG9Id1Jlc3VtZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXN0ICYmIG1Id1BhdXNlZCkgeworICAgICAgICAgICAgICAgIGRvSHdSZXN1bWUgPSB0cnVlOworICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTQwNTQsOSArNDU2OCwxMCBAQAogICAgICAgICAvLyBhcHAgZG9lcyBub3QgY2FsbCBzdG9wKCkgYW5kIHJlbGllcyBvbiB1bmRlcnJ1biB0byBzdG9wOgogICAgICAgICAvLyBoZW5jZSB0aGUgdGVzdCBvbiAodHJhY2stPm1SZXRyeUNvdW50ID4gMSkuCiAgICAgICAgIC8vIElmIHJldHJ5Q291bnQ8PTEgdGhlbiB0cmFjayBpcyBhYm91dCB0byB1bmRlcnJ1biBhbmQgYmUgcmVtb3ZlZC4KKyAgICAgICAgLy8gRG8gbm90IHVzZSBhIGhpZ2ggdGhyZXNob2xkIGZvciBjb21wcmVzc2VkIGF1ZGlvLgogICAgICAgICB1aW50MzJfdCBtaW5GcmFtZXM7CiAgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpID09IDApICYmICF0cmFjay0+aXNTdG9wcGluZ18xKCkgJiYgIXRyYWNrLT5pc1BhdXNpbmcoKQotICAgICAgICAgICAgJiYgKHRyYWNrLT5tUmV0cnlDb3VudCA+IDEpKSB7CisgICAgICAgICAgICAmJiAodHJhY2stPm1SZXRyeUNvdW50ID4gMSkgJiYgYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgewogICAgICAgICAgICAgbWluRnJhbWVzID0gbU5vcm1hbEZyYW1lQ291bnQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtaW5GcmFtZXMgPSAxOwpAQCAtNDA3OSwxMSArNDU5NCwyMiBAQAogICAgICAgICAgICAgLy8gY29tcHV0ZSB2b2x1bWUgZm9yIHRoaXMgdHJhY2sKICAgICAgICAgICAgIHByb2Nlc3NWb2x1bWVfbCh0cmFjaywgbGFzdCk7CiAgICAgICAgICAgICBpZiAobGFzdCkgeworICAgICAgICAgICAgICAgIHNwPFRyYWNrPiBwcmV2aW91c1RyYWNrID0gbVByZXZpb3VzVHJhY2sucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1RyYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrICE9IHByZXZpb3VzVHJhY2suZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsdXNoIGFueSBkYXRhIHN0aWxsIGJlaW5nIHdyaXR0ZW4gZnJvbSBsYXN0IHRyYWNrCisgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSBwcmV2aW91cyB0cmFjayB0byBmb3JjZSBhIHNlZWsgd2hlbiByZXN1bWluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzVHJhY2stPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUHJldmlvdXNUcmFjayA9IHRyYWNrOworCiAgICAgICAgICAgICAgICAgLy8gcmVzZXQgcmV0cnkgY291bnQKICAgICAgICAgICAgICAgICB0cmFjay0+bVJldHJ5Q291bnQgPSBrTWF4VHJhY2tSZXRyaWVzRGlyZWN0OwogICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjayA9IHQ7CiAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfUkVBRFk7Ci0gICAgICAgICAgICAgICAgaWYgKHVzZXNId0F2U3luYygpICYmIG1Id1BhdXNlZCkgeworICAgICAgICAgICAgICAgIGlmIChtSHdQYXVzZWQpIHsKICAgICAgICAgICAgICAgICAgICAgZG9Id1Jlc3VtZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KQEAgLTQwOTYsNiArNDYyMiwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1N0b3BwaW5nXzEoKSkgewogICAgICAgICAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQSU5HXzI7CisgICAgICAgICAgICAgICAgaWYgKGxhc3QgJiYgbUh3UGF1c2VkKSB7CisgICAgICAgICAgICAgICAgICAgICBkb0h3UmVzdW1lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoKHRyYWNrLT5zaGFyZWRCdWZmZXIoKSAhPSAwKSB8fCB0cmFjay0+aXNTdG9wcGVkKCkgfHwKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmlzU3RvcHBpbmdfMigpIHx8IHRyYWNrLT5pc1BhdXNlZCgpKSB7CkBAIC00MTMwLDggKzQ2NjAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCB0aGVuIGF1dG9tYXRpY2FsbHkgY2FsbCBzdGFydCgpIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19ESVNBQkxFRCwgJmNibGstPm1GbGFncyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJwYXVzZSBiZWNhdXNlIG9mIFVOREVSUlVOLCBmcmFtZXNSZWFkeSA9ICV6dSwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbkZyYW1lcyA9ICV1LCBtRm9ybWF0ID0gJSN4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+ZnJhbWVzUmVhZHkoKSwgbWluRnJhbWVzLCBtRm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfRU5BQkxFRDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXNId0F2U3luYygpICYmICFtSHdQYXVzZWQgJiYgIW1TdGFuZGJ5KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtSHdTdXBwb3J0c1BhdXNlICYmICFtSHdQYXVzZWQgJiYgIW1TdGFuZGJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkb0h3UGF1c2UgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgbUh3UGF1c2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNDE0MSwxMSArNDY3NCwxMSBAQAogICAgIH0KIAogICAgIC8vIGlmIGFuIGFjdGl2ZSB0cmFjayBkaWQgbm90IGNvbW1hbmQgYSBmbHVzaCwgY2hlY2sgZm9yIHBlbmRpbmcgZmx1c2ggb24gc3RvcHBlZCB0cmFja3MKLSAgICBpZiAoIWZsdXNoUGVuZGluZykgeworICAgIGlmICghbUZsdXNoUGVuZGluZykgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGlmIChtVHJhY2tzW2ldLT5pc0ZsdXNoUGVuZGluZygpKSB7CiAgICAgICAgICAgICAgICAgbVRyYWNrc1tpXS0+Zmx1c2hBY2soKTsKLSAgICAgICAgICAgICAgICBmbHVzaFBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNDE1NSwxMCArNDY4OCwxMCBAQAogICAgIC8vIGJlZm9yZSBmbHVzaCBhbmQgdGhlbiByZXN1bWUgSFcuIFRoaXMgY2FuIGhhcHBlbiBpbiBjYXNlIG9mIHBhdXNlL2ZsdXNoL3Jlc3VtZQogICAgIC8vIGlmIHJlc3VtZSBpcyByZWNlaXZlZCBiZWZvcmUgcGF1c2UgaXMgZXhlY3V0ZWQuCiAgICAgaWYgKG1Id1N1cHBvcnRzUGF1c2UgJiYgIW1TdGFuZGJ5ICYmCi0gICAgICAgICAgICAoZG9Id1BhdXNlIHx8IChmbHVzaFBlbmRpbmcgJiYgIW1Id1BhdXNlZCAmJiAoY291bnQgIT0gMCkpKSkgeworICAgICAgICAgICAgKGRvSHdQYXVzZSB8fCAobUZsdXNoUGVuZGluZyAmJiAhbUh3UGF1c2VkICYmIChjb3VudCAhPSAwKSkpKSB7CiAgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+cGF1c2UobU91dHB1dC0+c3RyZWFtKTsKICAgICB9Ci0gICAgaWYgKGZsdXNoUGVuZGluZykgeworICAgIGlmIChtRmx1c2hQZW5kaW5nKSB7CiAgICAgICAgIGZsdXNoSHdfbCgpOwogICAgIH0KICAgICBpZiAobUh3U3VwcG9ydHNQYXVzZSAmJiAhbVN0YW5kYnkgJiYgZG9Id1Jlc3VtZSkgewpAQCAtNDE3OCw4ICs0NzExLDggQEAKICAgICB3aGlsZSAoZnJhbWVDb3VudCkgewogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgYnVmZmVyOwogICAgICAgICBidWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgICAgIG1BY3RpdmVUcmFjay0+Z2V0TmV4dEJ1ZmZlcigmYnVmZmVyKTsKLSAgICAgICAgaWYgKGJ1ZmZlci5yYXcgPT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQWN0aXZlVHJhY2stPmdldE5leHRCdWZmZXIoJmJ1ZmZlcik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgYnVmZmVyLnJhdyA9PSBOVUxMKSB7CiAgICAgICAgICAgICBtZW1zZXQoY3VyQnVmLCAwLCBmcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNDE4OSw4ICs0NzIyLDggQEAKICAgICAgICAgbUFjdGl2ZVRyYWNrLT5yZWxlYXNlQnVmZmVyKCZidWZmZXIpOwogICAgIH0KICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gY3VyQnVmIC0gKGludDhfdCAqKW1TaW5rQnVmZmVyOwotICAgIHNsZWVwVGltZSA9IDA7Ci0gICAgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBzdGFuZGJ5RGVsYXk7CisgICAgbVNsZWVwVGltZVVzID0gMDsKKyAgICBtU3RhbmRieVRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1TdGFuZGJ5RGVsYXlOczsKICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKIH0KIApAQCAtNDE5OCwxOCArNDczMSwxOCBAQAogewogICAgIC8vIGRvIG5vdCB3cml0ZSB0byBIQUwgd2hlbiBwYXVzZWQKICAgICBpZiAobUh3UGF1c2VkIHx8ICh1c2VzSHdBdlN5bmMoKSAmJiBtU3RhbmRieSkpIHsKLSAgICAgICAgc2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZTsKKyAgICAgICAgbVNsZWVwVGltZVVzID0gbUlkbGVTbGVlcFRpbWVVczsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpZiAoc2xlZXBUaW1lID09IDApIHsKKyAgICBpZiAobVNsZWVwVGltZVVzID09IDApIHsKICAgICAgICAgaWYgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCkgewotICAgICAgICAgICAgc2xlZXBUaW1lID0gYWN0aXZlU2xlZXBUaW1lOworICAgICAgICAgICAgbVNsZWVwVGltZVVzID0gbUFjdGl2ZVNsZWVwVGltZVVzOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZTsKKyAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IG1JZGxlU2xlZXBUaW1lVXM7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1CeXRlc1dyaXR0ZW4gIT0gMCAmJiBhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CiAgICAgICAgIG1lbXNldChtU2lua0J1ZmZlciwgMCwgbUZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKLSAgICAgICAgc2xlZXBUaW1lID0gMDsKKyAgICAgICAgbVNsZWVwVGltZVVzID0gMDsKICAgICB9CiB9CiAKQEAgLTQyMTcsMTQgKzQ3NTAsMTMgQEAKIHsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGJvb2wgZmx1c2hQZW5kaW5nID0gZmFsc2U7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgaWYgKG1UcmFja3NbaV0tPmlzRmx1c2hQZW5kaW5nKCkpIHsKICAgICAgICAgICAgICAgICBtVHJhY2tzW2ldLT5mbHVzaEFjaygpOwotICAgICAgICAgICAgICAgIGZsdXNoUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbUZsdXNoUGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGZsdXNoUGVuZGluZykgeworICAgICAgICBpZiAobUZsdXNoUGVuZGluZykgewogICAgICAgICAgICAgZmx1c2hId19sKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC00MjM1LDE0ICs0NzY3LDE3IEBACiBib29sIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpzaG91bGRTdGFuZGJ5X2woKQogewogICAgIGJvb2wgdHJhY2tQYXVzZWQgPSBmYWxzZTsKKyAgICBib29sIHRyYWNrU3RvcHBlZCA9IGZhbHNlOwogCiAgICAgLy8gZG8gbm90IHB1dCB0aGUgSEFMIGluIHN0YW5kYnkgd2hlbiBwYXVzZWQuIEF3ZXNvbWVQbGF5ZXIgY2xlYXIgdGhlIG9mZmxvYWRlZCBBdWRpb1RyYWNrCiAgICAgLy8gYWZ0ZXIgYSB0aW1lb3V0IGFuZCB3ZSB3aWxsIGVudGVyIHN0YW5kYnkgdGhlbi4KICAgICBpZiAobVRyYWNrcy5zaXplKCkgPiAwKSB7CiAgICAgICAgIHRyYWNrUGF1c2VkID0gbVRyYWNrc1ttVHJhY2tzLnNpemUoKSAtIDFdLT5pc1BhdXNlZCgpOworICAgICAgICB0cmFja1N0b3BwZWQgPSBtVHJhY2tzW21UcmFja3Muc2l6ZSgpIC0gMV0tPmlzU3RvcHBlZCgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tzW21UcmFja3Muc2l6ZSgpIC0gMV0tPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OklETEU7CiAgICAgfQogCi0gICAgcmV0dXJuICFtU3RhbmRieSAmJiAhKHRyYWNrUGF1c2VkIHx8ICh1c2VzSHdBdlN5bmMoKSAmJiBtSHdQYXVzZWQpKTsKKyAgICByZXR1cm4gIW1TdGFuZGJ5ICYmICEodHJhY2tQYXVzZWQgfHwgKG1Id1BhdXNlZCAmJiAhdHJhY2tTdG9wcGVkKSk7CiB9CiAKIC8vIGdldFRyYWNrTmFtZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCkBAIC00MjkxLDcgKzQ4MjYsNyBAQAogICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwogICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgewotICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgICAgICAgICAgbU91dHB1dC0+c3RhbmRieSgpOwogICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7CiAgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCkBAIC00Mjk5LDcgKzQ4MzQsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcmVjb25maWcpIHsKICAgICAgICAgICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKTsKLSAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQXVkaW9TeXN0ZW06Ok9VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CisgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQzNDUsMTkgKzQ4ODAsMjEgQEAKIAogICAgIC8vIHVzZSBzaG9ydGVyIHN0YW5kYnkgZGVsYXkgYXMgb24gbm9ybWFsIG91dHB1dCB0byByZWxlYXNlCiAgICAgLy8gaGFyZHdhcmUgcmVzb3VyY2VzIGFzIHNvb24gYXMgcG9zc2libGUKLSAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgewotICAgICAgICBzdGFuZGJ5RGVsYXkgPSBtaWNyb3NlY29uZHMoYWN0aXZlU2xlZXBUaW1lKjIpOworICAgIC8vIG5vIGRlbGF5IG9uIG91dHB1dHMgd2l0aCBIVyBBL1Ygc3luYworICAgIGlmICh1c2VzSHdBdlN5bmMoKSkgeworICAgICAgICBtU3RhbmRieURlbGF5TnMgPSAwOworICAgIH0gZWxzZSBpZiAoKG1UeXBlID09IE9GRkxPQUQpICYmICFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIG1TdGFuZGJ5RGVsYXlOcyA9IGtPZmZsb2FkU3RhbmRieURlbGF5TnM7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RhbmRieURlbGF5ID0ga09mZmxvYWRTdGFuZGJ5RGVsYXlOczsKKyAgICAgICAgbVN0YW5kYnlEZWxheU5zID0gbWljcm9zZWNvbmRzKG1BY3RpdmVTbGVlcFRpbWVVcyoyKTsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmZsdXNoSHdfbCgpCiB7Ci0gICAgaWYgKG1PdXRwdXQtPnN0cmVhbS0+Zmx1c2ggIT0gTlVMTCkgewotICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmZsdXNoKG1PdXRwdXQtPnN0cmVhbSk7Ci0gICAgfQorICAgIG1PdXRwdXQtPmZsdXNoKCk7CiAgICAgbUh3UGF1c2VkID0gZmFsc2U7CisgICAgbUZsdXNoUGVuZGluZyA9IGZhbHNlOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00NDY0LDggKzUwMDEsOCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBBdWRpb0ZsaW5nZXI6Ok9mZmxvYWRUaHJlYWQ6Ok9mZmxvYWRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAotICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBhdWRpb19pb19oYW5kbGVfdCBpZCwgdWludDMyX3QgZGV2aWNlKQotICAgIDogICBEaXJlY3RPdXRwdXRUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIE9GRkxPQUQpLAorICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBhdWRpb19pb19oYW5kbGVfdCBpZCwgdWludDMyX3QgZGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQorICAgIDogICBEaXJlY3RPdXRwdXRUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIE9GRkxPQUQsIHN5c3RlbVJlYWR5KSwKICAgICAgICAgbVBhdXNlZEJ5dGVzUmVtYWluaW5nKDApCiB7CiAgICAgLy9GSVhNRTogbVN0YW5kYnkgc2hvdWxkIGJlIHNldCB0byB0cnVlIGJ5IFRocmVhZEJhc2UgY29uc3RydWN0b3IKQEAgLTQ1MzAsNyArNTA2Nyw3IEBACiAgICAgICAgIGlmICh0cmFjay0+aXNQYXVzaW5nKCkpIHsKICAgICAgICAgICAgIHRyYWNrLT5zZXRQYXVzZWQoKTsKICAgICAgICAgICAgIGlmIChsYXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtSHdQYXVzZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAobUh3U3VwcG9ydHNQYXVzZSAmJiAhbUh3UGF1c2VkKSB7CiAgICAgICAgICAgICAgICAgICAgIGRvSHdQYXVzZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDU2Niw3ICs1MTAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIGFuIGludGVycnVwdGVkIHdyaXRlCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIGVuYWJsZSB3cml0ZSB0byBhdWRpbyBIQUwKLSAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSAwOworICAgICAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IDA7CiAKICAgICAgICAgICAgICAgICAvLyBEbyBub3QgaGFuZGxlIG5ldyBkYXRhIGluIHRoaXMgaXRlcmF0aW9uIGV2ZW4gaWYgdHJhY2stPmZyYW1lc1JlYWR5KCkKICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19FTkFCTEVEOwpAQCAtNDYyNiw4ICs1MTYzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBtb2RpZnkgZHJhaW4gc2VxdWVuY2UgaWYgd2UgYXJlIGFscmVhZHkgZHJhaW5pbmcuIFRoaXMgaGFwcGVucwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiByZXN1bWluZyBmcm9tIHBhdXNlIGFmdGVyIGRyYWluLgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtRHJhaW5TZXF1ZW5jZSAmIDEpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYnlUaW1lID0gc3lzdGVtVGltZSgpICsgc3RhbmRieURlbGF5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnlUaW1lTnMgPSBzeXN0ZW1UaW1lKCkgKyBtU3RhbmRieURlbGF5TnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9EUkFJTl9UUkFDSzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJhaW5TZXF1ZW5jZSArPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNDY0Niw3ICs1MTgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGF1ZGlvSEFMRnJhbWVzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU91dHB1dC0+c3RyZWFtLT5nZXRfbGF0ZW5jeShtT3V0cHV0LT5zdHJlYW0pKm1TYW1wbGVSYXRlKSAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNXcml0dGVuID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuIC8gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKG1PdXRwdXQtPnN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiAvIG1PdXRwdXQtPmdldEZyYW1lU2l6ZSgpOwogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpOwogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CkBAIC00Njc5LDcgKzUyMTYsNiBAQAogICAgIH0KICAgICBpZiAobUZsdXNoUGVuZGluZykgewogICAgICAgICBmbHVzaEh3X2woKTsKLSAgICAgICAgbUZsdXNoUGVuZGluZyA9IGZhbHNlOwogICAgIH0KICAgICBpZiAoIW1TdGFuZGJ5ICYmIGRvSHdSZXN1bWUpIHsKICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5yZXN1bWUobU91dHB1dC0+c3RyZWFtKTsKQEAgLTQ3MjcsMjQgKzUyNjMsMTIgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpPZmZsb2FkVGhyZWFkOjpvbkFkZE5ld1RyYWNrX2woKQotewotICAgIHNwPFRyYWNrPiBwcmV2aW91c1RyYWNrID0gbVByZXZpb3VzVHJhY2sucHJvbW90ZSgpOwotICAgIHNwPFRyYWNrPiBsYXRlc3RUcmFjayA9IG1MYXRlc3RBY3RpdmVUcmFjay5wcm9tb3RlKCk7Ci0KLSAgICBpZiAocHJldmlvdXNUcmFjayAhPSAwICYmIGxhdGVzdFRyYWNrICE9IDAgJiYKLSAgICAgICAgKHByZXZpb3VzVHJhY2stPnNlc3Npb25JZCgpICE9IGxhdGVzdFRyYWNrLT5zZXNzaW9uSWQoKSkpIHsKLSAgICAgICAgbUZsdXNoUGVuZGluZyA9IHRydWU7Ci0gICAgfQotICAgIFBsYXliYWNrVGhyZWFkOjpvbkFkZE5ld1RyYWNrX2woKTsKLX0KLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjpEdXBsaWNhdGluZ1RocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCi0gICAgICAgIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQqIG1haW5UaHJlYWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkKQorICAgICAgICBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkKiBtYWluVGhyZWFkLCBhdWRpb19pb19oYW5kbGVfdCBpZCwgYm9vbCBzeXN0ZW1SZWFkeSkKICAgICA6ICAgTWl4ZXJUaHJlYWQoYXVkaW9GbGluZ2VyLCBtYWluVGhyZWFkLT5nZXRPdXRwdXQoKSwgaWQsIG1haW5UaHJlYWQtPm91dERldmljZSgpLAotICAgICAgICAgICAgICAgIERVUExJQ0FUSU5HKSwKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtUmVhZHksIERVUExJQ0FUSU5HKSwKICAgICAgICAgbVdhaXRUaW1lTXMoVUlOVF9NQVgpCiB7CiAgICAgYWRkT3V0cHV0VHJhY2sobWFpblRocmVhZCk7CkBAIC00NzY5LDE5ICs1MjkzLDE5IEBACiAgICAgICAgICAgICBtZW1zZXQobVNpbmtCdWZmZXIsIDAsIG1TaW5rQnVmZmVyU2l6ZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgc2xlZXBUaW1lID0gMDsKKyAgICBtU2xlZXBUaW1lVXMgPSAwOwogICAgIHdyaXRlRnJhbWVzID0gbU5vcm1hbEZyYW1lQ291bnQ7CiAgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1TaW5rQnVmZmVyU2l6ZTsKLSAgICBzdGFuZGJ5VGltZSA9IHN5c3RlbVRpbWUoKSArIHN0YW5kYnlEZWxheTsKKyAgICBtU3RhbmRieVRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1TdGFuZGJ5RGVsYXlOczsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjp0aHJlYWRMb29wX3NsZWVwVGltZSgpCiB7Ci0gICAgaWYgKHNsZWVwVGltZSA9PSAwKSB7CisgICAgaWYgKG1TbGVlcFRpbWVVcyA9PSAwKSB7CiAgICAgICAgIGlmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHNsZWVwVGltZSA9IGFjdGl2ZVNsZWVwVGltZTsKKyAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IG1BY3RpdmVTbGVlcFRpbWVVczsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWU7CisgICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSBtSWRsZVNsZWVwVGltZVVzOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQnl0ZXNXcml0dGVuICE9IDApIHsKICAgICAgICAgaWYgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCkgewpAQCAtNDc5MSwyMiArNTMxNSwxNCBAQAogICAgICAgICAgICAgLy8gZmx1c2ggcmVtYWluaW5nIG92ZXJmbG93IGJ1ZmZlcnMgaW4gb3V0cHV0IHRyYWNrcwogICAgICAgICAgICAgd3JpdGVGcmFtZXMgPSAwOwogICAgICAgICB9Ci0gICAgICAgIHNsZWVwVGltZSA9IDA7CisgICAgICAgIG1TbGVlcFRpbWVVcyA9IDA7CiAgICAgfQogfQogCiBzc2l6ZV90IEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OnRocmVhZExvb3Bfd3JpdGUoKQogewotICAgIC8vIFdlIGNvbnZlcnQgdGhlIGR1cGxpY2F0aW5nIHRocmVhZCBmb3JtYXQgdG8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKLSAgICAvLyBmb3IgZGVsaXZlcnkgZG93bnN0cmVhbSBhcyBuZWVkZWQuIFRoaXMgaW4tcGxhY2UgY29udmVyc2lvbiBpcyBzYWZlIGFzCi0gICAgLy8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgaXMgc21hbGxlciB0aGFuIGFueSBvdGhlciBzdXBwb3J0ZWQgZm9ybWF0Ci0gICAgLy8gKEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgaXMgbm90IGFsbG93ZWQgaGVyZSkuCi0gICAgaWYgKG1Gb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChtU2lua0J1ZmZlciwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNpbmtCdWZmZXIsIG1Gb3JtYXQsIHdyaXRlRnJhbWVzICogbUNoYW5uZWxDb3VudCk7Ci0gICAgfQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0VHJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG91dHB1dFRyYWNrc1tpXS0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4obVNpbmtCdWZmZXIpLCB3cml0ZUZyYW1lcyk7CisgICAgICAgIG91dHB1dFRyYWNrc1tpXS0+d3JpdGUobVNpbmtCdWZmZXIsIHdyaXRlRnJhbWVzKTsKICAgICB9CiAgICAgbVN0YW5kYnkgPSBmYWxzZTsKICAgICByZXR1cm4gKHNzaXplX3QpbVNpbmtCdWZmZXJTaXplOwpAQCAtNDgzMywyNSArNTM0OSwyNiBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjphZGRPdXRwdXRUcmFjayhNaXhlclRocmVhZCAqdGhyZWFkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgLy8gRklYTUUgZXhwbGFpbiB0aGlzIGZvcm11bGEKLSAgICBzaXplX3QgZnJhbWVDb3VudCA9ICgzICogbU5vcm1hbEZyYW1lQ291bnQgKiBtU2FtcGxlUmF0ZSkgLyB0aHJlYWQtPnNhbXBsZVJhdGUoKTsKLSAgICAvLyBPdXRwdXRUcmFjayBpcyBmb3JjZWQgdG8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgcmVnYXJkbGVzcyBvZiBtRm9ybWF0Ci0gICAgLy8gZHVlIHRvIGN1cnJlbnQgdXNhZ2UgY2FzZSBhbmQgcmVzdHJpY3Rpb25zIG9uIHRoZSBBdWRpb0J1ZmZlclByb3ZpZGVyLgotICAgIC8vIEFjdHVhbCBidWZmZXIgY29udmVyc2lvbiBpcyBkb25lIGluIHRocmVhZExvb3Bfd3JpdGUoKS4KLSAgICAvLwotICAgIC8vIFRPRE86IFRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLCBkZXBlbmRpbmcgb24gbXVsdGljaGFubmVsCi0gICAgLy8gKGFuZCBub24gaW50MTZfdCopIHN1cHBvcnQgb24gQUY6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjawotICAgIE91dHB1dFRyYWNrICpvdXRwdXRUcmFjayA9IG5ldyBPdXRwdXRUcmFjayh0aHJlYWQsCisgICAgLy8gVGhlIGRvd25zdHJlYW0gTWl4ZXJUaHJlYWQgY29uc3VtZXMgdGhyZWFkLT5mcmFtZUNvdW50KCkgYW1vdW50IG9mIGZyYW1lcyBwZXIgbWl4IHBhc3MuCisgICAgLy8gQWRqdXN0IGZvciB0aHJlYWQtPnNhbXBsZVJhdGUoKSB0byBkZXRlcm1pbmUgbWluaW11bSBidWZmZXIgZnJhbWUgY291bnQuCisgICAgLy8gVGhlbiB0cmlwbGUgYnVmZmVyIGJlY2F1c2UgVGhyZWFkcyBkbyBub3QgcnVuIHN5bmNocm9ub3VzbHkgYW5kIG1heSBub3QgYmUgY2xvY2sgbG9ja2VkLgorICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0KKyAgICAgICAgICAgIDMgKiBzb3VyY2VGcmFtZXNOZWVkZWQobVNhbXBsZVJhdGUsIHRocmVhZC0+ZnJhbWVDb3VudCgpLCB0aHJlYWQtPnNhbXBsZVJhdGUoKSk7CisgICAgLy8gVE9ETzogQ29uc2lkZXIgYXN5bmNocm9ub3VzIHNhbXBsZSByYXRlIGNvbnZlcnNpb24gdG8gaGFuZGxlIGNsb2NrIGRpc3Bhcml0eQorICAgIC8vIGZyb20gZGlmZmVyZW50IE91dHB1dFRyYWNrcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBNaXhlclRocmVhZHMgKGUuZy4gb25lIG1heQorICAgIC8vIG5lYXJseSBlbXB0eSBhbmQgdGhlIG90aGVyIG1heSBiZSBkcm9wcGluZyBkYXRhKS4KKworICAgIHNwPE91dHB1dFRyYWNrPiBvdXRwdXRUcmFjayA9IG5ldyBPdXRwdXRUcmFjayh0aHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwogICAgIGlmIChvdXRwdXRUcmFjay0+Y2JsaygpICE9IE5VTEwpIHsKICAgICAgICAgdGhyZWFkLT5zZXRTdHJlYW1Wb2x1bWUoQVVESU9fU1RSRUFNX1BBVENILCAxLjBmKTsKICAgICAgICAgbU91dHB1dFRyYWNrcy5hZGQob3V0cHV0VHJhY2spOwotICAgICAgICBBTE9HVigiYWRkT3V0cHV0VHJhY2soKSB0cmFjayAlcCwgb24gdGhyZWFkICVwIiwgb3V0cHV0VHJhY2ssIHRocmVhZCk7CisgICAgICAgIEFMT0dWKCJhZGRPdXRwdXRUcmFjaygpIHRyYWNrICVwLCBvbiB0aHJlYWQgJXAiLCBvdXRwdXRUcmFjay5nZXQoKSwgdGhyZWFkKTsKICAgICAgICAgdXBkYXRlV2FpdFRpbWVfbCgpOwogICAgIH0KIH0KQEAgLTQ5MzEsMTIgKzU0NDgsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5CiAjaWZkZWYgVEVFX1NJTksKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBjb25zdCBzcDxOQkFJT19TaW5rPiYgdGVlU2luawogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOgotICAgIFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgb3V0RGV2aWNlLCBpbkRldmljZSwgUkVDT1JEKSwKKyAgICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIG91dERldmljZSwgaW5EZXZpY2UsIFJFQ09SRCwgc3lzdGVtUmVhZHkpLAogICAgIG1JbnB1dChpbnB1dCksIG1BY3RpdmVUcmFja3NHZW4oMCksIG1Sc21wSW5CdWZmZXIoTlVMTCksCiAgICAgLy8gbVJzbXBJbkZyYW1lcyBhbmQgbVJzbXBJbkZyYW1lc1AyIGFyZSBzZXQgYnkgcmVhZElucHV0UGFyYW1ldGVyc19sKCkKICAgICBtUnNtcEluUmVhcigwKQpAQCAtNDk1NSw4ICs1NDczLDggQEAKICAgICAvLyBtRmFzdENhcHR1cmVOQkxvZ1dyaXRlcgogICAgICwgbUZhc3RUcmFja0F2YWlsKGZhbHNlKQogewotICAgIHNucHJpbnRmKG1OYW1lLCBrTmFtZUxlbmd0aCwgIkF1ZGlvSW5fJVgiLCBpZCk7Ci0gICAgbU5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrTG9nU2l6ZSwgbU5hbWUpOworICAgIHNucHJpbnRmKG1UaHJlYWROYW1lLCBrVGhyZWFkTmFtZUxlbmd0aCwgIkF1ZGlvSW5fJVgiLCBpZCk7CisgICAgbU5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrTG9nU2l6ZSwgbVRocmVhZE5hbWUpOwogCiAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7CiAKQEAgLTQ5NzcsMjYgKzU0OTUsMTMgQEAKICAgICAgICAgaW5pdEZhc3RDYXB0dXJlID0gdHJ1ZTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBGYXN0Q2FwdHVyZV9TdGF0aWM6Ci0gICAgICAgIHVpbnQzMl90IHByaW1hcnlPdXRwdXRTYW1wbGVSYXRlOwotICAgICAgICB7Ci0gICAgICAgICAgICBBdXRvTXV0ZXggX2woYXVkaW9GbGluZ2VyLT5tSGFyZHdhcmVMb2NrKTsKLSAgICAgICAgICAgIHByaW1hcnlPdXRwdXRTYW1wbGVSYXRlID0gYXVkaW9GbGluZ2VyLT5tUHJpbWFyeU91dHB1dFNhbXBsZVJhdGU7Ci0gICAgICAgIH0KLSAgICAgICAgaW5pdEZhc3RDYXB0dXJlID0KLSAgICAgICAgICAgICAgICAvLyBlaXRoZXIgY2FwdHVyZSBzYW1wbGUgcmF0ZSBpcyBzYW1lIGFzIChhIHJlYXNvbmFibGUpIHByaW1hcnkgb3V0cHV0IHNhbXBsZSByYXRlCi0gICAgICAgICAgICAgICAgKCgocHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPT0gNDQxMDAgfHwgcHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPT0gNDgwMDApICYmCi0gICAgICAgICAgICAgICAgICAgIChtU2FtcGxlUmF0ZSA9PSBwcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSkpIHx8Ci0gICAgICAgICAgICAgICAgLy8gb3IgcHJpbWFyeSBvdXRwdXQgc2FtcGxlIHJhdGUgaXMgdW5rbm93biwgYW5kIGNhcHR1cmUgc2FtcGxlIHJhdGUgaXMgcmVhc29uYWJsZQotICAgICAgICAgICAgICAgICgocHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChtU2FtcGxlUmF0ZSA9PSA0NDEwMCB8fCBtU2FtcGxlUmF0ZSA9PSA0ODAwMCkpKSkgJiYKLSAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGJ1ZmZlciBzaXplIGlzIDwgMTIgbXMKLSAgICAgICAgICAgICAgICAobUZyYW1lQ291bnQgKiAxMDAwKSAvIG1TYW1wbGVSYXRlIDwgMTI7CisgICAgICAgIGluaXRGYXN0Q2FwdHVyZSA9IChtRnJhbWVDb3VudCAqIDEwMDApIC8gbVNhbXBsZVJhdGUgPCBrTWluTm9ybWFsQ2FwdHVyZUJ1ZmZlclNpemVNczsKICAgICAgICAgYnJlYWs7CiAgICAgLy8gY2FzZSBGYXN0Q2FwdHVyZV9EeW5hbWljOgogICAgIH0KIAogICAgIGlmIChpbml0RmFzdENhcHR1cmUpIHsKLSAgICAgICAgLy8gY3JlYXRlIGEgUGlwZSBmb3IgRmFzdE1peGVyIHRvIHdyaXRlIHRvLCBhbmQgZm9yIHVzIGFuZCBmYXN0IHRyYWNrcyB0byByZWFkIGZyb20KKyAgICAgICAgLy8gY3JlYXRlIGEgUGlwZSBmb3IgRmFzdENhcHR1cmUgdG8gd3JpdGUgdG8sIGFuZCBmb3IgdXMgYW5kIGZhc3QgdHJhY2tzIHRvIHJlYWQgZnJvbQogICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gbUlucHV0U291cmNlLT5mb3JtYXQoKTsKICAgICAgICAgc2l6ZV90IHBpcGVGcmFtZXNQMiA9IHJvdW5kdXAobVNhbXBsZVJhdGUgLyAyNSk7ICAgIC8vIGRvdWJsZS1idWZmZXJpbmcgb2YgMjAgbXMgZWFjaAogICAgICAgICBzaXplX3QgcGlwZVNpemUgPSBwaXBlRnJhbWVzUDIgKiBGb3JtYXRfZnJhbWVTaXplKGZvcm1hdCk7CkBAIC01MDU1LDEyICs1NTYwLDcgQEAKICAgICAgICAgLy8gc3RhcnQgdGhlIGZhc3QgY2FwdHVyZQogICAgICAgICBtRmFzdENhcHR1cmUtPnJ1bigiRmFzdENhcHR1cmUiLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiAgICAgICAgIHBpZF90IHRpZCA9IG1GYXN0Q2FwdHVyZS0+Z2V0VGlkKCk7Ci0gICAgICAgIGludCBlcnIgPSByZXF1ZXN0UHJpb3JpdHkoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIpOwotICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJQb2xpY3kgU0NIRURfRklGTyBwcmlvcml0eSAlZCBpcyB1bmF2YWlsYWJsZSBmb3IgcGlkICVkIHRpZCAlZDsgZXJyb3IgJWQiLAotICAgICAgICAgICAgICAgICAgICBrUHJpb3JpdHlGYXN0Q2FwdHVyZSwgZ2V0cGlkX2NhY2hlZCwgdGlkLCBlcnIpOwotICAgICAgICB9Ci0KKyAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlcik7CiAjaWZkZWYgQVVESU9fV0FUQ0hET0cKICAgICAgICAgLy8gRklYTUUKICNlbmRpZgpAQCAtNTA3Miw3ICs1NTcyLDYgQEAKICAgICAvLyBGSVhNRSBtTm9ybWFsU291cmNlCiB9CiAKLQogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6On5SZWNvcmRUaHJlYWQoKQogewogICAgIGlmIChtRmFzdENhcHR1cmUgIT0gMCkgewpAQCAtNTA5MiwxMiArNTU5MSwxMiBAQAogICAgIH0KICAgICBtQXVkaW9GbGluZ2VyLT51bnJlZ2lzdGVyV3JpdGVyKG1GYXN0Q2FwdHVyZU5CTG9nV3JpdGVyKTsKICAgICBtQXVkaW9GbGluZ2VyLT51bnJlZ2lzdGVyV3JpdGVyKG1OQkxvZ1dyaXRlcik7Ci0gICAgZGVsZXRlW10gbVJzbXBJbkJ1ZmZlcjsKKyAgICBmcmVlKG1Sc21wSW5CdWZmZXIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpvbkZpcnN0UmVmKCkKIHsKLSAgICBydW4obU5hbWUsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CisgICAgcnVuKG1UaHJlYWROYW1lLCBQUklPUklUWV9VUkdFTlRfQVVESU8pOwogfQogCiBib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp0aHJlYWRMb29wKCkKQEAgLTUxMzgsNyArNTYzNyw5IEBACiAKICAgICAgICAgLy8gc2xlZXAgd2l0aCBtdXRleCB1bmxvY2tlZAogICAgICAgICBpZiAoc2xlZXBVcyA+IDApIHsKKyAgICAgICAgICAgIEFUUkFDRV9CRUdJTigic2xlZXAiKTsKICAgICAgICAgICAgIHVzbGVlcChzbGVlcFVzKTsKKyAgICAgICAgICAgIEFUUkFDRV9FTkQoKTsKICAgICAgICAgICAgIHNsZWVwVXMgPSAwOwogICAgICAgICB9CiAKQEAgLTUyODIsNyArNTc4Myw4IEBACiAgICAgICAgICAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdENhcHR1cmVTdGF0ZTo6UkVBRF9XUklURTsKICNpZiAwICAgLy8gRklYTUUKICAgICAgICAgICAgICAgICBtRmFzdENhcHR1cmVEdW1wU3RhdGUuaW5jcmVhc2VTYW1wbGluZ04obUF1ZGlvRmxpbmdlci0+aXNMb3dSYW1EZXZpY2UoKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZTo6a1NhbXBsaW5nTmZvckxvd1JhbURldmljZSA6IEZhc3RNaXhlckR1bXBTdGF0ZTo6a1NhbXBsaW5nTik7CisgICAgICAgICAgICAgICAgICAgICAgICBGYXN0VGhyZWFkRHVtcFN0YXRlOjprU2FtcGxpbmdOZm9yTG93UmFtRGV2aWNlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhc3RUaHJlYWREdW1wU3RhdGU6OmtTYW1wbGluZ04pOwogI2VuZGlmCiAgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KQEAgLTUzMjIsNyArNTgyNCw3IEBACiAgICAgICAgIC8vIElmIGFuIE5CQUlPIHNvdXJjZSBpcyBwcmVzZW50LCB1c2UgaXQgdG8gcmVhZCB0aGUgbm9ybWFsIGNhcHR1cmUncyBkYXRhCiAgICAgICAgIGlmIChtUGlwZVNvdXJjZSAhPSAwKSB7CiAgICAgICAgICAgICBzaXplX3QgZnJhbWVzVG9SZWFkID0gbUJ1ZmZlclNpemUgLyBtRnJhbWVTaXplOwotICAgICAgICAgICAgZnJhbWVzUmVhZCA9IG1QaXBlU291cmNlLT5yZWFkKCZtUnNtcEluQnVmZmVyW3JlYXIgKiBtQ2hhbm5lbENvdW50XSwKKyAgICAgICAgICAgIGZyYW1lc1JlYWQgPSBtUGlwZVNvdXJjZS0+cmVhZCgodWludDhfdCopbVJzbXBJbkJ1ZmZlciArIHJlYXIgKiBtRnJhbWVTaXplLAogICAgICAgICAgICAgICAgICAgICBmcmFtZXNUb1JlYWQsIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTKTsKICAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkID09IDApIHsKICAgICAgICAgICAgICAgICAvLyBzaW5jZSBwaXBlIGlzIG5vbi1ibG9ja2luZywgc2ltdWxhdGUgYmxvY2tpbmcgaW5wdXQKQEAgLTUzMzEsNyArNTgzMyw3IEBACiAgICAgICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIEhBTCAvIEF1ZGlvU3RyZWFtSW4gZGlyZWN0bHkKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gbUlucHV0LT5zdHJlYW0tPnJlYWQobUlucHV0LT5zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICZtUnNtcEluQnVmZmVyW3JlYXIgKiBtQ2hhbm5lbENvdW50XSwgbUJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgICAgICAodWludDhfdCopbVJzbXBJbkJ1ZmZlciArIHJlYXIgKiBtRnJhbWVTaXplLCBtQnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgMCkgewogICAgICAgICAgICAgICAgIGZyYW1lc1JlYWQgPSBieXRlc1JlYWQ7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNTM1MSwxMyArNTg1MywxMyBAQAogICAgICAgICBBTE9HX0FTU0VSVChmcmFtZXNSZWFkID4gMCk7CiAKICAgICAgICAgaWYgKG1UZWVTaW5rICE9IDApIHsKLSAgICAgICAgICAgICh2b2lkKSBtVGVlU2luay0+d3JpdGUoJm1Sc21wSW5CdWZmZXJbcmVhciAqIG1DaGFubmVsQ291bnRdLCBmcmFtZXNSZWFkKTsKKyAgICAgICAgICAgICh2b2lkKSBtVGVlU2luay0+d3JpdGUoKHVpbnQ4X3QqKW1Sc21wSW5CdWZmZXIgKyByZWFyICogbUZyYW1lU2l6ZSwgZnJhbWVzUmVhZCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gSWYgZGVzdGluYXRpb24gaXMgbm9uLWNvbnRpZ3VvdXMsIHdlIG5vdyBjb3JyZWN0IGZvciByZWFkaW5nIHBhc3QgZW5kIG9mIGJ1ZmZlci4KICAgICAgICAgewogICAgICAgICAgICAgc2l6ZV90IHBhcnQxID0gbVJzbXBJbkZyYW1lc1AyIC0gcmVhcjsKICAgICAgICAgICAgIGlmICgoc2l6ZV90KSBmcmFtZXNSZWFkID4gcGFydDEpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkobVJzbXBJbkJ1ZmZlciwgJm1Sc21wSW5CdWZmZXJbbVJzbXBJbkZyYW1lc1AyICogbUNoYW5uZWxDb3VudF0sCisgICAgICAgICAgICAgICAgbWVtY3B5KG1Sc21wSW5CdWZmZXIsICh1aW50OF90KiltUnNtcEluQnVmZmVyICsgbVJzbXBJbkZyYW1lc1AyICogbUZyYW1lU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZXNSZWFkIC0gcGFydDEpICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUzNzMsNiArNTg3NSw5IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgY29kZSBwcm9iYWJseSBzaG91bGQgYmUgbW92ZWQgdG8gUmVjb3JkVHJhY2suCisgICAgICAgICAgICAvLyBUT0RPOiBVcGRhdGUgdGhlIGFjdGl2ZVRyYWNrIGJ1ZmZlciBjb252ZXJ0ZXIgaW4gY2FzZSBvZiByZWNvbmZpZ3VyZS4KKwogICAgICAgICAgICAgZW51bSB7CiAgICAgICAgICAgICAgICAgT1ZFUlJVTl9VTktOT1dOLAogICAgICAgICAgICAgICAgIE9WRVJSVU5fVFJVRSwKQEAgLTUzODcsMTMxICs1ODkyLDI4IEBACiAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc091dCA9IGFjdGl2ZVRyYWNrLT5tU2luay5mcmFtZUNvdW50OwogICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHN0YXR1cyA9PSBPSykgIT0gKGZyYW1lc091dCA+IDApKTsKIAotICAgICAgICAgICAgICAgIGludDMyX3QgZnJvbnQgPSBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250OwotICAgICAgICAgICAgICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGF2YWlsYWJsZSBmcmFtZXMgYW5kIGhhbmRsZSBvdmVycnVuIGNvbmRpdGlvbnMKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcmVjb3JkIHRyYWNrIGlzbid0IGRyYWluaW5nIGZhc3QgZW5vdWdoLgorICAgICAgICAgICAgICAgIGJvb2wgaGFzT3ZlcnJ1bjsKICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzSW47Ci0KLSAgICAgICAgICAgICAgICBpZiAoZmlsbGVkIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IHRyZWF0IGxpa2UgYSBtYXNzaXZlIG92ZXJydW4gYW5kIHJlLXN5bmMKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSAwOwotICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250ID0gcmVhcjsKLSAgICAgICAgICAgICAgICAgICAgb3ZlcnJ1biA9IE9WRVJSVU5fVFJVRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChzaXplX3QpIGZpbGxlZCA8PSBtUnNtcEluRnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1lc0luID0gKHNpemVfdCkgZmlsbGVkOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBpcyBub3Qga2VlcGluZyB1cCB3aXRoIHNlcnZlciwgYnV0IGdpdmUgaXQgbGF0ZXN0IGRhdGEKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSBtUnNtcEluRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250ID0gZnJvbnQgPSByZWFyIC0gZnJhbWVzSW47CisgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlci0+c3luYygmZnJhbWVzSW4sICZoYXNPdmVycnVuKTsKKyAgICAgICAgICAgICAgICBpZiAoaGFzT3ZlcnJ1bikgewogICAgICAgICAgICAgICAgICAgICBvdmVycnVuID0gT1ZFUlJVTl9UUlVFOwogICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgPT0gMCB8fCBmcmFtZXNJbiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bVJlc2FtcGxlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlc2FtcGxpbmcKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc0luID4gZnJhbWVzT3V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiA9IGZyYW1lc091dDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IGZyYW1lc0luOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludDhfdCAqZHN0ID0gYWN0aXZlVHJhY2stPm1TaW5rLmk4OwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZnJhbWVzSW4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcm9udCAmPSBtUnNtcEluRnJhbWVzUDIgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBhcnQxID0gbVJzbXBJbkZyYW1lc1AyIC0gZnJvbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydDEgPiBmcmFtZXNJbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQxID0gZnJhbWVzSW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKnNyYyA9IChpbnQ4X3QgKiltUnNtcEluQnVmZmVyICsgKGZyb250ICogbUZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSBhY3RpdmVUcmFjay0+bUNoYW5uZWxDb3VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyYywgcGFydDEgKiBtRnJhbWVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUNoYW5uZWxDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBtaXhfdG9fc3RlcmVvX2kxNl9mcm9tX21vbm9faTE2KChpbnQxNl90ICopZHN0LCAoY29uc3QgaW50MTZfdCAqKXNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peF90b19tb25vX2kxNl9mcm9tX3N0ZXJlb19pMTYoKGludDE2X3QgKilkc3QsIChjb25zdCBpbnQxNl90ICopc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICs9IHBhcnQxICogYWN0aXZlVHJhY2stPm1GcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcm9udCArPSBwYXJ0MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luIC09IHBhcnQxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQgKz0gZnJhbWVzT3V0OwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVzYW1wbGluZwotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBmcmFtZXNJbk5lZWRlZCBzaG91bGQgcmVhbGx5IGJlIHBhcnQgb2YgcmVzYW1wbGVyIEFQSSwgYW5kIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBkZXBlbmQgb24gdGhlIFNSQyByYXRpbwotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICB0byBrZWVwIG1Sc21wSW5CdWZmZXIgZnVsbCBzbyByZXNhbXBsZXIgYWx3YXlzIGhhcyBzdWZmaWNpZW50IGlucHV0Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNJbk5lZWRlZDsKLSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb25seSByZS1jYWxjdWxhdGUgd2hlbiBpdCBjaGFuZ2VzLCBhbmQgb3B0aW1pemUgZm9yIGNvbW1vbiByYXRpb3MKLSAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHByZWNvbXB1dGUgaW4vb3V0IGJlY2F1c2UgZmxvYXRpbmcgcG9pbnQgaXMgbm90IGFzc29jaWF0aXZlCi0gICAgICAgICAgICAgICAgICAgIC8vIGUuZy4gYSpiL2MgIT0gYSooYi9jKS4KLSAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIGluKG1TYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIG91dChhY3RpdmVUcmFjay0+bVNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbk5lZWRlZCA9IGNlaWwoZnJhbWVzT3V0ICogaW4gLyBvdXQpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5lZWQgJXUgZnJhbWVzIGluIHRvIHByb2R1Y2UgJXUgb3V0IGdpdmVuIGluL291dCByYXRpbyBvZiAlLjRnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW5OZWVkZWQsIGZyYW1lc091dCwgaW4gLyBvdXQpOwotICAgICAgICAgICAgICAgICAgICAvLyBBbHRob3VnaCB3ZSB0aGVvcmV0aWNhbGx5IGhhdmUgZnJhbWVzSW4gaW4gY2lyY3VsYXIgYnVmZmVyLCBzb21lIG9mIHRob3NlIGFyZQotICAgICAgICAgICAgICAgICAgICAvLyB1bnJlbGVhc2VkIGZyYW1lcywgYW5kIHRodXMgbXVzdCBiZSBkaXNjb3VudGVkIGZvciBwdXJwb3NlIG9mIGJ1ZGdldGluZy4KLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHVucmVsZWFzZWQgPSBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsOwotICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiA9IGZyYW1lc0luID4gdW5yZWxlYXNlZCA/IGZyYW1lc0luIC0gdW5yZWxlYXNlZCA6IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNJbiA8IGZyYW1lc0luTmVlZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibm90IGVub3VnaCB0byByZXNhbXBsZTogaGF2ZSAldSBmcmFtZXMgaW4gYnV0IG5lZWQgJXUgaW4gdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvZHVjZSAldSBvdXQgZ2l2ZW4gaW4vb3V0IHJhdGlvIG9mICUuNGciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiwgZnJhbWVzSW5OZWVkZWQsIGZyYW1lc091dCwgaW4gLyBvdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5ld0ZyYW1lc091dCA9IGZyYW1lc0luID4gMCA/IGZsb29yKChmcmFtZXNJbiAtIDEpICogb3V0IC8gaW4pIDogMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobmV3RnJhbWVzT3V0ID49IGZyYW1lc091dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3RnJhbWVzT3V0ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luTmVlZGVkID0gY2VpbChuZXdGcmFtZXNPdXQgKiBpbiAvIG91dCkgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5vdyBuZWVkICV1IGZyYW1lcyBpbiB0byBwcm9kdWNlICV1IG91dCBnaXZlbiBvdXQvaW4gcmF0aW8gb2YgJS40ZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luTmVlZGVkLCBuZXdGcmFtZXNPdXQsIG91dCAvIGluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZnJhbWVzSW4gPCBmcmFtZXNJbk5lZWRlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigic3VjY2VzcyAyOiBoYXZlICV1IGZyYW1lcyBpbiBhbmQgbmVlZCAldSBpbiB0byBwcm9kdWNlICV1IG91dCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2l2ZW4gaW4vb3V0IHJhdGlvIG9mICUuNGciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4sIGZyYW1lc0luTmVlZGVkLCBuZXdGcmFtZXNPdXQsIGluIC8gb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IG5ld0ZyYW1lc091dDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdWNjZXNzIDE6IGhhdmUgJXUgaW4gYW5kIG5lZWQgJXUgaW4gdG8gcHJvZHVjZSAldSBvdXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnaXZlbiBpbi9vdXQgcmF0aW8gb2YgJS40ZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4sIGZyYW1lc0luTmVlZGVkLCBmcmFtZXNPdXQsIGluIC8gb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlYWxsb2NhdGUgbVJzbXBPdXRCdWZmZXIgYXMgbmVlZGVkOyB3ZSB3aWxsIGdyb3cgYnV0IG5ldmVyIHNocmluawotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1Sc21wT3V0RnJhbWVDb3VudCA8IGZyYW1lc091dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgd2h5IGRvZXMgZWFjaCB0cmFjayBuZWVkIGl0J3Mgb3duIG1Sc21wT3V0QnVmZmVyPyBjYW4ndCB0aGV5IHNoYXJlPwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlW10gYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzYW1wbGVyIGFsd2F5cyBvdXRwdXRzIHN0ZXJlbwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyID0gbmV3IGludDMyX3RbZnJhbWVzT3V0ICogRkNDXzJdOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wT3V0RnJhbWVDb3VudCA9IGZyYW1lc091dDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlc2FtcGxlciBhY2N1bXVsYXRlcywgYnV0IHdlIG9ubHkgaGF2ZSBvbmUgc291cmNlIHRyYWNrCi0gICAgICAgICAgICAgICAgICAgIG1lbXNldChhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsIDAsIGZyYW1lc091dCAqIEZDQ18yICogc2l6ZW9mKGludDMyX3QpKTsKLSAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1SZXNhbXBsZXItPnJlc2FtcGxlKGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwgZnJhbWVzT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGhvdyBhYm91dCBoYXZpbmcgYWN0aXZlVHJhY2sgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGl0c2VsZj8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGlzKi8gLyogQXVkaW9CdWZmZXJQcm92aWRlciogKi8pOwotICAgICAgICAgICAgICAgICAgICAvLyBkaXRoZXJBbmRDbGFtcCgpIHdvcmtzIGFzIGxvbmcgYXMgYWxsIGJ1ZmZlcnMgcmV0dXJuZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgLy8gYWN0aXZlVHJhY2stPmdldE5leHRCdWZmZXIoKSBhcmUgMzIgYml0IGFsaWduZWQgd2hpY2ggc2hvdWxkIGJlIGFsd2F5cyB0cnVlLgotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1DaGFubmVsQ291bnQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVtcG9yYXJpbHkgdHlwZSBwdW4gbVJzbXBPdXRCdWZmZXIgZnJvbSBRNC4yNyB0byBpbnQxNl90Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXRoZXJBbmRDbGFtcChhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsIGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXNhbXBsZXIgYWx3YXlzIG91dHB1dHMgc3RlcmVvIHNhbXBsZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBwb3N0IHN0ZXJlbyB0byBtb25vIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhfdG9fbW9ub19pMTZfZnJvbV9zdGVyZW9faTE2KGFjdGl2ZVRyYWNrLT5tU2luay5pMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyLCBmcmFtZXNPdXQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZGl0aGVyQW5kQ2xhbXAoKGludDMyX3QgKilhY3RpdmVUcmFjay0+bVNpbmsucmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsIGZyYW1lc091dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gbm93IGRvbmUgd2l0aCBtUnNtcE91dEJ1ZmZlcgotCi0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIERvbid0IGFsbG93IGZyYW1lc091dCB0byBiZSBsYXJnZXIgdGhhbiB3aGF0IGlzIHBvc3NpYmxlIHdpdGggcmVzYW1wbGluZworICAgICAgICAgICAgICAgIC8vIGZyb20gZnJhbWVzSW4uCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpc24ndCBzdHJpY3RseSBuZWNlc3NhcnkgYnV0IGhlbHBzIGxpbWl0IGJ1ZmZlciByZXNpemluZyBpbgorICAgICAgICAgICAgICAgIC8vIFJlY29yZEJ1ZmZlckNvbnZlcnRlci4gIFRPRE86IHJlbW92ZSB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCisgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gbWluKGZyYW1lc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uRnJhbWVzUG9zc2libGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luLCBtU2FtcGxlUmF0ZSwgYWN0aXZlVHJhY2stPm1TYW1wbGVSYXRlKSk7CisgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBmcmFtZXMgZnJvbSB0aGUgUmVjb3JkVGhyZWFkIGJ1ZmZlciBwcm92aWRlciB0byB0aGUgUmVjb3JkVHJhY2sgYnVmZmVyCisgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gYWN0aXZlVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmNvbnZlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVNpbmsucmF3LCBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLCBmcmFtZXNPdXQpOwogCiAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA+IDAgJiYgKG92ZXJydW4gPT0gT1ZFUlJVTl9VTktOT1dOKSkgewogICAgICAgICAgICAgICAgICAgICBvdmVycnVuID0gT1ZFUlJVTl9GQUxTRTsKQEAgLTU2NTIsOCArNjA1NCw5IEBACiAgICAgLy8gY2xpZW50IGV4cHJlc3NlcyBhIHByZWZlcmVuY2UgZm9yIEZBU1QsIGJ1dCB3ZSBnZXQgdGhlIGZpbmFsIHNheQogICAgIGlmICgqZmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7CiAgICAgICBpZiAoCi0gICAgICAgICAgICAvLyB1c2UgY2FzZTogY2FsbGJhY2sgaGFuZGxlcgotICAgICAgICAgICAgKHRpZCAhPSAtMSkgJiYKKyAgICAgICAgICAgIC8vIHdlIGZvcm1lcmx5IGNoZWNrZWQgZm9yIGEgY2FsbGJhY2sgaGFuZGxlciAobm9uLTAgdGlkKSwKKyAgICAgICAgICAgIC8vIGJ1dCB0aGF0IGlzIG5vIGxvbmdlciByZXF1aXJlZCBmb3IgVFJBTlNGRVJfT0JUQUlOIG1vZGUKKyAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAvLyBmcmFtZSBjb3VudCBpcyBub3Qgc3BlY2lmaWVkLCBvciBpcyBleGFjdGx5IHRoZSBwaXBlIGRlcHRoCiAgICAgICAgICAgICAoKGZyYW1lQ291bnQgPT0gMCkgfHwgKGZyYW1lQ291bnQgPT0gbVBpcGVGcmFtZXNQMikpICYmCiAgICAgICAgICAgICAvLyBQQ00gZGF0YQpAQCAtNTgxOSwxMiArNjIyMiw5IEBACiAgICAgICAgIC8vIHdhcyBpbml0aWFsaXplZCB0byBzb21lIHZhbHVlIGNsb3NlciB0byB0aGUgdGhyZWFkJ3MgbVJzbXBJbkZyb250LCB0aGVuIHRoZSB0cmFjayBjb3VsZAogICAgICAgICAvLyBzZWUgcHJldmlvdXNseSBidWZmZXJlZCBkYXRhIGJlZm9yZSBpdCBjYWxsZWQgc3RhcnQoKSwgYnV0IHdpdGggZ3JlYXRlciByaXNrIG9mIG92ZXJydW4uCiAKLSAgICAgICAgcmVjb3JkVHJhY2stPm1Sc21wSW5Gcm9udCA9IG1Sc21wSW5SZWFyOwotICAgICAgICByZWNvcmRUcmFjay0+bVJzbXBJblVucmVsID0gMDsKLSAgICAgICAgLy8gRklYTUUgd2h5IHJlc2V0PwotICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1SZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1SZXNhbXBsZXItPnJlc2V0KCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmVjb3JkVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICAgICAgLy8gY2xlYXIgYW55IGNvbnZlcnRlciBzdGF0ZSBhcyBuZXcgZGF0YSB3aWxsIGJlIGRpc2NvbnRpbnVvdXMKKyAgICAgICAgcmVjb3JkVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPnJlc2V0KCk7CiAgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUQVJUSU5HXzI7CiAgICAgICAgIC8vIHNpZ25hbCB0aHJlYWQgdG8gc3RhcnQKICAgICAgICAgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7CkBAIC01OTQyLDE1ICs2MzQyLDE3IEBACiB7CiAgICAgZHByaW50ZihmZCwgIlxuSW5wdXQgdGhyZWFkICVwOlxuIiwgdGhpcyk7CiAKLSAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIGRwcmludGYoZmQsICIgIEJ1ZmZlciBzaXplOiAlenUgYnl0ZXNcbiIsIG1CdWZmZXJTaXplKTsKLSAgICB9IGVsc2UgeworICAgIGR1bXBCYXNlKGZkLCBhcmdzKTsKKworICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSA9PSAwKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIGFjdGl2ZSByZWNvcmQgY2xpZW50c1xuIik7CiAgICAgfQogICAgIGRwcmludGYoZmQsICIgIEZhc3QgY2FwdHVyZSB0aHJlYWQ6ICVzXG4iLCBoYXNGYXN0Q2FwdHVyZSgpID8gInllcyIgOiAibm8iKTsKICAgICBkcHJpbnRmKGZkLCAiICBGYXN0IHRyYWNrIGF2YWlsYWJsZTogJXNcbiIsIG1GYXN0VHJhY2tBdmFpbCA/ICJ5ZXMiIDogIm5vIik7CiAKLSAgICBkdW1wQmFzZShmZCwgYXJncyk7CisgICAgLy8gIE1ha2UgYSBub24tYXRvbWljIGNvcHkgb2YgZmFzdCBjYXB0dXJlIGR1bXAgc3RhdGUgc28gaXQgd29uJ3QgY2hhbmdlIHVuZGVybmVhdGggdXMKKyAgICBjb25zdCBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSBjb3B5KG1GYXN0Q2FwdHVyZUR1bXBTdGF0ZSk7CisgICAgY29weS5kdW1wKGZkKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCkBAIC01OTk4LDEyICs2NDAwLDUyIEBACiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI6OnJlc2V0KCkKK3sKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWRCYXNlID0gbVJlY29yZFRyYWNrLT5tVGhyZWFkLnByb21vdGUoKTsKKyAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKikgdGhyZWFkQmFzZS5nZXQoKTsKKyAgICBtUnNtcEluRnJvbnQgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5SZWFyOworICAgIG1Sc21wSW5VbnJlbCA9IDA7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOjpzeW5jKAorICAgICAgICBzaXplX3QgKmZyYW1lc0F2YWlsYWJsZSwgYm9vbCAqaGFzT3ZlcnJ1bikKK3sKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWRCYXNlID0gbVJlY29yZFRyYWNrLT5tVGhyZWFkLnByb21vdGUoKTsKKyAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKikgdGhyZWFkQmFzZS5nZXQoKTsKKyAgICBjb25zdCBpbnQzMl90IHJlYXIgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5SZWFyOworICAgIGNvbnN0IGludDMyX3QgZnJvbnQgPSBtUnNtcEluRnJvbnQ7CisgICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisKKyAgICBzaXplX3QgZnJhbWVzSW47CisgICAgYm9vbCBvdmVycnVuID0gZmFsc2U7CisgICAgaWYgKGZpbGxlZCA8IDApIHsKKyAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCB0cmVhdCBsaWtlIGEgbWFzc2l2ZSBvdmVycnVuIGFuZCByZS1zeW5jCisgICAgICAgIGZyYW1lc0luID0gMDsKKyAgICAgICAgbVJzbXBJbkZyb250ID0gcmVhcjsKKyAgICAgICAgb3ZlcnJ1biA9IHRydWU7CisgICAgfSBlbHNlIGlmICgoc2l6ZV90KSBmaWxsZWQgPD0gcmVjb3JkVGhyZWFkLT5tUnNtcEluRnJhbWVzKSB7CisgICAgICAgIGZyYW1lc0luID0gKHNpemVfdCkgZmlsbGVkOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGNsaWVudCBpcyBub3Qga2VlcGluZyB1cCB3aXRoIHNlcnZlciwgYnV0IGdpdmUgaXQgbGF0ZXN0IGRhdGEKKyAgICAgICAgZnJhbWVzSW4gPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5GcmFtZXM7CisgICAgICAgIG1Sc21wSW5Gcm9udCA9IC8qIGZyb250ID0gKi8gcmVhciAtIGZyYW1lc0luOworICAgICAgICBvdmVycnVuID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGZyYW1lc0F2YWlsYWJsZSAhPSBOVUxMKSB7CisgICAgICAgICpmcmFtZXNBdmFpbGFibGUgPSBmcmFtZXNJbjsKKyAgICB9CisgICAgaWYgKGhhc092ZXJydW4gIT0gTlVMTCkgeworICAgICAgICAqaGFzT3ZlcnJ1biA9IG92ZXJydW47CisgICAgfQorfQorCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMgX191bnVzZWQpCiB7Ci0gICAgUmVjb3JkVHJhY2sgKmFjdGl2ZVRyYWNrID0gbVJlY29yZFRyYWNrOwotICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZEJhc2UgPSBhY3RpdmVUcmFjay0+bVRocmVhZC5wcm9tb3RlKCk7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkQmFzZSA9IG1SZWNvcmRUcmFjay0+bVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZEJhc2UgPT0gMCkgewogICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOwogICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7CkBAIC02MDExLDcgKzY0NTMsNyBAQAogICAgIH0KICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKikgdGhyZWFkQmFzZS5nZXQoKTsKICAgICBpbnQzMl90IHJlYXIgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5SZWFyOwotICAgIGludDMyX3QgZnJvbnQgPSBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250OworICAgIGludDMyX3QgZnJvbnQgPSBtUnNtcEluRnJvbnQ7CiAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CiAgICAgLy8gRklYTUUgc2hvdWxkIG5vdCBiZSBQMiAoZG9uJ3Qgd2FudCB0byBpbmNyZWFzZSBsYXRlbmN5KQogICAgIC8vIEZJWE1FIGlmIGNsaWVudCBub3Qga2VlcGluZyB1cCwgZGlzY2FyZApAQCAtNjAyOCwxNyArNjQ3MCwxNiBAQAogICAgICAgICBwYXJ0MSA9IGFzazsKICAgICB9CiAgICAgaWYgKHBhcnQxID09IDApIHsKLSAgICAgICAgLy8gSGlnaGVyLWxldmVsIHNob3VsZCBrZWVwIG1Sc21wSW5CdWZmZXIgZnVsbCwgYW5kIG5vdCBjYWxsIHJlc2FtcGxlciBpZiBlbXB0eQotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJSZWNvcmRUaHJlYWQ6OmdldE5leHRCdWZmZXIoKSBzdGFydmVkIik7CisgICAgICAgIC8vIG91dCBvZiBkYXRhIGlzIGZpbmUgc2luY2UgdGhlIHJlc2FtcGxlciB3aWxsIHJldHVybiBhIHNob3J0LWNvdW50LgogICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7CiAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci0gICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcEluVW5yZWwgPSAwOworICAgICAgICBtUnNtcEluVW5yZWwgPSAwOwogICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogICAgIH0KIAotICAgIGJ1ZmZlci0+cmF3ID0gcmVjb3JkVGhyZWFkLT5tUnNtcEluQnVmZmVyICsgZnJvbnQgKiByZWNvcmRUaHJlYWQtPm1DaGFubmVsQ291bnQ7CisgICAgYnVmZmVyLT5yYXcgPSAodWludDhfdCopcmVjb3JkVGhyZWFkLT5tUnNtcEluQnVmZmVyICsgZnJvbnQgKiByZWNvcmRUaHJlYWQtPm1GcmFtZVNpemU7CiAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gcGFydDE7Ci0gICAgYWN0aXZlVHJhY2stPm1Sc21wSW5VbnJlbCA9IHBhcnQxOworICAgIG1Sc21wSW5VbnJlbCA9IHBhcnQxOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtNjA0NiwxOCArNjQ4NywyNjQgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBSZWNvcmRUcmFjayAqYWN0aXZlVHJhY2sgPSBtUmVjb3JkVHJhY2s7CiAgICAgc2l6ZV90IHN0ZXBDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICBpZiAoc3RlcENvdW50ID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBTE9HX0FTU0VSVChzdGVwQ291bnQgPD0gYWN0aXZlVHJhY2stPm1Sc21wSW5VbnJlbCk7Ci0gICAgYWN0aXZlVHJhY2stPm1Sc21wSW5VbnJlbCAtPSBzdGVwQ291bnQ7Ci0gICAgYWN0aXZlVHJhY2stPm1Sc21wSW5Gcm9udCArPSBzdGVwQ291bnQ7CisgICAgQUxPR19BU1NFUlQoc3RlcENvdW50IDw9IG1Sc21wSW5VbnJlbCk7CisgICAgbVJzbXBJblVucmVsIC09IHN0ZXBDb3VudDsKKyAgICBtUnNtcEluRnJvbnQgKz0gc3RlcENvdW50OwogICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOwogfQogCitBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkQnVmZmVyQ29udmVydGVyOjpSZWNvcmRCdWZmZXJDb252ZXJ0ZXIoCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHNyY0NoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBzcmNGb3JtYXQsCisgICAgICAgIHVpbnQzMl90IHNyY1NhbXBsZVJhdGUsCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGRzdENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBkc3RGb3JtYXQsCisgICAgICAgIHVpbnQzMl90IGRzdFNhbXBsZVJhdGUpIDoKKyAgICAgICAgICAgIG1TcmNDaGFubmVsTWFzayhBVURJT19DSEFOTkVMX0lOVkFMSUQpLCAvLyB1cGRhdGVQYXJhbWV0ZXJzIHdpbGwgc2V0IGZvbGxvd2luZyB2YXJzCisgICAgICAgICAgICAvLyBtU3JjRm9ybWF0CisgICAgICAgICAgICAvLyBtU3JjU2FtcGxlUmF0ZQorICAgICAgICAgICAgLy8gbURzdENoYW5uZWxNYXNrCisgICAgICAgICAgICAvLyBtRHN0Rm9ybWF0CisgICAgICAgICAgICAvLyBtRHN0U2FtcGxlUmF0ZQorICAgICAgICAgICAgLy8gbVNyY0NoYW5uZWxDb3VudAorICAgICAgICAgICAgLy8gbURzdENoYW5uZWxDb3VudAorICAgICAgICAgICAgLy8gbURzdEZyYW1lU2l6ZQorICAgICAgICAgICAgbUJ1ZihOVUxMKSwgbUJ1ZkZyYW1lcygwKSwgbUJ1ZkZyYW1lU2l6ZSgwKSwKKyAgICAgICAgICAgIG1SZXNhbXBsZXIoTlVMTCksCisgICAgICAgICAgICBtSXNMZWdhY3lEb3dubWl4KGZhbHNlKSwKKyAgICAgICAgICAgIG1Jc0xlZ2FjeVVwbWl4KGZhbHNlKSwKKyAgICAgICAgICAgIG1SZXF1aXJlc0Zsb2F0KGZhbHNlKSwKKyAgICAgICAgICAgIG1JbnB1dENvbnZlcnRlclByb3ZpZGVyKE5VTEwpCit7CisgICAgKHZvaWQpdXBkYXRlUGFyYW1ldGVycyhzcmNDaGFubmVsTWFzaywgc3JjRm9ybWF0LCBzcmNTYW1wbGVSYXRlLAorICAgICAgICAgICAgZHN0Q2hhbm5lbE1hc2ssIGRzdEZvcm1hdCwgZHN0U2FtcGxlUmF0ZSk7Cit9CisKK0F1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRCdWZmZXJDb252ZXJ0ZXI6On5SZWNvcmRCdWZmZXJDb252ZXJ0ZXIoKSB7CisgICAgZnJlZShtQnVmKTsKKyAgICBkZWxldGUgbVJlc2FtcGxlcjsKKyAgICBkZWxldGUgbUlucHV0Q29udmVydGVyUHJvdmlkZXI7Cit9CisKK3NpemVfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkQnVmZmVyQ29udmVydGVyOjpjb252ZXJ0KHZvaWQgKmRzdCwKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciAqcHJvdmlkZXIsIHNpemVfdCBmcmFtZXMpCit7CisgICAgaWYgKG1JbnB1dENvbnZlcnRlclByb3ZpZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUlucHV0Q29udmVydGVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKHByb3ZpZGVyKTsKKyAgICAgICAgcHJvdmlkZXIgPSBtSW5wdXRDb252ZXJ0ZXJQcm92aWRlcjsKKyAgICB9CisKKyAgICBpZiAobVJlc2FtcGxlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWVigiTk8gUkVTQU1QTElORyBzYW1wbGVSYXRlOiV1IG1TcmNGb3JtYXQ6JSN4IG1Ec3RGb3JtYXQ6JSN4IiwKKyAgICAgICAgICAgICAgICBtU3JjU2FtcGxlUmF0ZSwgbVNyY0Zvcm1hdCwgbURzdEZvcm1hdCk7CisKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIGJ1ZmZlcjsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IGZyYW1lczsgaSA+IDA7ICkgeworICAgICAgICAgICAgYnVmZmVyLmZyYW1lQ291bnQgPSBpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9LIHx8IGJ1ZmZlci5mcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBmcmFtZXMgLT0gaTsgLy8gY2Fubm90IGZpbGwgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZvcm1hdCBjb252ZXJ0IHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICAgICAgICAgICAgY29udmVydE5vUmVzYW1wbGVyKGRzdCwgYnVmZmVyLnJhdywgYnVmZmVyLmZyYW1lQ291bnQpOworCisgICAgICAgICAgICBkc3QgPSAoaW50OF90Kilkc3QgKyBidWZmZXIuZnJhbWVDb3VudCAqIG1Ec3RGcmFtZVNpemU7CisgICAgICAgICAgICBpIC09IGJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICAgICAgcHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAgQUxPR1ZWKCJSRVNBTVBMSU5HIG1TcmNTYW1wbGVSYXRlOiV1IG1Ec3RTYW1wbGVSYXRlOiV1IG1TcmNGb3JtYXQ6JSN4IG1Ec3RGb3JtYXQ6JSN4IiwKKyAgICAgICAgICAgICAgICAgbVNyY1NhbXBsZVJhdGUsIG1Ec3RTYW1wbGVSYXRlLCBtU3JjRm9ybWF0LCBtRHN0Rm9ybWF0KTsKKworICAgICAgICAgLy8gcmVhbGxvY2F0ZSBidWZmZXIgaWYgbmVlZGVkCisgICAgICAgICBpZiAobUJ1ZkZyYW1lU2l6ZSAhPSAwICYmIG1CdWZGcmFtZXMgPCBmcmFtZXMpIHsKKyAgICAgICAgICAgICBmcmVlKG1CdWYpOworICAgICAgICAgICAgIG1CdWZGcmFtZXMgPSBmcmFtZXM7CisgICAgICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1CdWYsIDMyLCBtQnVmRnJhbWVzICogbUJ1ZkZyYW1lU2l6ZSk7CisgICAgICAgICB9CisgICAgICAgIC8vIHJlc2FtcGxlciBhY2N1bXVsYXRlcywgYnV0IHdlIG9ubHkgaGF2ZSBvbmUgc291cmNlIHRyYWNrCisgICAgICAgIG1lbXNldChtQnVmLCAwLCBmcmFtZXMgKiBtQnVmRnJhbWVTaXplKTsKKyAgICAgICAgZnJhbWVzID0gbVJlc2FtcGxlci0+cmVzYW1wbGUoKGludDMyX3QqKW1CdWYsIGZyYW1lcywgcHJvdmlkZXIpOworICAgICAgICAvLyBmb3JtYXQgY29udmVydCB0byBkZXN0aW5hdGlvbiBidWZmZXIKKyAgICAgICAgY29udmVydFJlc2FtcGxlcihkc3QsIG1CdWYsIGZyYW1lcyk7CisgICAgfQorICAgIHJldHVybiBmcmFtZXM7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRCdWZmZXJDb252ZXJ0ZXI6OnVwZGF0ZVBhcmFtZXRlcnMoCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHNyY0NoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBzcmNGb3JtYXQsCisgICAgICAgIHVpbnQzMl90IHNyY1NhbXBsZVJhdGUsCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGRzdENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBkc3RGb3JtYXQsCisgICAgICAgIHVpbnQzMl90IGRzdFNhbXBsZVJhdGUpCit7CisgICAgLy8gcXVpY2sgZXZhbHVhdGlvbiBpZiB0aGVyZSBpcyBhbnkgY2hhbmdlLgorICAgIGlmIChtU3JjRm9ybWF0ID09IHNyY0Zvcm1hdAorICAgICAgICAgICAgJiYgbVNyY0NoYW5uZWxNYXNrID09IHNyY0NoYW5uZWxNYXNrCisgICAgICAgICAgICAmJiBtU3JjU2FtcGxlUmF0ZSA9PSBzcmNTYW1wbGVSYXRlCisgICAgICAgICAgICAmJiBtRHN0Rm9ybWF0ID09IGRzdEZvcm1hdAorICAgICAgICAgICAgJiYgbURzdENoYW5uZWxNYXNrID09IGRzdENoYW5uZWxNYXNrCisgICAgICAgICAgICAmJiBtRHN0U2FtcGxlUmF0ZSA9PSBkc3RTYW1wbGVSYXRlKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBBTE9HVigiUmVjb3JkQnVmZmVyQ29udmVydGVyIHVwZGF0ZVBhcmFtZXRlcnMgc3JjTWFzazolI3ggZHN0TWFzazolI3giCisgICAgICAgICAgICAiICBzcmNGb3JtYXQ6JSN4IGRzdEZvcm1hdDolI3ggIHNyY1JhdGU6JXUgZHN0UmF0ZToldSIsCisgICAgICAgICAgICBzcmNDaGFubmVsTWFzaywgZHN0Q2hhbm5lbE1hc2ssIHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBzcmNTYW1wbGVSYXRlLCBkc3RTYW1wbGVSYXRlKTsKKyAgICBjb25zdCBib29sIHZhbGlkID0KKyAgICAgICAgICAgIGF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoc3JjQ2hhbm5lbE1hc2spCisgICAgICAgICAgICAmJiBhdWRpb19pc19pbnB1dF9jaGFubmVsKGRzdENoYW5uZWxNYXNrKQorICAgICAgICAgICAgJiYgYXVkaW9faXNfdmFsaWRfZm9ybWF0KHNyY0Zvcm1hdCkgJiYgYXVkaW9faXNfbGluZWFyX3BjbShzcmNGb3JtYXQpCisgICAgICAgICAgICAmJiBhdWRpb19pc192YWxpZF9mb3JtYXQoZHN0Rm9ybWF0KSAmJiBhdWRpb19pc19saW5lYXJfcGNtKGRzdEZvcm1hdCkKKyAgICAgICAgICAgICYmIChzcmNTYW1wbGVSYXRlIDw9IGRzdFNhbXBsZVJhdGUgKiBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVgpCisgICAgICAgICAgICA7IC8vIG5vIHVwc2FtcGxpbmcgY2hlY2tzIGZvciBub3cKKyAgICBpZiAoIXZhbGlkKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbVNyY0Zvcm1hdCA9IHNyY0Zvcm1hdDsKKyAgICBtU3JjQ2hhbm5lbE1hc2sgPSBzcmNDaGFubmVsTWFzazsKKyAgICBtU3JjU2FtcGxlUmF0ZSA9IHNyY1NhbXBsZVJhdGU7CisgICAgbURzdEZvcm1hdCA9IGRzdEZvcm1hdDsKKyAgICBtRHN0Q2hhbm5lbE1hc2sgPSBkc3RDaGFubmVsTWFzazsKKyAgICBtRHN0U2FtcGxlUmF0ZSA9IGRzdFNhbXBsZVJhdGU7CisKKyAgICAvLyBjb21wdXRlIGRlcml2ZWQgcGFyYW1ldGVycworICAgIG1TcmNDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhzcmNDaGFubmVsTWFzayk7CisgICAgbURzdENoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGRzdENoYW5uZWxNYXNrKTsKKyAgICBtRHN0RnJhbWVTaXplID0gbURzdENoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobURzdEZvcm1hdCk7CisKKyAgICAvLyBkbyB3ZSBuZWVkIHRvIHJlc2FtcGxlPworICAgIGRlbGV0ZSBtUmVzYW1wbGVyOworICAgIG1SZXNhbXBsZXIgPSBOVUxMOworICAgIGlmIChtU3JjU2FtcGxlUmF0ZSAhPSBtRHN0U2FtcGxlUmF0ZSkgeworICAgICAgICBtUmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZShBVURJT19GT1JNQVRfUENNX0ZMT0FULAorICAgICAgICAgICAgICAgIG1TcmNDaGFubmVsQ291bnQsIG1Ec3RTYW1wbGVSYXRlKTsKKyAgICAgICAgbVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShtU3JjU2FtcGxlUmF0ZSk7CisgICAgICAgIG1SZXNhbXBsZXItPnNldFZvbHVtZShBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FULCBBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FUKTsKKyAgICB9CisKKyAgICAvLyBhcmUgd2UgcnVubmluZyBsZWdhY3kgY2hhbm5lbCBjb252ZXJzaW9uIG1vZGVzPworICAgIG1Jc0xlZ2FjeURvd25taXggPSAobVNyY0NoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVNyY0NoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSykKKyAgICAgICAgICAgICAgICAgICAmJiBtRHN0Q2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9NT05POworICAgIG1Jc0xlZ2FjeVVwbWl4ID0gbVNyY0NoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fTU9OTworICAgICAgICAgICAgICAgICAgICYmIChtRHN0Q2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtRHN0Q2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLKTsKKworICAgIC8vIGRvIHdlIG5lZWQgdG8gcHJvY2VzcyBpbiBmbG9hdD8KKyAgICBtUmVxdWlyZXNGbG9hdCA9IG1SZXNhbXBsZXIgIT0gTlVMTCB8fCBtSXNMZWdhY3lEb3dubWl4IHx8IG1Jc0xlZ2FjeVVwbWl4OworCisgICAgLy8gZG8gd2UgbmVlZCBhIHN0YWdpbmcgYnVmZmVyIHRvIGNvbnZlcnQgZm9yIGRlc3RpbmF0aW9uICh3ZSBjYW4gc3RpbGwgb3B0aW1pemUgdGhpcyk/CisgICAgLy8gd2UgdXNlIG1CdWZGcmFtZVNpemUgPiAwIHRvIGluZGljYXRlIGJvdGggZnJhbWUgc2l6ZSBhcyB3ZWxsIGFzIGJ1ZmZlciBuZWNlc3NpdHkKKyAgICBpZiAobVJlc2FtcGxlciAhPSBOVUxMKSB7CisgICAgICAgIG1CdWZGcmFtZVNpemUgPSBtYXgobVNyY0NoYW5uZWxDb3VudCwgRkNDXzIpCisgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIH0gZWxzZSBpZiAobUlzTGVnYWN5VXBtaXggfHwgbUlzTGVnYWN5RG93bm1peCkgeyAvLyBsZWdhY3kgbW9kZXMgYWx3YXlzIGZsb2F0CisgICAgICAgIG1CdWZGcmFtZVNpemUgPSBtRHN0Q2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICB9IGVsc2UgaWYgKG1TcmNDaGFubmVsTWFzayAhPSBtRHN0Q2hhbm5lbE1hc2sgJiYgbURzdEZvcm1hdCAhPSBtU3JjRm9ybWF0KSB7CisgICAgICAgIG1CdWZGcmFtZVNpemUgPSBtRHN0Q2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtU3JjRm9ybWF0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQnVmRnJhbWVTaXplID0gMDsKKyAgICB9CisgICAgbUJ1ZkZyYW1lcyA9IDA7IC8vIGZvcmNlIHRoZSBidWZmZXIgdG8gYmUgcmVzaXplZC4KKworICAgIC8vIGRvIHdlIG5lZWQgYW4gaW5wdXQgY29udmVydGVyIGJ1ZmZlciBwcm92aWRlciB0byBnaXZlIHVzIGZsb2F0PworICAgIGRlbGV0ZSBtSW5wdXRDb252ZXJ0ZXJQcm92aWRlcjsKKyAgICBtSW5wdXRDb252ZXJ0ZXJQcm92aWRlciA9IE5VTEw7CisgICAgaWYgKG1SZXF1aXJlc0Zsb2F0ICYmIG1TcmNGb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBtSW5wdXRDb252ZXJ0ZXJQcm92aWRlciA9IG5ldyBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1TcmNDaGFubmVsTWFzayksCisgICAgICAgICAgICAgICAgbVNyY0Zvcm1hdCwKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNX0ZMT0FULAorICAgICAgICAgICAgICAgIDI1NiAvKiBwcm92aWRlciBidWZmZXIgZnJhbWUgY291bnQgKi8pOworICAgIH0KKworICAgIC8vIGRvIHdlIG5lZWQgYSByZW1peGVyIHRvIGRvIGNoYW5uZWwgbWFzayBjb252ZXJzaW9uCisgICAgaWYgKCFtSXNMZWdhY3lEb3dubWl4ICYmICFtSXNMZWdhY3lVcG1peCAmJiBtU3JjQ2hhbm5lbE1hc2sgIT0gbURzdENoYW5uZWxNYXNrKSB7CisgICAgICAgICh2b2lkKSBtZW1jcHlfYnlfaW5kZXhfYXJyYXlfaW5pdGlhbGl6YXRpb25fZnJvbV9jaGFubmVsX21hc2soCisgICAgICAgICAgICAgICAgbUlkeEFyeSwgQVJSQVlfU0laRShtSWR4QXJ5KSwgbURzdENoYW5uZWxNYXNrLCBtU3JjQ2hhbm5lbE1hc2spOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZEJ1ZmZlckNvbnZlcnRlcjo6Y29udmVydE5vUmVzYW1wbGVyKAorICAgICAgICB2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICAvLyBzcmMgaXMgbmF0aXZlIHR5cGUgdW5sZXNzIHRoZXJlIGlzIGxlZ2FjeSB1cG1peCBvciBkb3dubWl4LCB3aGVyZXVwb24gaXQgaXMgZmxvYXQuCisgICAgaWYgKG1CdWZGcmFtZVNpemUgIT0gMCAmJiBtQnVmRnJhbWVzIDwgZnJhbWVzKSB7CisgICAgICAgIGZyZWUobUJ1Zik7CisgICAgICAgIG1CdWZGcmFtZXMgPSBmcmFtZXM7CisgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtQnVmLCAzMiwgbUJ1ZkZyYW1lcyAqIG1CdWZGcmFtZVNpemUpOworICAgIH0KKyAgICAvLyBkbyB3ZSBuZWVkIHRvIGRvIGxlZ2FjeSB1cG1peCBhbmQgZG93bm1peD8KKyAgICBpZiAobUlzTGVnYWN5VXBtaXggfHwgbUlzTGVnYWN5RG93bm1peCkgeworICAgICAgICB2b2lkICpkc3RCdWYgPSBtQnVmICE9IE5VTEwgPyBtQnVmIDogZHN0OworICAgICAgICBpZiAobUlzTGVnYWN5VXBtaXgpIHsKKyAgICAgICAgICAgIHVwbWl4X3RvX3N0ZXJlb19mbG9hdF9mcm9tX21vbm9fZmxvYXQoKGZsb2F0ICopZHN0QnVmLAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKilzcmMsIGZyYW1lcyk7CisgICAgICAgIH0gZWxzZSAvKm1Jc0xlZ2FjeURvd25taXggKi8geworICAgICAgICAgICAgZG93bm1peF90b19tb25vX2Zsb2F0X2Zyb21fc3RlcmVvX2Zsb2F0KChmbG9hdCAqKWRzdEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopc3JjLCBmcmFtZXMpOworICAgICAgICB9CisgICAgICAgIGlmIChtQnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoZHN0LCBtRHN0Rm9ybWF0LCBtQnVmLCBBVURJT19GT1JNQVRfUENNX0ZMT0FULAorICAgICAgICAgICAgICAgICAgICBmcmFtZXMgKiBtRHN0Q2hhbm5lbENvdW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIGRvIHdlIG5lZWQgdG8gZG8gY2hhbm5lbCBtYXNrIGNvbnZlcnNpb24/CisgICAgaWYgKG1TcmNDaGFubmVsTWFzayAhPSBtRHN0Q2hhbm5lbE1hc2spIHsKKyAgICAgICAgdm9pZCAqZHN0QnVmID0gbUJ1ZiAhPSBOVUxMID8gbUJ1ZiA6IGRzdDsKKyAgICAgICAgbWVtY3B5X2J5X2luZGV4X2FycmF5KGRzdEJ1ZiwgbURzdENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICBzcmMsIG1TcmNDaGFubmVsQ291bnQsIG1JZHhBcnksIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobVNyY0Zvcm1hdCksIGZyYW1lcyk7CisgICAgICAgIGlmIChkc3RCdWYgPT0gZHN0KSB7CisgICAgICAgICAgICByZXR1cm47IC8vIGZvcm1hdCBpcyB0aGUgc2FtZQorICAgICAgICB9CisgICAgfQorICAgIC8vIGNvbnZlcnQgdG8gZGVzdGluYXRpb24gYnVmZmVyCisgICAgY29uc3Qgdm9pZCAqY29udmVydEJ1ZiA9IG1CdWYgIT0gTlVMTCA/IG1CdWYgOiBzcmM7CisgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChkc3QsIG1Ec3RGb3JtYXQsIGNvbnZlcnRCdWYsIG1TcmNGb3JtYXQsCisgICAgICAgICAgICBmcmFtZXMgKiBtRHN0Q2hhbm5lbENvdW50KTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkQnVmZmVyQ29udmVydGVyOjpjb252ZXJ0UmVzYW1wbGVyKAorICAgICAgICB2b2lkICpkc3QsIC8qbm90LWEtY29uc3QqLyB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpCit7CisgICAgLy8gc3JjIGJ1ZmZlciBmb3JtYXQgaXMgQUxXQVlTIGZsb2F0IHdoZW4gZW50ZXJpbmcgdGhpcyByb3V0aW5lCisgICAgaWYgKG1Jc0xlZ2FjeVVwbWl4KSB7CisgICAgICAgIDsgLy8gbW9ubyB0byBzdGVyZW8gYWxyZWFkeSBoYW5kbGVkIGJ5IHJlc2FtcGxlcgorICAgIH0gZWxzZSBpZiAobUlzTGVnYWN5RG93bm1peAorICAgICAgICAgICAgfHwgKG1TcmNDaGFubmVsTWFzayA9PSBtRHN0Q2hhbm5lbE1hc2sgJiYgbVNyY0NoYW5uZWxDb3VudCA9PSAxKSkgeworICAgICAgICAvLyB0aGUgcmVzYW1wbGVyIG91dHB1dHMgc3RlcmVvIGZvciBtb25vIGlucHV0IGNoYW5uZWwgKGEgZmVhdHVyZT8pCisgICAgICAgIC8vIG11c3QgY29udmVydCB0byBtb25vCisgICAgICAgIGRvd25taXhfdG9fbW9ub19mbG9hdF9mcm9tX3N0ZXJlb19mbG9hdCgoZmxvYXQgKilzcmMsCisgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopc3JjLCBmcmFtZXMpOworICAgIH0gZWxzZSBpZiAobVNyY0NoYW5uZWxNYXNrICE9IG1Ec3RDaGFubmVsTWFzaykgeworICAgICAgICAvLyBjb252ZXJ0IHRvIG1vbm8gY2hhbm5lbCBhZ2FpbiBmb3IgY2hhbm5lbCBtYXNrIGNvbnZlcnNpb24gKGNvdWxkIGJlIHNraXBwZWQKKyAgICAgICAgLy8gd2l0aCBmdXJ0aGVyIG9wdGltaXphdGlvbikuCisgICAgICAgIGlmIChtU3JjQ2hhbm5lbENvdW50ID09IDEpIHsKKyAgICAgICAgICAgIGRvd25taXhfdG9fbW9ub19mbG9hdF9mcm9tX3N0ZXJlb19mbG9hdCgoZmxvYXQgKilzcmMsCisgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopc3JjLCBmcmFtZXMpOworICAgICAgICB9CisgICAgICAgIC8vIGNvbnZlcnQgdG8gZGVzdGluYXRpb24gZm9ybWF0IChpbiBwbGFjZSwgT0sgYXMgZmxvYXQgaXMgbGFyZ2VyIHRoYW4gb3RoZXIgdHlwZXMpCisgICAgICAgIGlmIChtRHN0Rm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoc3JjLCBtRHN0Rm9ybWF0LCBzcmMsIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lcyAqIG1TcmNDaGFubmVsQ291bnQpOworICAgICAgICB9CisgICAgICAgIC8vIGNoYW5uZWwgY29udmVydCBhbmQgc2F2ZSB0byBkc3QKKyAgICAgICAgbWVtY3B5X2J5X2luZGV4X2FycmF5KGRzdCwgbURzdENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICBzcmMsIG1TcmNDaGFubmVsQ291bnQsIG1JZHhBcnksIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobURzdEZvcm1hdCksIGZyYW1lcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gY29udmVydCB0byBkZXN0aW5hdGlvbiBmb3JtYXQgYW5kIHNhdmUgdG8gZHN0CisgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChkc3QsIG1Ec3RGb3JtYXQsIHNyYywgQVVESU9fRk9STUFUX1BDTV9GTE9BVCwKKyAgICAgICAgICAgIGZyYW1lcyAqIG1Ec3RDaGFubmVsQ291bnQpOworfQorCiBib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cykKIHsKQEAgLTYwNjcsNiArNjc1NCw3IEBACiAKICAgICBhdWRpb19mb3JtYXRfdCByZXFGb3JtYXQgPSBtRm9ybWF0OwogICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOworICAgIC8vIFRPRE8gdGhpcyBtYXkgY2hhbmdlIGlmIHdlIHdhbnQgdG8gc3VwcG9ydCBjYXB0dXJlIGZyb20gSERNSSBQQ00gbXVsdGkgY2hhbm5lbCAoZS5nIG9uIFRWcykuCiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChtQ2hhbm5lbENvdW50KTsKIAogICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlyKTsKQEAgLTYwNzksNyArNjc2Nyw3IEBACiAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICB9CiAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgaWYgKChhdWRpb19mb3JtYXRfdCkgdmFsdWUgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKChhdWRpb19mb3JtYXRfdCkgdmFsdWUpKSB7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXFGb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIHZhbHVlOwpAQCAtNjA4OCw3ICs2Nzc2LDggQEAKICAgICB9CiAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlDaGFubmVscyksIHZhbHVlKSA9PSBOT19FUlJPUikgewogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KSB2YWx1ZTsKLSAgICAgICAgaWYgKG1hc2sgIT0gQVVESU9fQ0hBTk5FTF9JTl9NT05PICYmIG1hc2sgIT0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pIHsKKyAgICAgICAgaWYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKG1hc2spIHx8CisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobWFzaykgPiBGQ0NfOCkgewogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBtYXNrOwpAQCAtNjEyMCw2ICs2ODA5LDkgQEAKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1JbkRldmljZSA9IHZhbHVlOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgbVByZXZJbkRldmljZSA9IHZhbHVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gZGlzYWJsZSBBRUMgYW5kIE5TIGlmIHRoZSBkZXZpY2UgaXMgYSBCVCBTQ08gaGVhZHNldCBzdXBwb3J0aW5nIHRob3NlCiAgICAgICAgICAgICAvLyBwcmUgcHJvY2Vzc2luZ3MKICAgICAgICAgICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDApIHsKQEAgLTYxNTMsMTkgKzY4NDUsMTcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAocmVjb25maWcpIHsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQkFEX1ZBTFVFICYmCi0gICAgICAgICAgICAgICAgcmVxRm9ybWF0ID09IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikgJiYKLSAgICAgICAgICAgICAgICByZXFGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgJiYKKyAgICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikpICYmCisgICAgICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShyZXFGb3JtYXQpICYmCiAgICAgICAgICAgICAgICAgKG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgPD0gKDIgKiBzYW1wbGluZ1JhdGUpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgPD0gKEFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCAqIHNhbXBsaW5nUmF0ZSkpICYmCiAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soCi0gICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikpIDw9IEZDQ18yICYmCi0gICAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fTU9OTyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikpIDw9IEZDQ184KSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7Ci0gICAgICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBdWRpb1N5c3RlbTo6SU5QVVRfQ09ORklHX0NIQU5HRUQpOworICAgICAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fSU5QVVRfQ09ORklHX0NIQU5HRUQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNjE4NiwyNiArNjg3NiwyNyBAQAogICAgIHJldHVybiBvdXRfczg7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSBfX3VudXNlZCkgewotICAgIEF1ZGlvU3lzdGVtOjpPdXRwdXREZXNjcmlwdG9yIGRlc2M7Ci0gICAgY29uc3Qgdm9pZCAqcGFyYW0yID0gTlVMTDsKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkgeworICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CisKKyAgICBkZXNjLT5tSW9IYW5kbGUgPSBtSWQ7CiAKICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBBdWRpb1N5c3RlbTo6SU5QVVRfT1BFTkVEOgotICAgIGNhc2UgQXVkaW9TeXN0ZW06OklOUFVUX0NPTkZJR19DSEFOR0VEOgotICAgICAgICBkZXNjLmNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrOwotICAgICAgICBkZXNjLnNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOwotICAgICAgICBkZXNjLmZvcm1hdCA9IG1Gb3JtYXQ7Ci0gICAgICAgIGRlc2MuZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OwotICAgICAgICBkZXNjLmxhdGVuY3kgPSAwOwotICAgICAgICBwYXJhbTIgPSAmZGVzYzsKKyAgICBjYXNlIEFVRElPX0lOUFVUX09QRU5FRDoKKyAgICBjYXNlIEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEOgorICAgICAgICBkZXNjLT5tUGF0Y2ggPSBtUGF0Y2g7CisgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsKKyAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOworICAgICAgICBkZXNjLT5tRm9ybWF0ID0gbUZvcm1hdDsKKyAgICAgICAgZGVzYy0+bUZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKKyAgICAgICAgZGVzYy0+bUxhdGVuY3kgPSAwOwogICAgICAgICBicmVhazsKIAotICAgIGNhc2UgQXVkaW9TeXN0ZW06OklOUFVUX0NMT1NFRDoKKyAgICBjYXNlIEFVRElPX0lOUFVUX0NMT1NFRDoKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKICAgICB9Ci0gICAgbUF1ZGlvRmxpbmdlci0+YXVkaW9Db25maWdDaGFuZ2VkKGV2ZW50LCBtSWQsIHBhcmFtMik7CisgICAgbUF1ZGlvRmxpbmdlci0+aW9Db25maWdDaGFuZ2VkKGV2ZW50LCBkZXNjLCBwaWQpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpyZWFkSW5wdXRQYXJhbWV0ZXJzX2woKQpAQCAtNjIxMywxMCArNjkwNCwxMyBAQAogICAgIG1TYW1wbGVSYXRlID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIG1DaGFubmVsTWFzayA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrKTsKKyAgICBpZiAobUNoYW5uZWxDb3VudCA+IEZDQ184KSB7CisgICAgICAgIEFMT0dFKCJIQUwgY2hhbm5lbCBjb3VudCAlZCA+ICVkIiwgbUNoYW5uZWxDb3VudCwgRkNDXzgpOworICAgIH0KICAgICBtSEFMRm9ybWF0ID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBtRm9ybWF0ID0gbUhBTEZvcm1hdDsKLSAgICBpZiAobUZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBBTE9HRSgiSEFMIGZvcm1hdCAlI3ggbm90IHN1cHBvcnRlZDsgbXVzdCBiZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCIsIG1Gb3JtYXQpOworICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICBBTE9HRSgiSEFMIGZvcm1hdCAlI3ggaXMgbm90IGxpbmVhciBwY20iLCBtRm9ybWF0KTsKICAgICB9CiAgICAgbUZyYW1lU2l6ZSA9IGF1ZGlvX3N0cmVhbV9pbl9mcmFtZV9zaXplKG1JbnB1dC0+c3RyZWFtKTsKICAgICBtQnVmZmVyU2l6ZSA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2J1ZmZlcl9zaXplKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKQEAgLTYyMjcsOSArNjkyMSwxMiBAQAogICAgIC8vIFRoZSB2YWx1ZSBpcyBzb21ld2hhdCBhcmJpdHJhcnksIGFuZCBjb3VsZCBwcm9iYWJseSBiZSBldmVuIGxhcmdlci4KICAgICAvLyBBIGxhcmdlciB2YWx1ZSBzaG91bGQgYWxsb3cgbW9yZSBvbGQgZGF0YSB0byBiZSByZWFkIGFmdGVyIGEgdHJhY2sgY2FsbHMgc3RhcnQoKSwKICAgICAvLyB3aXRob3V0IGluY3JlYXNpbmcgbGF0ZW5jeS4KKyAgICAvLworICAgIC8vIE5vdGUgdGhpcyBpcyBpbmRlcGVuZGVudCBvZiB0aGUgbWF4aW11bSBkb3duc2FtcGxpbmcgcmF0aW8gcGVybWl0dGVkIGZvciBjYXB0dXJlLgogICAgIG1Sc21wSW5GcmFtZXMgPSBtRnJhbWVDb3VudCAqIDc7CiAgICAgbVJzbXBJbkZyYW1lc1AyID0gcm91bmR1cChtUnNtcEluRnJhbWVzKTsKLSAgICBkZWxldGVbXSBtUnNtcEluQnVmZmVyOworICAgIGZyZWUobVJzbXBJbkJ1ZmZlcik7CisgICAgbVJzbXBJbkJ1ZmZlciA9IE5VTEw7CiAKICAgICAvLyBUT0RPIG9wdGltaXplIGF1ZGlvIGNhcHR1cmUgYnVmZmVyIHNpemVzIC4uLgogICAgIC8vIEhlcmUgd2UgY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBzbGlkaW5nIGJ1ZmZlciB1c2VkIGFzIGEgc291cmNlCkBAIC02MjM5LDkgKzY5MzYsOSBAQAogICAgIC8vIFRoZSBjdXJyZW50IHZhbHVlIGlzIGhpZ2hlciB0aGFuIG5lY2Vzc2FyeS4gIEhvd2V2ZXIgaXQgc2hvdWxkIG5vdCBhZGQgdG8gbGF0ZW5jeS4KIAogICAgIC8vIE92ZXItYWxsb2NhdGUgYmV5b25kIG1Sc21wSW5GcmFtZXNQMiB0byBwZXJtaXQgYSBIQUwgcmVhZCBwYXN0IGVuZCBvZiBidWZmZXIKLSAgICBzaXplX3QgYnVmZmVyU2l6ZUluU2hvcnRzID0gKG1Sc21wSW5GcmFtZXNQMiArIG1GcmFtZUNvdW50IC0gMSkgKiBtQ2hhbm5lbENvdW50OwotICAgIG1Sc21wSW5CdWZmZXIgPSBuZXcgaW50MTZfdFtidWZmZXJTaXplSW5TaG9ydHNdOwotICAgIG1lbXNldChtUnNtcEluQnVmZmVyLCAwLCBidWZmZXJTaXplSW5TaG9ydHMgKiBzaXplb2YobVJzbXBJbkJ1ZmZlclswXSkpOworICAgIHNpemVfdCBidWZmZXJTaXplID0gKG1Sc21wSW5GcmFtZXNQMiArIG1GcmFtZUNvdW50IC0gMSkgKiBtRnJhbWVTaXplOworICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtUnNtcEluQnVmZmVyLCAzMiwgYnVmZmVyU2l6ZSk7CisgICAgbWVtc2V0KG1Sc21wSW5CdWZmZXIsIDAsIGJ1ZmZlclNpemUpOyAvLyBpZiBwb3NpeF9tZW1hbGlnbiBmYWlscywgd2lsbCBzZWd2IGhlcmUuCiAKICAgICAvLyBBdWRpb1JlY29yZCBtU2FtcGxlUmF0ZSBhbmQgbUNoYW5uZWxDb3VudCBhcmUgY29uc3RhbnQgZHVlIHRvIEF1ZGlvUmVjb3JkIEFQSSBjb25zdHJhaW50cy4KICAgICAvLyBCdXQgaWYgdGhyZWFkJ3MgbVNhbXBsZVJhdGUgb3IgbUNoYW5uZWxDb3VudCBjaGFuZ2VzLCBob3cgd2lsbCB0aGF0IGFmZmVjdCBhY3RpdmUgdHJhY2tzPwpAQCAtNjM0NSwzMyArNzA0MiwzNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgaWYgKG1JbnB1dC0+YXVkaW9Id0Rldi0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgLy8gc3RvcmUgbmV3IGRldmljZSBhbmQgc2VuZCB0byBlZmZlY3RzCi0gICAgICAgIG1JbkRldmljZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKKworICAgIC8vIHN0b3JlIG5ldyBkZXZpY2UgYW5kIHNlbmQgdG8gZWZmZWN0cworICAgIG1JbkRldmljZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKKyAgICBtUGF0Y2ggPSAqcGF0Y2g7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZV9sKG1JbkRldmljZSk7CisgICAgfQorCisgICAgLy8gZGlzYWJsZSBBRUMgYW5kIE5TIGlmIHRoZSBkZXZpY2UgaXMgYSBCVCBTQ08gaGVhZHNldCBzdXBwb3J0aW5nIHRob3NlCisgICAgLy8gcHJlIHByb2Nlc3NpbmdzCisgICAgaWYgKG1UcmFja3Muc2l6ZSgpID4gMCkgeworICAgICAgICBib29sIHN1c3BlbmQgPSBhdWRpb19pc19ibHVldG9vdGhfc2NvX2RldmljZShtSW5EZXZpY2UpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci0+YnROcmVjSXNPZmYoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOworICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woRlhfSUlEX0FFQywgc3VzcGVuZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZF9sKEZYX0lJRF9OUywgc3VzcGVuZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHN0b3JlIG5ldyBzb3VyY2UgYW5kIHNlbmQgdG8gZWZmZWN0cworICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UpIHsKKyAgICAgICAgbUF1ZGlvU291cmNlID0gcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2U7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wobUluRGV2aWNlKTsKKyAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldEF1ZGlvU291cmNlX2wobUF1ZGlvU291cmNlKTsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICAvLyBkaXNhYmxlIEFFQyBhbmQgTlMgaWYgdGhlIGRldmljZSBpcyBhIEJUIFNDTyBoZWFkc2V0IHN1cHBvcnRpbmcgdGhvc2UKLSAgICAgICAgLy8gcHJlIHByb2Nlc3NpbmdzCi0gICAgICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGJvb2wgc3VzcGVuZCA9IGF1ZGlvX2lzX2JsdWV0b290aF9zY29fZGV2aWNlKG1JbkRldmljZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci0+YnROcmVjSXNPZmYoKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07Ci0gICAgICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woRlhfSUlEX0FFQywgc3VzcGVuZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbChGWF9JSURfTlMsIHN1c3BlbmQsIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzdG9yZSBuZXcgc291cmNlIGFuZCBzZW5kIHRvIGVmZmVjdHMKLSAgICAgICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSkgewotICAgICAgICAgICAgbUF1ZGlvU291cmNlID0gcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2U7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXRBdWRpb1NvdXJjZV9sKG1BdWRpb1NvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQorICAgIGlmIChtSW5wdXQtPmF1ZGlvSHdEZXYtPnZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CiAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSA9IG1JbnB1dC0+YXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsKICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPmNyZWF0ZV9hdWRpb19wYXRjaChod0RldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzLApAQCAtNjM4MCwxOSArNzA3OSw0NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJjcmVhdGVBdWRpb1BhdGNoX2woKSBjYWxsZWQgb24gYSBwcmUgMy4wIEhBTCIpOworICAgICAgICBjaGFyICphZGRyZXNzOworICAgICAgICBpZiAoc3RyY21wKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcywgIiIpICE9IDApIHsKKyAgICAgICAgICAgIGFkZHJlc3MgPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkcmVzcyA9IChjaGFyICopY2FsbG9jKDEsIDEpOworICAgICAgICB9CisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoU3RyaW5nOChhZGRyZXNzKSk7CisgICAgICAgIGZyZWUoYWRkcmVzcyk7CisgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksCisgICAgICAgICAgICAgICAgICAgICAoaW50KXBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZSk7CisgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fSU5QVVRfU09VUkNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSk7CisgICAgICAgIHN0YXR1cyA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24sCisgICAgICAgICAgICAgICAgcGFyYW0udG9TdHJpbmcoKS5zdHJpbmcoKSk7CisgICAgICAgICpoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICB9CisKKyAgICBpZiAobUluRGV2aWNlICE9IG1QcmV2SW5EZXZpY2UpIHsKKyAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRCk7CisgICAgICAgIG1QcmV2SW5EZXZpY2UgPSBtSW5EZXZpY2U7CisgICAgfQorCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworCisgICAgbUluRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisKICAgICBpZiAobUlucHV0LT5hdWRpb0h3RGV2LT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewogICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UgPSBtSW5wdXQtPmF1ZGlvSHdEZXYtPmh3RGV2aWNlKCk7CiAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5yZWxlYXNlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLCBoYW5kbGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAicmVsZWFzZUF1ZGlvUGF0Y2hfbCgpIGNhbGxlZCBvbiBhIHByZSAzLjAgSEFMIik7CisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1JPVVRJTkcpLCAwKTsKKyAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICBwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTY0MTcsNCArNzE0NCw0IEBACiAgICAgY29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gbUF1ZGlvU291cmNlOwogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKaW5kZXggNTZhNDJhOC4uNDZhYzMwMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCkBAIC0zMiw4ICszMiwxMSBAQAogICAgICAgICBPRkZMT0FEICAgICAgICAgICAgIC8vIFRocmVhZCBjbGFzcyBpcyBPZmZsb2FkVGhyZWFkCiAgICAgfTsKIAorICAgIHN0YXRpYyBjb25zdCBjaGFyICp0aHJlYWRUeXBlVG9TdHJpbmcodHlwZV90IHR5cGUpOworCiAgICAgVGhyZWFkQmFzZShjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAotICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgdHlwZV90IHR5cGUpOworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+VGhyZWFkQmFzZSgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWFkeVRvUnVuKCk7CkBAIC05MCwzMCArOTMsMzMgQEAKICAgICAgICAgQ29uZGl0aW9uIG1Db25kOyAvLyBjb25kaXRpb24gZm9yIHN0YXR1cyByZXR1cm4KICAgICAgICAgc3RhdHVzX3QgbVN0YXR1czsgLy8gc3RhdHVzIGNvbW11bmljYXRlZCB0byBzZW5kZXIKICAgICAgICAgYm9vbCBtV2FpdFN0YXR1czsgLy8gdHJ1ZSBpZiBzZW5kZXIgaXMgd2FpdGluZyBmb3Igc3RhdHVzCisgICAgICAgIGJvb2wgbVJlcXVpcmVzU3lzdGVtUmVhZHk7IC8vIHRydWUgaWYgbXVzdCB3YWl0IGZvciBzeXN0ZW0gcmVhZHkgdG8gZW50ZXIgZXZlbnQgcXVldWUKICAgICAgICAgc3A8Q29uZmlnRXZlbnREYXRhPiBtRGF0YTsgICAgIC8vIGV2ZW50IHNwZWNpZmljIHBhcmFtZXRlciBkYXRhCiAKICAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIENvbmZpZ0V2ZW50KGludCB0eXBlKSA6IG1UeXBlKHR5cGUpLCBtU3RhdHVzKE5PX0VSUk9SKSwgbVdhaXRTdGF0dXMoZmFsc2UpLCBtRGF0YShOVUxMKSB7fQorICAgICAgICBDb25maWdFdmVudChpbnQgdHlwZSwgYm9vbCByZXF1aXJlc1N5c3RlbVJlYWR5ID0gZmFsc2UpIDoKKyAgICAgICAgICAgIG1UeXBlKHR5cGUpLCBtU3RhdHVzKE5PX0VSUk9SKSwgbVdhaXRTdGF0dXMoZmFsc2UpLAorICAgICAgICAgICAgbVJlcXVpcmVzU3lzdGVtUmVhZHkocmVxdWlyZXNTeXN0ZW1SZWFkeSksIG1EYXRhKE5VTEwpIHt9CiAgICAgfTsKIAogICAgIGNsYXNzIElvQ29uZmlnRXZlbnREYXRhIDogcHVibGljIENvbmZpZ0V2ZW50RGF0YSB7CiAgICAgcHVibGljOgotICAgICAgICBJb0NvbmZpZ0V2ZW50RGF0YShpbnQgZXZlbnQsIGludCBwYXJhbSkgOgotICAgICAgICAgICAgbUV2ZW50KGV2ZW50KSwgbVBhcmFtKHBhcmFtKSB7fQorICAgICAgICBJb0NvbmZpZ0V2ZW50RGF0YShhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkgOgorICAgICAgICAgICAgbUV2ZW50KGV2ZW50KSwgbVBpZChwaWQpIHt9CiAKICAgICAgICAgdmlydHVhbCAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIklPIGV2ZW50OiBldmVudCAlZCwgcGFyYW0gJWRcbiIsIG1FdmVudCwgbVBhcmFtKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIklPIGV2ZW50OiBldmVudCAlZFxuIiwgbUV2ZW50KTsKICAgICAgICAgfQogCi0gICAgICAgIGNvbnN0IGludCBtRXZlbnQ7Ci0gICAgICAgIGNvbnN0IGludCBtUGFyYW07CisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBtRXZlbnQ7CisgICAgICAgIGNvbnN0IHBpZF90ICAgICAgICAgICAgICAgICBtUGlkOwogICAgIH07CiAKICAgICBjbGFzcyBJb0NvbmZpZ0V2ZW50IDogcHVibGljIENvbmZpZ0V2ZW50IHsKICAgICBwdWJsaWM6Ci0gICAgICAgIElvQ29uZmlnRXZlbnQoaW50IGV2ZW50LCBpbnQgcGFyYW0pIDoKKyAgICAgICAgSW9Db25maWdFdmVudChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkgOgogICAgICAgICAgICAgQ29uZmlnRXZlbnQoQ0ZHX0VWRU5UX0lPKSB7Ci0gICAgICAgICAgICBtRGF0YSA9IG5ldyBJb0NvbmZpZ0V2ZW50RGF0YShldmVudCwgcGFyYW0pOworICAgICAgICAgICAgbURhdGEgPSBuZXcgSW9Db25maWdFdmVudERhdGEoZXZlbnQsIHBpZCk7CiAgICAgICAgIH0KICAgICAgICAgdmlydHVhbCB+SW9Db25maWdFdmVudCgpIHt9CiAgICAgfTsKQEAgLTEzNSw3ICsxNDEsNyBAQAogICAgIGNsYXNzIFByaW9Db25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CiAgICAgcHVibGljOgogICAgICAgICBQcmlvQ29uZmlnRXZlbnQocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbykgOgotICAgICAgICAgICAgQ29uZmlnRXZlbnQoQ0ZHX0VWRU5UX1BSSU8pIHsKKyAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9QUklPLCB0cnVlKSB7CiAgICAgICAgICAgICBtRGF0YSA9IG5ldyBQcmlvQ29uZmlnRXZlbnREYXRhKHBpZCwgdGlkLCBwcmlvKTsKICAgICAgICAgfQogICAgICAgICB2aXJ0dWFsIH5QcmlvQ29uZmlnRXZlbnQoKSB7fQpAQCAtMjUwLDEzICsyNTYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKSA9IDA7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKICAgICB2aXJ0dWFsICAgICBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpID0gMDsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKSA9IDA7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCkgPSAwOwogICAgICAgICAgICAgICAgIC8vIHNlbmRDb25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiAgICAgICAgICAgICAgICAgLy8gQ2FuIHRlbXBvcmFyaWx5IHJlbGVhc2UgdGhlIGxvY2sgaWYgd2FpdGluZyBmb3IgYSByZXBseSBmcm9tCiAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkuCiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZENvbmZpZ0V2ZW50X2woc3A8Q29uZmlnRXZlbnQ+JiBldmVudCk7Ci0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnQoaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChwaWRfdCBwaWQsIHBpZF90IHRpZCwgaW50MzJfdCBwcmlvKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50X2wocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbyk7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50X2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCkBAIC0zNTgsNiArMzY1LDggQEAKIAogICAgICAgICAgICAgICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gcGlwZU1lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KIAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBzeXN0ZW1SZWFkeSgpOworCiAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CiAKIHByb3RlY3RlZDoKQEAgLTQwOCw2ICs0MTcsNyBAQAogICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgIG1DaGFubmVsTWFzazsKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7CisgICAgICAgICAgICAgICAgLy8gbm90IEhBTCBmcmFtZSBzaXplLCB0aGlzIGlzIGZvciBvdXRwdXQgc2luayAodG8gcGlwZSB0byBmYXN0IG1peGVyKQogICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7ICAgICAgICAgICAvLyBTb3VyY2UgZm9ybWF0IGZvciBSZWNvcmRpbmcgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmsgZm9ybWF0IGZvciBQbGF5YmFjay4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luayBmb3JtYXQgbWF5IGJlIGRpZmZlcmVudCB0aGFuCkBAIC00MTYsNiArNDI2LDcgQEAKICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsgICAgICAgLy8gSEFMIGJ1ZmZlciBzaXplIGZvciByZWFkKCkgb3Igd3JpdGUoKQogCiAgICAgICAgICAgICAgICAgVmVjdG9yPCBzcDxDb25maWdFdmVudD4gPiAgICAgbUNvbmZpZ0V2ZW50czsKKyAgICAgICAgICAgICAgICBWZWN0b3I8IHNwPENvbmZpZ0V2ZW50PiA+ICAgICBtUGVuZGluZ0NvbmZpZ0V2ZW50czsgLy8gZXZlbnRzIGF3YWl0aW5nIHN5c3RlbSByZWFkeQogCiAgICAgICAgICAgICAgICAgLy8gVGhlc2UgZmllbGRzIGFyZSB3cml0dGVuIGFuZCByZWFkIGJ5IHRocmVhZCBpdHNlbGYgd2l0aG91dCBsb2NrIG9yIGJhcnJpZXIsCiAgICAgICAgICAgICAgICAgLy8gYW5kIHJlYWQgYnkgb3RoZXIgdGhyZWFkcyB3aXRob3V0IGxvY2sgb3IgYmFycmllciB2aWEgc3RhbmRieSgpLCBvdXREZXZpY2UoKQpAQCAtNDI2LDEzICs0MzcsMTYgQEAKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtU3RhbmRieTsgICAgIC8vIFdoZXRoZXIgdGhyZWFkIGlzIGN1cnJlbnRseSBpbiBzdGFuZGJ5LgogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1PdXREZXZpY2U7ICAgLy8gb3V0cHV0IGRldmljZQogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1JbkRldmljZTsgICAgLy8gaW5wdXQgZGV2aWNlCi0gICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgICAgICAgICAgbUF1ZGlvU291cmNlOyAvLyAoc2VlIGF1ZGlvLmgsIGF1ZGlvX3NvdXJjZV90KQorICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1QcmV2T3V0RGV2aWNlOyAgIC8vIHByZXZpb3VzIG91dHB1dCBkZXZpY2UKKyAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtUHJldkluRGV2aWNlOyAgICAvLyBwcmV2aW91cyBpbnB1dCBkZXZpY2UKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggICAgICBtUGF0Y2g7CisgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgICAgICAgICAgbUF1ZGlvU291cmNlOwogCiAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgbUlkOwogICAgICAgICAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gbUVmZmVjdENoYWluczsKIAotICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgIGtOYW1lTGVuZ3RoID0gMTY7ICAgLy8gcHJjdGwoUFJfU0VUX05BTUUpIGxpbWl0Ci0gICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgbU5hbWVba05hbWVMZW5ndGhdOworICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgIGtUaHJlYWROYW1lTGVuZ3RoID0gMTY7IC8vIHByY3RsKFBSX1NFVF9OQU1FKSBsaW1pdAorICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIG1UaHJlYWROYW1lW2tUaHJlYWROYW1lTGVuZ3RoXTsgLy8gZ3VhcmFudGVlZCBOVUwtdGVybWluYXRlZAogICAgICAgICAgICAgICAgIHNwPElQb3dlck1hbmFnZXI+ICAgICAgIG1Qb3dlck1hbmFnZXI7CiAgICAgICAgICAgICAgICAgc3A8SUJpbmRlcj4gICAgICAgICAgICAgbVdha2VMb2NrVG9rZW47CiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8UE1EZWF0aFJlY2lwaWVudD4gbURlYXRoUmVjaXBpZW50OwpAQCAtNDQyLDYgKzQ1Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1c3BlbmRlZFNlc3Npb25zOwogICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgIGtMb2dTaXplID0gNCAqIDEwMjQ7CiAgICAgICAgICAgICAgICAgc3A8TkJMb2c6OldyaXRlcj4gICAgICAgbU5CTG9nV3JpdGVyOworICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeTsKIH07CiAKIC8vIC0tLSBQbGF5YmFja1RocmVhZCAtLS0KQEAgLTQ2Nyw3ICs0ODIsNyBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQ4X3Qga01heFRyYWNrUmV0cmllc09mZmxvYWQgPSAyMDsKIAogICAgIFBsYXliYWNrVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgdHlwZV90IHR5cGUpOworICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB0eXBlX3QgdHlwZSwgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+UGxheWJhY2tUaHJlYWQoKTsKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKQEAgLTU1OSw3ICs1NzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1TdXNwZW5kZWQpID4gMDsgfQogCiAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqaGFsRnJhbWVzLCB1aW50MzJfdCAqZHNwRnJhbWVzKTsKICAgICAgICAgICAgICAgICAvLyBGSVhNRSByZW5hbWUgbWl4QnVmZmVyKCkgdG8gc2lua0J1ZmZlcigpIGFuZCByZW1vdmUgaW50MTZfdCogZGVwZW5kZW5jeS4KICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciBhbHNvIHJlbW92aW5nIGFuZCBwYXNzaW5nIGFuIGV4cGxpY2l0IG1NYWluQnVmZmVyIGluaXRpYWxpemF0aW9uCkBAIC02MDEsNiArNjE2LDExIEBACiAgICAgLy8gdXBkYXRlZCBieSByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50OyAgLy8gbm9ybWFsIG1peGVyIGFuZCBlZmZlY3RzCiAKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRUaHJvdHRsZTsgICAgIC8vIHRocm90dGxlIHRoZSB0aHJlYWQgcHJvY2Vzc2luZworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZFRocm90dGxlVGltZU1zOyAvLyB0aHJvdHRsZSB0aW1lIGZvciBNSVhFUiB0aHJlYWRzCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkVGhyb3R0bGVFbmRNczsgIC8vIG5vdGlmeSBvbmNlIHBlciB0aHJvdHRsaW5nCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBtSGFsZkJ1ZmZlck1zOyAgICAgICAvLyBoYWxmIHRoZSBidWZmZXIgc2l6ZSBpbiBtaWxsaXNlY29uZHMKKwogICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNpbmtCdWZmZXI7ICAgICAgICAgLy8gZnJhbWUgc2l6ZSBhbGlnbmVkIHNpbmsgYnVmZmVyCiAKICAgICAvLyBUT0RPOgpAQCAtNzEyLDggKzczMiw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKIAotICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIHVzZXNId0F2U3luYygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBESVJFQ1QpICYmIChtT3V0cHV0ICE9IE5VTEwpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU91dHB1dC0+ZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsgfQorICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIHVzZXNId0F2U3luYygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBESVJFQ1QpICYmIChtT3V0cHV0ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtSHdTdXBwb3J0c1BhdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobU91dHB1dC0+ZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsgfQogCiBwcml2YXRlOgogCkBAIC03NDIsMTQgKzc2MywxNCBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluV3JpdGU7CiAKICAgICAvLyBGSVhNRSByZW5hbWUgdGhlc2UgZm9ybWVyIGxvY2FsIHZhcmlhYmxlcyBvZiB0aHJlYWRMb29wIHRvIHN0YW5kYXJkICJtIiBuYW1lcwotICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRieVRpbWU7CisgICAgbnNlY3NfdCAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhbmRieVRpbWVOczsKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaW5rQnVmZmVyU2l6ZTsKIAogICAgIC8vIGNhY2hlZCBjb3BpZXMgb2YgYWN0aXZlU2xlZXBUaW1lVXMoKSBhbmQgaWRsZVNsZWVwVGltZVVzKCkgbWFkZSBieSBjYWNoZVBhcmFtZXRlcnNfbCgpCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVTbGVlcFRpbWU7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBpZGxlU2xlZXBUaW1lOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVNsZWVwVGltZVVzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgbUlkbGVTbGVlcFRpbWVVczsKIAotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBUaW1lOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgbVNsZWVwVGltZVVzOwogCiAgICAgLy8gbWl4ZXIgc3RhdHVzIHJldHVybmVkIGJ5IHByZXBhcmVUcmFja3NfbCgpCiAgICAgbWl4ZXJfc3RhdGUgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJTdGF0dXM7IC8vIGN1cnJlbnQgY3ljbGUKQEAgLTc2Miw3ICs3ODMsNyBAQAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBUaW1lU2hpZnQ7CiAKICAgICAvLyBzYW1lIGFzIEF1ZGlvRmxpbmdlcjo6bVN0YW5kYnlUaW1lSW5Oc2VjcyBleGNlcHQgZm9yIERJUkVDVCB3aGljaCB1c2VzIGEgc2hvcnRlciB2YWx1ZQotICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRieURlbGF5OworICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnlEZWxheU5zOwogCiAgICAgLy8gTUlYRVIgb25seQogICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGVyaW9kOwpAQCAtODM4LDYgKzg1OSw3IEBACiAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwKICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHksCiAgICAgICAgICAgICAgICAgdHlwZV90IHR5cGUgPSBNSVhFUik7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+TWl4ZXJUaHJlYWQoKTsKIApAQCAtODY0LDYgKzg4NiwxMCBAQAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKTsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBjb3JyZWN0TGF0ZW5jeV9sKHVpbnQzMl90IGxhdGVuY3kpIGNvbnN0OwogCisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKwogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXIqIG1BdWRpb01peGVyOyAgICAvLyBub3JtYWwgbWl4ZXIKIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgLy8gb25lLXRpbWUgaW5pdGlhbGl6YXRpb24sIG5vIGxvY2tzIHJlcXVpcmVkCkBAIC04OTUsNyArOTIxLDcgQEAKIHB1YmxpYzoKIAogICAgIERpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGJvb2wgc3lzdGVtUmVhZHkpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5EaXJlY3RPdXRwdXRUaHJlYWQoKTsKIAogICAgIC8vIFRocmVhZCB2aXJ0dWFscwpAQCAtOTIwLDE2ICs5NDYsMjIgQEAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX2V4aXQoKTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBzaG91bGRTdGFuZGJ5X2woKTsKIAorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uQWRkTmV3VHJhY2tfbCgpOworCiAgICAgLy8gdm9sdW1lcyBsYXN0IHNlbnQgdG8gYXVkaW8gSEFMIHdpdGggc3RyZWFtLT5zZXRfdm9sdW1lKCkKICAgICBmbG9hdCBtTGVmdFZvbEZsb2F0OwogICAgIGZsb2F0IG1SaWdodFZvbEZsb2F0OwogCiAgICAgRGlyZWN0T3V0cHV0VGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UsIFRocmVhZEJhc2U6OnR5cGVfdCB0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UsIFRocmVhZEJhc2U6OnR5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdm9pZCBwcm9jZXNzVm9sdW1lX2woVHJhY2sgKnRyYWNrLCBib29sIGxhc3RUcmFjayk7CiAKICAgICAvLyBwcmVwYXJlVHJhY2tzX2woKSB0ZWxscyB0aHJlYWRMb29wX21peCgpIHRoZSBuYW1lIG9mIHRoZSBzaW5nbGUgYWN0aXZlIHRyYWNrCiAgICAgc3A8VHJhY2s+ICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrOworCisgICAgd3A8VHJhY2s+ICAgICAgICAgICAgICAgbVByZXZpb3VzVHJhY2s7ICAgICAgICAgLy8gdXNlZCB0byBkZXRlY3QgdHJhY2sgc3dpdGNoCisKIHB1YmxpYzoKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogfTsKQEAgLTkzOCw3ICs5NzAsNyBAQAogcHVibGljOgogCiAgICAgT2ZmbG9hZFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgdWludDMyX3QgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UsIGJvb2wgc3lzdGVtUmVhZHkpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5PZmZsb2FkVGhyZWFkKCkge307CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZmx1c2hId19sKCk7CiAKQEAgLTk0OSwxMiArOTgxLDEwIEBACiAKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB3YWl0aW5nQXN5bmNDYWxsYmFjaygpOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHdhaXRpbmdBc3luY0NhbGxiYWNrX2woKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBvbkFkZE5ld1RyYWNrX2woKTsKIAogcHJpdmF0ZToKICAgICBzaXplX3QgICAgICBtUGF1c2VkV3JpdGVMZW5ndGg7ICAgICAvLyBsZW5ndGggaW4gYnl0ZXMgb2Ygd3JpdGUgaW50ZXJydXB0ZWQgYnkgcGF1c2UKICAgICBzaXplX3QgICAgICBtUGF1c2VkQnl0ZXNSZW1haW5pbmc7ICAvLyBieXRlcyBzdGlsbCB3YWl0aW5nIGluIG1peGJ1ZmZlciBhZnRlciByZXN1bWUKLSAgICB3cDxUcmFjaz4gICBtUHJldmlvdXNUcmFjazsgICAgICAgICAvLyB1c2VkIHRvIGRldGVjdCB0cmFjayBzd2l0Y2gKIH07CiAKIGNsYXNzIEFzeW5jQ2FsbGJhY2tUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKQEAgLTk5Myw3ICsxMDIzLDcgQEAKIGNsYXNzIER1cGxpY2F0aW5nVGhyZWFkIDogcHVibGljIE1peGVyVGhyZWFkIHsKIHB1YmxpYzoKICAgICBEdXBsaWNhdGluZ1RocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIE1peGVyVGhyZWFkKiBtYWluVGhyZWFkLAotICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkR1cGxpY2F0aW5nVGhyZWFkKCk7CiAKICAgICAvLyBUaHJlYWQgdmlydHVhbHMKQEAgLTEwMzUsMTcgKzEwNjUsMTMyIEBACiBwdWJsaWM6CiAKICAgICBjbGFzcyBSZWNvcmRUcmFjazsKKworICAgIC8qIFRoZSBSZXNhbXBsZXJCdWZmZXJQcm92aWRlciBpcyB1c2VkIHRvIHJldHJpZXZlIHJlY29yZGVkIGlucHV0IGRhdGEgZnJvbSB0aGUKKyAgICAgKiBSZWNvcmRUaHJlYWQuICBJdCBtYWludGFpbnMgbG9jYWwgc3RhdGUgb24gdGhlIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSByZWFkCisgICAgICogcG9zaXRpb24gb2YgdGhlIFJlY29yZFRyYWNrIGNvbXBhcmVkIHdpdGggdGhlIFJlY29yZFRocmVhZC4KKyAgICAgKi8KICAgICBjbGFzcyBSZXNhbXBsZXJCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXJpdmVzIGZyb20gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UgZm9yIHVzZSBieSByZXNhbXBsZXIKICAgICB7CiAgICAgcHVibGljOgotICAgICAgICBSZXNhbXBsZXJCdWZmZXJQcm92aWRlcihSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spIDogbVJlY29yZFRyYWNrKHJlY29yZFRyYWNrKSB7IH0KKyAgICAgICAgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKSA6CisgICAgICAgICAgICBtUmVjb3JkVHJhY2socmVjb3JkVHJhY2spLAorICAgICAgICAgICAgbVJzbXBJblVucmVsKDApLCBtUnNtcEluRnJvbnQoMCkgeyB9CiAgICAgICAgIHZpcnR1YWwgflJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyKCkgeyB9CisKKyAgICAgICAgLy8gY2FsbGVkIHRvIHNldCB0aGUgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgdG8gaGVhZCBvZiB0aGUgUmVjb3JkVGhyZWFkIGRhdGEgYnVmZmVyLAorICAgICAgICAvLyBza2lwcGluZyBhbnkgcHJldmlvdXMgZGF0YSByZWFkIGZyb20gdGhlIGhhbC4KKyAgICAgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisKKyAgICAgICAgLyogU3luY2hyb25pemVzIFJlY29yZFRyYWNrIHBvc2l0aW9uIHdpdGggdGhlIFJlY29yZFRocmVhZC4KKyAgICAgICAgICogQ2FsY3VsYXRlcyBhdmFpbGFibGUgZnJhbWVzIGFuZCBoYW5kbGUgb3ZlcnJ1bnMgaWYgdGhlIFJlY29yZFRocmVhZAorICAgICAgICAgKiBoYXMgYWR2YW5jZWQgZmFzdGVyIHRoYW4gdGhlIFJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyIGhhcyByZXRyaWV2ZWQgZGF0YS4KKyAgICAgICAgICogVE9ETzogd2h5IG5vdCBkbyB0aGlzIGZvciBldmVyeSBnZXROZXh0QnVmZmVyPworICAgICAgICAgKgorICAgICAgICAgKiBQYXJhbWV0ZXJzCisgICAgICAgICAqIGZyYW1lc0F2YWlsYWJsZTogIHBvaW50ZXIgdG8gb3B0aW9uYWwgb3V0cHV0IHNpemVfdCB0byBzdG9yZSByZWNvcmQgdHJhY2sKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgZnJhbWVzIGF2YWlsYWJsZS4KKyAgICAgICAgICogICAgICBoYXNPdmVycnVuOiAgcG9pbnRlciB0byBvcHRpb25hbCBib29sZWFuLCByZXR1cm5zIHRydWUgaWYgdHJhY2sgaGFzIG92ZXJydW4uCisgICAgICAgICAqLworCisgICAgICAgIHZpcnR1YWwgdm9pZCBzeW5jKHNpemVfdCAqZnJhbWVzQXZhaWxhYmxlID0gTlVMTCwgYm9vbCAqaGFzT3ZlcnJ1biA9IE5VTEwpOworCiAgICAgICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpOwogICAgIHByaXZhdGU6CiAgICAgICAgIFJlY29yZFRyYWNrICogY29uc3QgbVJlY29yZFRyYWNrOworICAgICAgICBzaXplX3QgICAgICAgICAgICAgIG1Sc21wSW5VbnJlbDsgICAvLyB1bnJlbGVhc2VkIGZyYW1lcyByZW1haW5pbmcgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3N0IHJlY2VudCBnZXROZXh0QnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBkZWJ1ZyBvbmx5CisgICAgICAgIGludDMyX3QgICAgICAgICAgICAgbVJzbXBJbkZyb250OyAgIC8vIG5leHQgYXZhaWxhYmxlIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvbGxpbmcgY291bnRlciB0aGF0IGlzIG5ldmVyIGNsZWFyZWQKKyAgICB9OworCisgICAgLyogVGhlIFJlY29yZEJ1ZmZlckNvbnZlcnRlciBpcyB1c2VkIGZvciBmb3JtYXQsIGNoYW5uZWwsIGFuZCBzYW1wbGUgcmF0ZQorICAgICAqIGNvbnZlcnNpb24gZm9yIGEgUmVjb3JkVHJhY2suCisgICAgICoKKyAgICAgKiBUT0RPOiBTZWxmIGNvbnRhaW5lZCwgc28gbW92ZSB0byBhIHNlcGFyYXRlIGZpbGUgbGF0ZXIuCisgICAgICoKKyAgICAgKiBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIgdXNlcyB0aGUgY29udmVydCgpIG1ldGhvZCByYXRoZXIgdGhhbiBleHBvc2luZyBhCisgICAgICogYnVmZmVyIHByb3ZpZGVyIGludGVyZmFjZTsgdGhpcyBpcyB0byBzYXZlIGEgbWVtb3J5IGNvcHkuCisgICAgICovCisgICAgY2xhc3MgUmVjb3JkQnVmZmVyQ29udmVydGVyCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgUmVjb3JkQnVmZmVyQ29udmVydGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHNyY0NoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBzcmNGb3JtYXQsCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBkc3RDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZHN0Rm9ybWF0LAorICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdFNhbXBsZVJhdGUpOworCisgICAgICAgIH5SZWNvcmRCdWZmZXJDb252ZXJ0ZXIoKTsKKworICAgICAgICAvKiBDb252ZXJ0cyBpbnB1dCBkYXRhIGZyb20gYW4gQXVkaW9CdWZmZXJQcm92aWRlciBieSBmb3JtYXQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgKiBhbmQgc2FtcGxlUmF0ZSB0byBhIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogUGFyYW1ldGVycworICAgICAgICAgKiAgICAgIGRzdDogIGJ1ZmZlciB0byBwbGFjZSB0aGUgY29udmVydGVkIGRhdGEuCisgICAgICAgICAqIHByb3ZpZGVyOiAgYnVmZmVyIHByb3ZpZGVyIHRvIG9idGFpbiBzb3VyY2UgZGF0YS4KKyAgICAgICAgICogICBmcmFtZXM6ICBudW1iZXIgb2YgZnJhbWVzIHRvIGNvbnZlcnQKKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBjb252ZXJ0ZWQuCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgY29udmVydCh2b2lkICpkc3QsIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnByb3ZpZGVyLCBzaXplX3QgZnJhbWVzKTsKKworICAgICAgICAvLyByZXR1cm5zIE5PX0VSUk9SIGlmIGNvbnN0cnVjdG9yIHdhcyBzdWNjZXNzZnVsCisgICAgICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0IHsKKyAgICAgICAgICAgIC8vIG1TcmNDaGFubmVsTWFzayBzZXQgb24gc3VjY2Vzc2Z1bCB1cGRhdGVQYXJhbWV0ZXJzCisgICAgICAgICAgICByZXR1cm4gbVNyY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfSU5WQUxJRCA/IE5PX0VSUk9SIDogTk9fSU5JVDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFsbG93cyBkeW5hbWljIHJlY29uZmlndXJlIG9mIGFsbCBwYXJhbWV0ZXJzCisgICAgICAgIHN0YXR1c190IHVwZGF0ZVBhcmFtZXRlcnMoCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgc3JjQ2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IHNyY0Zvcm1hdCwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNTYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGRzdENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBkc3RGb3JtYXQsCisgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0U2FtcGxlUmF0ZSk7CisKKyAgICAgICAgLy8gY2FsbGVkIHRvIHJlc2V0IHJlc2FtcGxlciBidWZmZXJzIG9uIHJlY29yZCB0cmFjayBkaXNjb250aW51aXR5CisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBpZiAobVJlc2FtcGxlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVJlc2FtcGxlci0+cmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gZm9ybWF0IGNvbnZlcnNpb24gd2hlbiBub3QgdXNpbmcgcmVzYW1wbGVyCisgICAgICAgIHZvaWQgY29udmVydE5vUmVzYW1wbGVyKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKTsKKworICAgICAgICAvLyBmb3JtYXQgY29udmVyc2lvbiB3aGVuIHVzaW5nIHJlc2FtcGxlcjsgbW9kaWZpZXMgc3JjIGluLXBsYWNlCisgICAgICAgIHZvaWQgY29udmVydFJlc2FtcGxlcih2b2lkICpkc3QsIC8qbm90LWEtY29uc3QqLyB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpOworCisgICAgICAgIC8vIHVzZXIgcHJvdmlkZWQgaW5mb3JtYXRpb24KKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbVNyY0NoYW5uZWxNYXNrOworICAgICAgICBhdWRpb19mb3JtYXRfdCAgICAgICBtU3JjRm9ybWF0OworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtU3JjU2FtcGxlUmF0ZTsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbURzdENoYW5uZWxNYXNrOworICAgICAgICBhdWRpb19mb3JtYXRfdCAgICAgICBtRHN0Rm9ybWF0OworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtRHN0U2FtcGxlUmF0ZTsKKworICAgICAgICAvLyBkZXJpdmVkIGluZm9ybWF0aW9uCisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1TcmNDaGFubmVsQ291bnQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1Ec3RDaGFubmVsQ291bnQ7CisgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgIG1Ec3RGcmFtZVNpemU7CisKKyAgICAgICAgLy8gZm9ybWF0IGNvbnZlcnNpb24gYnVmZmVyCisgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKm1CdWY7CisgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgIG1CdWZGcmFtZXM7CisgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgIG1CdWZGcmFtZVNpemU7CisKKyAgICAgICAgLy8gcmVzYW1wbGVyIGluZm8KKyAgICAgICAgQXVkaW9SZXNhbXBsZXIgICAgICAqbVJlc2FtcGxlcjsKKworICAgICAgICBib29sICAgICAgICAgICAgICAgICBtSXNMZWdhY3lEb3dubWl4OyAgLy8gbGVnYWN5IHN0ZXJlbyB0byBtb25vIGNvbnZlcnNpb24gbmVlZGVkCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgIG1Jc0xlZ2FjeVVwbWl4OyAgICAvLyBsZWdhY3kgbW9ubyB0byBzdGVyZW8gY29udmVyc2lvbiBuZWVkZWQKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgbVJlcXVpcmVzRmxvYXQ7ICAgIC8vIGRhdGEgcHJvY2Vzc2luZyByZXF1aXJlcyBmbG9hdCAoZS5nLiByZXNhbXBsZXIpCisgICAgICAgIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIgKm1JbnB1dENvbnZlcnRlclByb3ZpZGVyOyAgICAvLyBjb252ZXJ0cyBpbnB1dCB0byBmbG9hdAorICAgICAgICBpbnQ4X3QgICAgICAgICAgICAgICBtSWR4QXJ5W3NpemVvZih1aW50MzJfdCkgKiA4XTsgLy8gdXNlZCBmb3IgY2hhbm5lbCBtYXNrIGNvbnZlcnNpb24KICAgICB9OwogCiAjaW5jbHVkZSAiUmVjb3JkVHJhY2tzLmgiCkBAIC0xMDU0LDcgKzExOTksOCBAQAogICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZQorICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHkKICNpZmRlZiBURUVfU0lOSwogICAgICAgICAgICAgICAgICAgICAsIGNvbnN0IHNwPE5CQUlPX1Npbms+JiB0ZWVTaW5rCiAjZW5kaWYKQEAgLTExMTAsNyArMTI1Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKSB7fQogICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKQEAgLTExNTYsNyArMTMwMiw3IEBACiAgICAgICAgICAgICBDb25kaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRTdG9wQ29uZDsKIAogICAgICAgICAgICAgLy8gcmVzYW1wbGVyIGNvbnZlcnRzIGlucHV0IGF0IEhBTCBIeiB0byBvdXRwdXQgYXQgQXVkaW9SZWNvcmQgY2xpZW50IEh6Ci0gICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbVJzbXBJbkJ1ZmZlcjsgLy8gc2VlIG5ld1tdIGZvciBkZXRhaWxzIG9uIHRoZSBzaXplCisgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptUnNtcEluQnVmZmVyOyAvLwogICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkZyYW1lczsgIC8vIHNpemUgb2YgcmVzYW1wbGVyIGlucHV0IGluIGZyYW1lcwogICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkZyYW1lc1AyOy8vIHNpemUgcm91bmRlZCB1cCB0byBhIHBvd2VyLW9mLTIKIApAQCAtMTE2OSw3ICsxMzE1LDkgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPE1lbW9yeURlYWxlcj4gICAgICAgICAgICAgIG1SZWFkT25seUhlYXA7CiAKICAgICAgICAgICAgIC8vIG9uZS10aW1lIGluaXRpYWxpemF0aW9uLCBubyBsb2NrcyByZXF1aXJlZAotICAgICAgICAgICAgc3A8RmFzdENhcHR1cmU+ICAgICAgICAgICAgICAgICAgICAgbUZhc3RDYXB0dXJlOyAgIC8vIG5vbi0wIGlmIHRoZXJlIGlzIGFsc28gYSBmYXN0IGNhcHR1cmUKKyAgICAgICAgICAgIHNwPEZhc3RDYXB0dXJlPiAgICAgICAgICAgICAgICAgICAgIG1GYXN0Q2FwdHVyZTsgICAvLyBub24tMCBpZiB0aGVyZSBpcyBhbHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBmYXN0IGNhcHR1cmUKKwogICAgICAgICAgICAgLy8gRklYTUUgYXVkaW8gd2F0Y2hkb2cgdGhyZWFkCiAKICAgICAgICAgICAgIC8vIGNvbnRlbnRzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBjb25zaXN0ZW50LCBubyBsb2NrcyByZXF1aXJlZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAppbmRleCBlOTcwMDM2Li5mN2RhMjA5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcApAQCAtMjAsNiArMjAsNyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC00MDMsMTAgKzQwNCw3IEBACiAgICAgbUlzSW52YWxpZChmYWxzZSksCiAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eShOVUxMKSwKICAgICBtUmVzdW1lVG9TdG9wcGluZyhmYWxzZSksCi0gICAgbUZsdXNoSHdQZW5kaW5nKGZhbHNlKSwKLSAgICBtUHJldmlvdXNWYWxpZChmYWxzZSksCi0gICAgbVByZXZpb3VzRnJhbWVzV3JpdHRlbigwKQotICAgIC8vIG1QcmV2aW91c1RpbWVzdGFtcAorICAgIG1GbHVzaEh3UGVuZGluZyhmYWxzZSkKIHsKICAgICAvLyBjbGllbnQgPT0gMCBpbXBsaWVzIHNoYXJlZEJ1ZmZlciA9PSAwCiAgICAgQUxPR19BU1NFUlQoIShjbGllbnQgPT0gMCAmJiBzaGFyZWRCdWZmZXIgIT0gMCkpOwpAQCAtNDQzLDggKzQ0MSw2IEBACiAgICAgICAgIC8vICAgICAgIHRoaXMgbWVhbnMgd2UgYXJlIHBvdGVudGlhbGx5IGRlbnlpbmcgb3RoZXIgbW9yZSBpbXBvcnRhbnQgZmFzdCB0cmFja3MgZnJvbQogICAgICAgICAvLyAgICAgICBiZWluZyBjcmVhdGVkLiAgSXQgd291bGQgYmUgYmV0dGVyIHRvIGFsbG9jYXRlIHRoZSBpbmRleCBkeW5hbWljYWxseS4KICAgICAgICAgbUZhc3RJbmRleCA9IGk7Ci0gICAgICAgIC8vIFJlYWQgdGhlIGluaXRpYWwgdW5kZXJydW5zIGJlY2F1c2UgdGhpcyBmaWVsZCBpcyBuZXZlciBjbGVhcmVkIGJ5IHRoZSBmYXN0IG1peGVyCi0gICAgICAgIG1PYnNlcnZlZFVuZGVycnVucyA9IHRocmVhZC0+Z2V0RmFzdFRyYWNrVW5kZXJydW5zKGkpOwogICAgICAgICB0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2sgJj0gfigxIDw8IGkpOwogICAgIH0KIH0KQEAgLTY5Myw2ICs2ODksMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgaWYgKGlzRmFzdFRyYWNrKCkpIHsKKyAgICAgICAgICAgIC8vIHJlZnJlc2ggZmFzdCB0cmFjayB1bmRlcnJ1bnMgb24gc3RhcnQgYmVjYXVzZSB0aGF0IGZpZWxkIGlzIG5ldmVyIGNsZWFyZWQKKyAgICAgICAgICAgIC8vIGJ5IHRoZSBmYXN0IG1peGVyOyBmdXJ0aGVybW9yZSwgdGhlIHNhbWUgdHJhY2sgY2FuIGJlIHJlY3ljbGVkLCBpLmUuIHN0YXJ0CisgICAgICAgICAgICAvLyBhZnRlciBzdG9wLgorICAgICAgICAgICAgbU9ic2VydmVkVW5kZXJydW5zID0gcGxheWJhY2tUaHJlYWQtPmdldEZhc3RUcmFja1VuZGVycnVucyhtRmFzdEluZGV4KTsKKyAgICAgICAgfQogICAgICAgICBzdGF0dXMgPSBwbGF5YmFja1RocmVhZC0+YWRkVHJhY2tfbCh0aGlzKTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTiB8fCBzdGF0dXMgPT0gUEVSTUlTU0lPTl9ERU5JRUQpIHsKICAgICAgICAgICAgIHRyaWdnZXJFdmVudHMoQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfUFJFU0VOVEFUSU9OX0NPTVBMRVRFKTsKQEAgLTc0Miw2ICs3NDQsNyBAQAogICAgICAgICAgICAgICAgIC8vIG1vdmUgdG8gU1RPUFBJTkdfMiB3aGVuIGRyYWluIGNvbXBsZXRlcyBhbmQgdGhlbiBTVE9QUEVECiAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RPUFBJTkdfMTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5icm9hZGNhc3RfbCgpOwogICAgICAgICAgICAgQUxPR1YoIm5vdCBzdG9wcGluZy9zdG9wcGVkID0+IHN0b3BwaW5nL3N0b3BwZWQgKCVkKSBvbiB0aHJlYWQgJXAiLCBtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQpOwogICAgICAgICB9CkBAIC04ODAsMjQgKzg4MywyNyBAQAogewogICAgIC8vIENsaWVudCBzaG91bGQgaW1wbGVtZW50IHRoaXMgdXNpbmcgU1NROyB0aGUgdW5wcmVzZW50ZWQgZnJhbWUgY291bnQgaW4gbGF0Y2ggaXMgaXJyZWxldmFudAogICAgIGlmIChpc0Zhc3RUcmFjaygpKSB7Ci0gICAgICAgIC8vIEZJWE1FIG5vIGxvY2sgaGVsZCB0byBzZXQgbVByZXZpb3VzVmFsaWQgPSBmYWxzZQogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAvLyBGSVhNRSBubyBsb2NrIGhlbGQgdG8gc2V0IG1QcmV2aW91c1ZhbGlkID0gZmFsc2UKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICBpZiAoIWlzT2ZmbG9hZGVkKCkgJiYgIWlzRGlyZWN0KCkpIHsKICAgICAgICAgaWYgKCFwbGF5YmFja1RocmVhZC0+bUxhdGNoUVZhbGlkKSB7Ci0gICAgICAgICAgICBtUHJldmlvdXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9Ci0gICAgICAgIHVpbnQzMl90IHVucHJlc2VudGVkRnJhbWVzID0KLSAgICAgICAgICAgICAgICAoKGludDY0X3QpIHBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRLm1VbnByZXNlbnRlZEZyYW1lcyAqIG1TYW1wbGVSYXRlKSAvCi0gICAgICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPm1TYW1wbGVSYXRlOworICAgICAgICAvLyBGSVhNRSBOb3QgYWNjdXJhdGUgdW5kZXIgZHluYW1pYyBjaGFuZ2VzIG9mIHNhbXBsZSByYXRlIGFuZCBzcGVlZC4KKyAgICAgICAgLy8gRG8gbm90IHVzZSB0cmFjaydzIG1TYW1wbGVSYXRlIGFzIGl0IGlzIG5vdCBjdXJyZW50IGZvciBtaXhlciB0cmFja3MuCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRTYW1wbGVSYXRlKCk7CisgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHBsYXliYWNrUmF0ZSA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFBsYXliYWNrUmF0ZSgpOworICAgICAgICB1aW50MzJfdCB1bnByZXNlbnRlZEZyYW1lcyA9ICgoZG91YmxlKSBwbGF5YmFja1RocmVhZC0+bUxhdGNoUS5tVW5wcmVzZW50ZWRGcmFtZXMgKgorICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUgKiBwbGF5YmFja1JhdGUubVNwZWVkKS8gcGxheWJhY2tUaHJlYWQtPm1TYW1wbGVSYXRlOwogICAgICAgICAvLyBGSVhNRSBTaW5jZSB3ZSdyZSB1c2luZyBhIHJhdyBwb2ludGVyIGFzIHRoZSBrZXksIGl0IGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUKICAgICAgICAgLy8gICAgICAgZm9yIGEgYnJhbmQgbmV3IHRyYWNrIHRvIHNoYXJlIHRoZSBzYW1lIGFkZHJlc3MgYXMgYSByZWNlbnRseSBkZXN0cm95ZWQKICAgICAgICAgLy8gICAgICAgdHJhY2ssIGFuZCB0aHVzIGZvciB1cyB0byBnZXQgdGhlIGZyYW1lcyByZWxlYXNlZCBvZiB0aGUgd3JvbmcgdHJhY2suCkBAIC05MDgsMzYgKzkxNCwxNiBAQAogICAgICAgICB1aW50MzJfdCBmcmFtZXNXcml0dGVuID0gaSA+PSAwID8KICAgICAgICAgICAgICAgICBwbGF5YmFja1RocmVhZC0+bUxhdGNoUS5tRnJhbWVzUmVsZWFzZWRbaV0gOgogICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCk7Ci0gICAgICAgIGJvb2wgY2hlY2tQcmV2aW91c1RpbWVzdGFtcCA9IG1QcmV2aW91c1ZhbGlkICYmIGZyYW1lc1dyaXR0ZW4gPj0gbVByZXZpb3VzRnJhbWVzV3JpdHRlbjsKLSAgICAgICAgaWYgKGZyYW1lc1dyaXR0ZW4gPCB1bnByZXNlbnRlZEZyYW1lcykgewotICAgICAgICAgICAgbVByZXZpb3VzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgaWYgKGZyYW1lc1dyaXR0ZW4gPj0gdW5wcmVzZW50ZWRGcmFtZXMpIHsKKyAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSBmcmFtZXNXcml0dGVuIC0gdW5wcmVzZW50ZWRGcmFtZXM7CisgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWUgPSBwbGF5YmFja1RocmVhZC0+bUxhdGNoUS5tVGltZXN0YW1wLm1UaW1lOworICAgICAgICAgICAgcmVzdWx0ID0gTk9fRVJST1I7CiAgICAgICAgIH0KLSAgICAgICAgbVByZXZpb3VzRnJhbWVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW47Ci0gICAgICAgIHVpbnQzMl90IHBvc2l0aW9uID0gZnJhbWVzV3JpdHRlbiAtIHVucHJlc2VudGVkRnJhbWVzOwotICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZSA9IHBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRLm1UaW1lc3RhbXAubVRpbWU7Ci0gICAgICAgIGlmIChjaGVja1ByZXZpb3VzVGltZXN0YW1wKSB7Ci0gICAgICAgICAgICBpZiAodGltZS50dl9zZWMgPCBtUHJldmlvdXNUaW1lc3RhbXAubVRpbWUudHZfc2VjIHx8Ci0gICAgICAgICAgICAgICAgICAgICh0aW1lLnR2X3NlYyA9PSBtUHJldmlvdXNUaW1lc3RhbXAubVRpbWUudHZfc2VjICYmCi0gICAgICAgICAgICAgICAgICAgIHRpbWUudHZfbnNlYyA8IG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZS50dl9uc2VjKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJUaW1lIGlzIGdvaW5nIGJhY2t3YXJkcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gcG9zaXRpb24gY2FuIGJvYmJsZSBzbGlnaHRseSBhcyBhbiBhcnRpZmFjdDsgdGhpcyBoaWRlcyB0aGUgYm9iYmxlCi0gICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUlOSU1VTV9QT1NJVElPTl9ERUxUQSA9IDh1OwotICAgICAgICAgICAgaWYgKChwb3NpdGlvbiA8PSBtUHJldmlvdXNUaW1lc3RhbXAubVBvc2l0aW9uKSB8fAotICAgICAgICAgICAgICAgICAgICAocG9zaXRpb24gLSBtUHJldmlvdXNUaW1lc3RhbXAubVBvc2l0aW9uKSA8IE1JTklNVU1fUE9TSVRJT05fREVMVEEpIHsKLSAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IG1QcmV2aW91c1RpbWVzdGFtcC5tUG9zaXRpb247Ci0gICAgICAgICAgICAgICAgdGltZSA9IG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gcG9zaXRpb247Ci0gICAgICAgIHRpbWVzdGFtcC5tVGltZSA9IHRpbWU7Ci0gICAgICAgIG1QcmV2aW91c1RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKLSAgICAgICAgbVByZXZpb3VzVmFsaWQgPSB0cnVlOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsgLy8gb2ZmbG9hZGVkIG9yIGRpcmVjdAorICAgICAgICByZXN1bHQgPSBwbGF5YmFja1RocmVhZC0+Z2V0VGltZXN0YW1wX2wodGltZXN0YW1wKTsKICAgICB9CiAKLSAgICByZXR1cm4gcGxheWJhY2tUaHJlYWQtPmdldFRpbWVzdGFtcF9sKHRpbWVzdGFtcCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmF0dGFjaEF1eEVmZmVjdChpbnQgRWZmZWN0SWQpCkBAIC0xNzA5LDM2ICsxNjk1LDE4IEBACiAgICAgbUFjdGl2ZSA9IGZhbHNlOwogfQogCi1ib29sIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok91dHB1dFRyYWNrOjp3cml0ZShpbnQxNl90KiBkYXRhLCB1aW50MzJfdCBmcmFtZXMpCitib29sIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok91dHB1dFRyYWNrOjp3cml0ZSh2b2lkKiBkYXRhLCB1aW50MzJfdCBmcmFtZXMpCiB7CiAgICAgQnVmZmVyICpwSW5CdWZmZXI7CiAgICAgQnVmZmVyIGluQnVmZmVyOwotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1DaGFubmVsQ291bnQ7CiAgICAgYm9vbCBvdXRwdXRCdWZmZXJGdWxsID0gZmFsc2U7CiAgICAgaW5CdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lczsKLSAgICBpbkJ1ZmZlci5pMTYgPSBkYXRhOworICAgIGluQnVmZmVyLnJhdyA9IGRhdGE7CiAKICAgICB1aW50MzJfdCB3YWl0VGltZUxlZnRNcyA9IG1Tb3VyY2VUaHJlYWQtPndhaXRUaW1lTXMoKTsKIAogICAgIGlmICghbUFjdGl2ZSAmJiBmcmFtZXMgIT0gMCkgewotICAgICAgICBzdGFydCgpOwotICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICBNaXhlclRocmVhZCAqbWl4ZXJUaHJlYWQgPSAoTWl4ZXJUaHJlYWQgKil0aHJlYWQuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAobUZyYW1lQ291bnQgPiBmcmFtZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlclF1ZXVlLnNpemUoKSA8IGtNYXhPdmVyRmxvd0J1ZmZlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRGcmFtZXMgPSAobUZyYW1lQ291bnQgLSBmcmFtZXMpOwotICAgICAgICAgICAgICAgICAgICBwSW5CdWZmZXIgPSBuZXcgQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICBwSW5CdWZmZXItPm1CdWZmZXIgPSBuZXcgaW50MTZfdFtzdGFydEZyYW1lcyAqIGNoYW5uZWxDb3VudF07Ci0gICAgICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+ZnJhbWVDb3VudCA9IHN0YXJ0RnJhbWVzOwotICAgICAgICAgICAgICAgICAgICBwSW5CdWZmZXItPmkxNiA9IHBJbkJ1ZmZlci0+bUJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBJbkJ1ZmZlci0+cmF3LCAwLCBzdGFydEZyYW1lcyAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS5hZGQocEluQnVmZmVyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiT3V0cHV0VHJhY2s6OndyaXRlKCkgJXAgbm8gbW9yZSBidWZmZXJzIGluIHF1ZXVlIiwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgICh2b2lkKSBzdGFydCgpOwogICAgIH0KIAogICAgIHdoaWxlICh3YWl0VGltZUxlZnRNcykgewpAQCAtMTc3MywyMCArMTc0MSwyMCBAQAogCiAgICAgICAgIHVpbnQzMl90IG91dEZyYW1lcyA9IHBJbkJ1ZmZlci0+ZnJhbWVDb3VudCA+IG1PdXRCdWZmZXIuZnJhbWVDb3VudCA/IG1PdXRCdWZmZXIuZnJhbWVDb3VudCA6CiAgICAgICAgICAgICAgICAgcEluQnVmZmVyLT5mcmFtZUNvdW50OwotICAgICAgICBtZW1jcHkobU91dEJ1ZmZlci5yYXcsIHBJbkJ1ZmZlci0+cmF3LCBvdXRGcmFtZXMgKiBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICBtZW1jcHkobU91dEJ1ZmZlci5yYXcsIHBJbkJ1ZmZlci0+cmF3LCBvdXRGcmFtZXMgKiBtRnJhbWVTaXplKTsKICAgICAgICAgUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgICAgIGJ1Zi5tRnJhbWVDb3VudCA9IG91dEZyYW1lczsKICAgICAgICAgYnVmLm1SYXcgPSBOVUxMOwogICAgICAgICBtQ2xpZW50UHJveHktPnJlbGVhc2VCdWZmZXIoJmJ1Zik7CiAgICAgICAgIHBJbkJ1ZmZlci0+ZnJhbWVDb3VudCAtPSBvdXRGcmFtZXM7Ci0gICAgICAgIHBJbkJ1ZmZlci0+aTE2ICs9IG91dEZyYW1lcyAqIGNoYW5uZWxDb3VudDsKKyAgICAgICAgcEluQnVmZmVyLT5yYXcgPSAoaW50OF90ICopcEluQnVmZmVyLT5yYXcgKyBvdXRGcmFtZXMgKiBtRnJhbWVTaXplOwogICAgICAgICBtT3V0QnVmZmVyLmZyYW1lQ291bnQgLT0gb3V0RnJhbWVzOwotICAgICAgICBtT3V0QnVmZmVyLmkxNiArPSBvdXRGcmFtZXMgKiBjaGFubmVsQ291bnQ7CisgICAgICAgIG1PdXRCdWZmZXIucmF3ID0gKGludDhfdCAqKW1PdXRCdWZmZXIucmF3ICsgb3V0RnJhbWVzICogbUZyYW1lU2l6ZTsKIAogICAgICAgICBpZiAocEluQnVmZmVyLT5mcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgICAgIGlmIChtQnVmZmVyUXVldWUuc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLnJlbW92ZUF0KDApOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBbXSBwSW5CdWZmZXItPm1CdWZmZXI7CisgICAgICAgICAgICAgICAgZnJlZShwSW5CdWZmZXItPm1CdWZmZXIpOwogICAgICAgICAgICAgICAgIGRlbGV0ZSBwSW5CdWZmZXI7CiAgICAgICAgICAgICAgICAgQUxPR1YoIk91dHB1dFRyYWNrOjp3cml0ZSgpICVwIHRocmVhZCAlcCByZWxlYXNlZCBvdmVyZmxvdyBidWZmZXIgJWQiLCB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIG1CdWZmZXJRdWV1ZS5zaXplKCkpOwpAQCAtMTgwMiwxMSArMTc3MCwxMCBAQAogICAgICAgICBpZiAodGhyZWFkICE9IDAgJiYgIXRocmVhZC0+c3RhbmRieSgpKSB7CiAgICAgICAgICAgICBpZiAobUJ1ZmZlclF1ZXVlLnNpemUoKSA8IGtNYXhPdmVyRmxvd0J1ZmZlcnMpIHsKICAgICAgICAgICAgICAgICBwSW5CdWZmZXIgPSBuZXcgQnVmZmVyOwotICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+bUJ1ZmZlciA9IG5ldyBpbnQxNl90W2luQnVmZmVyLmZyYW1lQ291bnQgKiBjaGFubmVsQ291bnRdOworICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+bUJ1ZmZlciA9IG1hbGxvYyhpbkJ1ZmZlci5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICAgICAgcEluQnVmZmVyLT5mcmFtZUNvdW50ID0gaW5CdWZmZXIuZnJhbWVDb3VudDsKLSAgICAgICAgICAgICAgICBwSW5CdWZmZXItPmkxNiA9IHBJbkJ1ZmZlci0+bUJ1ZmZlcjsKLSAgICAgICAgICAgICAgICBtZW1jcHkocEluQnVmZmVyLT5yYXcsIGluQnVmZmVyLnJhdywgaW5CdWZmZXIuZnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudCAqCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+cmF3ID0gcEluQnVmZmVyLT5tQnVmZmVyOworICAgICAgICAgICAgICAgIG1lbWNweShwSW5CdWZmZXItPnJhdywgaW5CdWZmZXIucmF3LCBpbkJ1ZmZlci5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLmFkZChwSW5CdWZmZXIpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgYWRkaW5nIG92ZXJmbG93IGJ1ZmZlciAlZCIsIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLnVuc2FmZV9nZXQoKSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CkBAIC0xODE3LDIzICsxNzg0LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBDYWxsaW5nIHdyaXRlKCkgd2l0aCBhIDAgbGVuZ3RoIGJ1ZmZlciwgbWVhbnMgdGhhdCBubyBtb3JlIGRhdGEgd2lsbCBiZSB3cml0dGVuOgotICAgIC8vIElmIG5vIG1vcmUgYnVmZmVycyBhcmUgcGVuZGluZywgZmlsbCBvdXRwdXQgdHJhY2sgYnVmZmVyIHRvIG1ha2Ugc3VyZSBpdCBpcyBzdGFydGVkCi0gICAgLy8gYnkgb3V0cHV0IG1peGVyLgotICAgIGlmIChmcmFtZXMgPT0gMCAmJiBtQnVmZmVyUXVldWUuc2l6ZSgpID09IDApIHsKLSAgICAgICAgLy8gRklYTUUgYm9ya2VuLCByZXBsYWNlIGJ5IGdldHRpbmcgZnJhbWVzUmVhZHkoKSBmcm9tIHByb3h5Ci0gICAgICAgIHNpemVfdCB1c2VyID0gMDsgICAgLy8gd2FzIG1DYmxrLT51c2VyCi0gICAgICAgIGlmICh1c2VyIDwgbUZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgIGZyYW1lcyA9IG1GcmFtZUNvdW50IC0gdXNlcjsKLSAgICAgICAgICAgIHBJbkJ1ZmZlciA9IG5ldyBCdWZmZXI7Ci0gICAgICAgICAgICBwSW5CdWZmZXItPm1CdWZmZXIgPSBuZXcgaW50MTZfdFtmcmFtZXMgKiBjaGFubmVsQ291bnRdOwotICAgICAgICAgICAgcEluQnVmZmVyLT5mcmFtZUNvdW50ID0gZnJhbWVzOwotICAgICAgICAgICAgcEluQnVmZmVyLT5pMTYgPSBwSW5CdWZmZXItPm1CdWZmZXI7Ci0gICAgICAgICAgICBtZW1zZXQocEluQnVmZmVyLT5yYXcsIDAsIGZyYW1lcyAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgICAgICBtQnVmZmVyUXVldWUuYWRkKHBJbkJ1ZmZlcik7Ci0gICAgICAgIH0gZWxzZSBpZiAobUFjdGl2ZSkgewotICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICB9CisgICAgLy8gQ2FsbGluZyB3cml0ZSgpIHdpdGggYSAwIGxlbmd0aCBidWZmZXIgbWVhbnMgdGhhdCBubyBtb3JlIGRhdGEgd2lsbCBiZSB3cml0dGVuOgorICAgIC8vIFdlIHJlbHkgb24gc3RvcCgpIHRvIHNldCB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MgdG8gYWxsb3cgdGhlIHJlbWFpbmluZyBmcmFtZXMgdG8gcGxheSBvdXQuCisgICAgaWYgKGZyYW1lcyA9PSAwICYmIG1CdWZmZXJRdWV1ZS5zaXplKCkgPT0gMCAmJiBtQWN0aXZlKSB7CisgICAgICAgIHN0b3AoKTsKICAgICB9CiAKICAgICByZXR1cm4gb3V0cHV0QnVmZmVyRnVsbDsKQEAgLTE4NTksNyArMTgxMyw3IEBACiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICBCdWZmZXIgKnBCdWZmZXIgPSBtQnVmZmVyUXVldWUuaXRlbUF0KGkpOwotICAgICAgICBkZWxldGUgW10gcEJ1ZmZlci0+bUJ1ZmZlcjsKKyAgICAgICAgZnJlZShwQnVmZmVyLT5tQnVmZmVyKTsKICAgICAgICAgZGVsZXRlIHBCdWZmZXI7CiAgICAgfQogICAgIG1CdWZmZXJRdWV1ZS5jbGVhcigpOwpAQCAtMTg2NywxMyArMTgyMSwxNCBAQAogCiAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OlBhdGNoVHJhY2soUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MpCi0gICAgOiAgIFRyYWNrKHBsYXliYWNrVGhyZWFkLCBOVUxMLCBBVURJT19TVFJFQU1fUEFUQ0gsCisgICAgOiAgIFRyYWNrKHBsYXliYWNrVGhyZWFkLCBOVUxMLCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICBidWZmZXIsIDAsIDAsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCiAgICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIHRydWUsIHRydWUpKQpAQCAtMTk5NSwyOSArMTk1MCwzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgPyBBTExPQ19QSVBFIDogQUxMT0NfQ0JMSykgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJ1ZmZlciA9PSBOVUxMKSA/IEFMTE9DX0xPQ0FMIDogQUxMT0NfTk9ORSksCiAgICAgICAgICAgICAgICAgICB0eXBlKSwKLSAgICAgICAgbU92ZXJmbG93KGZhbHNlKSwgbVJlc2FtcGxlcihOVUxMKSwgbVJzbXBPdXRCdWZmZXIoTlVMTCksIG1Sc21wT3V0RnJhbWVDb3VudCgwKSwKLSAgICAgICAgLy8gU2VlIHJlYWwgaW5pdGlhbGl6YXRpb24gb2YgbVJzbXBJbkZyb250IGF0IFJlY29yZFRocmVhZDo6c3RhcnQoKQotICAgICAgICBtUnNtcEluVW5yZWwoMCksIG1Sc21wSW5Gcm9udCgwKSwgbUZyYW1lc1RvRHJvcCgwKSwgbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyKE5VTEwpCisgICAgICAgIG1PdmVyZmxvdyhmYWxzZSksCisgICAgICAgIG1GcmFtZXNUb0Ryb3AoMCksCisgICAgICAgIG1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcihOVUxMKSwgLy8gaW5pdGlhbGl6ZSBpbiBjYXNlIG9mIGVhcmx5IGNvbnN0cnVjdG9yIGV4aXQKKyAgICAgICAgbVJlY29yZEJ1ZmZlckNvbnZlcnRlcihOVUxMKQogewogICAgIGlmIChtQ2JsayA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBtUmVjb3JkQnVmZmVyQ29udmVydGVyID0gbmV3IFJlY29yZEJ1ZmZlckNvbnZlcnRlcigKKyAgICAgICAgICAgIHRocmVhZC0+bUNoYW5uZWxNYXNrLCB0aHJlYWQtPm1Gb3JtYXQsIHRocmVhZC0+bVNhbXBsZVJhdGUsCisgICAgICAgICAgICBjaGFubmVsTWFzaywgZm9ybWF0LCBzYW1wbGVSYXRlKTsKKyAgICAvLyBDaGVjayBpZiB0aGUgUmVjb3JkQnVmZmVyQ29udmVydGVyIGNvbnN0cnVjdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAvLyBJZiBub3QsIGRvbid0IGNvbnRpbnVlIHdpdGggY29uc3RydWN0aW9uLgorICAgIC8vCisgICAgLy8gTk9URTogSXQgd291bGQgYmUgZXh0cmVtZWx5IHJhcmUgdGhhdCB0aGUgcmVjb3JkIHRyYWNrIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgLy8gZm9yIHRoZSBjdXJyZW50IGRldmljZSwgYnV0IGEgcGVuZGluZyBvciBmdXR1cmUgZGV2aWNlIGNoYW5nZSB3b3VsZCBtYWtlCisgICAgLy8gdGhlIHJlY29yZCB0cmFjayBjb25maWd1cmF0aW9uIHZhbGlkLgorICAgIGlmIChtUmVjb3JkQnVmZmVyQ29udmVydGVyLT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiUmVjb3JkVHJhY2sgdW5hYmxlIHRvIGNyZWF0ZSByZWNvcmQgYnVmZmVyIGNvbnZlcnRlciIpOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgbVNlcnZlclByb3h5ID0gbmV3IEF1ZGlvUmVjb3JkU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSwgIWlzRXh0ZXJuYWxUcmFjaygpKTsKLQotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKTsKLSAgICAvLyBGSVhNRSBJIGRvbid0IHVuZGVyc3RhbmQgZWl0aGVyIG9mIHRoZSBjaGFubmVsIGNvdW50IGNoZWNrcwotICAgIGlmICh0aHJlYWQtPm1TYW1wbGVSYXRlICE9IHNhbXBsZVJhdGUgJiYgdGhyZWFkLT5tQ2hhbm5lbENvdW50IDw9IEZDQ18yICYmCi0gICAgICAgICAgICBjaGFubmVsQ291bnQgPD0gRkNDXzIpIHsKLSAgICAgICAgLy8gc2luayBTUgotICAgICAgICBtUmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZShBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICB0aHJlYWQtPm1DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOwotICAgICAgICAvLyBzb3VyY2UgU1IKLSAgICAgICAgbVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSh0aHJlYWQtPm1TYW1wbGVSYXRlKTsKLSAgICAgICAgbVJlc2FtcGxlci0+c2V0Vm9sdW1lKEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQsIEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQpOwotICAgICAgICBtUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgPSBuZXcgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIodGhpcyk7Ci0gICAgfQorICAgIG1SZXNhbXBsZXJCdWZmZXJQcm92aWRlciA9IG5ldyBSZXNhbXBsZXJCdWZmZXJQcm92aWRlcih0aGlzKTsKIAogICAgIGlmIChmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKICAgICAgICAgQUxPR19BU1NFUlQodGhyZWFkLT5tRmFzdFRyYWNrQXZhaWwpOwpAQCAtMjAyOCwxMSArMTk4NiwxOSBAQAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjp+UmVjb3JkVHJhY2soKQogewogICAgIEFMT0dWKCIlcyIsIF9fZnVuY19fKTsKLSAgICBkZWxldGUgbVJlc2FtcGxlcjsKLSAgICBkZWxldGVbXSBtUnNtcE91dEJ1ZmZlcjsKKyAgICBkZWxldGUgbVJlY29yZEJ1ZmZlckNvbnZlcnRlcjsKICAgICBkZWxldGUgbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmluaXRDaGVjaygpIGNvbnN0Cit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhY2tCYXNlOjppbml0Q2hlY2soKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG1TZXJ2ZXJQcm94eSA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwKICAgICAgICAgaW50NjRfdCBwdHMgX191bnVzZWQpCkBAIC0yMjEyLDQgKzIxNzgsNCBAQAogICAgIG1Qcm94eS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIpOwogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3QtcmVzYW1wbGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3QtcmVzYW1wbGUuY3BwCmluZGV4IDg0YTY1NWEuLjc4OTM3NzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0LXJlc2FtcGxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdC1yZXNhbXBsZS5jcHAKQEAgLTQyNyw2ICs0MjcsMTQgQEAKICAgICAgICAgcHJpbnRmKCJxdWFsaXR5OiAlZCAgY2hhbm5lbHM6ICVkICBtc2VjOiAlIiBQUklkNjQgIiAgTWZybXMvczogJS4ybGZcbiIsCiAgICAgICAgICAgICAgICAgcXVhbGl0eSwgY2hhbm5lbHMsIHRpbWUvMTAwMDAwMCwgb3V0cHV0X2ZyYW1lcyAqIGxvb3BsaW1pdCAvICh0aW1lIC8gMWU5KSAvIDFlNik7CiAgICAgICAgIHJlc2FtcGxlci0+cmVzZXQoKTsKKworICAgICAgICAvLyBUT0RPIGZpeCBsZWdhY3kgYnVnOiByZXNldCBkb2VzIG5vdCBjbGVhciBidWZmZXJzLgorICAgICAgICAvLyBkZWxldGUgYW5kIHJlY3JlYXRlIHJlc2FtcGxlciBoZXJlLgorICAgICAgICBkZWxldGUgcmVzYW1wbGVyOworICAgICAgICByZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKGZvcm1hdCwgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mcmVxLCBxdWFsaXR5KTsKKyAgICAgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKGlucHV0X2ZyZXEpOworICAgICAgICByZXNhbXBsZXItPnNldFZvbHVtZShBdWRpb1Jlc2FtcGxlcjo6VU5JVFlfR0FJTl9GTE9BVCwgQXVkaW9SZXNhbXBsZXI6OlVOSVRZX0dBSU5fRkxPQVQpOwogICAgIH0KIAogICAgIG1lbXNldChvdXRwdXRfdmFkZHIsIDAsIG91dHB1dF9zaXplKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggODYwNGVmNS4uZTE1MjQ2OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTMwLDIwICszMCwxNiBAQAogIwogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLSMgQ2xhbmcrKyBhYm9ydHMgb24gQXVkaW9NaXhlci5jcHAsCi0jIGIvMTgzNzM4NjYsICJkbyBub3Qga25vdyBob3cgdG8gc3BsaXQgdGhpcyBvcGVyYXRvci4iCi1pZmVxICgkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSxhcm0gYXJtNjQpLCQoVEFSR0VUX0FSQ0gpKQotICAgIExPQ0FMX0NMQU5HIDo9IGZhbHNlCi1lbmRpZgotCiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJdGVzdC1taXhlci5jcHAgXAogCS4uL0F1ZGlvTWl4ZXIuY3BwLmFybSBcCisJLi4vQnVmZmVyUHJvdmlkZXJzLmNwcAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotCWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyCisJZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAorCWV4dGVybmFsL3NvbmljCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogCWxpYnNuZGZpbGUKQEAgLTU3LDcgKzUzLDggQEAKIAlsaWJkbCBcCiAJbGliY3V0aWxzIFwKIAlsaWJ1dGlscyBcCi0JbGlibG9nCisJbGlibG9nIFwKKwlsaWJzb25pYwogCiBMT0NBTF9NT0RVTEU6PSB0ZXN0LW1peGVyCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKaW5kZXggMmM0NTNiMC4uN2Y0ZDQ1NiAxMDA3NTUKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTE1LDcgKzE1LDcgQEAKIGVjaG8gIndhaXRpbmcgZm9yIGRldmljZSIKIGFkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAogYWRiIHB1c2ggJE9VVC9zeXN0ZW0vbGliL2xpYmF1ZGlvcmVzYW1wbGVyLnNvIC9zeXN0ZW0vbGliCi1hZGIgcHVzaCAkT1VUL3N5c3RlbS9iaW4vcmVzYW1wbGVyX3Rlc3RzIC9zeXN0ZW0vYmluCithZGIgcHVzaCAkT1VUL2RhdGEvbmF0aXZldGVzdC9yZXNhbXBsZXJfdGVzdHMgL3N5c3RlbS9iaW4KIAogc2ggJEFORFJPSURfQlVJTERfVE9QL2ZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3J1bl9hbGxfdW5pdF90ZXN0cy5zaAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvbWl4ZXJfdG9fd2F2X3Rlc3RzLnNoIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL21peGVyX3RvX3dhdl90ZXN0cy5zaAppbmRleCA5YjM5ZTc3Li5kMDQ4MmExIDEwMDc1NQotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvbWl4ZXJfdG9fd2F2X3Rlc3RzLnNoCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9taXhlcl90b193YXZfdGVzdHMuc2gKQEAgLTYwLDExICs2MCwyMSBAQAogICAgIGZpCiAKICMgVGVzdDoKKyMgcHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmcgd2l0aCBtaXhlZCBpbnRlZ2VyIGFuZCBmbG9hdCB0cmFjayBpbnB1dAorIyB0cmFja19fUmVzYW1wbGUgLyB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlCisgICAgYWRiIHNoZWxsIHRlc3QtbWl4ZXIgJDEgLXMgNDgwMDAgXAorICAgICAgICAtbyAvc2RjYXJkL3RtNDgwMDBncmlmLndhdiBcCisgICAgICAgIHNpbmU6Miw0MDAwLDc1MjAgY2hpcnA6Miw5MjAwIHNpbmU6MSwzMDAwLDE4MDAwIFwKKyAgICAgICAgc2luZTpmLDYsNjAwMCwxOTAwMCAgY2hpcnA6aSw0LDMwMDAwCisgICAgYWRiIHB1bGwgL3NkY2FyZC90bTQ4MDAwZ3JpZi53YXYgJDIKKworIyBUZXN0OgogIyBwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZwogIyB0cmFja19fUmVzYW1wbGUgLyB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlCiAgICAgYWRiIHNoZWxsIHRlc3QtbWl4ZXIgJDEgLXMgNDgwMDAgXAogICAgICAgICAtbyAvc2RjYXJkL3RtNDgwMDBnci53YXYgXAotICAgICAgICBzaW5lOjIsNDAwMCw3NTIwIGNoaXJwOjIsOTIwMCBzaW5lOjEsMzAwMCwxODAwMAorICAgICAgICBzaW5lOjIsNDAwMCw3NTIwIGNoaXJwOjIsOTIwMCBzaW5lOjEsMzAwMCwxODAwMCBcCisgICAgICAgIHNpbmU6Niw2MDAwLDE5MDAwCiAgICAgYWRiIHB1bGwgL3NkY2FyZC90bTQ4MDAwZ3Iud2F2ICQyCiAKICMgVGVzdDoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9yZXNhbXBsZXJfdGVzdHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cy5jcHAKaW5kZXggZDYyMTdiYS4uOWUzNzVkYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cy5jcHAKQEAgLTQ4LDcgKzQ4LDEwIEBACiAgICAgICAgIGlmICh0aGlzRnJhbWVzID09IDAgfHwgdGhpc0ZyYW1lcyA+IG91dHB1dEZyYW1lcyAtIGkpIHsKICAgICAgICAgICAgIHRoaXNGcmFtZXMgPSBvdXRwdXRGcmFtZXMgLSBpOwogICAgICAgICB9Ci0gICAgICAgIHJlc2FtcGxlci0+cmVzYW1wbGUoKGludDMyX3QqKSBvdXRwdXQgKyBjaGFubmVscyppLCB0aGlzRnJhbWVzLCBwcm92aWRlcik7CisgICAgICAgIHNpemVfdCBmcmFtZXNSZXNhbXBsZWQgPSByZXNhbXBsZXItPnJlc2FtcGxlKAorICAgICAgICAgICAgICAgIChpbnQzMl90Kikgb3V0cHV0ICsgY2hhbm5lbHMqaSwgdGhpc0ZyYW1lcywgcHJvdmlkZXIpOworICAgICAgICAvLyB3ZSBzaG91bGQgaGF2ZSBlbm91Z2ggYnVmZmVyIHNwYWNlLCBzbyB0aGVyZSBpcyBubyBzaG9ydCBjb3VudC4KKyAgICAgICAgQVNTRVJUX0VRKHRoaXNGcmFtZXMsIGZyYW1lc1Jlc2FtcGxlZCk7CiAgICAgICAgIGkgKz0gdGhpc0ZyYW1lczsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvdGVzdC1taXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvdGVzdC1taXhlci5jcHAKaW5kZXggOWE0ZmFkNi4uOGRhNjI0NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Rlc3QtbWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy90ZXN0LW1peGVyLmNwcApAQCAtMzksNyArMzksNyBAQAogICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstZl0gWy1tXSBbLWMgY2hhbm5lbHNdIgogICAgICAgICAgICAgICAgICAgICAiIFstcyBzYW1wbGUtcmF0ZV0gWy1vIDxvdXRwdXQtZmlsZT5dIFstYSA8YXV4LWJ1ZmZlci1maWxlPl0gWy1QIGNzdl0iCiAgICAgICAgICAgICAgICAgICAgICIgKDxpbnB1dC1maWxlPiB8IDxjb21tYW5kPikrXG4iLCBuYW1lKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtZiAgICBlbmFibGUgZmxvYXRpbmcgcG9pbnQgaW5wdXQgdHJhY2tcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1mICAgIGVuYWJsZSBmbG9hdGluZyBwb2ludCBpbnB1dCB0cmFjayBieSBkZWZhdWx0XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtbSAgICBlbmFibGUgZmxvYXRpbmcgcG9pbnQgbWl4ZXIgb3V0cHV0XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtYyAgICBudW1iZXIgb2YgbWl4ZXIgb3V0cHV0IGNoYW5uZWxzXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtcyAgICBtaXhlciBzYW1wbGUtcmF0ZVxuIik7CkBAIC00Nyw4ICs0Nyw4IEBACiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgLWEgICAgPGF1eC1idWZmZXItZmlsZT5cbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1QICAgICMgZnJhbWVzIHByb3ZpZGVkIHBlciBjYWxsIHRvIHJlc2FtcGxlKCkgaW4gQ1NWIGZvcm1hdFxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgPGlucHV0LWZpbGU+IGlzIGEgV0FWIGZpbGVcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgIDxjb21tYW5kPiBjYW4gYmUgJ3NpbmU6PGNoYW5uZWxzPiw8ZnJlcXVlbmN5Piw8c2FtcGxlcmF0ZT4nXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgICAgICdjaGlycDo8Y2hhbm5lbHM+LDxzYW1wbGVyYXRlPidcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIDxjb21tYW5kPiBjYW4gYmUgJ3NpbmU6WyhpfGYpLF08Y2hhbm5lbHM+LDxmcmVxdWVuY3k+LDxzYW1wbGVyYXRlPidcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgICAgJ2NoaXJwOlsoaXxmKSxdPGNoYW5uZWxzPiw8c2FtcGxlcmF0ZT4nXG4iKTsKIH0KIAogc3RhdGljIGludCB3cml0ZUZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKQEAgLTc4LDYgKzc4LDE4IEBACiAgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKIH0KIAorY29uc3QgY2hhciAqcGFyc2VGb3JtYXQoY29uc3QgY2hhciAqcywgYm9vbCAqdXNlRmxvYXQpIHsKKyAgICBpZiAoIXN0cm5jbXAocywgImYsIiwgMikpIHsKKyAgICAgICAgKnVzZUZsb2F0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHMgKyAyOworICAgIH0KKyAgICBpZiAoIXN0cm5jbXAocywgImksIiwgMikpIHsKKyAgICAgICAgKnVzZUZsb2F0ID0gZmFsc2U7CisgICAgICAgIHJldHVybiBzICsgMjsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKICAgICBjb25zdCBjaGFyKiBjb25zdCBwcm9nbmFtZSA9IGFyZ3ZbMF07CiAgICAgYm9vbCB1c2VJbnB1dEZsb2F0ID0gZmFsc2U7CkBAIC04OCw4ICsxMDAsOSBAQAogICAgIHN0ZDo6dmVjdG9yPGludD4gUHZhbHVlczsKICAgICBjb25zdCBjaGFyKiBvdXRwdXRGaWxlbmFtZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciogYXV4RmlsZW5hbWUgPSBOVUxMOwotICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IE5hbWVzOwotICAgIHN0ZDo6dmVjdG9yPFNpZ25hbFByb3ZpZGVyPiBQcm92aWRlcnM7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gbmFtZXM7CisgICAgc3RkOjp2ZWN0b3I8U2lnbmFsUHJvdmlkZXI+IHByb3ZpZGVyczsKKyAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gZm9ybWF0czsKIAogICAgIGZvciAoaW50IGNoOyAoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgImZtYzpzOm86YTpQOiIpKSAhPSAtMTspIHsKICAgICAgICAgc3dpdGNoIChjaCkgewpAQCAtMTM4LDU0ICsxNTEsNjUgQEAKICAgICBzaXplX3Qgb3V0cHV0RnJhbWVzID0gMDsKIAogICAgIC8vIGNyZWF0ZSBwcm92aWRlcnMgZm9yIGVhY2ggdHJhY2sKLSAgICBQcm92aWRlcnMucmVzaXplKGFyZ2MpOworICAgIG5hbWVzLnJlc2l6ZShhcmdjKTsKKyAgICBwcm92aWRlcnMucmVzaXplKGFyZ2MpOworICAgIGZvcm1hdHMucmVzaXplKGFyZ2MpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYzsgKytpKSB7CiAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGNoaXJwW10gPSAiY2hpcnA6IjsKICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc2luZVtdID0gInNpbmU6IjsKICAgICAgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBrU2Vjb25kcyA9IDE7CisgICAgICAgIGJvb2wgdXNlRmxvYXQgPSB1c2VJbnB1dEZsb2F0OwogCiAgICAgICAgIGlmICghc3RybmNtcChhcmd2W2ldLCBjaGlycCwgc3RybGVuKGNoaXJwKSkpIHsKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gdjsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMgPSBwYXJzZUZvcm1hdChhcmd2W2ldICsgc3RybGVuKGNoaXJwKSwgJnVzZUZsb2F0KTsKIAotICAgICAgICAgICAgcGFyc2VDU1YoYXJndltpXSArIHN0cmxlbihjaGlycCksIHYpOworICAgICAgICAgICAgcGFyc2VDU1Yocywgdik7CiAgICAgICAgICAgICBpZiAodi5zaXplKCkgPT0gMikgewogICAgICAgICAgICAgICAgIHByaW50ZigiY3JlYXRpbmcgY2hpcnAoJWQgJWQpXG4iLCB2WzBdLCB2WzFdKTsKLSAgICAgICAgICAgICAgICBpZiAodXNlSW5wdXRGbG9hdCkgewotICAgICAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0Q2hpcnA8ZmxvYXQ+KHZbMF0sIDAsIHZbMV0vMiwgdlsxXSwga1NlY29uZHMpOworICAgICAgICAgICAgICAgIGlmICh1c2VGbG9hdCkgeworICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnNbaV0uc2V0Q2hpcnA8ZmxvYXQ+KHZbMF0sIDAsIHZbMV0vMiwgdlsxXSwga1NlY29uZHMpOworICAgICAgICAgICAgICAgICAgICBmb3JtYXRzW2ldID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0Q2hpcnA8aW50MTZfdD4odlswXSwgMCwgdlsxXS8yLCB2WzFdLCBrU2Vjb25kcyk7CisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyc1tpXS5zZXRDaGlycDxpbnQxNl90Pih2WzBdLCAwLCB2WzFdLzIsIHZbMV0sIGtTZWNvbmRzKTsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0c1tpXSA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0SW5jcihQdmFsdWVzKTsKKyAgICAgICAgICAgICAgICBwcm92aWRlcnNbaV0uc2V0SW5jcihQdmFsdWVzKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWxmb3JtZWQgaW5wdXQgJyVzJ1xuIiwgYXJndltpXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgc2luZSwgc3RybGVuKHNpbmUpKSkgewogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiB2OworICAgICAgICAgICAgY29uc3QgY2hhciAqcyA9IHBhcnNlRm9ybWF0KGFyZ3ZbaV0gKyBzdHJsZW4oc2luZSksICZ1c2VGbG9hdCk7CiAKLSAgICAgICAgICAgIHBhcnNlQ1NWKGFyZ3ZbaV0gKyBzdHJsZW4oc2luZSksIHYpOworICAgICAgICAgICAgcGFyc2VDU1Yocywgdik7CiAgICAgICAgICAgICBpZiAodi5zaXplKCkgPT0gMykgewogICAgICAgICAgICAgICAgIHByaW50ZigiY3JlYXRpbmcgc2luZSglZCAlZCAlZClcbiIsIHZbMF0sIHZbMV0sIHZbMl0pOwotICAgICAgICAgICAgICAgIGlmICh1c2VJbnB1dEZsb2F0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRTaW5lPGZsb2F0Pih2WzBdLCB2WzFdLCB2WzJdLCBrU2Vjb25kcyk7CisgICAgICAgICAgICAgICAgaWYgKHVzZUZsb2F0KSB7CisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyc1tpXS5zZXRTaW5lPGZsb2F0Pih2WzBdLCB2WzFdLCB2WzJdLCBrU2Vjb25kcyk7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHNbaV0gPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRTaW5lPGludDE2X3Q+KHZbMF0sIHZbMV0sIHZbMl0sIGtTZWNvbmRzKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzW2ldLnNldFNpbmU8aW50MTZfdD4odlswXSwgdlsxXSwgdlsyXSwga1NlY29uZHMpOworICAgICAgICAgICAgICAgICAgICBmb3JtYXRzW2ldID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRJbmNyKFB2YWx1ZXMpOworICAgICAgICAgICAgICAgIHByb3ZpZGVyc1tpXS5zZXRJbmNyKFB2YWx1ZXMpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGZvcm1lZCBpbnB1dCAnJXMnXG4iLCBhcmd2W2ldKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHByaW50ZigiY3JlYXRpbmcgZmlsZW5hbWUoJXMpXG4iLCBhcmd2W2ldKTsKICAgICAgICAgICAgIGlmICh1c2VJbnB1dEZsb2F0KSB7Ci0gICAgICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldEZpbGU8ZmxvYXQ+KGFyZ3ZbaV0pOworICAgICAgICAgICAgICAgIHByb3ZpZGVyc1tpXS5zZXRGaWxlPGZsb2F0Pihhcmd2W2ldKTsKKyAgICAgICAgICAgICAgICBmb3JtYXRzW2ldID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldEZpbGU8c2hvcnQ+KGFyZ3ZbaV0pOworICAgICAgICAgICAgICAgIHByb3ZpZGVyc1tpXS5zZXRGaWxlPHNob3J0Pihhcmd2W2ldKTsKKyAgICAgICAgICAgICAgICBmb3JtYXRzW2ldID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0SW5jcihQdmFsdWVzKTsKKyAgICAgICAgICAgIHByb3ZpZGVyc1tpXS5zZXRJbmNyKFB2YWx1ZXMpOwogICAgICAgICB9CiAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG91dHB1dCBmcmFtZXMKLSAgICAgICAgc2l6ZV90IG5mcmFtZXMgPSAoaW50NjRfdCkgUHJvdmlkZXJzW2ldLmdldE51bUZyYW1lcygpICogb3V0cHV0U2FtcGxlUmF0ZQotICAgICAgICAgICAgICAgIC8gUHJvdmlkZXJzW2ldLmdldFNhbXBsZVJhdGUoKTsKKyAgICAgICAgc2l6ZV90IG5mcmFtZXMgPSAoaW50NjRfdCkgcHJvdmlkZXJzW2ldLmdldE51bUZyYW1lcygpICogb3V0cHV0U2FtcGxlUmF0ZQorICAgICAgICAgICAgICAgIC8gcHJvdmlkZXJzW2ldLmdldFNhbXBsZVJhdGUoKTsKICAgICAgICAgaWYgKGkgPT0gMCB8fCBvdXRwdXRGcmFtZXMgPiBuZnJhbWVzKSB7IC8vIGNob29zZSBtaW5pbXVtIGZvciBvdXRwdXRGcmFtZXMKICAgICAgICAgICAgIG91dHB1dEZyYW1lcyA9IG5mcmFtZXM7CiAgICAgICAgIH0KQEAgLTIxMywyMiArMjM3LDIwIEBACiAgICAgLy8gY3JlYXRlIHRoZSBtaXhlci4KICAgICBjb25zdCBzaXplX3QgbWl4ZXJGcmFtZUNvdW50ID0gMzIwOyAvLyB0eXBpY2FsIG51bWJlcnMgbWF5IHJhbmdlIGZyb20gMjQwIG9yIDk2MAogICAgIEF1ZGlvTWl4ZXIgKm1peGVyID0gbmV3IEF1ZGlvTWl4ZXIobWl4ZXJGcmFtZUNvdW50LCBvdXRwdXRTYW1wbGVSYXRlKTsKLSAgICBhdWRpb19mb3JtYXRfdCBpbnB1dEZvcm1hdCA9IHVzZUlucHV0RmxvYXQKLSAgICAgICAgICAgID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVCA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVyRm9ybWF0ID0gdXNlTWl4ZXJGbG9hdAogICAgICAgICAgICAgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgZmxvYXQgZiA9IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQgLyBQcm92aWRlcnMuc2l6ZSgpOyAvLyBub3JtYWxpemUgdm9sdW1lIGJ5ICMgdHJhY2tzCisgICAgZmxvYXQgZiA9IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQgLyBwcm92aWRlcnMuc2l6ZSgpOyAvLyBub3JtYWxpemUgdm9sdW1lIGJ5ICMgdHJhY2tzCiAgICAgc3RhdGljIGZsb2F0IGYwOyAvLyB6ZXJvCiAKICAgICAvLyBzZXQgdXAgdGhlIHRyYWNrcy4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IFByb3ZpZGVycy5zaXplKCk7ICsraSkgewotICAgICAgICAvL3ByaW50ZigidHJhY2sgJWQgb3V0IG9mICVkXG4iLCBpLCBQcm92aWRlcnMuc2l6ZSgpKTsKLSAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoUHJvdmlkZXJzW2ldLmdldE51bUNoYW5uZWxzKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJvdmlkZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIC8vcHJpbnRmKCJ0cmFjayAlZCBvdXQgb2YgJWRcbiIsIGksIHByb3ZpZGVycy5zaXplKCkpOworICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChwcm92aWRlcnNbaV0uZ2V0TnVtQ2hhbm5lbHMoKSk7CiAgICAgICAgIGludDMyX3QgbmFtZSA9IG1peGVyLT5nZXRUcmFja05hbWUoY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgaW5wdXRGb3JtYXQsIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7CisgICAgICAgICAgICAgICAgZm9ybWF0c1tpXSwgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKLSAgICAgICAgTmFtZXMucHVzaF9iYWNrKG5hbWUpOwotICAgICAgICBtaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgJlByb3ZpZGVyc1tpXSk7CisgICAgICAgIG5hbWVzW2ldID0gbmFtZTsKKyAgICAgICAgbWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsICZwcm92aWRlcnNbaV0pOwogICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKICAgICAgICAgICAgICAgICAodm9pZCAqKW91dHB1dEFkZHIpOwogICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKApAQCAtMjQwLDcgKzI2Miw3IEBACiAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpGT1JNQVQsCi0gICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWlucHV0Rm9ybWF0KTsKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZm9ybWF0c1tpXSk7CiAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKQEAgLTI1NSw3ICsyNzcsNyBAQAogICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsCi0gICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KVByb3ZpZGVyc1tpXS5nZXRTYW1wbGVSYXRlKCkpOworICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClwcm92aWRlcnNbaV0uZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICAgICAgaWYgKHVzZVJhbXApIHsKICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmZjApOwogICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZmMCk7CkBAIC0yNzcsMTEgKzI5OSwxMSBAQAogICAgIC8vIHB1bXAgdGhlIG1peGVyIHRvIHByb2Nlc3MgZGF0YS4KICAgICBzaXplX3QgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgb3V0cHV0RnJhbWVzIC0gbWl4ZXJGcmFtZUNvdW50OyBpICs9IG1peGVyRnJhbWVDb3VudCkgewotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IE5hbWVzLnNpemUoKTsgKytqKSB7Ci0gICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKE5hbWVzW2pdLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbmFtZXMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZXNbal0sIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgb3V0cHV0QWRkciArIGkgKiBvdXRwdXRGcmFtZVNpemUpOwogICAgICAgICAgICAgaWYgKGF1eEZpbGVuYW1lKSB7Ci0gICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihOYW1lc1tqXSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkFVWF9CVUZGRVIsCisgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lc1tqXSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkFVWF9CVUZGRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBhdXhBZGRyICsgaSAqIGF1eEZyYW1lU2l6ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCmluZGV4IDE4OGZjODkuLjViMzhlMWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tawpAQCAtMywyNSArMywyNyBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBBdWRpb1BvbGljeVNlcnZpY2UuY3BwIFwKLSAgICBBdWRpb1BvbGljeUVmZmVjdHMuY3BwCisgICAgc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIFwKKyAgICBzZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKIAogaWZlcSAoJChVU0VfTEVHQUNZX0FVRElPX1BPTElDWSksIDEpCiBMT0NBTF9TUkNfRklMRVMgKz0gXAotICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbExlZ2FjeS5jcHAgXAotICAgIEF1ZGlvUG9saWN5Q2xpZW50SW1wbExlZ2FjeS5jcHAKKyAgICBzZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbExlZ2FjeS5jcHAgXAorICAgIHNlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsTGVnYWN5LmNwcAogCiAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kKIGVsc2UKIExPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBcCi0gICAgQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAorICAgIHNlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBcCisgICAgc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCiBlbmRpZgogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliY3V0aWxzIFwKQEAgLTM5LDcgKzQxLDggQEAKIGVuZGlmCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgIGxpYm1lZGlhX2hlbHBlcgorICAgIGxpYm1lZGlhX2hlbHBlciBcCisgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCiAKIExPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5c2VydmljZQogCkBAIC01Myw3ICs1Niw3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIEF1ZGlvUG9saWN5TWFuYWdlci5jcHAKKyAgICBtYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliY3V0aWxzIFwKQEAgLTYxLDggKzY0LDMwIEBACiAgICAgbGlibG9nIFwKICAgICBsaWJzb3VuZHRyaWdnZXIKIAoraWZlcSAoJChVU0VfQ09ORklHVVJBQkxFX0FVRElPX1BPTElDWSksIDEpCisKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAorICAgIHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5IFwKKyAgICBhdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZiBcCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlCisKK2Vsc2UKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJhdWRpb3BvbGljeWVuZ2luZWRlZmF1bHQKKworZW5kaWYKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKKwogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlibWVkaWFfaGVscGVyCisgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKIAogTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9wb2xpY3ltYW5hZ2VyZGVmYXVsdAogCkBAIC03MywxNCArOTgsMjYgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcAorICAgIG1hbmFnZXIvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0CiAKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cworCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UgXAorCiBMT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3BvbGljeW1hbmFnZXIKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCiBlbmRpZgogZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUmVjdXJzaXZlIGNhbGwgc3ViLWZvbGRlciBBbmRyb2lkLm1rCisjCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAppbmRleCA0NTA4ZmE3Li5jMWU3YmMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKQEAgLTY0LDYgKzY0LDcgQEAKICAgICAgICAgQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEUsLy8gdXNlZCBmb3IgcGxhdGZvcm0gYXVkaW8gcmVyb3V0aW5nLCB3aGVyZSBtaXhlcyBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlZCBieSBleHRlcm5hbCBhbmQgZHluYW1pY2FsbHkgaW5zdGFsbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvbGljaWVzIHdoaWNoIHJlcm91dGUgYXVkaW8gbWl4ZXMKKyAgICAgICAgQVBJX0lOUFVUX1RFTEVQSE9OWV9SWCwgLy8gdXNlZCBmb3IgY2FwdHVyZSBmcm9tIHRlbGVwaG9ueSBSWCBwYXRoCiAgICAgfSBpbnB1dF90eXBlX3Q7CiAKIHB1YmxpYzoKQEAgLTc1LDcgKzc2LDggQEAKICAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBkZXZpY2UgY29ubmVjdGlvbiBzdGF0dXMKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpID0gMDsKICAgICAvLyByZXRyaWV2ZSBhIGRldmljZSBjb25uZWN0aW9uIHN0YXR1cwogICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykgPSAwOwpAQCAtMTA1LDEwICsxMDcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pID0gMDsKICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIG91dHB1dCBzdGFydHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nIHN0cmVhbS4KICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKQEAgLTEyNywxMCArMTMxLDEyIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF90eXBlX3QgKmlucHV0VHlwZSkgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RhcnRzIGJlaW5nIHVzZWQuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LApAQCAtMjA2LDcgKzIxMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgY2xlYXJBdWRpb1BhdGNoZXModWlkX3QgdWlkKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VSZXNvdXJjZXNGb3JVaWQodWlkX3QgdWlkKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCkBAIC0yMTYsNiArMjIyLDExIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSA9IDA7CiB9OwogCiAKQEAgLTMxOCw2ICszMjksOCBAQAogICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkgPSAwOwogCiAgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpID0gMDsKIH07CiAKIGV4dGVybiAiQyIgQXVkaW9Qb2xpY3lJbnRlcmZhY2UqIGNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWJkMGVkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MDk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5TWFuYWdlciIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotLy8jZGVmaW5lIFZFUllfVkVSQk9TRV9MT0dHSU5HCi0jaWZkZWYgVkVSWV9WRVJCT1NFX0xPR0dJTkcKLSNkZWZpbmUgQUxPR1ZWIEFMT0dWCi0jZWxzZQotI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCi0jZW5kaWYKLQotLy8gQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIGlucHV0IGRldmljZXMgdGhhdCBhcmUgY29uc2lkZXJlZCAidmlydHVhbCIgd2hlbiBldmFsdWF0aW5nCi0vLyBhY3RpdmUgaW5wdXRzIGluIGdldEFjdGl2ZUlucHV0KCkKLSNkZWZpbmUgQVBNX0FVRElPX0lOX0RFVklDRV9WSVJUVUFMX0FMTCAgKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYfEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUikKLS8vIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBvdXRwdXQgZGV2aWNlcyB0aGF0IGFyZSBjb25zaWRlcmVkICJyZW1vdGUiIHdoZW4gZXZhbHVhdGluZwotLy8gYWN0aXZlIG91dHB1dCBkZXZpY2VzIGluIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoKQotI2RlZmluZSBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMICBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgKLS8vIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBpbnB1dCBhbmQgb3V0cHV0IGRldmljZXMgd2hlcmUgbWF0Y2hpbmcgaW5wdXRzL291dHB1dHMgb24gZGV2aWNlCi0vLyB0eXBlIGFsb25lIGlzIG5vdCBlbm91Z2g6IHRoZSBhZGRyZXNzIG11c3QgbWF0Y2ggdG9vCi0jZGVmaW5lIEFQTV9BVURJT19ERVZJQ0VfTUFUQ0hfQUREUkVTU19BTEwgKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPG1hdGguaD4KLQotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+Ci0jaW5jbHVkZSA8c291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oPgotI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWFuYWdlci5oIgotI2luY2x1ZGUgImF1ZGlvX3BvbGljeV9jb25mLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRGVmaW5pdGlvbnMgZm9yIGF1ZGlvX3BvbGljeS5jb25mIGZpbGUgcGFyc2luZwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgU3RyaW5nVG9FbnVtIHsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIHVpbnQzMl90IHZhbHVlOwotfTsKLQotI2RlZmluZSBTVFJJTkdfVE9fRU5VTShzdHJpbmcpIHsgI3N0cmluZywgc3RyaW5nIH0KLSNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCi0KLWNvbnN0IFN0cmluZ1RvRW51bSBzRGV2aWNlTmFtZVRvRW51bVRhYmxlW10gPSB7Ci0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfU0NPKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9IRE1JKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlkpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0xJTkUpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfU1BESUYpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfRk0pLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9BTUJJRU5UKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9BTExfU0NPKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FVWF9ESUdJVEFMKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fSERNSSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CQUNLX01JQyksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9BTkxHX0RPQ0tfSEVBRFNFVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0RHVExfRE9DS19IRUFEU0VUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVVNCX0FDQ0VTU09SWSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUiksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1RWX1RVTkVSKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fTElORSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1NQRElGKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9MT09QQkFDSyksCi19OwotCi1jb25zdCBTdHJpbmdUb0VudW0gc091dHB1dEZsYWdOYW1lVG9FbnVtVGFibGVbXSA9IHsKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19OT05fQkxPQ0tJTkcpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpLAotfTsKLQotY29uc3QgU3RyaW5nVG9FbnVtIHNJbnB1dEZsYWdOYW1lVG9FbnVtVGFibGVbXSA9IHsKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19JTlBVVF9GTEFHX0ZBU1QpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0lOUFVUX0ZMQUdfSFdfSE9UV09SRCksCi19OwotCi1jb25zdCBTdHJpbmdUb0VudW0gc0Zvcm1hdE5hbWVUb0VudW1UYWJsZVtdID0gewotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzhfQklUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzMyX0JJVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV9GTE9BVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfTVAzKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX01BSU4pLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEMpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfU1NSKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0xUUCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19IRV9WMSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19TQ0FMQUJMRSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19FUkxDKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0xEKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0hFX1YyKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0VMRCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1ZPUkJJUyksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0hFX0FBQ19WMSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0hFX0FBQ19WMiksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX09QVVMpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQzMpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9FX0FDMyksCi19OwotCi1jb25zdCBTdHJpbmdUb0VudW0gc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlW10gPSB7Ci0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF9RVUFEKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF81UE9JTlQxKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxKSwKLX07Ci0KLWNvbnN0IFN0cmluZ1RvRW51bSBzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZVtdID0gewotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5fTU9OTyksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyksCi19OwotCi1jb25zdCBTdHJpbmdUb0VudW0gc0dhaW5Nb2RlTmFtZVRvRW51bVRhYmxlW10gPSB7Ci0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fR0FJTl9NT0RFX0pPSU5UKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19HQUlOX01PREVfQ0hBTk5FTFMpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0dBSU5fTU9ERV9SQU1QKSwKLX07Ci0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdHJpbmdUb0VudW0oY29uc3Qgc3RydWN0IFN0cmluZ1RvRW51bSAqdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBpZiAoc3RyY21wKHRhYmxlW2ldLm5hbWUsIG5hbWUpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJzdHJpbmdUb0VudW0oKSBmb3VuZCAlcyIsIHRhYmxlW2ldLm5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIHRhYmxlW2ldLnZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1jb25zdCBjaGFyICpBdWRpb1BvbGljeU1hbmFnZXI6OmVudW1Ub1N0cmluZyhjb25zdCBzdHJ1Y3QgU3RyaW5nVG9FbnVtICp0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBpZiAodGFibGVbaV0udmFsdWUgPT0gdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiB0YWJsZVtpXS5uYW1lOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAiIjsKLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0cmluZ1RvQm9vbChjb25zdCBjaGFyICp2YWx1ZSkKLXsKLSAgICByZXR1cm4gKChzdHJjYXNlY21wKCJ0cnVlIiwgdmFsdWUpID09IDApIHx8IChzdHJjbXAoIjEiLCB2YWx1ZSkgPT0gMCkpOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKLXsKLSAgICByZXR1cm4gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQotewotICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2U6ICV4LCBzdGF0ZSAlZCwgYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICBkZXZpY2UsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcyAhPSBOVUxMID8gZGV2aWNlX2FkZHJlc3MgOiAiIik7Ci0KLSAgICAvLyBjb25uZWN0L2Rpc2Nvbm5lY3Qgb25seSAxIGRldmljZSBhdCBhIHRpbWUKLSAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gZ2V0RGV2aWNlRGVzY3JpcHRvcihkZXZpY2UsIGRldmljZV9hZGRyZXNzKTsKLQotICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlcwotICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgU29ydGVkVmVjdG9yIDxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKLQotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihkZXZEZXNjKTsKLQotICAgICAgICAvLyBzYXZlIGEgY29weSBvZiB0aGUgb3BlbmVkIG91dHB1dCBkZXNjcmlwdG9ycyBiZWZvcmUgYW55IG91dHB1dCBpcyBvcGVuZWQgb3IgY2xvc2VkCi0gICAgICAgIC8vIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpLiBUaGlzIHdpbGwgYmUgbmVlZGVkIGJ5IGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCi0gICAgICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkKLSAgICAgICAgewotICAgICAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZSBjb25uZWN0aW9uCi0gICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU6IHsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBhbHJlYWR5IGNvbm5lY3RlZDogJXgiLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjb25uZWN0aW5nIGRldmljZSAleCIsIGRldmljZSk7Ci0KLSAgICAgICAgICAgIC8vIHJlZ2lzdGVyIG5ldyBkZXZpY2UgYXMgYXZhaWxhYmxlCi0gICAgICAgICAgICBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChkZXZEZXNjKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IGdldE1vZHVsZUZvckRldmljZShkZXZpY2UpOwotICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRCgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9IG5leHRVbmlxdWVJZCgpOwotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+bU1vZHVsZSA9IG1vZHVsZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgb3V0cHV0cywgZGV2RGVzYy0+bUFkZHJlc3MpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIG91dHB1dHMgc2hvdWxkIG5ldmVyIGJlIGVtcHR5IGhlcmUKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKG91dHB1dHMuc2l6ZSgpICE9IDAsICJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKToiCi0gICAgICAgICAgICAgICAgICAgICJjaGVja091dHB1dHNGb3JEZXZpY2UoKSByZXR1cm5lZCBubyBvdXRwdXRzIGJ1dCBzdGF0dXMgT0siKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjaGVja091dHB1dHNGb3JEZXZpY2UoKSByZXR1cm5lZCAlenUgb3V0cHV0cyIsCi0gICAgICAgICAgICAgICAgICBvdXRwdXRzLnNpemUoKSk7Ci0KLQotICAgICAgICAgICAgLy8gU2V0IGNvbm5lY3QgdG8gSEFMcwotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkZXZEZXNjLT5tQWRkcmVzcyk7Ci0gICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX0NPTk5FQ1QpLCBkZXZpY2UpOwotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZSBkaXNjb25uZWN0aW9uCi0gICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTogewotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJXgiLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3Rpbmcgb3V0cHV0IGRldmljZSAleCIsIGRldmljZSk7Ci0KLSAgICAgICAgICAgIC8vIFNldCBEaXNjb25uZWN0IHRvIEhBTHMKLSAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoZGV2RGVzYy0+bUFkZHJlc3MpOwotICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX0RFVklDRV9ESVNDT05ORUNUKSwgZGV2aWNlKTsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKEFVRElPX0lPX0hBTkRMRV9OT05FLCBwYXJhbS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgLy8gcmVtb3ZlIGRldmljZSBmcm9tIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcwotICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOwotCi0gICAgICAgICAgICBjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIG91dHB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKTsKLSAgICAgICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVja0EyZHBTdXNwZW5kIG11c3QgcnVuIGJlZm9yZSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMgc28gdGhhdCBBMkRQCi0gICAgICAgIC8vIG91dHB1dCBpcyBzdXNwZW5kZWQgYmVmb3JlIGFueSB0cmFja3MgYXJlIG1vdmVkIHRvIGl0Ci0gICAgICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7Ci0gICAgICAgIC8vIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKLSAgICAgICAgaWYgKCFvdXRwdXRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7Ci0gICAgICAgICAgICAgICAgLy8gY2xvc2UgdW51c2VkIG91dHB1dHMgYWZ0ZXIgZGV2aWNlIGRpc2Nvbm5lY3Rpb24gb3IgZGlyZWN0IG91dHB1dHMgdGhhdCBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAvLyBvcGVuZWQgYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgaWYgKChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApKSkgewotICAgICAgICAgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXRzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjaGVjayBhZ2FpbiBhZnRlciBjbG9zaW5nIEEyRFAgb3V0cHV0IHRvIHJlc2V0IG1BMmRwU3VzcGVuZGVkIGlmIG5lZWRlZAotICAgICAgICAgICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKLSAgICAgICAgaWYgKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IG1PdXRwdXRzLmtleUF0KGkpOwotICAgICAgICAgICAgaWYgKChtUGhvbmVTdGF0ZSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHx8IChvdXRwdXQgIT0gbVByaW1hcnlPdXRwdXQpKSB7Ci0gICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtT3V0cHV0cy5rZXlBdChpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90IGZvcmNlIGRldmljZSBjaGFuZ2Ugb24gZHVwbGljYXRlZCBvdXRwdXQgYmVjYXVzZSBpZiBkZXZpY2UgaXMgMCwgaXQgd2lsbAotICAgICAgICAgICAgICAgIC8vIGFsc28gZm9yY2UgYSBkZXZpY2UgMCBmb3IgdGhlIHR3byBvdXRwdXRzIGl0IGlzIGR1cGxpY2F0ZWQgdG8gd2hpY2ggbWF5IG92ZXJyaWRlCi0gICAgICAgICAgICAgICAgLy8gYSB2YWxpZCBkZXZpY2Ugc2VsZWN0aW9uIG9uIHRob3NlIG91dHB1dHMuCi0gICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9ICFtT3V0cHV0cy52YWx1ZUF0KGkpLT5pc0R1cGxpY2F0ZWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGRldmljZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIGZvcmNlIHdoZW4gZGlzY29ubmVjdGluZyAoYSBub24tZHVwbGljYXRlZCBkZXZpY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSk7Ci0gICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgbmV3RGV2aWNlLCBmb3JjZSwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9ICAvLyBlbmQgaWYgaXMgb3V0cHV0IGRldmljZQotCi0gICAgLy8gaGFuZGxlIGlucHV0IGRldmljZXMKLSAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgU29ydGVkVmVjdG9yIDxhdWRpb19pb19oYW5kbGVfdD4gaW5wdXRzOwotCi0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2YoZGV2RGVzYyk7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpCi0gICAgICAgIHsKLSAgICAgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZSBjb25uZWN0aW9uCi0gICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU6IHsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBhbHJlYWR5IGNvbm5lY3RlZDogJWQiLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBnZXRNb2R1bGVGb3JEZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKTogY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2hlY2tJbnB1dHNGb3JEZXZpY2UoZGV2aWNlLCBzdGF0ZSwgaW5wdXRzLCBkZXZEZXNjLT5tQWRkcmVzcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGluZGV4ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGV2RGVzYyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tSWQgPSBuZXh0VW5pcXVlSWQoKTsKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2luZGV4XS0+bU1vZHVsZSA9IG1vZHVsZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2V0IGNvbm5lY3QgdG8gSEFMcwotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkZXZEZXNjLT5tQWRkcmVzcyk7Ci0gICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX0NPTk5FQ1QpLCBkZXZpY2UpOwotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZSBkaXNjb25uZWN0aW9uCi0gICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTogewotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJWQiLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3RpbmcgaW5wdXQgZGV2aWNlICV4IiwgZGV2aWNlKTsKLQotICAgICAgICAgICAgLy8gU2V0IERpc2Nvbm5lY3QgdG8gSEFMcwotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkZXZEZXNjLT5tQWRkcmVzcyk7Ci0gICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX0RJU0NPTk5FQ1QpLCBkZXZpY2UpOwotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICBjaGVja0lucHV0c0ZvckRldmljZShkZXZpY2UsIHN0YXRlLCBpbnB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKTsKLSAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOwotCi0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBjbG9zZUFsbElucHV0cygpOwotCi0gICAgICAgIGlmIChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0gLy8gZW5kIGlmIGlzIGlucHV0IGRldmljZQotCi0gICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgZGV2aWNlOiAleCIsIGRldmljZSk7Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQotewotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBnZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZSwgZGV2aWNlX2FkZHJlc3MpOwotICAgIERldmljZVZlY3RvciAqZGV2aWNlVmVjdG9yOwotCi0gICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICBkZXZpY2VWZWN0b3IgPSAmbUF2YWlsYWJsZU91dHB1dERldmljZXM7Ci0gICAgfSBlbHNlIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICBkZXZpY2VWZWN0b3IgPSAmbUF2YWlsYWJsZUlucHV0RGV2aWNlczsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBkZXZpY2UgdHlwZSAlMDh4IiwgZGV2aWNlKTsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7Ci0gICAgfQotCi0gICAgc3NpemVfdCBpbmRleCA9IGRldmljZVZlY3Rvci0+aW5kZXhPZihkZXZEZXNjKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7Ci0gICAgfQotfQotCi1zcDxBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I+ICBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQotewotICAgIFN0cmluZzggYWRkcmVzcyA9IChkZXZpY2VfYWRkcmVzcyA9PSBOVUxMKSA/IFN0cmluZzgoIiIpIDogU3RyaW5nOChkZXZpY2VfYWRkcmVzcyk7Ci0gICAgLy8gaGFuZGxlIGxlZ2FjeSByZW1vdGUgc3VibWl4IGNhc2Ugd2hlcmUgdGhlIGFkZHJlc3Mgd2FzIG5vdCBhbHdheXMgc3BlY2lmaWVkCi0gICAgaWYgKGRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoZGV2aWNlKSAmJiAoYWRkcmVzcy5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9Ci0gICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bURlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVBZGRyKGRldmljZSwgYWRkcmVzcyk7Ci0gICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKLSAgICAgICAgfQotICAgICAgICBkZXZpY2VMaXN0ID0gbUh3TW9kdWxlc1tpXS0+bURlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGRldmljZUxpc3QuaXRlbUF0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCBkZXZpY2UpOwotICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKLSAgICByZXR1cm4gZGV2RGVzYzsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUNhbGxSb3V0aW5nKGF1ZGlvX2RldmljZXNfdCByeERldmljZSwgaW50IGRlbGF5TXMpCi17Ci0gICAgYm9vbCBjcmVhdGVUeFBhdGNoID0gZmFsc2U7Ci0gICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOwotICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICBwYXRjaC5udW1fc2lua3MgPSAxOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlOwotICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0OwotCi0gICAgYXVkaW9fZGV2aWNlc190IHR4RGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOwotICAgIEFMT0dWKCJ1cGRhdGVDYWxsUm91dGluZyBkZXZpY2UgcnhEZXZpY2UgJTA4eCB0eERldmljZSAlMDh4IiwgcnhEZXZpY2UsIHR4RGV2aWNlKTsKLQotICAgIC8vIHJlbGVhc2UgZXhpc3RpbmcgUlggcGF0Y2ggaWYgYW55Ci0gICAgaWYgKG1DYWxsUnhQYXRjaCAhPSAwKSB7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFJ4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgbUNhbGxSeFBhdGNoLmNsZWFyKCk7Ci0gICAgfQotICAgIC8vIHJlbGVhc2UgVFggcGF0Y2ggaWYgYW55Ci0gICAgaWYgKG1DYWxsVHhQYXRjaCAhPSAwKSB7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFR4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlIFJYIGRldmljZSBpcyBvbiB0aGUgcHJpbWFyeSBIVyBtb2R1bGUsIHRoZW4gdXNlIGxlZ2FjeSByb3V0aW5nIG1ldGhvZCBmb3Igdm9pY2UgY2FsbHMKLSAgICAvLyB2aWEgc2V0T3V0cHV0RGV2aWNlKCkgb24gcHJpbWFyeSBvdXRwdXQuCi0gICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgdHdvIGF1ZGlvIHBhdGNoZXMgZm9yIFRYIGFuZCBSWCBwYXRoLgotICAgIGlmIChhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpICYgcnhEZXZpY2UpIHsKLSAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCByeERldmljZSwgdHJ1ZSwgZGVsYXlNcyk7Ci0gICAgICAgIC8vIElmIHRoZSBUWCBkZXZpY2UgaXMgYWxzbyBvbiB0aGUgcHJpbWFyeSBIVyBtb2R1bGUsIHNldE91dHB1dERldmljZSgpIHdpbGwgdGFrZSBjYXJlCi0gICAgICAgIC8vIG9mIGl0IGR1ZSB0byBsZWdhY3kgaW1wbGVtZW50YXRpb24uIElmIG5vdCwgY3JlYXRlIGEgcGF0Y2guCi0gICAgICAgIGlmICgoYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpICYgdHhEZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikKLSAgICAgICAgICAgICAgICA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgY3JlYXRlVHhQYXRjaCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBjcmVhdGUgUlggcGF0aCBhdWRpbyBwYXRjaAotICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHJ4RGV2aWNlKTsKLSAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAotICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBzZWxlY3RlZCBkZXZpY2Ugbm90IGluIG91dHB1dCBkZXZpY2UgbGlzdCIpOwotICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiByeFNpbmtEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0gICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKTsKLSAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAotICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBubyB0ZWxlcGhvbnkgUlggZGV2aWNlIik7Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHJ4U291cmNlRGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOwotCi0gICAgICAgIHJ4U291cmNlRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICByeFNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbMF0pOwotCi0gICAgICAgIC8vIHJlcXVlc3QgdG8gcmV1c2UgZXhpc3Rpbmcgb3V0cHV0IHN0cmVhbSBpZiBvbmUgaXMgYWxyZWFkeSBvcGVuZWQgdG8gcmVhY2ggdGhlIFJYIGRldmljZQotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKHJ4RGV2aWNlLCBtT3V0cHV0cyk7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKLSAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIFJYIGRldmljZSBvdXRwdXQgaXMgZHVwbGljYXRlZCIpOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMV0pOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZhZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAidXBkYXRlQ2FsbFJvdXRpbmcoKSBlcnJvciAlZCBjcmVhdGluZyBSWCBhdWRpbyBwYXRjaCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1DYWxsUnhQYXRjaCA9IG5ldyBBdWRpb1BhdGNoKChhdWRpb19wYXRjaF9oYW5kbGVfdCluZXh0VW5pcXVlSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRjaCwgbVVpZENhY2hlZCk7Ci0gICAgICAgICAgICBtQ2FsbFJ4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIG1DYWxsUnhQYXRjaC0+bVVpZCA9IG1VaWRDYWNoZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgY3JlYXRlVHhQYXRjaCA9IHRydWU7Ci0gICAgfQotICAgIGlmIChjcmVhdGVUeFBhdGNoKSB7Ci0KLSAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOwotICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7Ci0gICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSh0eERldmljZSk7Ci0gICAgICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKLSAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgc2VsZWN0ZWQgZGV2aWNlIG5vdCBpbiBpbnB1dCBkZXZpY2UgbGlzdCIpOwotICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiB0eFNvdXJjZURldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKLSAgICAgICAgdHhTb3VyY2VEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpOwotICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCi0gICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIG5vIHRlbGVwaG9ueSBUWCBkZXZpY2UiKTsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gdHhTaW5rRGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOwotICAgICAgICB0eFNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbMF0pOwotCi0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2UoQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsIG1PdXRwdXRzKTsKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOwotICAgICAgICAvLyByZXF1ZXN0IHRvIHJldXNlIGV4aXN0aW5nIG91dHB1dCBzdHJlYW0gaWYgb25lIGlzIGFscmVhZHkgb3BlbmVkIHRvIHJlYWNoIHRoZSBUWAotICAgICAgICAvLyBwYXRoIG91dHB1dCBkZXZpY2UKLSAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIFJYIGRldmljZSBvdXRwdXQgaXMgZHVwbGljYXRlZCIpOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMV0pOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZhZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAic2V0UGhvbmVTdGF0ZSgpIGVycm9yICVkIGNyZWF0aW5nIFRYIGF1ZGlvIHBhdGNoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbUNhbGxUeFBhdGNoID0gbmV3IEF1ZGlvUGF0Y2goKGF1ZGlvX3BhdGNoX2hhbmRsZV90KW5leHRVbmlxdWVJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGNoLCBtVWlkQ2FjaGVkKTsKLSAgICAgICAgICAgIG1DYWxsVHhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgbUNhbGxUeFBhdGNoLT5tVWlkID0gbVVpZENhY2hlZDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQotewotICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgc3RhdGUgJWQiLCBzdGF0ZSk7Ci0gICAgaWYgKHN0YXRlIDwgMCB8fCBzdGF0ZSA+PSBBVURJT19NT0RFX0NOVCkgewotICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIGludmFsaWQgc3RhdGUgJWQiLCBzdGF0ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdGUgPT0gbVBob25lU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dXKCJzZXRQaG9uZVN0YXRlKCkgc2V0dGluZyBzYW1lIHN0YXRlICVkIiwgc3RhdGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gaWYgbGVhdmluZyBjYWxsIHN0YXRlLCBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGFjdGl2ZSBzdHJlYW1zCi0gICAgLy8gcGVydGFpbmluZyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgc2VlIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpCi0gICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKLSAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1BBVENIKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gY2FsbCBzdGFydHMKLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOwotICAgIH0KLQotICAgIC8vIHN0b3JlIHByZXZpb3VzIHBob25lIHN0YXRlIGZvciBtYW5hZ2VtZW50IG9mIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBiZWxvdwotICAgIGludCBvbGRTdGF0ZSA9IG1QaG9uZVN0YXRlOwotICAgIG1QaG9uZVN0YXRlID0gc3RhdGU7Ci0gICAgYm9vbCBmb3JjZSA9IGZhbHNlOwotCi0gICAgLy8gYXJlIHdlIGVudGVyaW5nIG9yIHN0YXJ0aW5nIGEgY2FsbAotICAgIGlmICghaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkgJiYgaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKLSAgICAgICAgQUxPR1YoIiAgRW50ZXJpbmcgY2FsbCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKLSAgICAgICAgLy8gZm9yY2Ugcm91dGluZyBjb21tYW5kIHRvIGF1ZGlvIGhhcmR3YXJlIHdoZW4gc3RhcnRpbmcgYSBjYWxsCi0gICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKLSAgICAgICAgZm9yY2UgPSB0cnVlOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgewotICAgICAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0RUTUZdLm1Wb2x1bWVDdXJ2ZVtqXSA9Ci0gICAgICAgICAgICAgICAgICAgIHNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTF1bal07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmICFpc1N0YXRlSW5DYWxsKHN0YXRlKSkgewotICAgICAgICBBTE9HVigiICBFeGl0aW5nIGNhbGwgaW4gc2V0UGhvbmVTdGF0ZSgpIik7Ci0gICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIGV4aXRpbmcgYSBjYWxsCi0gICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKLSAgICAgICAgZm9yY2UgPSB0cnVlOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgewotICAgICAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0RUTUZdLm1Wb2x1bWVDdXJ2ZVtqXSA9Ci0gICAgICAgICAgICAgICAgICAgIHNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fRFRNRl1bal07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpICYmIChzdGF0ZSAhPSBvbGRTdGF0ZSkpIHsKLSAgICAgICAgQUxPR1YoIiAgU3dpdGNoaW5nIGJldHdlZW4gdGVsZXBob255IGFuZCBWb0lQIGluIHNldFBob25lU3RhdGUoKSIpOwotICAgICAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiB0ZWxlcGhvbnkgYW5kIFZvSVAKLSAgICAgICAgLy8gZXZlbiBpZiBubyBkZXZpY2UgY2hhbmdlIGlzIG5lZWRlZAotICAgICAgICBmb3JjZSA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgZm9yIGRldmljZSBhbmQgb3V0cHV0IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IG5ldyBwaG9uZSBzdGF0ZQotICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKLSAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKLSAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOwotCi0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBod091dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7Ci0KLSAgICBpbnQgZGVsYXlNcyA9IDA7Ci0gICAgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7Ci0gICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIC8vIG11dGUgbWVkaWEgYW5kIHNvbmlmaWNhdGlvbiBzdHJhdGVnaWVzIGFuZCBkZWxheSBkZXZpY2Ugc3dpdGNoIGJ5IHRoZSBsYXJnZXN0Ci0gICAgICAgICAgICAvLyBsYXRlbmN5IG9mIGFueSBvdXRwdXQgd2hlcmUgZWl0aGVyIHN0cmF0ZWd5IGlzIGFjdGl2ZS4KLSAgICAgICAgICAgIC8vIFRoaXMgYXZvaWQgc2VuZGluZyB0aGUgcmluZyB0b25lIG9yIG11c2ljIHRhaWwgaW50byB0aGUgZWFycGllY2Ugb3IgaGVhZHNldC4KLSAgICAgICAgICAgIGlmICgoZGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNUaW1lKSB8fAotICAgICAgICAgICAgICAgICAgICBkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1NPTklGSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c1RpbWUpKSAmJgotICAgICAgICAgICAgICAgICAgICAoZGVsYXlNcyA8IChpbnQpZGVzYy0+bUxhdGVuY3kqMikpIHsKLSAgICAgICAgICAgICAgICBkZWxheU1zID0gZGVzYy0+bUxhdGVuY3kqMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgdHJ1ZSwgbU91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCBmYWxzZSwgbU91dHB1dHMua2V5QXQoaSksIE1VVEVfVElNRV9NUywKLSAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgdHJ1ZSAvKmZyb21DYWNoZSovKSk7Ci0gICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlLCBtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmYWxzZSwgbU91dHB1dHMua2V5QXQoaSksIE1VVEVfVElNRV9NUywKLSAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIHRydWUgLypmcm9tQ2FjaGUqLykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm90ZSB0aGF0IGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBnZXROZXdPdXRwdXREZXZpY2UoKSBpcyBjYWxsZWQgb24gdGhlIHByaW1hcnkgb3V0cHV0LAotICAgIC8vIHRoZSBkZXZpY2UgcmV0dXJuZWQgaXMgbm90IG5lY2Vzc2FyaWx5IHJlYWNoYWJsZSB2aWEgdGhpcyBvdXRwdXQKLSAgICBhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIGVuZGluZyBjYWxsCi0gICAgLy8gZXZlbiBpZiBubyBkZXZpY2UgY2hhbmdlIGlzIG5lZWRlZAotICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSAmJiByeERldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICByeERldmljZSA9IGh3T3V0cHV0RGVzYy0+ZGV2aWNlKCk7Ci0gICAgfQotCi0gICAgaWYgKHN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgewotICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhyeERldmljZSwgZGVsYXlNcyk7Ci0gICAgfSBlbHNlIGlmIChvbGRTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKLSAgICAgICAgaWYgKG1DYWxsUnhQYXRjaCAhPSAwKSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxSeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7Ci0gICAgICAgICAgICBtQ2FsbFJ4UGF0Y2guY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFR4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgICAgIG1DYWxsVHhQYXRjaC5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIGZvcmNlLCAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCBmb3JjZSwgMCk7Ci0gICAgfQotICAgIC8vIGlmIGVudGVyaW5nIGluIGNhbGwgc3RhdGUsIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgYWN0aXZlIHN0cmVhbXMKLSAgICAvLyBwZXJ0YWluaW5nIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBzZWUgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkKLSAgICBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKLSAgICAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKLSAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1BBVENIKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEZsYWcgdGhhdCByaW5ndG9uZSB2b2x1bWUgbXVzdCBiZSBsaW1pdGVkIHRvIG11c2ljIHZvbHVtZSB1bnRpbCB3ZSBleGl0IE1PREVfUklOR1RPTkUKLSAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9SSU5HVE9ORSAmJgotICAgICAgICBpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZKSkgewotICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSBmYWxzZTsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQotewotICAgIEFMT0dWKCJzZXRGb3JjZVVzZSgpIHVzYWdlICVkLCBjb25maWcgJWQsIG1QaG9uZVN0YXRlICVkIiwgdXNhZ2UsIGNvbmZpZywgbVBob25lU3RhdGUpOwotCi0gICAgYm9vbCBmb3JjZVZvbHVtZVJlZXZhbCA9IGZhbHNlOwotICAgIHN3aXRjaCh1c2FnZSkgewotICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OOgotICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfQ09NTVVOSUNBVElPTiIsIGNvbmZpZyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yY2VWb2x1bWVSZWV2YWwgPSB0cnVlOwotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUE6Ci0gICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0hFQURQSE9ORVMgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9BMkRQICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1dJUkVEX0FDQ0VTU09SWSAmJgotICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSyAmJgotICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9ESUdJVEFMX0RPQ0sgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFAgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSICkgewotICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9NRURJQSIsIGNvbmZpZyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRDoKLSAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfUkVDT1JEIiwgY29uZmlnKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DSzoKLSAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0NBUl9ET0NLICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0RFU0tfRE9DSyAmJgotICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9XSVJFRF9BQ0NFU1NPUlkgJiYKLSAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQU5BTE9HX0RPQ0sgJiYKLSAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRElHSVRBTF9ET0NLKSB7Ci0gICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX0RPQ0siLCBjb25maWcpOwotICAgICAgICB9Ci0gICAgICAgIGZvcmNlVm9sdW1lUmVldmFsID0gdHJ1ZTsKLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTToKLSAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgotICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfU1lTVEVNIiwgY29uZmlnKTsKLSAgICAgICAgfQotICAgICAgICBmb3JjZVZvbHVtZVJlZXZhbCA9IHRydWU7Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJTzoKLSAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgotICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9IRE1JX1NZU1RFTV9BVURJT19FTkZPUkNFRCkgewotICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9ySERNSV9TWVNURU1fQVVESU8iLCBjb25maWcpOwotICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgdXNhZ2UgJWQiLCB1c2FnZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIGNoZWNrIGZvciBkZXZpY2UgYW5kIG91dHB1dCBjaGFuZ2VzIHRyaWdnZXJlZCBieSBuZXcgZm9yY2UgdXNhZ2UKLSAgICBjaGVja0EyZHBTdXNwZW5kKCk7Ci0gICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7Ci0gICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKLSAgICBpZiAobVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZSk7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0LCB0cnVlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICBpZiAoKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKG91dHB1dCAhPSBtUHJpbWFyeU91dHB1dCkpIHsKLSAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXQsIG5ld0RldmljZSwgKG5ld0RldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmb3JjZVZvbHVtZVJlZXZhbCAmJiAobmV3RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSkgewotICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dCwgbmV3RGV2aWNlLCAwLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUlucHV0ID0gZ2V0QWN0aXZlSW5wdXQoKTsKLSAgICBpZiAoYWN0aXZlSW5wdXQgIT0gMCkgewotICAgICAgICBzZXRJbnB1dERldmljZShhY3RpdmVJbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoYWN0aXZlSW5wdXQpKTsKLSAgICB9Ci0KLX0KLQotYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkKLXsKLSAgICByZXR1cm4gbUZvcmNlVXNlW3VzYWdlXTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN5c3RlbVByb3BlcnR5KGNvbnN0IGNoYXIqIHByb3BlcnR5LCBjb25zdCBjaGFyKiB2YWx1ZSkKLXsKLSAgICBBTE9HVigic2V0U3lzdGVtUHJvcGVydHkoKSBwcm9wZXJ0eSAlcywgdmFsdWUgJXMiLCBwcm9wZXJ0eSwgdmFsdWUpOwotfQotCi0vLyBGaW5kIGEgZGlyZWN0IG91dHB1dCBwcm9maWxlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVycyBwYXNzZWQsIGV2ZW4gaWYgdGhlIGlucHV0IGZsYWdzIGRvCi0vLyBub3QgZXhwbGljaXRseSByZXF1ZXN0IGEgZGlyZWN0IG91dHB1dAotc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOwotICAgICAgICAgICAgYm9vbCBmb3VuZCA9IHByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlLCBTdHJpbmc4KCIiKSwgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICBOVUxMIC8qdXBkYXRlZFNhbXBsaW5nUmF0ZSovLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICBmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgPwotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCA6IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7Ci0gICAgICAgICAgICBpZiAoZm91bmQgJiYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwcm9maWxlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCi17Ci0gICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICBBTE9HVigiZ2V0T3V0cHV0KCkgZGV2aWNlICVkLCBzdHJlYW0gJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICV4LCBjaGFubmVsTWFzayAleCwgZmxhZ3MgJXgiLAotICAgICAgICAgIGRldmljZSwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzKTsKLQotICAgIHJldHVybiBnZXRPdXRwdXRGb3JEZXZpY2UoZGV2aWNlLCBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBzYW1wbGluZ1JhdGUsZm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBvZmZsb2FkSW5mbyk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCi17Ci0gICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7Ci0gICAgaWYgKGF0dHIgIT0gTlVMTCkgewotICAgICAgICBpZiAoIWlzVmFsaWRBdHRyaWJ1dGVzKGF0dHIpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cigpIGludmFsaWQgYXR0cmlidXRlczogdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCi0gICAgICAgICAgICAgICAgICBhdHRyLT51c2FnZSwgYXR0ci0+Y29udGVudF90eXBlLCBhdHRyLT5mbGFncywKLSAgICAgICAgICAgICAgICAgIGF0dHItPnRhZ3MpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBhdHRyaWJ1dGVzID0gKmF0dHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCpzdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8ICpzdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyKCk6ICBpbnZhbGlkIHN0cmVhbSB0eXBlIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIHN0cmVhbV90eXBlX3RvX2F1ZGlvX2F0dHJpYnV0ZXMoKnN0cmVhbSwgJmF0dHJpYnV0ZXMpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBvbGljeU1peGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYzsKLSAgICAgICAgaWYgKG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tQ3JpdGVyaWEuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoKFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFID09IG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tQ3JpdGVyaWFbal0ubVJ1bGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tQ3JpdGVyaWFbal0ubUF0dHIubVVzYWdlID09IGF0dHJpYnV0ZXMudXNhZ2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFID09IG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tQ3JpdGVyaWFbal0ubVJ1bGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tQ3JpdGVyaWFbal0ubUF0dHIubVVzYWdlICE9IGF0dHJpYnV0ZXMudXNhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2MgPSBtUG9saWN5TWl4ZXNbaV0tPm1PdXRwdXQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MgKyBzdHJsZW4oImFkZHI9IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tUmVnaXN0cmF0aW9uSWQuc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIHN0cmxlbigiYWRkcj0iKSAtIDEpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzYyA9IG1Qb2xpY3lNaXhlc1tpXS0+bU91dHB1dDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFICYmCi0gICAgICAgICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MgKyBzdHJsZW4oImFkZHI9IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeU1peGVzW2ldLT5tTWl4Lm1SZWdpc3RyYXRpb25JZC5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSBzdHJsZW4oImFkZHI9IikgLSAxKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzYyA9IG1Qb2xpY3lNaXhlc1tpXS0+bU91dHB1dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZGVzYyAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXNjLT5tUG9saWN5TWl4ID0gJm1Qb2xpY3lNaXhlc1tpXS0+bU1peDsKLSAgICAgICAgICAgICpzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJmF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgKm91dHB1dCA9IGRlc2MtPm1Jb0hhbmRsZTsKLSAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJucyBvdXRwdXQgJWQiLCAqb3V0cHV0KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSkgewotICAgICAgICBBTE9HVygiZ2V0T3V0cHV0Rm9yQXR0cigpIG5vIHBvbGljeSBtaXggZm91bmQgZm9yIHVzYWdlIEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgQUxPR1YoImdldE91dHB1dEZvckF0dHIoKSB1c2FnZT0lZCwgY29udGVudD0lZCwgdGFnPSVzIGZsYWdzPSUwOHgiLAotICAgICAgICAgICAgYXR0cmlidXRlcy51c2FnZSwgYXR0cmlidXRlcy5jb250ZW50X3R5cGUsIGF0dHJpYnV0ZXMudGFncywgYXR0cmlidXRlcy5mbGFncyk7Ci0KLSAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gKHJvdXRpbmdfc3RyYXRlZ3kpIGdldFN0cmF0ZWd5Rm9yQXR0cigmYXR0cmlidXRlcyk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLQotICAgIGlmICgoYXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgewotICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsKLSAgICB9Ci0KLSAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIGRldmljZSAweCV4LCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAleCwgY2hhbm5lbE1hc2sgJXgsIGZsYWdzICV4IiwKLSAgICAgICAgICBkZXZpY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOwotCi0gICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmYXR0cmlidXRlcyk7Ci0gICAgKm91dHB1dCA9IGdldE91dHB1dEZvckRldmljZShkZXZpY2UsIHNlc3Npb24sICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgb2ZmbG9hZEluZm8pOwotICAgIGlmICgqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckRldmljZSgKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gX191bnVzZWQsCi0gICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCi17Ci0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgdWludDMyX3QgbGF0ZW5jeSA9IDA7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotCi0jaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKLSAgICBpZiAobUN1ck91dHB1dCAhPSAwKSB7Ci0gICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSB0ZXN0IG91dHB1dCBtQ3VyT3V0cHV0ICVkLCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgJXgsIG1EaXJlY3RPdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgIG1DdXJPdXRwdXQsIG1UZXN0U2FtcGxpbmdSYXRlLCBtVGVzdEZvcm1hdCwgbVRlc3RDaGFubmVscywgbURpcmVjdE91dHB1dCk7Ci0KLSAgICAgICAgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgb3BlbmluZyB0ZXN0IG91dHB1dCIpOwotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihOVUxMKTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBtVGVzdERldmljZTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1MYXRlbmN5ID0gbVRlc3RMYXRlbmN5TXM7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MgPQotICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKG1EaXJlY3RPdXRwdXQgPyBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgOiAwKTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID0gMDsKLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG1UZXN0U2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IG1UZXN0Q2hhbm5lbHM7Ci0gICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gbVRlc3RGb3JtYXQ7Ci0gICAgICAgICAgICBpZiAob2ZmbG9hZEluZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8gPSAqb2ZmbG9hZEluZm87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dCgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OwotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICBvdXRwdXRDbWQuYWRkSW50KFN0cmluZzgoInNldF9pZCIpLG1DdXJPdXRwdXQpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSxvdXRwdXRDbWQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgYWRkT3V0cHV0KG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XTsKLSAgICB9Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotCi0gICAgLy8gb3BlbiBhIGRpcmVjdCBvdXRwdXQgaWYgcmVxdWlyZWQgYnkgc3BlY2lmaWVkIHBhcmFtZXRlcnMKLSAgICAvL2ZvcmNlIGRpcmVjdCBmbGFnIGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQ6IG9mZmxvYWRpbmcgaW1wbGllcyBhIGRpcmVjdCBvdXRwdXQgc3RyZWFtCi0gICAgLy8gYW5kIGFsbCBjb21tb24gYmVoYXZpb3JzIGFyZSBkcml2ZW4gYnkgY2hlY2tpbmcgb25seSB0aGUgZGlyZWN0IGZsYWcKLSAgICAvLyB0aGlzIHNob3VsZCBub3JtYWxseSBiZSBzZXQgYXBwcm9wcmlhdGVseSBpbiB0aGUgcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZQotICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7Ci0gICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7Ci0gICAgfQotICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7Ci0gICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7Ci0gICAgfQotICAgIC8vIG9ubHkgYWxsb3cgZGVlcCBidWZmZXJpbmcgZm9yIG11c2ljIHN0cmVhbSB0eXBlCi0gICAgaWYgKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fTVVTSUMpIHsKLSAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzICZ+QVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpOwotICAgIH0KLQotICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZTsKLQotICAgIC8vIHNraXAgZGlyZWN0IG91dHB1dCBzZWxlY3Rpb24gaWYgdGhlIHJlcXVlc3QgY2FuIG9idmlvdXNseSBiZSBhdHRhY2hlZCB0byBhIG1peGVkIG91dHB1dAotICAgIC8vIGFuZCBub3QgZXhwbGljaXRseSByZXF1ZXN0ZWQKLSAgICBpZiAoKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgJiYKLSAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJiBzYW1wbGluZ1JhdGUgPD0gTUFYX01JWEVSX1NBTVBMSU5HX1JBVEUgJiYKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzaykgPD0gMikgewotICAgICAgICBnb3RvIG5vbl9kaXJlY3Rfb3V0cHV0OwotICAgIH0KLQotICAgIC8vIERvIG5vdCBhbGxvdyBvZmZsb2FkaW5nIGlmIG9uZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0IGlzIGVuYWJsZWQuIFRoaXMgcHJldmVudHMgZnJvbQotICAgIC8vIGNyZWF0aW5nIGFuIG9mZmxvYWRlZCB0cmFjayBhbmQgdGVhcmluZyBpdCBkb3duIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0IHdoZW4gYXVkaW9mbGluZ2VyCi0gICAgLy8gZGV0ZWN0cyB0aGVyZSBpcyBhbiBhY3RpdmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdC4KLSAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGNoZWNrIHRoZSBhdWRpbyBzZXNzaW9uIGhlcmUgYnV0IHdlIGRvIG5vdCBoYXZlIGl0IGluIHRoaXMgY29udGV4dC4KLSAgICAvLyBUaGlzIG1heSBwcmV2ZW50IG9mZmxvYWRpbmcgaW4gcmFyZSBzaXR1YXRpb25zIHdoZXJlIGVmZmVjdHMgYXJlIGxlZnQgYWN0aXZlIGJ5IGFwcHMKLSAgICAvLyBpbiB0aGUgYmFja2dyb3VuZC4KLQotICAgIGlmICgoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgPT0gMCkgfHwKLSAgICAgICAgICAgICFpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpKSB7Ci0gICAgICAgIHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClmbGFncyk7Ci0gICAgfQotCi0gICAgaWYgKHByb2ZpbGUgIT0gMCkgewotICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBOVUxMOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIChwcm9maWxlID09IGRlc2MtPm1Qcm9maWxlKSkgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MgPSBkZXNjOwotICAgICAgICAgICAgICAgIC8vIHJldXNlIGRpcmVjdCBvdXRwdXQgaWYgY3VycmVudGx5IG9wZW4gYW5kIGNvbmZpZ3VyZWQgd2l0aCBzYW1lIHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICBpZiAoKHNhbXBsaW5nUmF0ZSA9PSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCA9PSBvdXRwdXREZXNjLT5tRm9ybWF0KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IG91dHB1dERlc2MtPm1DaGFubmVsTWFzaykpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCsrOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgcmV1c2luZyBkaXJlY3Qgb3V0cHV0ICVkIiwgbU91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU91dHB1dHMua2V5QXQoaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIGNsb3NlIGRpcmVjdCBvdXRwdXQgaWYgY3VycmVudGx5IG9wZW4gYW5kIGNvbmZpZ3VyZWQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycwotICAgICAgICBpZiAob3V0cHV0RGVzYyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICB9Ci0gICAgICAgIG91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUpOwotICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOwotICAgICAgICBvdXRwdXREZXNjLT5tTGF0ZW5jeSA9IDA7Ci0gICAgICAgIG91dHB1dERlc2MtPm1GbGFncyA9KGF1ZGlvX291dHB1dF9mbGFnc190KSAob3V0cHV0RGVzYy0+bUZsYWdzIHwgZmxhZ3MpOwotICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNhbXBsaW5nUmF0ZTsKLSAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOwotICAgICAgICBjb25maWcuZm9ybWF0ID0gZm9ybWF0OwotICAgICAgICBpZiAob2ZmbG9hZEluZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9ICpvZmZsb2FkSW5mbzsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChwcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKLQotICAgICAgICAvLyBvbmx5IGFjY2VwdCBhbiBvdXRwdXQgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAotICAgICAgICAgICAgKHNhbXBsaW5nUmF0ZSAhPSAwICYmIHNhbXBsaW5nUmF0ZSAhPSBjb25maWcuc2FtcGxlX3JhdGUpIHx8Ci0gICAgICAgICAgICAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUICYmIGZvcm1hdCAhPSBjb25maWcuZm9ybWF0KSB8fAotICAgICAgICAgICAgKGNoYW5uZWxNYXNrICE9IDAgJiYgY2hhbm5lbE1hc2sgIT0gY29uZmlnLmNoYW5uZWxfbWFzaykpIHsKLSAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBmYWlsZWQgb3BlbmluZyBkaXJlY3Qgb3V0cHV0OiBvdXRwdXQgJWQgc2FtcGxpbmdSYXRlICVkICVkLCIKLSAgICAgICAgICAgICAgICAgICAgImZvcm1hdCAlZCAlZCwgY2hhbm5lbE1hc2sgJTA0eCAlMDR4Iiwgb3V0cHV0LCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUsIGZvcm1hdCwgb3V0cHV0RGVzYy0+bUZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBmYWxsIGJhY2sgdG8gbWl4ZXIgb3V0cHV0IGlmIHBvc3NpYmxlIHdoZW4gdGhlIGRpcmVjdCBvdXRwdXQgY291bGQgbm90IGJlIG9wZW4KLSAgICAgICAgICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYgc2FtcGxpbmdSYXRlIDw9IE1BWF9NSVhFUl9TQU1QTElOR19SQVRFKSB7Ci0gICAgICAgICAgICAgICAgZ290byBub25fZGlyZWN0X291dHB1dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgfQotICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKLSAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOwotICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IDA7Ci0gICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQgPSAxOwotCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCA9IGdldE91dHB1dEZvckVmZmVjdCgpOwotICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBvdXRwdXREZXNjKTsKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRWZmZWN0KCk7Ci0gICAgICAgIGlmIChkc3RPdXRwdXQgPT0gb3V0cHV0KSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+bW92ZUVmZmVjdHMoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBzcmNPdXRwdXQsIGRzdE91dHB1dCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOwotICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgcmV0dXJucyBuZXcgZGlyZWN0IG91dHB1dCAlZCIsIG91dHB1dCk7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKLSAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICB9Ci0KLW5vbl9kaXJlY3Rfb3V0cHV0OgotCi0gICAgLy8gaWdub3JpbmcgY2hhbm5lbCBtYXNrIGR1ZSB0byBkb3dubWl4IGNhcGFiaWxpdHkgaW4gbWl4ZXIKLQotICAgIC8vIG9wZW4gYSBub24gZGlyZWN0IG91dHB1dAotCi0gICAgLy8gZm9yIG5vbiBkaXJlY3Qgb3V0cHV0cywgb25seSBQQ00gaXMgc3VwcG9ydGVkCi0gICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewotICAgICAgICAvLyBnZXQgd2hpY2ggb3V0cHV0IGlzIHN1aXRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHN0cmVhbS4gVGhlIGFjdHVhbAotICAgICAgICAvLyByb3V0aW5nIGNoYW5nZSB3aWxsIGhhcHBlbiB3aGVuIHN0YXJ0T3V0cHV0KCkgd2lsbCBiZSBjYWxsZWQKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKLQotICAgICAgICAvLyBhdCB0aGlzIHN0YWdlIHdlIHNob3VsZCBpZ25vcmUgdGhlIERJUkVDVCBmbGFnIGFzIG5vIGRpcmVjdCBvdXRwdXQgY291bGQgYmUgZm91bmQgZWFybGllcgotICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKLSAgICAgICAgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsIGZsYWdzLCBmb3JtYXQpOwotICAgIH0KLSAgICBBTE9HV19JRigob3V0cHV0ID09IDApLCAiZ2V0T3V0cHV0KCkgY291bGQgbm90IGZpbmQgb3V0cHV0IGZvciBzdHJlYW0gJWQsIHNhbXBsaW5nUmF0ZSAlZCwiCi0gICAgICAgICAgICAiZm9ybWF0ICVkLCBjaGFubmVscyAleCwgZmxhZ3MgJXgiLCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOwotCi0gICAgQUxPR1YoImdldE91dHB1dCgpIHJldHVybnMgb3V0cHV0ICVkIiwgb3V0cHV0KTsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci19Ci0KLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQotewotICAgIC8vIHNlbGVjdCBvbmUgb3V0cHV0IGFtb25nIHNldmVyYWwgdGhhdCBwcm92aWRlIGEgcGF0aCB0byBhIHBhcnRpY3VsYXIgZGV2aWNlIG9yIHNldCBvZgotICAgIC8vIGRldmljZXMgKHRoZSBsaXN0IHdhcyBwcmV2aW91c2x5IGJ1aWxkIGJ5IGdldE91dHB1dHNGb3JEZXZpY2UoKSkuCi0gICAgLy8gVGhlIHByaW9yaXR5IGlzIGFzIGZvbGxvd3M6Ci0gICAgLy8gMTogdGhlIG91dHB1dCB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiByZXF1ZXN0ZWQgcG9saWN5IGZsYWdzCi0gICAgLy8gMjogdGhlIHByaW1hcnkgb3V0cHV0Ci0gICAgLy8gMzogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAotCi0gICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRzWzBdOwotICAgIH0KLQotICAgIGludCBtYXhDb21tb25GbGFncyA9IDA7Ci0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0RmxhZ3MgPSAwOwotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dFByaW1hcnkgPSAwOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOwotICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgICAgICAvLyBpZiBhIHZhbGlkIGZvcm1hdCBpcyBzcGVjaWZpZWQsIHNraXAgb3V0cHV0IGlmIG5vdCBjb21wYXRpYmxlCi0gICAgICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IG91dHB1dERlc2MtPm1Gb3JtYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGNvbW1vbkZsYWdzID0gcG9wY291bnQob3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1GbGFncyAmIGZsYWdzKTsKLSAgICAgICAgICAgIGlmIChjb21tb25GbGFncyA+IG1heENvbW1vbkZsYWdzKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RmxhZ3MgPSBvdXRwdXRzW2ldOwotICAgICAgICAgICAgICAgIG1heENvbW1vbkZsYWdzID0gY29tbW9uRmxhZ3M7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dCgpIGNvbW1vbkZsYWdzIGZvciBvdXRwdXQgJWQsICUwNHgiLCBvdXRwdXRzW2ldLCBjb21tb25GbGFncyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRQcmltYXJ5ID0gb3V0cHV0c1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChvdXRwdXRGbGFncyAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRGbGFnczsKLSAgICB9Ci0gICAgaWYgKG91dHB1dFByaW1hcnkgIT0gMCkgewotICAgICAgICByZXR1cm4gb3V0cHV0UHJpbWFyeTsKLSAgICB9Ci0KLSAgICByZXR1cm4gb3V0cHV0c1swXTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwotICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RhcnRPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgLy8gY2Fubm90IHN0YXJ0IHBsYXliYWNrIG9mIFNUUkVBTV9UVFMgaWYgYW55IG90aGVyIG91dHB1dCBpcyBiZWluZyB1c2VkCi0gICAgdWludDMyX3QgYmVhY29uTXV0ZUxhdGVuY3kgPSAwOwotICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1RUUykgewotICAgICAgICBBTE9HVigiXHQgZm91bmQgQkVBQ09OIHN0cmVhbSIpOwotICAgICAgICBpZiAoaXNBbnlPdXRwdXRBY3RpdmUoQVVESU9fU1RSRUFNX1RUUyAvKnN0cmVhbVRvSWdub3JlKi8pKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiZWFjb25NdXRlTGF0ZW5jeSA9IGhhbmRsZUV2ZW50Rm9yQmVhY29uKFNUQVJUSU5HX0JFQUNPTik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBzb21lIHBsYXliYWNrIG90aGVyIHRoYW4gYmVhY29uIHN0YXJ0cwotICAgICAgICBiZWFjb25NdXRlTGF0ZW5jeSA9IGhhbmRsZUV2ZW50Rm9yQmVhY29uKFNUQVJUSU5HX09VVFBVVCk7Ci0gICAgfQotCi0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7Ci0KLSAgICAvLyBpbmNyZW1lbnQgdXNhZ2UgY291bnQgZm9yIHRoaXMgc3RyZWFtIG9uIHRoZSByZXF1ZXN0ZWQgb3V0cHV0OgotICAgIC8vIE5PVEUgdGhhdCB0aGUgdXNhZ2UgY291bnQgaXMgdGhlIHNhbWUgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0IGFuZCBoYXJkd2FyZSBvdXRwdXQgd2hpY2ggaXMKLSAgICAvLyBuZWNlc3NhcnkgZm9yIGEgY29ycmVjdCBjb250cm9sIG9mIGhhcmR3YXJlIG91dHB1dCByb3V0aW5nIGJ5IHN0YXJ0T3V0cHV0KCkgYW5kIHN0b3BPdXRwdXQoKQotICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgMSk7Ci0KLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMSkgewotICAgICAgICAvLyBzdGFydGluZyBhbiBvdXRwdXQgYmVpbmcgcmVyb3V0ZWQ/Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2U7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG5ld0RldmljZSA9IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICB9Ci0gICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOwotICAgICAgICBib29sIHNob3VsZFdhaXQgPSAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVhY29uTXV0ZUxhdGVuY3kgPiAwKTsKLSAgICAgICAgdWludDMyX3Qgd2FpdE1zID0gYmVhY29uTXV0ZUxhdGVuY3k7Ci0gICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmIChkZXNjICE9IG91dHB1dERlc2MpIHsKLSAgICAgICAgICAgICAgICAvLyBmb3JjZSBhIGRldmljZSBjaGFuZ2UgaWYgYW55IG90aGVyIG91dHB1dCBpcyBtYW5hZ2VkIGJ5IHRoZSBzYW1lIGh3Ci0gICAgICAgICAgICAgICAgLy8gbW9kdWxlIGFuZCBoYXMgYSBjdXJyZW50IGRldmljZSBzZWxlY3Rpb24gdGhhdCBkaWZmZXJzIGZyb20gc2VsZWN0ZWQgZGV2aWNlLgotICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIGF1ZGlvIEhBTCBtdXN0IHJlY2VpdmUgdGhlIG5ldyBkZXZpY2Ugc2VsZWN0aW9uIHNvIHRoYXQgaXQgY2FuCi0gICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBkZXZpY2UgY3VycmVudGx5IHNlbGVjdGVkIGJ5IHRoZSBvdGhlciBhY3RpdmUgb3V0cHV0LgotICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5zaGFyZXNId01vZHVsZVdpdGgoZGVzYykgJiYKLSAgICAgICAgICAgICAgICAgICAgZGVzYy0+ZGV2aWNlKCkgIT0gbmV3RGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcmNlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgYXVkaW8gb24gb3RoZXIgYWN0aXZlIG91dHB1dHMgdG8gYmUgcHJlc2VudGVkIHdoZW4gc3RhcnRpbmcKLSAgICAgICAgICAgICAgICAvLyBhIG5vdGlmaWNhdGlvbiBzbyB0aGF0IGF1ZGlvIGZvY3VzIGVmZmVjdCBjYW4gcHJvcGFnYXRlLCBvciB0aGF0IGEgbXV0ZS91bm11dGUKLSAgICAgICAgICAgICAgICAvLyBldmVudCBvY2N1cnJlZCBmb3IgYmVhY29uCi0gICAgICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSA9IGRlc2MtPmxhdGVuY3koKTsKLSAgICAgICAgICAgICAgICBpZiAoc2hvdWxkV2FpdCAmJiBkZXNjLT5pc0FjdGl2ZShsYXRlbmN5ICogMikgJiYgKHdhaXRNcyA8IGxhdGVuY3kpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdhaXRNcyA9IGxhdGVuY3k7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHVpbnQzMl90IG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBuZXdEZXZpY2UsIGZvcmNlKTsKLQotICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBzb25pZmljYXRpb24gd2hpbGUgaW4gY2FsbAotICAgICAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKHN0cmVhbSwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYXBwbHkgdm9sdW1lIHJ1bGVzIGZvciBjdXJyZW50IHN0cmVhbSBhbmQgZGV2aWNlIGlmIG5lY2Vzc2FyeQotICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zW3N0cmVhbV0uZ2V0Vm9sdW1lSW5kZXgobmV3RGV2aWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZXZpY2UpOwotCi0gICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdGFydGluZyBhbiBvdXRwdXQgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uCi0gICAgICAgIC8vIHJvdXRpbmcKLSAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShzdHJlYW0pOwotCi0gICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0YXJ0ZWQgb24gYSByZSByb3V0aW5nIG1peAotICAgICAgICAvLyBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUwotICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UobmV3RGV2aWNlKSAmJiBvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1SZWdpc3RyYXRpb25JZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gcmluZ3RvbmUgb3IgYWxhcm0gc3RhcnRzCi0gICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh3YWl0TXMgPiBtdXRlV2FpdE1zKSB7Ci0gICAgICAgICAgICB1c2xlZXAoKHdhaXRNcyAtIG11dGVXYWl0TXMpICogMiAqIDEwMDApOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgQUxPR1YoInN0b3BPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7Ci0KLSAgICAvLyBhbHdheXMgaGFuZGxlIHN0cmVhbSBzdG9wLCBjaGVjayB3aGljaCBzdHJlYW0gdHlwZSBpcyBzdG9wcGluZwotICAgIGhhbmRsZUV2ZW50Rm9yQmVhY29uKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVFRTID8gU1RPUFBJTkdfQkVBQ09OIDogU1RPUFBJTkdfT1VUUFVUKTsKLQotICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCi0gICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKHN0cmVhbSwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPiAwKSB7Ci0gICAgICAgIC8vIGRlY3JlbWVudCB1c2FnZSBjb3VudCBvZiB0aGlzIHN0cmVhbSBvbiB0aGUgb3V0cHV0Ci0gICAgICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgLTEpOwotICAgICAgICAvLyBzdG9yZSB0aW1lIGF0IHdoaWNoIHRoZSBzdHJlYW0gd2FzIHN0b3BwZWQgLSBzZWUgaXNTdHJlYW1BY3RpdmUoKQotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMCkgewotICAgICAgICAgICAgLy8gQXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0b3BwZWQgb24gYQotICAgICAgICAgICAgLy8gcmUgcm91dGluZyBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKLSAgICAgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShvdXRwdXREZXNjLT5tRGV2aWNlKSAmJgotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7Ci0gICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1SZWdpc3RyYXRpb25JZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdG9wVGltZVtzdHJlYW1dID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgLy8gZGVsYXkgdGhlIGRldmljZSBzd2l0Y2ggYnkgdHdpY2UgdGhlIGxhdGVuY3kgYmVjYXVzZSBzdG9wT3V0cHV0KCkgaXMgZXhlY3V0ZWQgd2hlbgotICAgICAgICAgICAgLy8gdGhlIHRyYWNrIHN0b3AoKSBjb21tYW5kIGlzIHJlY2VpdmVkIGFuZCBhdCB0aGF0IHRpbWUgdGhlIGF1ZGlvIHRyYWNrIGJ1ZmZlciBjYW4KLSAgICAgICAgICAgIC8vIHN0aWxsIGNvbnRhaW4gZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGRyYWluZWQuIFRoZSBsYXRlbmN5IG9ubHkgY292ZXJzIHRoZSBhdWRpbyBIQUwKLSAgICAgICAgICAgIC8vIGFuZCBrZXJuZWwgYnVmZmVycy4gQWxzbyB0aGUgbGF0ZW5jeSBkb2VzIG5vdCBhbHdheXMgaW5jbHVkZSBhZGRpdGlvbmFsIGRlbGF5IGluIHRoZQotICAgICAgICAgICAgLy8gYXVkaW8gcGF0aCAoYXVkaW8gRFNQLCBDT0RFQyAuLi4pCi0gICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBuZXdEZXZpY2UsIGZhbHNlLCBvdXRwdXREZXNjLT5tTGF0ZW5jeSoyKTsKLQotICAgICAgICAgICAgLy8gZm9yY2UgcmVzdG9yaW5nIHRoZSBkZXZpY2Ugc2VsZWN0aW9uIG9uIG90aGVyIGFjdGl2ZSBvdXRwdXRzIGlmIGl0IGRpZmZlcnMgZnJvbSB0aGUKLSAgICAgICAgICAgIC8vIG9uZSBiZWluZyBzZWxlY3RlZCBmb3IgdGhpcyBvdXRwdXQKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBjdXJPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKLSAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChjdXJPdXRwdXQgIT0gb3V0cHV0ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5pc0FjdGl2ZSgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5zaGFyZXNId01vZHVsZVdpdGgoZGVzYykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChuZXdEZXZpY2UgIT0gZGVzYy0+ZGV2aWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShjdXJPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdPdXRwdXREZXZpY2UoY3VyT3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tTGF0ZW5jeSoyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG91dHB1dHMgaWYgc3RvcHBpbmcgb25lIHdpdGggYSBzdHJlYW0gdGhhdCBjYW4gYWZmZWN0IG5vdGlmaWNhdGlvbiByb3V0aW5nCi0gICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wT3V0cHV0KCkgcmVmY291bnQgaXMgYWxyZWFkeSAwIGZvciBvdXRwdXQgJWQiLCBvdXRwdXQpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uIF9fdW51c2VkKQotewotICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkgJWQiLCBvdXRwdXQpOwotICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIHJlbGVhc2luZyB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAotICAgIGludCB0ZXN0SW5kZXggPSB0ZXN0T3V0cHV0SW5kZXgob3V0cHV0KTsKLSAgICBpZiAodGVzdEluZGV4ICE9IDApIHsKLSAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKLSAgICAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKLSAgICAgICAgICAgIG1UZXN0T3V0cHV0c1t0ZXN0SW5kZXhdID0gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKLQotICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgIGlmIChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKLSAgICAgICAgaWYgKGRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPD0gMCkgewotICAgICAgICAgICAgQUxPR1coInJlbGVhc2VPdXRwdXQoKSBpbnZhbGlkIG9wZW4gY291bnQgJWQgZm9yIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1EaXJlY3RPcGVuQ291bnQsIG91dHB1dCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKC0tZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXQpOwotICAgICAgICAgICAgLy8gSWYgZWZmZWN0cyB3aGVyZSBwcmVzZW50IG9uIHRoZSBvdXRwdXQsIGF1ZGlvZmxpbmdlciBtb3ZlZCB0aGVtIHRvIHRoZSBwcmltYXJ5Ci0gICAgICAgICAgICAvLyBvdXRwdXQgYnkgZGVmYXVsdDogbW92ZSB0aGVtIGJhY2sgdG8gdGhlIGFwcHJvcHJpYXRlIG91dHB1dC4KLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCA9IGdldE91dHB1dEZvckVmZmVjdCgpOwotICAgICAgICAgICAgaWYgKGRzdE91dHB1dCAhPSBtUHJpbWFyeU91dHB1dCkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5tb3ZlRWZmZWN0cyhBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsIG1QcmltYXJ5T3V0cHV0LCBkc3RPdXRwdXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfdHlwZV90ICppbnB1dFR5cGUpCi17Ci0gICAgQUxPR1YoImdldElucHV0Rm9yQXR0cigpIHNvdXJjZSAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrICV4LCIKLSAgICAgICAgICAgICJzZXNzaW9uICVkLCBmbGFncyAlI3giLAotICAgICAgICAgIGF0dHItPnNvdXJjZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzZXNzaW9uLCBmbGFncyk7Ci0KLSAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0lOVkFMSUQ7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKLSAgICAvLyBoYW5kbGUgbGVnYWN5IHJlbW90ZSBzdWJtaXggY2FzZSB3aGVyZSB0aGUgYWRkcmVzcyB3YXMgbm90IGFsd2F5cyBzcGVjaWZpZWQKLSAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKLSAgICBib29sIGlzU291bmRUcmlnZ2VyID0gZmFsc2U7Ci0gICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UgPSBhdHRyLT5zb3VyY2U7Ci0gICAgYXVkaW9fc291cmNlX3QgaGFsSW5wdXRTb3VyY2U7Ci0gICAgQXVkaW9NaXggKnBvbGljeU1peCA9IE5VTEw7Ci0KLSAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKLSAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOwotICAgIH0KLSAgICBoYWxJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOwotCi0gICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYICYmCi0gICAgICAgICAgICBzdHJuY21wKGF0dHItPnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCkgewotICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKLSAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoYXR0ci0+dGFncyArIHN0cmxlbigiYWRkcj0iKSk7Ci0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtUG9saWN5TWl4ZXMuaW5kZXhPZktleShhZGRyZXNzKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIG5vIHBvbGljeSBmb3IgYWRkcmVzcyAlcyIsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVBvbGljeU1peGVzW2luZGV4XS0+bU1peC5tTWl4VHlwZSAhPSBNSVhfVFlQRV9QTEFZRVJTKSB7Ci0gICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgYmFkIHBvbGljeSBtaXggdHlwZSBmb3IgYWRkcmVzcyAlcyIsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBwb2xpY3lNaXggPSAmbVBvbGljeU1peGVzW2luZGV4XS0+bU1peDsKLSAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9NSVhfRVhUX1BPTElDWV9SRVJPVVRFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGlucHV0U291cmNlLCAmcG9saWN5TWl4KTsKLSAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGNvdWxkIG5vdCBmaW5kIGRldmljZSBmb3Igc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1SZWdpc3RyYXRpb25JZDsKLSAgICAgICAgICAgIGlmIChwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgewotICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGFuIGV4dGVybmFsIHBvbGljeSwgYnV0IHRoaXMgaW5wdXQgaXMgYXR0YWNoZWQgdG8gYSBtaXggb2YgcmVjb3JkZXJzLAotICAgICAgICAgICAgICAgIC8vIG1lYW5pbmcgaXQgcmVjZWl2ZXMgYXVkaW8gaW5qZWN0ZWQgaW50byB0aGUgZnJhbWV3b3JrLCBzbyB0aGUgcmVjb3JkZXIgZG9lc24ndAotICAgICAgICAgICAgICAgIC8vIGtub3cgYWJvdXQgaXQgYW5kIGlzIHRoZXJlZm9yZSBjb25zaWRlcmVkICJsZWdhY3kiCi0gICAgICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9MRUdBQ1k7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHJlY29yZGluZyBhIG1peCBvZiBwbGF5ZXJzIGRlZmluZWQgYnkgYW4gZXh0ZXJuYWwgcG9saWN5LCB3ZSdyZSByZXJvdXRpbmcgZm9yCi0gICAgICAgICAgICAgICAgLy8gYW4gZXh0ZXJuYWwgcG9saWN5Ci0gICAgICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9NSVhfRVhUX1BPTElDWV9SRVJPVVRFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7Ci0gICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9DQVBUVVJFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9MRUdBQ1k7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYWRhcHQgY2hhbm5lbCBzZWxlY3Rpb24gdG8gaW5wdXQgc291cmNlCi0gICAgICAgIHN3aXRjaCAoaW5wdXRTb3VyY2UpIHsKLSAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgotICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOSzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKLSAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTks7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKLSAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTksgfCBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVNvdW5kVHJpZ2dlclNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbik7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICppbnB1dCA9IG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy52YWx1ZUZvcihzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBpc1NvdW5kVHJpZ2dlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19JTlBVVF9GTEFHX0hXX0hPVFdPUkQpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJTb3VuZFRyaWdnZXIgY2FwdHVyZSBvbiBzZXNzaW9uICVkIGlucHV0ICVkIiwgc2Vzc2lvbiwgKmlucHV0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRJbnB1dFByb2ZpbGUoZGV2aWNlLCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLSAgICBpZiAocHJvZmlsZSA9PSAwKSB7Ci0gICAgICAgIC8vcmV0cnkgd2l0aG91dCBmbGFncwotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGxvZ19mbGFncyA9IGZsYWdzOwotICAgICAgICBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKLSAgICAgICAgcHJvZmlsZSA9IGdldElucHV0UHJvZmlsZShkZXZpY2UsIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLSAgICAgICAgaWYgKHByb2ZpbGUgPT0gMCkgewotICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGNvdWxkIG5vdCBmaW5kIHByb2ZpbGUgZm9yIGRldmljZSAweCVYLCBzYW1wbGluZ1JhdGUgJXUsIgotICAgICAgICAgICAgICAgICAgICAiZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgMHglWCwgZmxhZ3MgJSN4IiwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGxvZ19mbGFncyk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUgPT0gMCkgewotICAgICAgICBBTE9HRSgiZ2V0SW5wdXRGb3JBdHRyKCk6IEhXIG1vZHVsZSAlcyBub3Qgb3BlbmVkIiwgcHJvZmlsZS0+bU1vZHVsZS0+bU5hbWUpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc2FtcGxpbmdSYXRlOwotICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzazsKLSAgICBjb25maWcuZm9ybWF0ID0gZm9ybWF0OwotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5JbnB1dChwcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxJbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQotICAgIC8vIG9ubHkgYWNjZXB0IGlucHV0IHdpdGggdGhlIGV4YWN0IHJlcXVlc3RlZCBzZXQgb2YgcGFyYW1ldGVycwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgKmlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FIHx8Ci0gICAgICAgIChzYW1wbGluZ1JhdGUgIT0gY29uZmlnLnNhbXBsZV9yYXRlKSB8fAotICAgICAgICAoZm9ybWF0ICE9IGNvbmZpZy5mb3JtYXQpIHx8Ci0gICAgICAgIChjaGFubmVsTWFzayAhPSBjb25maWcuY2hhbm5lbF9tYXNrKSkgewotICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgZmFpbGVkIG9wZW5pbmcgaW5wdXQ6IHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAleCIsCi0gICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKLSAgICAgICAgaWYgKCppbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoKmlucHV0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IocHJvZmlsZSk7Ci0gICAgaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKLSAgICBpbnB1dERlc2MtPm1SZWZDb3VudCA9IDA7Ci0gICAgaW5wdXREZXNjLT5tT3BlblJlZkNvdW50ID0gMTsKLSAgICBpbnB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7Ci0gICAgaW5wdXREZXNjLT5tRm9ybWF0ID0gZm9ybWF0OwotICAgIGlucHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgaW5wdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOwotICAgIGlucHV0RGVzYy0+bVNlc3Npb25zLmFkZChzZXNzaW9uKTsKLSAgICBpbnB1dERlc2MtPm1Jc1NvdW5kVHJpZ2dlciA9IGlzU291bmRUcmlnZ2VyOwotICAgIGlucHV0RGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peDsKLQotICAgIEFMT0dWKCJnZXRJbnB1dEZvckF0dHIoKSByZXR1cm5zIGlucHV0IHR5cGUgPSAlZCIsIGlucHV0VHlwZSk7Ci0KLSAgICBhZGRJbnB1dCgqaW5wdXQsIGlucHV0RGVzYyk7Ci0gICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIEFMT0dWKCJzdGFydElucHV0KCkgaW5wdXQgJWQiLCBpbnB1dCk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RhcnRJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgaW5kZXggPSBpbnB1dERlc2MtPm1TZXNzaW9ucy5pbmRleE9mKHNlc3Npb24pOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgLy8gdmlydHVhbCBpbnB1dCBkZXZpY2VzIGFyZSBjb21wYXRpYmxlIHdpdGggb3RoZXIgaW5wdXQgZGV2aWNlcwotICAgIGlmICghaXNWaXJ0dWFsSW5wdXREZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgewotCi0gICAgICAgIC8vIGZvciBhIG5vbi12aXJ0dWFsIGlucHV0IGRldmljZSwgY2hlY2sgaWYgdGhlcmUgaXMgYW5vdGhlciAobm9uLXZpcnR1YWwpIGFjdGl2ZSBpbnB1dAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhY3RpdmVJbnB1dCA9IGdldEFjdGl2ZUlucHV0KCk7Ci0gICAgICAgIGlmIChhY3RpdmVJbnB1dCAhPSAwICYmIGFjdGl2ZUlucHV0ICE9IGlucHV0KSB7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBhbHJlYWR5IGFjdGl2ZSBpbnB1dCB1c2VzIEFVRElPX1NPVVJDRV9IT1RXT1JEIHRoZW4gaXQgaXMgY2xvc2VkLAotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBhY3RpdmUgaW5wdXQgY29udGludWVzIGFuZCB0aGUgbmV3IGlucHV0IGNhbm5vdCBiZSBzdGFydGVkLgotICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGFjdGl2ZURlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGFjdGl2ZUlucHV0KTsKLSAgICAgICAgICAgIGlmIChhY3RpdmVEZXNjLT5tSW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgcHJlZW1wdGluZyBsb3ctcHJpb3JpdHkgaW5wdXQgJWQiLCBpbnB1dCwgYWN0aXZlSW5wdXQpOwotICAgICAgICAgICAgICAgIHN0b3BJbnB1dChhY3RpdmVJbnB1dCwgYWN0aXZlRGVzYy0+bVNlc3Npb25zLml0ZW1BdCgwKSk7Ci0gICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVEZXNjLT5tU2Vzc2lvbnMuaXRlbUF0KDApKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoInN0YXJ0SW5wdXQoJWQpIGZhaWxlZDogb3RoZXIgaW5wdXQgJWQgYWxyZWFkeSBzdGFydGVkIiwgaW5wdXQsIGFjdGl2ZUlucHV0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaW5wdXREZXNjLT5tUmVmQ291bnQgPT0gMCkgewotICAgICAgICBpZiAoYWN0aXZlSW5wdXRzQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZSh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXQpLCB0cnVlIC8qIGZvcmNlICovKTsKLQotICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdGFydGVkIGlmIG5vdAotICAgICAgICAvLyB1c2VkIGJ5IGEgcG9saWN5IG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUwotICAgICAgICAvLyBGb3IgcmVtb3RlIHN1Ym1peCAoYSB2aXJ0dWFsIGRldmljZSksIHdlIG9wZW4gb25seSBvbmUgaW5wdXQgcGVyIGNhcHR1cmUgcmVxdWVzdC4KLSAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgoIiIpOwotICAgICAgICAgICAgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7Ci0gICAgICAgICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGVzYy0+bVBvbGljeU1peC0+bVJlZ2lzdHJhdGlvbklkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKLSAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0SW5wdXQoKSBpbnB1dCBzb3VyY2UgPSAlZCIsIGlucHV0RGVzYy0+bUlucHV0U291cmNlKTsKLQotICAgIGlucHV0RGVzYy0+bVJlZkNvdW50Kys7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIEFMT0dWKCJzdG9wSW5wdXQoKSBpbnB1dCAlZCIsIGlucHV0KTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLQotICAgIGluZGV4ID0gaW5wdXREZXNjLT5tU2Vzc2lvbnMuaW5kZXhPZihzZXNzaW9uKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaWYgKGlucHV0RGVzYy0+bVJlZkNvdW50ID09IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIGlucHV0ICVkIGFscmVhZHkgc3RvcHBlZCIsIGlucHV0KTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGlucHV0RGVzYy0+bVJlZkNvdW50LS07Ci0gICAgaWYgKGlucHV0RGVzYy0+bVJlZkNvdW50ID09IDApIHsKLQotICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGRpc2FibGUgdGhlIHJlbW90ZSBzdWJtaXggb3V0cHV0IHdoZW4gaW5wdXQgaXMgc3RvcHBlZCBpZiBub3QKLSAgICAgICAgLy8gdXNlZCBieSBhIHBvbGljeSBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKLSAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgoIiIpOwotICAgICAgICAgICAgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7Ci0gICAgICAgICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGVzYy0+bVBvbGljeU1peC0+bVJlZ2lzdHJhdGlvbklkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKLSAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJlc2V0SW5wdXREZXZpY2UoaW5wdXQpOwotCi0gICAgICAgIGlmIChhY3RpdmVJbnB1dHNDb3VudCgpID09IDApIHsKLSAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSAlZCIsIGlucHV0KTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSByZWxlYXNpbmcgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICBBTE9HX0FTU0VSVChpbnB1dERlc2MgIT0gMCk7Ci0KLSAgICBpbmRleCA9IGlucHV0RGVzYy0+bVNlc3Npb25zLmluZGV4T2Yoc2Vzc2lvbik7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlucHV0RGVzYy0+bVNlc3Npb25zLnJlbW92ZShzZXNzaW9uKTsKLSAgICBpZiAoaW5wdXREZXNjLT5tT3BlblJlZkNvdW50ID09IDApIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIGludmFsaWQgb3BlbiByZWYgY291bnQgJWQiLCBpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudC0tOwotICAgIGlmIChpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQgPiAwKSB7Ci0gICAgICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0ID4gMCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY2xvc2VJbnB1dChpbnB1dCk7Ci0gICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwotICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0Iik7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUFsbElucHV0cygpIHsKLSAgICBib29sIHBhdGNoUmVtb3ZlZCA9IGZhbHNlOwotCi0gICAgZm9yKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKLSAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7Ci0gICAgICAgIHNzaXplX3QgcGF0Y2hfaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOwotICAgICAgICBpZiAocGF0Y2hfaW5kZXggPj0gMCkgewotICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KHBhdGNoX2luZGV4KTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgICAgIG1BdWRpb1BhdGNoZXMucmVtb3ZlSXRlbXNBdChwYXRjaF9pbmRleCk7Ci0gICAgICAgICAgICBwYXRjaFJlbW92ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKLSAgICB9Ci0gICAgbUlucHV0cy5jbGVhcigpOwotICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0KLSAgICBpZiAocGF0Y2hSZW1vdmVkKSB7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCi17Ci0gICAgQUxPR1YoImluaXRTdHJlYW1Wb2x1bWUoKSBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKLSAgICBpZiAoaW5kZXhNaW4gPCAwIHx8IGluZGV4TWluID49IGluZGV4TWF4KSB7Ci0gICAgICAgIEFMT0dXKCJpbml0U3RyZWFtVm9sdW1lKCkgaW52YWxpZCBpbmRleCBsaW1pdHMgZm9yIHN0cmVhbSAlZCwgbWluICVkLCBtYXggJWQiLCBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWluID0gaW5kZXhNaW47Ci0gICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXggPSBpbmRleE1heDsKLSAgICAvL0ZJWE1FOiBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSB2b2x1bWUgZm9sbG93cyBBVURJT19TVFJFQU1fTVVTSUMgZm9yIG5vdwotICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDKSB7Ci0gICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZXS5tSW5kZXhNaW4gPSBpbmRleE1pbjsKLSAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFldLm1JbmRleE1heCA9IGluZGV4TWF4OwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi17Ci0KLSAgICBpZiAoKGluZGV4IDwgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNaW4pIHx8IChpbmRleCA+IG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4KSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIC8vIEZvcmNlIG1heCB2b2x1bWUgaWYgc3RyZWFtIGNhbm5vdCBiZSBtdXRlZAotICAgIGlmICghbVN0cmVhbXNbc3RyZWFtXS5tQ2FuQmVNdXRlZCkgaW5kZXggPSBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heDsKLQotICAgIEFMT0dWKCJzZXRTdHJlYW1Wb2x1bWVJbmRleCgpIHN0cmVhbSAlZCwgZGV2aWNlICUwNHgsIGluZGV4ICVkIiwKLSAgICAgICAgICBzdHJlYW0sIGRldmljZSwgaW5kZXgpOwotCi0gICAgLy8gaWYgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCBzZXQgZGVmYXVsdCB2YWx1ZSBhbmQKLSAgICAvLyBjbGVhciBhbGwgZGV2aWNlIHNwZWNpZmljIHZhbHVlcwotICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSB7Ci0gICAgICAgIG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4Q3VyLmNsZWFyKCk7Ci0gICAgfQotICAgIG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4Q3VyLmFkZChkZXZpY2UsIGluZGV4KTsKLQotICAgIC8vIHVwZGF0ZSB2b2x1bWUgb24gYWxsIG91dHB1dHMgd2hvc2UgY3VycmVudCBkZXZpY2UgaXMgYWxzbyBzZWxlY3RlZCBieSB0aGUgc2FtZQotICAgIC8vIHN0cmF0ZWd5IGFzIHRoZSBkZXZpY2Ugc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIKLSAgICBhdWRpb19kZXZpY2VzX3Qgc3RyYXRlZ3lEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShnZXRTdHJhdGVneShzdHJlYW0pLCB0cnVlIC8qZnJvbUNhY2hlKi8pOwotCi0KLSAgICAvL0ZJWE1FOiBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSB2b2x1bWUgZm9sbG93cyBBVURJT19TVFJFQU1fTVVTSUMgZm9yIG5vdwotICAgIGF1ZGlvX2RldmljZXNfdCBhY2Nlc3NpYmlsaXR5RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMpIHsKLSAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFldLm1JbmRleEN1ci5hZGQoZGV2aWNlLCBpbmRleCk7Ci0gICAgICAgIGFjY2Vzc2liaWxpdHlEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9BQ0NFU1NJQklMSVRZLCB0cnVlIC8qZnJvbUNhY2hlKi8pOwotICAgIH0KLSAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpICYmCi0gICAgICAgICAgICAoZGV2aWNlICYgKHN0cmF0ZWd5RGV2aWNlIHwgYWNjZXNzaWJpbGl0eURldmljZSkpID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPQotICAgICAgICAgICAgICAgIGdldERldmljZUZvclZvbHVtZShtT3V0cHV0cy52YWx1ZUF0KGkpLT5kZXZpY2UoKSk7Ci0gICAgICAgIGlmICgoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCkgfHwgKChjdXJEZXZpY2UgJiBzdHJhdGVneURldmljZSkgIT0gMCkpIHsKLSAgICAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9IGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwgaW5kZXgsIG1PdXRwdXRzLmtleUF0KGkpLCBjdXJEZXZpY2UpOwotICAgICAgICAgICAgaWYgKHZvbFN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHZvbFN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpIHx8ICgoY3VyRGV2aWNlICYgYWNjZXNzaWJpbGl0eURldmljZSkgIT0gMCkpIHsKLSAgICAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9IGNoZWNrQW5kU2V0Vm9sdW1lKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIG1PdXRwdXRzLmtleUF0KGkpLCBjdXJEZXZpY2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBpZiAoaW5kZXggPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICAvLyBpZiBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9ERUZBVUxULCByZXR1cm4gdm9sdW1lIGZvciBkZXZpY2UgY29ycmVzcG9uZGluZyB0bwotICAgIC8vIHRoZSBzdHJhdGVneSB0aGUgc3RyZWFtIGJlbG9uZ3MgdG8uCi0gICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koZ2V0U3RyYXRlZ3koc3RyZWFtKSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICB9Ci0gICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7Ci0KLSAgICAqaW5kZXggPSAgbVN0cmVhbXNbc3RyZWFtXS5nZXRWb2x1bWVJbmRleChkZXZpY2UpOwotICAgIEFMT0dWKCJnZXRTdHJlYW1Wb2x1bWVJbmRleCgpIHN0cmVhbSAlZCBkZXZpY2UgJTA4eCBpbmRleCAlZCIsIHN0cmVhbSwgZGV2aWNlLCAqaW5kZXgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzKQotewotICAgIC8vIHNlbGVjdCBvbmUgb3V0cHV0IGFtb25nIHNldmVyYWwgc3VpdGFibGUgZm9yIGdsb2JhbCBlZmZlY3RzLgotICAgIC8vIFRoZSBwcmlvcml0eSBpcyBhcyBmb2xsb3dzOgotICAgIC8vIDE6IEFuIG9mZmxvYWRlZCBvdXRwdXQuIElmIHRoZSBlZmZlY3QgZW5kcyB1cCBub3QgYmVpbmcgb2ZmbG9hZGFibGUsCi0gICAgLy8gICAgQXVkaW9GbGluZ2VyIHdpbGwgaW52YWxpZGF0ZSB0aGUgdHJhY2sgYW5kIHRoZSBvZmZsb2FkZWQgb3V0cHV0Ci0gICAgLy8gICAgd2lsbCBiZSBjbG9zZWQgY2F1c2luZyB0aGUgZWZmZWN0IHRvIGJlIG1vdmVkIHRvIGEgUENNIG91dHB1dC4KLSAgICAvLyAyOiBBIGRlZXAgYnVmZmVyIG91dHB1dAotICAgIC8vIDM6IHRoZSBmaXJzdCBvdXRwdXQgaW4gdGhlIGxpc3QKLQotICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dE9mZmxvYWRlZCA9IDA7Ci0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0RGVlcEJ1ZmZlciA9IDA7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7Ci0gICAgICAgIEFMT0dWKCJzZWxlY3RPdXRwdXRGb3JFZmZlY3RzIG91dHB1dHNbJXp1XSBmbGFncyAleCIsIGksIGRlc2MtPm1GbGFncyk7Ci0gICAgICAgIGlmICgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgewotICAgICAgICAgICAgb3V0cHV0T2ZmbG9hZGVkID0gb3V0cHV0c1tpXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKSAhPSAwKSB7Ci0gICAgICAgICAgICBvdXRwdXREZWVwQnVmZmVyID0gb3V0cHV0c1tpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJzZWxlY3RPdXRwdXRGb3JFZmZlY3RzIG91dHB1dE9mZmxvYWRlZCAlZCBvdXRwdXREZWVwQnVmZmVyICVkIiwKLSAgICAgICAgICBvdXRwdXRPZmZsb2FkZWQsIG91dHB1dERlZXBCdWZmZXIpOwotICAgIGlmIChvdXRwdXRPZmZsb2FkZWQgIT0gMCkgewotICAgICAgICByZXR1cm4gb3V0cHV0T2ZmbG9hZGVkOwotICAgIH0KLSAgICBpZiAob3V0cHV0RGVlcEJ1ZmZlciAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXREZWVwQnVmZmVyOwotICAgIH0KLQotICAgIHJldHVybiBvdXRwdXRzWzBdOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQotewotICAgIC8vIGFwcGx5IHNpbXBsZSBydWxlIHdoZXJlIGdsb2JhbCBlZmZlY3RzIGFyZSBhdHRhY2hlZCB0byB0aGUgc2FtZSBvdXRwdXQgYXMgTVVTSUMgc3RyZWFtcwotCi0gICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KEFVRElPX1NUUkVBTV9NVVNJQyk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGRzdE91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOwotCi0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0Rm9yRWZmZWN0cyhkc3RPdXRwdXRzKTsKLSAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yRWZmZWN0KCkgZ290IG91dHB1dCAlZCBmb3IgZnggJXMgZmxhZ3MgJXgiLAotICAgICAgICAgIG91dHB1dCwgKGRlc2MgPT0gTlVMTCkgPyAidW5zcGVjaWZpZWQiIDogZGVzYy0+bmFtZSwgIChkZXNjID09IE5VTEwpID8gMCA6IGRlc2MtPmZsYWdzKTsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQotewotICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KGlvKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlvKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgQUxPR1coInJlZ2lzdGVyRWZmZWN0KCkgdW5rbm93biBpbyAlZCIsIGlvKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtVG90YWxFZmZlY3RzTWVtb3J5ICsgZGVzYy0+bWVtb3J5VXNhZ2UgPiBnZXRNYXhFZmZlY3RzTWVtb3J5KCkpIHsKLSAgICAgICAgQUxPR1coInJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5IGxpbWl0IGV4Y2VlZGVkIGZvciBGeCAlcywgTWVtb3J5ICVkIEtCIiwKLSAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBkZXNjLT5tZW1vcnlVc2FnZSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgbVRvdGFsRWZmZWN0c01lbW9yeSArPSBkZXNjLT5tZW1vcnlVc2FnZTsKLSAgICBBTE9HVigicmVnaXN0ZXJFZmZlY3QoKSBlZmZlY3QgJXMsIGlvICVkLCBzdHJhdGVneSAlZCBzZXNzaW9uICVkIGlkICVkIiwKLSAgICAgICAgICAgIGRlc2MtPm5hbWUsIGlvLCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOwotICAgIEFMT0dWKCJyZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCwgdG90YWwgbWVtb3J5ICVkIiwgZGVzYy0+bWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwotCi0gICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IG5ldyBFZmZlY3REZXNjcmlwdG9yKCk7Ci0gICAgbWVtY3B5ICgmZWZmZWN0RGVzYy0+bURlc2MsIGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgZWZmZWN0RGVzYy0+bUlvID0gaW87Ci0gICAgZWZmZWN0RGVzYy0+bVN0cmF0ZWd5ID0gKHJvdXRpbmdfc3RyYXRlZ3kpc3RyYXRlZ3k7Ci0gICAgZWZmZWN0RGVzYy0+bVNlc3Npb24gPSBzZXNzaW9uOwotICAgIGVmZmVjdERlc2MtPm1FbmFibGVkID0gZmFsc2U7Ci0KLSAgICBtRWZmZWN0cy5hZGQoaWQsIGVmZmVjdERlc2MpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQotewotICAgIHNzaXplX3QgaW5kZXggPSBtRWZmZWN0cy5pbmRleE9mS2V5KGlkKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgdW5rbm93biBlZmZlY3QgSUQgJWQiLCBpZCk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbUVmZmVjdHMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBzZXRFZmZlY3RFbmFibGVkKGVmZmVjdERlc2MsIGZhbHNlKTsKLQotICAgIGlmIChtVG90YWxFZmZlY3RzTWVtb3J5IDwgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UpIHsKLSAgICAgICAgQUxPR1coInVucmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgJWQgdG9vIGJpZyBmb3IgdG90YWwgJWQiLAotICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKLSAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UgPSBtVG90YWxFZmZlY3RzTWVtb3J5OwotICAgIH0KLSAgICBtVG90YWxFZmZlY3RzTWVtb3J5IC09IGVmZmVjdERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlOwotICAgIEFMT0dWKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgZWZmZWN0ICVzLCBJRCAlZCwgbWVtb3J5ICVkIHRvdGFsIG1lbW9yeSAlZCIsCi0gICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5uYW1lLCBpZCwgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwotCi0gICAgbUVmZmVjdHMucmVtb3ZlSXRlbShpZCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKLXsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUVmZmVjdHMuaW5kZXhPZktleShpZCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIHVua25vd24gZWZmZWN0IElEICVkIiwgaWQpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgcmV0dXJuIHNldEVmZmVjdEVuYWJsZWQobUVmZmVjdHMudmFsdWVBdChpbmRleCksIGVuYWJsZWQpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4mIGVmZmVjdERlc2MsIGJvb2wgZW5hYmxlZCkKLXsKLSAgICBpZiAoZW5hYmxlZCA9PSBlZmZlY3REZXNjLT5tRW5hYmxlZCkgewotICAgICAgICBBTE9HVigic2V0RWZmZWN0RW5hYmxlZCglcykgZWZmZWN0IGFscmVhZHkgJXMiLAotICAgICAgICAgICAgIGVuYWJsZWQ/InRydWUiOiJmYWxzZSIsIGVuYWJsZWQ/ImVuYWJsZWQiOiJkaXNhYmxlZCIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgaWYgKG1Ub3RhbEVmZmVjdHNDcHVMb2FkICsgZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZCA+IGdldE1heEVmZmVjdHNDcHVMb2FkKCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJzZXRFZmZlY3RFbmFibGVkKHRydWUpIENQVSBMb2FkIGxpbWl0IGV4Y2VlZGVkIGZvciBGeCAlcywgQ1BVICVmIE1JUFMiLAotICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5uYW1lLCAoZmxvYXQpZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZC8xMCk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgbVRvdGFsRWZmZWN0c0NwdUxvYWQgKz0gZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZDsKLSAgICAgICAgQUxPR1YoInNldEVmZmVjdEVuYWJsZWQodHJ1ZSkgdG90YWwgQ1BVICVkIiwgbVRvdGFsRWZmZWN0c0NwdUxvYWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtVG90YWxFZmZlY3RzQ3B1TG9hZCA8IGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJzZXRFZmZlY3RFbmFibGVkKGZhbHNlKSBDUFUgbG9hZCAlZCB0b28gaGlnaCBmb3IgdG90YWwgJWQiLAotICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCk7Ci0gICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkID0gbVRvdGFsRWZmZWN0c0NwdUxvYWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbVRvdGFsRWZmZWN0c0NwdUxvYWQgLT0gZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZDsKLSAgICAgICAgQUxPR1YoInNldEVmZmVjdEVuYWJsZWQoZmFsc2UpIHRvdGFsIENQVSAlZCIsIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKTsKLSAgICB9Ci0gICAgZWZmZWN0RGVzYy0+bUVuYWJsZWQgPSBlbmFibGVkOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSBtRWZmZWN0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoZWZmZWN0RGVzYy0+bUVuYWJsZWQgJiYgKGVmZmVjdERlc2MtPm1TdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgJiYKLSAgICAgICAgICAgICAgICAoKGVmZmVjdERlc2MtPm1EZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TVVBQT1JURUQpID09IDApKSB7Ci0gICAgICAgICAgICBBTE9HVigiaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSBub24gb2ZmbG9hZGFibGUgZWZmZWN0ICVzIGVuYWJsZWQgb24gc2Vzc2lvbiAlZCIsCi0gICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5uYW1lLCBlZmZlY3REZXNjLT5tU2Vzc2lvbik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Ci17Ci0gICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAotewotICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmICgoKG91dHB1dERlc2MtPmRldmljZSgpICYgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCkgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zLCBzeXNUaW1lKSkgewotICAgICAgICAgICAgLy8gZG8gbm90IGNvbnNpZGVyIHJlIHJvdXRpbmcgKHdoZW4gdGhlIG91dHB1dCBpcyBnb2luZyB0byBhIGR5bmFtaWMgcG9saWN5KQotICAgICAgICAgICAgLy8gYXMgInJlbW90ZSBwbGF5YmFjayIKLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0Ci17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXREZXNjcmlwdG9yID0gbUlucHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoaW5wdXREZXNjcmlwdG9yLT5tUmVmQ291bnQgPT0gMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0RGVzY3JpcHRvci0+bUlucHV0U291cmNlID09IChpbnQpc291cmNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBBVURJT19TT1VSQ0VfSE9UV09SRCBpcyBlcXVpdmFsZW50IHRvIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiBvbmx5IGlmIGl0Ci0gICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGFuIGFjdGl2ZSBjYXB0dXJlIHRyaWdnZXJlZCBieSBhIGhhcmR3YXJlIGhvdHdvcmQgcmVjb2duaXRpb24KLSAgICAgICAgaWYgKChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSAmJgotICAgICAgICAgICAgICAgICAoaW5wdXREZXNjcmlwdG9yLT5tSW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogd2Ugc2hvdWxkIG5vdCBhc3N1bWUgdGhhdCB0aGUgZmlyc3Qgc2Vzc2lvbiBpcyB0aGUgYWN0aXZlIG9uZSBhbmQga2VlcAotICAgICAgICAgICAgLy8gYWN0aXZpdHkgY291bnQgcGVyIHNlc3Npb24uIFNhbWUgaW4gc3RhcnRJbnB1dCgpLgotICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5pbmRleE9mS2V5KGlucHV0RGVzY3JpcHRvci0+bVNlc3Npb25zLml0ZW1BdCgwKSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gUmVnaXN0ZXIgYSBsaXN0IG9mIGN1c3RvbSBtaXhlcyB3aXRoIHRoZWlyIGF0dHJpYnV0ZXMgYW5kIGZvcm1hdC4KLS8vIFdoZW4gYSBtaXggaXMgcmVnaXN0ZXJlZCwgY29ycmVzcG9uZGluZyBpbnB1dCBhbmQgb3V0cHV0IHByb2ZpbGVzIGFyZQotLy8gYWRkZWQgdG8gdGhlIHJlbW90ZSBzdWJtaXggaHcgbW9kdWxlLiBUaGUgcHJvZmlsZSBjb250YWlucyBvbmx5IHRoZQotLy8gcGFyYW1ldGVycyAoc2FtcGxpbmcgcmF0ZSwgZm9ybWF0Li4uKSBzcGVjaWZpZWQgYnkgdGhlIG1peC4KLS8vIFRoZSBjb3JyZXNwb25kaW5nIGlucHV0IHJlbW90ZSBzdWJtaXggZGV2aWNlIGlzIGFsc28gY29ubmVjdGVkLgotLy8KLS8vIFdoZW4gYSByZW1vdGUgc3VibWl4IGRldmljZSBpcyBjb25uZWN0ZWQsIHRoZSBhZGRyZXNzIGlzIGNoZWNrZWQgdG8gc2VsZWN0IHRoZQotLy8gYXBwcm9wcmlhdGUgcHJvZmlsZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQgb3Igb3V0cHV0IHN0cmVhbSBpcyBvcGVuZWQuCi0vLwotLy8gV2hlbiBjYXB0dXJlIHN0YXJ0cywgZ2V0SW5wdXRGb3JBdHRyKCkgd2lsbDoKLS8vICAtIDEgbG9vayBmb3IgYSBtaXggbWF0Y2hpbmcgdGhlIGFkZHJlc3MgcGFzc2VkIGluIGF0dHJpYnR1dGVzIHRhZ3MgaWYgYW55Ci0vLyAgLSAyIGlmIG5vbmUgZm91bmQsIGdldERldmljZUZvcklucHV0U291cmNlKCkgd2lsbDoKLS8vICAgICAtIDIuMSBsb29rIGZvciBhIG1peCBtYXRjaGluZyB0aGUgYXR0cmlidXRlcyBzb3VyY2UKLS8vICAgICAtIDIuMiBpZiBub25lIGZvdW5kLCBkZWZhdWx0IHRvIGRldmljZSBzZWxlY3Rpb24gYnkgcG9saWN5IHJ1bGVzCi0vLyBBdCB0aGlzIHRpbWUsIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCByZW1vdGUgc3VibWl4IGRldmljZSBpcyBhbHNvIGNvbm5lY3RlZAotLy8gYW5kIGFjdGl2ZSBwbGF5YmFjayB1c2UgY2FzZXMgY2FuIGJlIHRyYW5zZmVycmVkIHRvIHRoaXMgbWl4IGlmIG5lZWRlZCB3aGVuIHJlY29ubmVjdGluZwotLy8gYWZ0ZXIgQXVkaW9UcmFja3MgYXJlIGludmFsaWRhdGVkCi0vLwotLy8gV2hlbiBwbGF5YmFjayBzdGFydHMsIGdldE91dHB1dEZvckF0dHIoKSB3aWxsOgotLy8gIC0gMSBsb29rIGZvciBhIG1peCBtYXRjaGluZyB0aGUgYWRkcmVzcyBwYXNzZWQgaW4gYXR0cmlidHV0ZXMgdGFncyBpZiBhbnkKLS8vICAtIDIgaWYgbm9uZSBmb3VuZCwgbG9vayBmb3IgYSBtaXggbWF0Y2hpbmcgdGhlIGF0dHJpYnV0ZXMgdXNhZ2UKLS8vICAtIDMgaWYgbm9uZSBmb3VuZCwgZGVmYXVsdCB0byBkZXZpY2UgYW5kIG91dHB1dCBzZWxlY3Rpb24gYnkgcG9saWN5IHJ1bGVzLgotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcykKLXsKLSAgICBzcDxId01vZHVsZT4gbW9kdWxlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYLCBtSHdNb2R1bGVzW2ldLT5tTmFtZSkgPT0gMCAmJgotICAgICAgICAgICAgICAgIG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgIT0gMCkgewotICAgICAgICAgICAgbW9kdWxlID0gbUh3TW9kdWxlc1tpXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBBTE9HVigicmVnaXN0ZXJQb2xpY3lNaXhlcygpIG51bSBtaXhlcyAlZCIsIG1peGVzLnNpemUoKSk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1peGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peGVzW2ldLm1SZWdpc3RyYXRpb25JZDsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1Qb2xpY3lNaXhlcy5pbmRleE9mS2V5KGFkZHJlc3MpOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgQUxPR0UoInJlZ2lzdGVyUG9saWN5TWl4ZXMoKTogbWl4IGZvciBhZGRyZXNzICVzIGFscmVhZHkgcmVnaXN0ZXJlZCIsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgYXVkaW9fY29uZmlnX3Qgb3V0cHV0Q29uZmlnID0gbWl4ZXNbaV0ubUZvcm1hdDsKLSAgICAgICAgYXVkaW9fY29uZmlnX3QgaW5wdXRDb25maWcgPSBtaXhlc1tpXS5tRm9ybWF0OwotICAgICAgICAvLyBOT1RFOiBhdWRpbyBmbGluZ2VyIG1peGVyIGRvZXMgbm90IHN1cHBvcnQgbW9ubyBvdXRwdXQ6IGNvbmZpZ3VyZSByZW1vdGUgc3VibWl4IEhBTCBpbgotICAgICAgICAvLyBzdGVyZW8gYW5kIGxldCBhdWRpbyBmbGluZ2VyIGRvIHRoZSBjaGFubmVsIGNvbnZlcnNpb24gaWYgbmVlZGVkLgotICAgICAgICBvdXRwdXRDb25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgICAgICBpbnB1dENvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX0lOX1NURVJFTzsKLSAgICAgICAgbW9kdWxlLT5hZGRPdXRwdXRQcm9maWxlKGFkZHJlc3MsICZvdXRwdXRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsIGFkZHJlc3MpOwotICAgICAgICBtb2R1bGUtPmFkZElucHV0UHJvZmlsZShhZGRyZXNzLCAmaW5wdXRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwgYWRkcmVzcyk7Ci0gICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBuZXcgQXVkaW9Qb2xpY3lNaXgoKTsKLSAgICAgICAgcG9saWN5TWl4LT5tTWl4ID0gbWl4ZXNbaV07Ci0gICAgICAgIG1Qb2xpY3lNaXhlcy5hZGQoYWRkcmVzcywgcG9saWN5TWl4KTsKLSAgICAgICAgaWYgKG1peGVzW2ldLm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnVucmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzKQotewotICAgIHNwPEh3TW9kdWxlPiBtb2R1bGU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVgsIG1Id01vZHVsZXNbaV0tPm1OYW1lKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bUhhbmRsZSAhPSAwKSB7Ci0gICAgICAgICAgICBtb2R1bGUgPSBtSHdNb2R1bGVzW2ldOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobW9kdWxlID09IDApIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIEFMT0dWKCJ1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoKSBudW0gbWl4ZXMgJWQiLCBtaXhlcy5zaXplKCkpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaXhlcy5zaXplKCk7IGkrKykgewotICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXhlc1tpXS5tUmVnaXN0cmF0aW9uSWQ7Ci0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtUG9saWN5TWl4ZXMuaW5kZXhPZktleShhZGRyZXNzKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgQUxPR0UoInVucmVnaXN0ZXJQb2xpY3lNaXhlcygpOiBtaXggZm9yIGFkZHJlc3MgJXMgbm90IHJlZ2lzdGVyZWQiLCBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgbVBvbGljeU1peGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotCi0gICAgICAgIGlmIChnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsIGFkZHJlc3Muc3RyaW5nKCkpID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkKLSAgICAgICAgewotICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwgYWRkcmVzcy5zdHJpbmcoKSkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbW9kdWxlLT5yZW1vdmVPdXRwdXRQcm9maWxlKGFkZHJlc3MpOwotICAgICAgICBtb2R1bGUtPnJlbW92ZUlucHV0UHJvZmlsZShhZGRyZXNzKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvUG9saWN5TWFuYWdlciBEdW1wOiAlcFxuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFByaW1hcnkgT3V0cHV0OiAlZFxuIiwgbVByaW1hcnlPdXRwdXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUGhvbmUgc3RhdGU6ICVkXG4iLCBtUGhvbmVTdGF0ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGNvbW11bmljYXRpb25zICVkXG4iLAotICAgICAgICAgICAgIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgbWVkaWEgJWRcbiIsIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIHJlY29yZCAlZFxuIiwgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGRvY2sgJWRcbiIsIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0tdKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3Igc3lzdGVtICVkXG4iLCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgaGRtaSBzeXN0ZW0gYXVkaW8gJWRcbiIsCi0gICAgICAgICAgICBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJT10pOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBBdmFpbGFibGUgb3V0cHV0IGRldmljZXM6XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+ZHVtcChmZCwgMiwgaSk7Ci0gICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuIEF2YWlsYWJsZSBpbnB1dCBkZXZpY2VzOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5kdW1wKGZkLCAyLCBpKTsKLSAgICB9Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkhXIE1vZHVsZXMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBIVyBNb2R1bGUgJXp1OlxuIiwgaSArIDEpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIG1Id01vZHVsZXNbaV0tPmR1bXAoZmQpOwotICAgIH0KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuT3V0cHV0cyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICBtT3V0cHV0cy52YWx1ZUF0KGkpLT5kdW1wKGZkKTsKLSAgICB9Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbklucHV0cyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIElucHV0ICVkIGR1bXA6XG4iLCBtSW5wdXRzLmtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICBtSW5wdXRzLnZhbHVlQXQoaSktPmR1bXAoZmQpOwotICAgIH0KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuU3RyZWFtcyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICAiIFN0cmVhbSAgQ2FuIGJlIG11dGVkICBJbmRleCBNaW4gIEluZGV4IE1heCAgSW5kZXggQ3VyIFtkZXZpY2UgOiBpbmRleF0uLi5cbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyenUgICAgICAiLCBpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICBtU3RyZWFtc1tpXS5kdW1wKGZkKTsKLSAgICB9Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblRvdGFsIEVmZmVjdHMgQ1BVOiAlZiBNSVBTLCBUb3RhbCBFZmZlY3RzIG1lbW9yeTogJWQgS0JcbiIsCi0gICAgICAgICAgICAoZmxvYXQpbVRvdGFsRWZmZWN0c0NwdUxvYWQvMTAsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlJlZ2lzdGVyZWQgZWZmZWN0czpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gRWZmZWN0ICVkIGR1bXA6XG4iLCBtRWZmZWN0cy5rZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgbUVmZmVjdHMudmFsdWVBdChpKS0+ZHVtcChmZCk7Ci0gICAgfQotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5BdWRpbyBQYXRjaGVzOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvUGF0Y2hlcy5zaXplKCk7IGkrKykgewotICAgICAgICBtQXVkaW9QYXRjaGVzW2ldLT5kdW1wKGZkLCAyLCBpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGZvciB0aGUgcGFyYW1ldGVycyB3aGljaCBjYW4gYmUgb2ZmbG9hZGVkLgotLy8gVGhpcyBjYW4gYmUgZW5oYW5jZWQgZGVwZW5kaW5nIG9uIHRoZSBjYXBhYmlsaXR5IG9mIHRoZSBEU1AgYW5kIHBvbGljeQotLy8gb2YgdGhlIHN5c3RlbS4KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIG9mZmxvYWRJbmZvKQotewotICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQ6IFNSPSV1LCBDTT0weCV4LCBGb3JtYXQ9MHgleCwgU3RyZWFtVHlwZT0lZCwiCi0gICAgICIgQml0UmF0ZT0ldSwgZHVyYXRpb249JSIgUFJJZDY0ICIgdXMsIGhhc192aWRlbz0lZCIsCi0gICAgIG9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlLCBvZmZsb2FkSW5mby5jaGFubmVsX21hc2ssCi0gICAgIG9mZmxvYWRJbmZvLmZvcm1hdCwKLSAgICAgb2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUsIG9mZmxvYWRJbmZvLmJpdF9yYXRlLCBvZmZsb2FkSW5mby5kdXJhdGlvbl91cywKLSAgICAgb2ZmbG9hZEluZm8uaGFzX3ZpZGVvKTsKLQotICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaGFzIGJlZW4gZGlzYWJsZWQKLSAgICBjaGFyIHByb3BWYWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoImF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIsIHByb3BWYWx1ZSwgIjAiKSkgewotICAgICAgICBpZiAoYXRvaShwcm9wVmFsdWUpICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJvZmZsb2FkIGRpc2FibGVkIGJ5IGF1ZGlvLm9mZmxvYWQuZGlzYWJsZT0lcyIsIHByb3BWYWx1ZSApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHR5cGUgaXMgbXVzaWMsIHRoZW4gb25seSBhbGxvdyBvZmZsb2FkIGFzIG9mIG5vdy4KLSAgICBpZiAob2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUgIT0gQVVESU9fU1RSRUFNX01VU0lDKQotICAgIHsKLSAgICAgICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZDogc3RyZWFtX3R5cGUgIT0gTVVTSUMsIHJldHVybmluZyBmYWxzZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy9UT0RPOiBlbmFibGUgYXVkaW8gb2ZmbG9hZGluZyB3aXRoIHZpZGVvIHdoZW4gcmVhZHkKLSAgICBpZiAob2ZmbG9hZEluZm8uaGFzX3ZpZGVvKQotICAgIHsKLSAgICAgICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZDogaGFzX3ZpZGVvID09IHRydWUsIHJldHVybmluZyBmYWxzZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy9JZiBkdXJhdGlvbiBpcyBsZXNzIHRoYW4gbWluaW11bSB2YWx1ZSBkZWZpbmVkIGluIHByb3BlcnR5LCByZXR1cm4gZmFsc2UKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzIiwgcHJvcFZhbHVlLCBOVUxMKSkgewotICAgICAgICBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCAoYXRvaShwcm9wVmFsdWUpICogMTAwMDAwMCApKSB7Ci0gICAgICAgICAgICBBTE9HVigiT2ZmbG9hZCBkZW5pZWQgYnkgZHVyYXRpb24gPCBhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzKD0lcykiLCBwcm9wVmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyAqIDEwMDAwMDApIHsKLSAgICAgICAgQUxPR1YoIk9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgZGVmYXVsdCBtaW4oPSV1KSIsIE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBEbyBub3QgYWxsb3cgb2ZmbG9hZGluZyBpZiBvbmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdCBpcyBlbmFibGVkLiBUaGlzIHByZXZlbnRzIGZyb20KLSAgICAvLyBjcmVhdGluZyBhbiBvZmZsb2FkZWQgdHJhY2sgYW5kIHRlYXJpbmcgaXQgZG93biBpbW1lZGlhdGVseSBhZnRlciBzdGFydCB3aGVuIGF1ZGlvZmxpbmdlcgotICAgIC8vIGRldGVjdHMgdGhlcmUgaXMgYW4gYWN0aXZlIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QuCi0gICAgLy8gRklYTUU6IFdlIHNob3VsZCBjaGVjayB0aGUgYXVkaW8gc2Vzc2lvbiBoZXJlIGJ1dCB3ZSBkbyBub3QgaGF2ZSBpdCBpbiB0aGlzIGNvbnRleHQuCi0gICAgLy8gVGhpcyBtYXkgcHJldmVudCBvZmZsb2FkaW5nIGluIHJhcmUgc2l0dWF0aW9ucyB3aGVyZSBlZmZlY3RzIGFyZSBsZWZ0IGFjdGl2ZSBieSBhcHBzCi0gICAgLy8gaW4gdGhlIGJhY2tncm91bmQuCi0gICAgaWYgKGlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhIHByb2ZpbGUgdG8gc3VwcG9ydCB0aGlzLgotICAgIC8vIEFVRElPX0RFVklDRV9OT05FCi0gICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gZ2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dChBVURJT19ERVZJQ0VfTk9ORSAvKmlnbm9yZSBkZXZpY2UgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCk7Ci0gICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZCgpIHByb2ZpbGUgJXNmb3VuZCIsIHByb2ZpbGUgIT0gMCA/ICIiIDogIk5PVCAiKTsKLSAgICByZXR1cm4gKHByb2ZpbGUgIT0gMCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6bGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQotewotICAgIGlmIChudW1fcG9ydHMgPT0gTlVMTCB8fCAoKm51bV9wb3J0cyAhPSAwICYmIHBvcnRzID09IE5VTEwpIHx8Ci0gICAgICAgICAgICBnZW5lcmF0aW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgQUxPR1YoImxpc3RBdWRpb1BvcnRzKCkgcm9sZSAlZCB0eXBlICVkIG51bV9wb3J0cyAlZCBwb3J0cyAlcCIsIHJvbGUsIHR5cGUsICpudW1fcG9ydHMsIHBvcnRzKTsKLSAgICBpZiAocG9ydHMgPT0gTlVMTCkgewotICAgICAgICAqbnVtX3BvcnRzID0gMDsKLSAgICB9Ci0KLSAgICBzaXplX3QgcG9ydHNXcml0dGVuID0gMDsKLSAgICBzaXplX3QgcG9ydHNNYXggPSAqbnVtX3BvcnRzOwotICAgICpudW1fcG9ydHMgPSAwOwotICAgIGlmICh0eXBlID09IEFVRElPX1BPUlRfVFlQRV9OT05FIHx8IHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaSAgPCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCkgJiYgcG9ydHNXcml0dGVuIDwgcG9ydHNNYXg7IGkrKykgewotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpudW1fcG9ydHMgKz0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgfHwgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfTk9ORSkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGkgIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCkgJiYgcG9ydHNXcml0dGVuIDwgcG9ydHNNYXg7IGkrKykgewotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnRvQXVkaW9Qb3J0KCZwb3J0c1twb3J0c1dyaXR0ZW4rK10pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKm51bV9wb3J0cyArPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAodHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTk9ORSB8fCB0eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTksgfHwgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfTk9ORSkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKSAmJiBwb3J0c1dyaXR0ZW4gPCBwb3J0c01heDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0c1tpXS0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqbnVtX3BvcnRzICs9IG1JbnB1dHMuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgfHwgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfTk9ORSkgewotICAgICAgICAgICAgc2l6ZV90IG51bU91dHB1dHMgPSAwOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICghbU91dHB1dHNbaV0tPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG51bU91dHB1dHMrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnRzV3JpdHRlbiA8IHBvcnRzTWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0c1tpXS0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqbnVtX3BvcnRzICs9IG51bU91dHB1dHM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKmdlbmVyYXRpb24gPSBjdXJBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgQUxPR1YoImxpc3RBdWRpb1BvcnRzKCkgZ290ICV6dSBwb3J0cyBuZWVkZWQgJWQiLCBwb3J0c1dyaXR0ZW4sICpudW1fcG9ydHMpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQgX191bnVzZWQpCi17Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zcDxBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGcm9tSWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0Ci17Ci0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gTlVMTDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bUlkID09IGlkKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gb3V0cHV0RGVzYzsKLX0KLQotc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0lucHV0RGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dEZyb21JZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3QKLXsKLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gTlVMTDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoaW5wdXREZXNjLT5tSWQgPT0gaWQpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbnB1dERlc2M7Ci19Ci0KLXNwIDxBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1vZHVsZUZvckRldmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKLXsKLSAgICBzcCA8SHdNb2R1bGU+IG1vZHVsZTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtSHdNb2R1bGVzW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXNbal0tPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJgotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Id01vZHVsZXNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtb2R1bGU7Ci19Ci0KLXNwIDxBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1vZHVsZUZyb21OYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0Ci17Ci0gICAgc3AgPEh3TW9kdWxlPiBtb2R1bGU7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgICBpZiAoc3RyY21wKG1Id01vZHVsZXNbaV0tPm1OYW1lLCBuYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUh3TW9kdWxlc1tpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbW9kdWxlOwotfQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpCi17Ci0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOwotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gb3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCk7Ci0gICAgcmV0dXJuIGRldmljZXMgJiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOwotfQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkKLXsKLSAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgcHJpbWFyeUhhbmRsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLnZhbHVlRm9yKG1QcmltYXJ5T3V0cHV0KS0+bVByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGU7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1Nb2R1bGUtPm1IYW5kbGUgPT0gcHJpbWFyeUhhbmRsZSkgewotICAgICAgICAgICAgZGV2aWNlcyB8PSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tRGV2aWNlVHlwZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlczsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKLXsKLSAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIik7Ci0KLSAgICBpZiAoaGFuZGxlID09IE5VTEwgfHwgcGF0Y2ggPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG51bSBzb3VyY2VzICVkIG51bSBzaW5rcyAlZCIsIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcyk7Ci0KLSAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID09IDAgfHwgcGF0Y2gtPm51bV9zb3VyY2VzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYIHx8Ci0gICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID09IDAgfHwgcGF0Y2gtPm51bV9zaW5rcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICAvLyBvbmx5IG9uZSBzb3VyY2UgcGVyIGF1ZGlvIHBhdGNoIHN1cHBvcnRlZCBmb3Igbm93Ci0gICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA+IDEpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGlmIChwYXRjaC0+c291cmNlc1swXS5yb2xlICE9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgewotICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnJvbGUgIT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOwotCi0gICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2ggc291cmNlIGlkICVkIHJvbGUgJWQgdHlwZSAlZCIsIHBhdGNoLT5zb3VyY2VzWzBdLmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5yb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS50eXBlKTsKLSNpZiBMT0dfTkRFQlVHID09IDAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgewotICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCBzaW5rICVkOiBpZCAlZCByb2xlICVkIHR5cGUgJWQiLCBpLCBwYXRjaC0+c2lua3NbaV0uaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLnJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLnR5cGUpOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBtVWlkQ2FjaGVkICVkIHBhdGNoRGVzYy0+bVVpZCAlZCB1aWQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVpZENhY2hlZCwgcGF0Y2hEZXNjLT5tVWlkLCB1aWQpOwotICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQgJiYgdWlkICE9IHBhdGNoRGVzYy0+bVVpZCkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmhhbmRsZSA9IDA7Ci0gICAgfQotCi0gICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewotICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBnZXRPdXRwdXRGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOwotICAgICAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG91dHB1dCBub3QgZm91bmQgZm9yIGlkICVkIiwgcGF0Y2gtPnNvdXJjZXNbMF0uaWQpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksImR1cGxpY2F0ZWQgb3V0cHV0ICVkIGluIHNvdXJjZSBpbiBwb3J0cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDApIHsKLSAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPm1QYXRjaC5zb3VyY2VzWzBdLmlkICE9IHBhdGNoLT5zb3VyY2VzWzBdLmlkKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzb3VyY2UgaWQgZGlmZmVycyBmb3IgcGF0Y2ggY3VycmVudCBpZCAlZCBuZXcgaWQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2guc291cmNlc1swXS5pZCwgcGF0Y2gtPnNvdXJjZXNbMF0uaWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnQgbWl4IHRvIGRldmljZXMgY29ubmVjdGlvbgotICAgICAgICAgICAgLy8gVE9ETyBhZGQgc3VwcG9ydCBmb3IgbWl4IHRvIG1peCBjb25uZWN0aW9uCi0gICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc291cmNlIG1peCBidXQgc2luayBpcyBub3QgYSBkZXZpY2UiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zaW5rc1tpXS5pZCk7Ci0gICAgICAgICAgICBpZiAoZGV2RGVzYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBvdXQgZGV2aWNlIG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c2lua3NbaV0uaWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghb3V0cHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2RGVzYy0+bURldmljZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyB1cGRhdGVkU2FtcGxpbmdSYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FIC8qRklYTUUqLykpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHByb2ZpbGUgbm90IHN1cHBvcnRlZCBmb3IgZGV2aWNlICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1EZXZpY2VUeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZEZXNjKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogcmVjb25maWd1cmUgb3V0cHV0IGZvcm1hdCBhbmQgY2hhbm5lbHMgaGVyZQotICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNldHRpbmcgZGV2aWNlICUwOHggb24gb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgZGV2aWNlcy50eXBlcygpLCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+bUlvSGFuZGxlLCBkZXZpY2VzLnR5cGVzKCksIHRydWUsIDAsIGhhbmRsZSk7Ci0gICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwICYmIHBhdGNoRGVzYyAhPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRPdXRwdXREZXZpY2UoKSBkaWQgbm90IHJldXNlIHRoZSBwYXRjaCBwcm92aWRlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgIHBhdGNoRGVzYy0+bVVpZCA9IHVpZDsKLSAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc3VjY2VzcyIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRPdXRwdXREZXZpY2UoKSBmYWlsZWQgdG8gY3JlYXRlIGEgcGF0Y2giKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgICAgICAvLyBpbnB1dCBkZXZpY2UgdG8gaW5wdXQgbWl4IGNvbm5lY3Rpb24KLSAgICAgICAgICAgIC8vIG9ubHkgb25lIHNpbmsgc3VwcG9ydGVkIHdoZW4gY29ubmVjdGluZyBhbiBpbnB1dCBkZXZpY2UgdG8gYSBtaXgKLSAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NpbmtzID4gMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBnZXRJbnB1dEZyb21JZChwYXRjaC0+c2lua3NbMF0uaWQpOwotICAgICAgICAgICAgaWYgKGlucHV0RGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPm1QYXRjaC5zaW5rc1swXS5pZCAhPSBwYXRjaC0+c2lua3NbMF0uaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOwotICAgICAgICAgICAgaWYgKGRldkRlc2MgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghaW5wdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZEZXNjLT5tRGV2aWNlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgLyp1cGRhdGVkU2FtcGxlUmF0ZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uY2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGZvciB0aGUgcGFyYW1ldGVyIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBOT05FCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE86IHJlY29uZmlndXJlIG91dHB1dCBmb3JtYXQgYW5kIGNoYW5uZWxzIGhlcmUKLSAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0dGluZyBkZXZpY2UgJTA4eCBvbiBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tRGV2aWNlVHlwZSwgaW5wdXREZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXREZXNjLT5tSW9IYW5kbGUsIGRldkRlc2MtPm1EZXZpY2VUeXBlLCB0cnVlLCBoYW5kbGUpOwotICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKmhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCAmJiBwYXRjaERlc2MgIT0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHNldElucHV0RGV2aWNlKCkgZGlkIG5vdCByZXVzZSB0aGUgcGF0Y2ggcHJvdmlkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1VaWQgPSB1aWQ7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzdWNjZXNzIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0SW5wdXREZXZpY2UoKSBmYWlsZWQgdG8gY3JlYXRlIGEgcGF0Y2giKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgLy8gZGV2aWNlIHRvIGRldmljZSBjb25uZWN0aW9uCi0gICAgICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2hEZXNjLT5tUGF0Y2guc291cmNlc1swXS5pZCAhPSBwYXRjaC0+c291cmNlc1swXS5pZCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZURlc2MgPQotICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7Ci0gICAgICAgICAgICBpZiAoc3JjRGV2aWNlRGVzYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy91cGRhdGUgc291cmNlIGFuZCBzaW5rIHdpdGggb3VyIG93biBkYXRhIGFzIHRoZSBkYXRhIHBhc3NlZCBpbiB0aGUgcGF0Y2ggbWF5Ci0gICAgICAgICAgICAvLyBiZSBpbmNvbXBsZXRlLgotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG5ld1BhdGNoID0gKnBhdGNoOwotICAgICAgICAgICAgc3JjRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNvdXJjZXNbMF0sICZwYXRjaC0+c291cmNlc1swXSk7Ci0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzb3VyY2UgZGV2aWNlIGJ1dCBvbmUgc2luayBpcyBub3QgYSBkZXZpY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2VEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c2lua3NbaV0uaWQpOwotICAgICAgICAgICAgICAgIGlmIChzaW5rRGV2aWNlRGVzYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc2lua3NbaV0sICZwYXRjaC0+c2lua3NbaV0pOwotCi0gICAgICAgICAgICAgICAgaWYgKHNyY0RldmljZURlc2MtPm1Nb2R1bGUgIT0gc2lua0RldmljZURlc2MtPm1Nb2R1bGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gb25seSBvbmUgc2luayBzdXBwb3J0ZWQgd2hlbiBjb25uZWN0ZWQgZGV2aWNlcyBhY3Jvc3MgSFcgbW9kdWxlcwotICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPm51bV9zaW5rcyA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKHNpbmtEZXZpY2VEZXNjLT5tRGV2aWNlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzaW5rIGRldmljZSBpcyByZWFjaGFibGUgdmlhIGFuIG9wZW5lZCBvdXRwdXQgc3RyZWFtLCByZXF1ZXN0IHRvIGdvIHZpYQotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG91dHB1dCBzdHJlYW0gYnkgYWRkaW5nIGEgc2Vjb25kIHNvdXJjZSB0byB0aGUgcGF0Y2ggZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNvdXJjZXNbMV0sICZwYXRjaC0+c291cmNlc1swXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5udW1fc291cmNlcyA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBmcm9tIHJvdXRpbmcgY2FwYWJpbGl0aWVzIGluIGNvbmZpZyBmaWxlIGFuZCBvdGhlciBjb25mbGljdGluZyBwYXRjaGVzCi0KLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZuZXdQYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpbmV4dFVuaXF1ZUlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdQYXRjaCwgdWlkKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBuZXdQYXRjaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICAgICAgKmhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKLSAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgcGF0Y2ggcGFuZWwgY291bGQgbm90IGNvbm5lY3QgZGV2aWNlIHBhdGNoLCBlcnJvciAlZCIsCi0gICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQotewotICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIHBhdGNoICVkIiwgaGFuZGxlKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBtVWlkQ2FjaGVkICVkIHBhdGNoRGVzYy0+bVVpZCAlZCB1aWQgJWQiLAotICAgICAgICAgIG1VaWRDYWNoZWQsIHBhdGNoRGVzYy0+bVVpZCwgdWlkKTsKLSAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQgJiYgdWlkICE9IHBhdGNoRGVzYy0+bVVpZCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCA9ICZwYXRjaERlc2MtPm1QYXRjaDsKLSAgICBwYXRjaERlc2MtPm1VaWQgPSBtVWlkQ2FjaGVkOwotICAgIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gZ2V0T3V0cHV0RnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgb3V0cHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c291cmNlc1swXS5pZCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPm1Jb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLT5tSW9IYW5kbGUsIHRydWUgLypmcm9tQ2FjaGUqLyksCi0gICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gZ2V0SW5wdXRGcm9tSWQocGF0Y2gtPnNpbmtzWzBdLmlkKTsKLSAgICAgICAgICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGlucHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c2lua3NbMF0uaWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dERlc2MtPm1Jb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYy0+bUlvSGFuZGxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIHJlbW92ZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlKTsKLSAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKLXsKLSAgICBpZiAobnVtX3BhdGNoZXMgPT0gTlVMTCB8fCAoKm51bV9wYXRjaGVzICE9IDAgJiYgcGF0Y2hlcyA9PSBOVUxMKSB8fAotICAgICAgICAgICAgZ2VuZXJhdGlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIEFMT0dWKCJsaXN0QXVkaW9QYXRjaGVzKCkgbnVtX3BhdGNoZXMgJWQgcGF0Y2hlcyAlcCBhdmFpbGFibGUgcGF0Y2hlcyAlenUiLAotICAgICAgICAgICpudW1fcGF0Y2hlcywgcGF0Y2hlcywgbUF1ZGlvUGF0Y2hlcy5zaXplKCkpOwotICAgIGlmIChwYXRjaGVzID09IE5VTEwpIHsKLSAgICAgICAgKm51bV9wYXRjaGVzID0gMDsKLSAgICB9Ci0KLSAgICBzaXplX3QgcGF0Y2hlc1dyaXR0ZW4gPSAwOwotICAgIHNpemVfdCBwYXRjaGVzTWF4ID0gKm51bV9wYXRjaGVzOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOwotICAgICAgICAgICAgaSAgPCBtQXVkaW9QYXRjaGVzLnNpemUoKSAmJiBwYXRjaGVzV3JpdHRlbiA8IHBhdGNoZXNNYXg7IGkrKykgewotICAgICAgICBwYXRjaGVzW3BhdGNoZXNXcml0dGVuXSA9IG1BdWRpb1BhdGNoZXNbaV0tPm1QYXRjaDsKLSAgICAgICAgcGF0Y2hlc1twYXRjaGVzV3JpdHRlbisrXS5pZCA9IG1BdWRpb1BhdGNoZXNbaV0tPm1IYW5kbGU7Ci0gICAgICAgIEFMT0dWKCJsaXN0QXVkaW9QYXRjaGVzKCkgcGF0Y2ggJXp1IG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCIsCi0gICAgICAgICAgICAgIGksIG1BdWRpb1BhdGNoZXNbaV0tPm1QYXRjaC5udW1fc291cmNlcywgbUF1ZGlvUGF0Y2hlc1tpXS0+bVBhdGNoLm51bV9zaW5rcyk7Ci0gICAgfQotICAgICpudW1fcGF0Y2hlcyA9IG1BdWRpb1BhdGNoZXMuc2l6ZSgpOwotCi0gICAgKmdlbmVyYXRpb24gPSBjdXJBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMoKSBnb3QgJXp1IHBhdGNoZXMgbmVlZGVkICVkIiwgcGF0Y2hlc1dyaXR0ZW4sICpudW1fcGF0Y2hlcyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKLXsKLSAgICBBTE9HVigic2V0QXVkaW9Qb3J0Q29uZmlnKCkiKTsKLQotICAgIGlmIChjb25maWcgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBBTE9HVigic2V0QXVkaW9Qb3J0Q29uZmlnKCkgb24gcG9ydCBoYW5kbGUgJWQiLCBjb25maWctPmlkKTsKLSAgICAvLyBPbmx5IHN1cHBvcnQgZ2FpbiBjb25maWd1cmF0aW9uIGZvciBub3cKLSAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAhPSBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBzcDxBdWRpb1BvcnRDb25maWc+IGF1ZGlvUG9ydENvbmZpZzsKLSAgICBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgaWYgKGNvbmZpZy0+cm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBnZXRPdXRwdXRGcm9tSWQoY29uZmlnLT5pZCk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZXRBdWRpb1BvcnRDb25maWcoKSBjYWxsZWQgb24gZHVwbGljYXRlZCBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgIGF1ZGlvUG9ydENvbmZpZyA9IG91dHB1dERlc2M7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gZ2V0SW5wdXRGcm9tSWQoY29uZmlnLT5pZCk7Ci0gICAgICAgICAgICBpZiAoaW5wdXREZXNjID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXVkaW9Qb3J0Q29uZmlnID0gaW5wdXREZXNjOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYzsKLSAgICAgICAgaWYgKGNvbmZpZy0+cm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7Ci0gICAgICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoY29uZmlnLT5pZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7Ci0gICAgICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKGNvbmZpZy0+aWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlRGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGF1ZGlvUG9ydENvbmZpZyA9IGRldmljZURlc2M7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgYmFja3VwQ29uZmlnOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9ydENvbmZpZy0+YXBwbHlBdWRpb1BvcnRDb25maWcoY29uZmlnLCAmYmFja3VwQ29uZmlnKTsKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBuZXdDb25maWc7Ci0gICAgICAgIGF1ZGlvUG9ydENvbmZpZy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld0NvbmZpZywgY29uZmlnKTsKLSAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnNldEF1ZGlvUG9ydENvbmZpZygmbmV3Q29uZmlnLCAwKTsKLSAgICB9Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBhdWRpb1BvcnRDb25maWctPmFwcGx5QXVkaW9Qb3J0Q29uZmlnKCZiYWNrdXBDb25maWcpOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpCi17Ci0gICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltQXVkaW9QYXRjaGVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgewotICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgPT0gdWlkKSB7Ci0gICAgICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChtQXVkaW9QYXRjaGVzLmtleUF0KGkpLCB1aWQpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKQotewotICAgICpzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCltcENsaWVudEludGVyZmFjZS0+bmV3QXVkaW9VbmlxdWVJZCgpOwotICAgICppb0hhbmRsZSA9IChhdWRpb19pb19oYW5kbGVfdCltcENsaWVudEludGVyZmFjZS0+bmV3QXVkaW9VbmlxdWVJZCgpOwotICAgICpkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfSE9UV09SRCk7Ci0KLSAgICBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuYWRkKCpzZXNzaW9uLCAqaW9IYW5kbGUpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIHNzaXplX3QgaW5kZXggPSBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbigpIHNlc3Npb24gJWQgbm90IHJlZ2lzdGVyZWQiLCBzZXNzaW9uKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBtU291bmRUcmlnZ2VyU2Vzc2lvbnMucmVtb3ZlSXRlbShzZXNzaW9uKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoKQotewotICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKLQotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJhZGRBdWRpb1BhdGNoKCkgcGF0Y2ggJWQgYWxyZWFkeSBpbiIsIGhhbmRsZSk7Ci0gICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKLSAgICB9Ci0gICAgbUF1ZGlvUGF0Y2hlcy5hZGQoaGFuZGxlLCBwYXRjaCk7Ci0gICAgQUxPR1YoImFkZEF1ZGlvUGF0Y2goKSBoYW5kbGUgJWQgYWYgaGFuZGxlICVkIG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCBzb3VyY2UgaGFuZGxlICVkIgotICAgICAgICAgICAgInNpbmsgaGFuZGxlICVkIiwKLSAgICAgICAgICBoYW5kbGUsIHBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgcGF0Y2gtPm1QYXRjaC5udW1fc291cmNlcywgcGF0Y2gtPm1QYXRjaC5udW1fc2lua3MsCi0gICAgICAgICAgcGF0Y2gtPm1QYXRjaC5zb3VyY2VzWzBdLmlkLCBwYXRjaC0+bVBhdGNoLnNpbmtzWzBdLmlkKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVtb3ZlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCi17Ci0gICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShoYW5kbGUpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygicmVtb3ZlQXVkaW9QYXRjaCgpIHBhdGNoICVkIG5vdCBpbiIsIGhhbmRsZSk7Ci0gICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKLSAgICB9Ci0gICAgQUxPR1YoInJlbW92ZUF1ZGlvUGF0Y2goKSBoYW5kbGUgJWQgYWYgaGFuZGxlICVkIiwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCktPm1BZlBhdGNoSGFuZGxlKTsKLSAgICBtQXVkaW9QYXRjaGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQXVkaW9Qb2xpY3lNYW5hZ2VyCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6bmV4dFVuaXF1ZUlkKCkKLXsKLSAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dFVuaXF1ZUlkKTsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpCi17Ci0gICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2luYygmbUF1ZGlvUG9ydEdlbmVyYXRpb24pOwotfQotCi1BdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQotICAgIDoKLSNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAotICAgIFRocmVhZChmYWxzZSksCi0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotICAgIG1QcmltYXJ5T3V0cHV0KChhdWRpb19pb19oYW5kbGVfdCkwKSwKLSAgICBtUGhvbmVTdGF0ZShBVURJT19NT0RFX05PUk1BTCksCi0gICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpLCBtTGFzdFZvaWNlVm9sdW1lKC0xLjBmKSwKLSAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCgwKSwgbVRvdGFsRWZmZWN0c01lbW9yeSgwKSwKLSAgICBtQTJkcFN1c3BlbmRlZChmYWxzZSksCi0gICAgbVNwZWFrZXJEcmNFbmFibGVkKGZhbHNlKSwgbU5leHRVbmlxdWVJZCgxKSwKLSAgICBtQXVkaW9Qb3J0R2VuZXJhdGlvbigxKSwKLSAgICBtQmVhY29uTXV0ZVJlZkNvdW50KDApLAotICAgIG1CZWFjb25QbGF5aW5nUmVmQ291bnQoMCksCi0gICAgbUJlYWNvbk11dGVkKGZhbHNlKQotewotICAgIG1VaWRDYWNoZWQgPSBnZXR1aWQoKTsKLSAgICBtcENsaWVudEludGVyZmFjZSA9IGNsaWVudEludGVyZmFjZTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQ7IGkrKykgewotICAgICAgICBtRm9yY2VVc2VbaV0gPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKLSAgICB9Ci0KLSAgICBtRGVmYXVsdE91dHB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOwotICAgIGlmIChsb2FkQXVkaW9Qb2xpY3lDb25maWcoQVVESU9fUE9MSUNZX1ZFTkRPUl9DT05GSUdfRklMRSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgaWYgKGxvYWRBdWRpb1BvbGljeUNvbmZpZyhBVURJT19QT0xJQ1lfQ09ORklHX0ZJTEUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IGxvYWQgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSwgc2V0dGluZyBkZWZhdWx0cyIpOwotICAgICAgICAgICAgZGVmYXVsdEF1ZGlvUG9saWN5Q29uZmlnKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gbUF2YWlsYWJsZU91dHB1dERldmljZXMgYW5kIG1BdmFpbGFibGVJbnB1dERldmljZXMgbm93IGNvbnRhaW4gYWxsIGF0dGFjaGVkIGRldmljZXMKLQotICAgIC8vIG11c3QgYmUgZG9uZSBhZnRlciByZWFkaW5nIHRoZSBwb2xpY3kKLSAgICBpbml0aWFsaXplVm9sdW1lQ3VydmVzKCk7Ci0KLSAgICAvLyBvcGVuIGFsbCBvdXRwdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMKLSAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOwotICAgIGF1ZGlvX2RldmljZXNfdCBpbnB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPSBtcENsaWVudEludGVyZmFjZS0+bG9hZEh3TW9kdWxlKG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKLSAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgewotICAgICAgICAgICAgQUxPR1coImNvdWxkIG5vdCBvcGVuIEhXIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcwotICAgICAgICAvLyBleGNlcHQgZm9yIGRpcmVjdCBvdXRwdXQgc3RyZWFtcyB0aGF0IGFyZSBvbmx5IG9wZW5lZCB3aGVuIHRoZXkgYXJlIGFjdHVhbGx5Ci0gICAgICAgIC8vIHJlcXVpcmVkIGJ5IGFuIGFwcC4KLSAgICAgICAgLy8gVGhpcyBhbHNvIHZhbGlkYXRlcyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBsaXN0Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IG91dFByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal07Ci0KLSAgICAgICAgICAgIGlmIChvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiT3V0cHV0IHByb2ZpbGUgY29udGFpbnMgbm8gZGV2aWNlIG9uIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChvdXRQcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcm9maWxlVHlwZSA9IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCk7Ci0gICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlKSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlID0gbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBjaG9zZSBmaXJzdCBkZXZpY2UgcHJlc2VudCBpbiBtU3VwcG9ydGVkRGV2aWNlcyBhbHNvIHBhcnQgb2YKLSAgICAgICAgICAgICAgICAvLyBvdXRwdXREZXZpY2VUeXBlcwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlID0gb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10tPm1EZXZpY2VUeXBlOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgb3V0cHV0RGV2aWNlVHlwZXMpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIG91dHB1dERldmljZVR5cGVzKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKG91dFByb2ZpbGUpOwotCi0gICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gcHJvZmlsZVR5cGU7Ci0gICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IG91dHB1dERlc2MtPm1DaGFubmVsTWFzazsKLSAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBvdXRwdXREZXNjLT5tRm9ybWF0OwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChvdXRQcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKLQotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dXKCJDYW5ub3Qgb3BlbiBvdXRwdXQgc3RyZWFtIGZvciBkZXZpY2UgJTA4eCBvbiBodyBtb2R1bGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdLT5tRGV2aWNlVHlwZTsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCi0gICAgICAgICAgICAgICAgICAgIGlmICgoaW5kZXggPj0gMCkgJiYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+bUlkID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9IG5leHRVbmlxdWVJZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5tTW9kdWxlID0gbUh3TW9kdWxlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVByaW1hcnlPdXRwdXQgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJvZmlsZS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgewotICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dCA9IG91dHB1dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gb3BlbiBpbnB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcyB0byB2YWxpZGF0ZQotICAgICAgICAvLyBtQXZhaWxhYmxlSW5wdXREZXZpY2VzIGxpc3QKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBpblByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlc1tqXTsKLQotICAgICAgICAgICAgaWYgKGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIklucHV0IHByb2ZpbGUgY29udGFpbnMgbm8gZGV2aWNlIG9uIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIG1TdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZgotICAgICAgICAgICAgLy8gaW5wdXREZXZpY2VUeXBlcwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByb2ZpbGVUeXBlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdLT5tRGV2aWNlVHlwZTsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZVR5cGUgJiBpbnB1dERldmljZVR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBpbnB1dERldmljZVR5cGVzKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGluUHJvZmlsZSk7Ci0KLSAgICAgICAgICAgIGlucHV0RGVzYy0+bUlucHV0U291cmNlID0gQVVESU9fU09VUkNFX01JQzsKLSAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IHByb2ZpbGVUeXBlOwotCi0gICAgICAgICAgICAvLyBmaW5kIHRoZSBhZGRyZXNzCi0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocHJvZmlsZVR5cGUpOwotICAgICAgICAgICAgLy8gICB0aGUgaW5wdXRzIHZlY3RvciBtdXN0IGJlIG9mIHNpemUgMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZQotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcwotICAgICAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOwotICAgICAgICAgICAgQUxPR1YoIiAgZm9yIGlucHV0IGRldmljZSAweCV4IHVzaW5nIGFkZHJlc3MgJXMiLCBwcm9maWxlVHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBBTE9HRV9JRihpbnB1dERldmljZXMuc2l6ZSgpID09IDAsICJJbnB1dCBkZXZpY2UgbGlzdCBpcyBlbXB0eSEiKTsKLQotICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwotICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gaW5wdXREZXNjLT5tU2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGlucHV0RGVzYy0+bUNoYW5uZWxNYXNrOwotICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IGlucHV0RGVzYy0+bUZvcm1hdDsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KGluUHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpOwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgIDwgaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10tPm1EZXZpY2VUeXBlOwotICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2YoaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCi0gICAgICAgICAgICAgICAgICAgIGlmICgoaW5kZXggPj0gMCkgJiYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tSWQgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tSWQgPSBuZXh0VW5pcXVlSWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tTW9kdWxlID0gbUh3TW9kdWxlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJDYW5ub3Qgb3BlbiBpbnB1dCBzdHJlYW0gZm9yIGRldmljZSAlMDh4IG9uIGh3IG1vZHVsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBtYWtlIHN1cmUgYWxsIGF0dGFjaGVkIGRldmljZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhIHVuaXF1ZSBJRAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTspIHsKLSAgICAgICAgaWYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT5tSWQgPT0gMCkgewotICAgICAgICAgICAgQUxPR1coIklucHV0IGRldmljZSAlMDh4IHVucmVhY2hhYmxlIiwgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPm1EZXZpY2VUeXBlKTsKLSAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpKys7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOykgewotICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUlkID09IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBkZXZpY2UgJTA4eCB1bnJlYWNoYWJsZSIsIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1EZXZpY2VUeXBlKTsKLSAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0pOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaSsrOwotICAgIH0KLSAgICAvLyBtYWtlIHN1cmUgZGVmYXVsdCBkZXZpY2UgaXMgcmVhY2hhYmxlCi0gICAgaWYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YobURlZmF1bHRPdXRwdXREZXZpY2UpIDwgMCkgewotICAgICAgICBBTE9HRSgiRGVmYXVsdCBkZXZpY2UgJTA4eCBpcyB1bnJlYWNoYWJsZSIsIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tRGV2aWNlVHlwZSk7Ci0gICAgfQotCi0gICAgQUxPR0VfSUYoKG1QcmltYXJ5T3V0cHV0ID09IDApLCAiRmFpbGVkIHRvIG9wZW4gcHJpbWFyeSBvdXRwdXQiKTsKLQotICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7Ci0KLSNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAotICAgIGlmIChtUHJpbWFyeU91dHB1dCAhPSAwKSB7Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksIDApOwotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtUHJpbWFyeU91dHB1dCwgb3V0cHV0Q21kLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIG1UZXN0RGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwotICAgICAgICBtVGVzdFNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwotICAgICAgICBtVGVzdEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwotICAgICAgICBtVGVzdENoYW5uZWxzID0gIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICAgICAgbVRlc3RMYXRlbmN5TXMgPSAwOwotICAgICAgICBtQ3VyT3V0cHV0ID0gMDsKLSAgICAgICAgbURpcmVjdE91dHB1dCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9URVNUX09VVFBVVFM7IGkrKykgewotICAgICAgICAgICAgbVRlc3RPdXRwdXRzW2ldID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCIpOwotICAgICAgICBydW4oYnVmZmVyLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKLSAgICB9Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotfQotCi1BdWRpb1BvbGljeU1hbmFnZXI6On5BdWRpb1BvbGljeU1hbmFnZXIoKQotewotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgZXhpdCgpOwotI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKLSAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgIH0KLSAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChtSW5wdXRzLmtleUF0KGkpKTsKLSAgIH0KLSAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNsZWFyKCk7Ci0gICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmNsZWFyKCk7Ci0gICBtT3V0cHV0cy5jbGVhcigpOwotICAgbUlucHV0cy5jbGVhcigpOwotICAgbUh3TW9kdWxlcy5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmluaXRDaGVjaygpCi17Ci0gICAgcmV0dXJuIChtUHJpbWFyeU91dHB1dCA9PSAwKSA/IE5PX0lOSVQgOiBOT19FUlJPUjsKLX0KLQotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6dGhyZWFkTG9vcCgpCi17Ci0gICAgQUxPR1YoImVudGVyaW5nIHRocmVhZExvb3AoKSIpOwotICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKLSAgICB7Ci0gICAgICAgIFN0cmluZzggY29tbWFuZDsKLSAgICAgICAgaW50IHZhbHVlSW50OwotICAgICAgICBTdHJpbmc4IHZhbHVlOwotCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIG1XYWl0V29ya0NWLndhaXRSZWxhdGl2ZShtTG9jaywgbWlsbGlzZWNvbmRzKDUwKSk7Ci0KLSAgICAgICAgY29tbWFuZCA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKDAsIFN0cmluZzgoInRlc3RfY21kX3BvbGljeSIpKTsKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihjb21tYW5kKTsKLQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeSIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IgJiYKLSAgICAgICAgICAgIHZhbHVlSW50ICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJUZXN0IGNvbW1hbmQgJXMgcmVjZWl2ZWQiLCBjb21tYW5kLnN0cmluZygpKTsKLSAgICAgICAgICAgIFN0cmluZzggdGFyZ2V0OwotICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0YXJnZXQiKSwgdGFyZ2V0KSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHRhcmdldCA9ICJNYW5hZ2VyIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X291dHB1dCIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X291dHB1dCIpKTsKLSAgICAgICAgICAgICAgICBtQ3VyT3V0cHV0ID0gdmFsdWVJbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9kaXJlY3QiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9kaXJlY3QiKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJmYWxzZSIpIHsKLSAgICAgICAgICAgICAgICAgICAgbURpcmVjdE91dHB1dCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gInRydWUiKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EaXJlY3RPdXRwdXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2lucHV0IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfaW5wdXQiKSk7Ci0gICAgICAgICAgICAgICAgbVRlc3RJbnB1dCA9IHZhbHVlSW50OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9mb3JtYXQiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9mb3JtYXQiKSk7Ci0gICAgICAgICAgICAgICAgaW50IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiUENNIDE2IGJpdHMiKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIlBDTSA4IGJpdHMiKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiQ29tcHJlc3NlZCBNUDMiKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9NUDM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSAiTWFuYWdlciIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0Rm9ybWF0ID0gZm9ybWF0OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOCgiZm9ybWF0IiksIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dFBhcmFtLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfY2hhbm5lbHMiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9jaGFubmVscyIpKTsKLSAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMgPSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJDaGFubmVscyBTdGVyZW8iKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJDaGFubmVscyBNb25vIikgewotICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9ICBBVURJT19DSEFOTkVMX09VVF9NT05POwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbHMgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgewotICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RDaGFubmVscyA9IGNoYW5uZWxzOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOCgiY2hhbm5lbHMiKSwgY2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3NhbXBsZVJhdGUiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9zYW1wbGVSYXRlIikpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZUludCA+PSAwICYmIHZhbHVlSW50IDw9IDk2MDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGluZ1JhdGUgPSB2YWx1ZUludDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSAiTWFuYWdlciIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOCgic2FtcGxpbmdfcmF0ZSIpLCBzYW1wbGluZ1JhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfcmVvcGVuIiksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfcmVvcGVuIikpOwotCi0gICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChtUHJpbWFyeU91dHB1dCk7Ci0KLSAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlID0gb3V0cHV0RGVzYy0+bU1vZHVsZS0+bUhhbmRsZTsKLQotICAgICAgICAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0obVByaW1hcnlPdXRwdXQpOwotCi0gICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihOVUxMKTsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwotICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2s7Ci0gICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQobW9kdWxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtUHJpbWFyeU91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZW9wZW4gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsaW5nUmF0ZTogJWQsIGZvcm1hdCAlZCwgY2hhbm5lbHMgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwgb3V0cHV0RGVzYy0+bUZvcm1hdCwgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q21kLmFkZEludChTdHJpbmc4KCJzZXRfaWQiKSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1QcmltYXJ5T3V0cHV0LCBvdXRwdXRDbWQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dChtUHJpbWFyeU91dHB1dCwgb3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKDAsIFN0cmluZzgoInRlc3RfY21kX3BvbGljeT0iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZXhpdCgpCi17Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgICAgICByZXF1ZXN0RXhpdCgpOwotICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLSAgICB9Ci0gICAgcmVxdWVzdEV4aXRBbmRXYWl0KCk7Ci19Ci0KLWludCBBdWRpb1BvbGljeU1hbmFnZXI6OnRlc3RPdXRwdXRJbmRleChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fVEVTVF9PVVRQVVRTOyBpKyspIHsKLSAgICAgICAgaWYgKG91dHB1dCA9PSBtVGVzdE91dHB1dHNbaV0pIHJldHVybiBpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi0KLS8vIC0tLQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjKQotewotICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSA9IG91dHB1dDsKLSAgICBvdXRwdXREZXNjLT5tSWQgPSBuZXh0VW5pcXVlSWQoKTsKLSAgICBtT3V0cHV0cy5hZGQob3V0cHV0LCBvdXRwdXREZXNjKTsKLSAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MpCi17Ci0gICAgaW5wdXREZXNjLT5tSW9IYW5kbGUgPSBpbnB1dDsKLSAgICBpbnB1dERlc2MtPm1JZCA9IG5leHRVbmlxdWVJZCgpOwotICAgIG1JbnB1dHMuYWRkKGlucHV0LCBpbnB1dERlc2MpOwotICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyAvKmluKi8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgLyppbiovLAotICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MgLyppbiovLAotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzIC8qb3V0Ki8pIHsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KLSAgICAgICAgZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmdldERldmljZShkZXZpY2UsIGFkZHJlc3MpOwotICAgIGlmIChkZXZEZXNjICE9IDApIHsKLSAgICAgICAgQUxPR1YoImZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQgb24gc2FtZSBhZGRyZXNzICVzIiwKLSAgICAgICAgICAgICAgZGVzYy0+bUlvSGFuZGxlLCBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgb3V0cHV0cy5hZGQoZGVzYy0+bUlvSGFuZGxlKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKQotewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBkZXZEZXNjLT5tRGV2aWNlVHlwZTsKLSAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7Ci0gICAgLy8gZXJhc2UgYWxsIGN1cnJlbnQgc2FtcGxlIHJhdGVzLCBmb3JtYXRzIGFuZCBjaGFubmVsIG1hc2tzCi0gICAgZGV2RGVzYy0+Y2xlYXJDYXBhYmlsaXRpZXMoKTsKLQotICAgIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgewotICAgICAgICAvLyBmaXJzdCBsaXN0IGFscmVhZHkgb3BlbiBvdXRwdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgKGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIGlmICghZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQiLCBtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiICBjaGVja2luZyBhZGRyZXNzIG1hdGNoIGR1ZSB0byBkZXZpY2UgMHgleCIsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoZGVzYywgZGV2aWNlLCBhZGRyZXNzLCBvdXRwdXRzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gdGhlbiBsb29rIGZvciBvdXRwdXQgcHJvZmlsZXMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCi0gICAgICAgIFNvcnRlZFZlY3Rvcjwgc3A8SU9Qcm9maWxlPiA+IHByb2ZpbGVzOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXTsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoZGV2aWNlKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPT0gcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNbMF0tPm1BZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQocHJvZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlenUiLCBqLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCIgIGZvdW5kICVkIHByb2ZpbGVzLCAlZCBvdXRwdXRzIiwgcHJvZmlsZXMuc2l6ZSgpLCBvdXRwdXRzLnNpemUoKSk7Ci0KLSAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSAmJiBvdXRwdXRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gb3BlbiBvdXRwdXRzIGZvciBtYXRjaGluZyBwcm9maWxlcyBpZiBuZWVkZWQuIERpcmVjdCBvdXRwdXRzIGFyZSBhbHNvIG9wZW5lZCB0bwotICAgICAgICAvLyBxdWVyeSBmb3IgZHluYW1pYyBwYXJhbWV0ZXJzIGFuZCB3aWxsIGJlIGNsb3NlZCBsYXRlciBieSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKQotICAgICAgICBmb3IgKHNzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7IHByb2ZpbGVfaW5kZXggPCAoc3NpemVfdClwcm9maWxlcy5zaXplKCk7IHByb2ZpbGVfaW5kZXgrKykgewotICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gcHJvZmlsZXNbcHJvZmlsZV9pbmRleF07Ci0KLSAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaWYgb25lIG91dHB1dCBpcyBhbHJlYWR5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlCi0gICAgICAgICAgICBzaXplX3QgajsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRwdXRzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHMuaXRlbUF0KGopKTsKLSAgICAgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgcHJvZmlsZTogc2F2ZSB0aGUgc2FtcGxlIHJhdGVzLCBmb3JtYXQgYW5kIGNoYW5uZWwgbWFza3Mgc3VwcG9ydGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBwcm9maWxlIGluIG91ciBkZXZpY2UgZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChqICE9IG91dHB1dHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggd2l0aCBwYXJhbXMgJXMgcHJvZmlsZSAlcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCksIHByb2ZpbGUuZ2V0KCkpOwotICAgICAgICAgICAgZGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSk7Ci0gICAgICAgICAgICBkZXNjLT5tRGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwotICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKLSAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7Ci0gICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKLSAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uc2FtcGxlX3JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5jaGFubmVsX21hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7Ci0gICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmZvcm1hdCA9IGRlc2MtPm1Gb3JtYXQ7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1GbGFncyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgICAgICAgICAgICAgIGRlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OwotCi0gICAgICAgICAgICAgICAgLy8gSGVyZSBpcyB3aGVyZSB0aGUgb3V0X3NldF9wYXJhbWV0ZXJzKCkgZm9yIGNhcmQgJiBkZXZpY2UgZ2V0cyBjYWxsZWQKLSAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKGRldmljZSwgYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG91dHB1dCwgU3RyaW5nOChwYXJhbSkpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBhcmFtKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBIZXJlIGlzIHdoZXJlIHdlIHN0ZXAgdGhyb3VnaCBhbmQgcmVzb2x2ZSBhbnkgImR5bmFtaWMiIGZpZWxkcwotICAgICAgICAgICAgICAgIFN0cmluZzggcmVwbHk7Ci0gICAgICAgICAgICAgICAgY2hhciAqdmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfU0FNUExJTkdfUkFURVMpKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcyAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZFNhbXBsaW5nUmF0ZXModmFsdWUgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0ZPUk1BVFMpKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHN1cHBvcnRlZCBmb3JtYXRzICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkRm9ybWF0cyh2YWx1ZSArIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfQ0hBTk5FTFMpKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHN1cHBvcnRlZCBjaGFubmVsIG1hc2tzICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkT3V0Q2hhbm5lbHModmFsdWUgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgPCAyKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICgocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSA8IDIpKSB8fAotICAgICAgICAgICAgICAgICAgICAgKChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpIDwgMikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBtaXNzaW5nIHBhcmFtIik7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDAgfHwgcHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gcHJvZmlsZS0+cGlja1NhbXBsaW5nUmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gcHJvZmlsZS0+cGlja0NoYW5uZWxNYXNrKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBwcm9maWxlLT5waWNrRm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uc2FtcGxlX3JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uY2hhbm5lbF9tYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPSBjb25maWcuZm9ybWF0OwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChwcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1MYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIGRlc2MpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpICYmIGFkZHJlc3MgIT0gIjAiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVBvbGljeU1peGVzLmluZGV4T2ZLZXkoYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lNaXhlc1tpbmRleF0tPm1PdXRwdXQgPSBkZXNjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1Qb2xpY3lNaXggPSAmbVBvbGljeU1peGVzW2luZGV4XS0+bU1peDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGNhbm5vdCBmaW5kIHBvbGljeSBmb3IgYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZHVwbGljYXRlZCBvdXRwdXQgZm9yIGRpcmVjdCBvdXRwdXRzIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0cyB1c2VkIGJ5IGR5bmFtaWMgcG9saWN5IG1peGVzCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkdXBsaWNhdGVkT3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBpbml0aWFsIHN0cmVhbSB2b2x1bWUgZm9yIGRldmljZQotICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dCwgZGV2aWNlLCAwLCB0cnVlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBjb25maWd1cmUgYXVkaW8gZWZmZWN0IG91dHB1dCBzdGFnZSBoZXJlCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wZW4gYSBkdXBsaWNhdGluZyBvdXRwdXQgdGhyZWFkIGZvciB0aGUgbmV3IG91dHB1dCBhbmQgdGhlIHByaW1hcnkgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkT3V0cHV0ID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5EdXBsaWNhdGVPdXRwdXQob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXBsaWNhdGVkT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGR1cGxpY2F0ZWQgb3V0cHV0IGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGR1cE91dHB1dERlc2MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9IG1PdXRwdXRzLnZhbHVlRm9yKG1QcmltYXJ5T3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MiA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUZvcm1hdCA9IGRlc2MtPm1Gb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gZGVzYy0+bUNoYW5uZWxNYXNrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1MYXRlbmN5ID0gZGVzYy0+bUxhdGVuY3k7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KGR1cGxpY2F0ZWRPdXRwdXQsIGR1cE91dHB1dERlc2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhkdXBsaWNhdGVkT3V0cHV0LCBkZXZpY2UsIDAsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gZHVwIG91dHB1dCBmb3IgJWQgYW5kICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0LCBvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gb3V0cHV0IGZvciBkZXZpY2UgJXgiLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJlbW92ZUF0KHByb2ZpbGVfaW5kZXgpOwotICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgtLTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQob3V0cHV0KTsKLSAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogc2V0T3V0cHV0RGV2aWNlKGRldj0weCV4LCBhZGRyPSVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgZGV2aWNlLCB0cnVlLypmb3JjZSovLCAwLypkZWxheSovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwvKnBhdGNoIGhhbmRsZSovLCBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3V0cHV0ICVkIiwgb3V0cHV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogTm8gb3V0cHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICUwNHgiLCBkZXZpY2UpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7IC8vIERpc2Nvbm5lY3QKLSAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9wZW5lZCBvdXRwdXQgaXMgbm90IG5lZWRlZCBhbnkgbW9yZSBhZnRlciBkaXNjb25uZWN0aW5nIG9uZSBkZXZpY2UKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZXhhY3QgbWF0Y2ggb24gZGV2aWNlCi0gICAgICAgICAgICAgICAgaWYgKGRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoZGV2aWNlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpID09IGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhkZXNjLCBkZXZpY2UsIGFkZHJlc3MsIG91dHB1dHMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgJiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGRpc2Nvbm5lY3RpbmcgYWRkaW5nIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIENsZWFyIGFueSBwcm9maWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc2Nvbm5lY3RlZCBkZXZpY2UuCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOwotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGVhcmluZyBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgJXp1IG9uIG1vZHVsZSAlenUiLCBqLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZCgwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tJbnB1dHNGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIGlucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcykKLXsKLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZGVzYzsKLSAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKLSAgICAgICAgLy8gZmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gaW5wdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQotICAgICAgICBmb3IgKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKLSAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOwotICAgICAgICAgICAgaWYgKGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgKGRldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3BlbmVkIGlucHV0ICVkIiwgbUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOwotICAgICAgICAgICAgICAgaW5wdXRzLmFkZChtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIGlucHV0IHByb2ZpbGVzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQotICAgICAgICBTb3J0ZWRWZWN0b3I8IHNwPElPUHJvZmlsZT4gPiBwcm9maWxlczsKLSAgICAgICAgZm9yIChzaXplX3QgbW9kdWxlX2lkeCA9IDA7IG1vZHVsZV9pZHggPCBtSHdNb2R1bGVzLnNpemUoKTsgbW9kdWxlX2lkeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBwcm9maWxlX2luZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCA8IG1Id01vZHVsZXNbbW9kdWxlX2lkeF0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbbW9kdWxlX2lkeF0tPm1JbnB1dFByb2ZpbGVzW3Byb2ZpbGVfaW5kZXhdOwotCi0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiAoZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9PSBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1swXS0+bUFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIG1vZHVsZV9pZHgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSAmJiBpbnB1dHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogTm8gaW5wdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gb3BlbiBpbnB1dHMgZm9yIG1hdGNoaW5nIHByb2ZpbGVzIGlmIG5lZWRlZC4gRGlyZWN0IGlucHV0cyBhcmUgYWxzbyBvcGVuZWQgdG8KLSAgICAgICAgLy8gcXVlcnkgZm9yIGR5bmFtaWMgcGFyYW1ldGVycyBhbmQgd2lsbCBiZSBjbG9zZWQgbGF0ZXIgYnkgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkKLSAgICAgICAgZm9yIChzc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOyBwcm9maWxlX2luZGV4IDwgKHNzaXplX3QpcHJvZmlsZXMuc2l6ZSgpOyBwcm9maWxlX2luZGV4KyspIHsKLQotICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gcHJvZmlsZXNbcHJvZmlsZV9pbmRleF07Ci0gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGlmIG9uZSBpbnB1dCBpcyBhbHJlYWR5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlCi0gICAgICAgICAgICBzaXplX3QgaW5wdXRfaW5kZXg7Ci0gICAgICAgICAgICBmb3IgKGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgewotICAgICAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOwotICAgICAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZSA9PSBwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpbnB1dF9pbmRleCAhPSBtSW5wdXRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVigib3BlbmluZyBpbnB1dCBmb3IgZGV2aWNlIDB4JVggd2l0aCBwYXJhbXMgJXMiLCBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICAgICAgZGVzYyA9IG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihwcm9maWxlKTsKLSAgICAgICAgICAgIGRlc2MtPm1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKLSAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBkZXNjLT5tRm9ybWF0OwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FIC8qRklYTUUqLyk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgICAgICAgICAgZGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKGRldmljZSwgYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGlucHV0LCBTdHJpbmc4KHBhcmFtKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocGFyYW0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEhlcmUgaXMgd2hlcmUgd2Ugc3RlcCB0aHJvdWdoIGFuZCByZXNvbHZlIGFueSAiZHluYW1pYyIgZmllbGRzCi0gICAgICAgICAgICAgICAgU3RyaW5nOCByZXBseTsKLSAgICAgICAgICAgICAgICBjaGFyICp2YWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX1NBTVBMSU5HX1JBVEVTKSk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGRpcmVjdCBpbnB1dCBzdXAgc2FtcGxpbmcgcmF0ZXMgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRTYW1wbGluZ1JhdGVzKHZhbHVlICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0ZPUk1BVFMpKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgZGlyZWN0IGlucHV0IHN1cCBmb3JtYXRzICVzIiwgcmVwbHkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRGb3JtYXRzKHZhbHVlICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0NIQU5ORUxTKSk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGRpcmVjdCBpbnB1dCBzdXAgY2hhbm5lbCBtYXNrcyAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEluQ2hhbm5lbHModmFsdWUgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSAmJiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDwgMikpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAoKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IDApICYmIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPCAyKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICgocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSAmJiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgPCAyKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgZGlyZWN0IGlucHV0IG1pc3NpbmcgcGFyYW0iKTsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoaW5wdXQpOwotICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpbnB1dCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZElucHV0KGlucHV0LCBkZXNjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IC8vIGVuZGlmIGlucHV0ICE9IDAKLQotICAgICAgICAgICAgaWYgKGlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gaW5wdXQgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBwcm9maWxlcy5yZW1vdmVBdChwcm9maWxlX2luZGV4KTsKLSAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LS07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlucHV0cy5hZGQoaW5wdXQpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgaW5wdXQgJWQiLCBpbnB1dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gLy8gZW5kIHNjYW4gcHJvZmlsZXMKLQotICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogTm8gaW5wdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gRGlzY29ubmVjdAotICAgICAgICAvLyBjaGVjayBpZiBvbmUgb3BlbmVkIGlucHV0IGlzIG5vdCBuZWVkZWQgYW55IG1vcmUgYWZ0ZXIgZGlzY29ubmVjdGluZyBvbmUgZGV2aWNlCi0gICAgICAgIGZvciAoc2l6ZV90IGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgewotICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7Ci0gICAgICAgICAgICBpZiAoIShkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmCi0gICAgICAgICAgICAgICAgICAgIH5BVURJT19ERVZJQ0VfQklUX0lOKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBkaXNjb25uZWN0aW5nIGFkZGluZyBpbnB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgbUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOwotICAgICAgICAgICAgICAgIGlucHV0cy5hZGQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIENsZWFyIGFueSBwcm9maWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc2Nvbm5lY3RlZCBkZXZpY2UuCi0gICAgICAgIGZvciAoc2l6ZV90IG1vZHVsZV9pbmRleCA9IDA7IG1vZHVsZV9pbmRleCA8IG1Id01vZHVsZXMuc2l6ZSgpOyBtb2R1bGVfaW5kZXgrKykgewotICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbbW9kdWxlX2luZGV4XS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBwcm9maWxlX2luZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCA8IG1Id01vZHVsZXNbbW9kdWxlX2luZGV4XS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4KyspIHsKLSAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBtSHdNb2R1bGVzW21vZHVsZV9pbmRleF0tPm1JbnB1dFByb2ZpbGVzW3Byb2ZpbGVfaW5kZXhdOwotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGNsZWFyaW5nIGRpcmVjdCBpbnB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgbW9kdWxlX2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZCgwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gLy8gZW5kIGRpc2Nvbm5lY3QKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIEFMT0dWKCJjbG9zZU91dHB1dCglZCkiLCBvdXRwdXQpOwotCi0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJjbG9zZU91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBvbGljeU1peGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtUG9saWN5TWl4ZXNbaV0tPm1PdXRwdXQgPT0gb3V0cHV0RGVzYykgewotICAgICAgICAgICAgbVBvbGljeU1peGVzW2ldLT5tT3V0cHV0LmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBsb29rIGZvciBkdXBsaWNhdGVkIG91dHB1dHMgY29ubmVjdGVkIHRvIHRoZSBvdXRwdXQgYmVpbmcgcmVtb3ZlZC4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZHVwT3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChkdXBPdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJgotICAgICAgICAgICAgICAgIChkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9PSBvdXRwdXREZXNjIHx8Ci0gICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bU91dHB1dDIgPT0gb3V0cHV0RGVzYykpIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYzI7Ci0gICAgICAgICAgICBpZiAoZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPT0gb3V0cHV0RGVzYykgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MyID0gZHVwT3V0cHV0RGVzYy0+bU91dHB1dDI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MyID0gZHVwT3V0cHV0RGVzYy0+bU91dHB1dDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBBcyBhbGwgYWN0aXZlIHRyYWNrcyBvbiBkdXBsaWNhdGVkIG91dHB1dCB3aWxsIGJlIGRlbGV0ZWQsCi0gICAgICAgICAgICAvLyBhbmQgYXMgdGhleSB3ZXJlIGFsc28gcmVmZXJlbmNlZCBvbiB0aGUgb3RoZXIgb3V0cHV0LCB0aGUgcmVmZXJlbmNlCi0gICAgICAgICAgICAvLyBjb3VudCBmb3IgdGhlaXIgc3RyZWFtIHR5cGUgbXVzdCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseSBvbgotICAgICAgICAgICAgLy8gdGhlIG90aGVyIG91dHB1dC4KLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgQVVESU9fU1RSRUFNX0NOVDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJlZkNvdW50ID0gZHVwT3V0cHV0RGVzYy0+bVJlZkNvdW50W2pdOwotICAgICAgICAgICAgICAgIG91dHB1dERlc2MyLT5jaGFuZ2VSZWZDb3VudCgoYXVkaW9fc3RyZWFtX3R5cGVfdClqLC1yZWZDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkdXBsaWNhdGVkT3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7Ci0gICAgICAgICAgICBBTE9HVigiY2xvc2VPdXRwdXQoKSBjbG9zaW5nIGFsc28gZHVwbGljYXRlZCBvdXRwdXQgJWQiLCBkdXBsaWNhdGVkT3V0cHV0KTsKLQotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KGR1cGxpY2F0ZWRPdXRwdXQpOwotICAgICAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShkdXBsaWNhdGVkT3V0cHV0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOwotICAgICAgICBtQXVkaW9QYXRjaGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgIH0KLQotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwotICAgIHBhcmFtLmFkZChTdHJpbmc4KCJjbG9zaW5nIiksIFN0cmluZzgoInRydWUiKSk7Ci0gICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBwYXJhbS50b1N0cmluZygpKTsKLQotICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOwotICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKLSAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQotewotICAgIEFMT0dWKCJjbG9zZUlucHV0KCVkKSIsIGlucHV0KTsKLQotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKLSAgICBpZiAoaW5wdXREZXNjID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImNsb3NlSW5wdXQoKSB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgbUF1ZGlvUGF0Y2hlcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICB9Ci0KLSAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7Ci0gICAgbUlucHV0cy5yZW1vdmVJdGVtKGlucHV0KTsKLX0KLQotU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dHNGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiA+IG9wZW5PdXRwdXRzKQotewotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKLQotICAgIEFMT0dWVigiZ2V0T3V0cHV0c0ZvckRldmljZSgpIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wZW5PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIEFMT0dWVigib3V0cHV0ICVkIGlzRHVwbGljYXRlZD0lZCBkZXZpY2U9JTA0eCIsCi0gICAgICAgICAgICAgICAgaSwgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+aXNEdXBsaWNhdGVkKCksIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPnN1cHBvcnRlZERldmljZXMoKSk7Ci0gICAgICAgIGlmICgoZGV2aWNlICYgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydGVkRGV2aWNlcygpKSA9PSBkZXZpY2UpIHsKLSAgICAgICAgICAgIEFMT0dWVigiZ2V0T3V0cHV0c0ZvckRldmljZSgpIGZvdW5kIG91dHB1dCAlZCIsIG9wZW5PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgIG91dHB1dHMuYWRkKG9wZW5PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gb3V0cHV0czsKLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnZlY3RvcnNFcXVhbChTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czIpCi17Ci0gICAgaWYgKG91dHB1dHMxLnNpemUoKSAhPSBvdXRwdXRzMi5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMxLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChvdXRwdXRzMVtpXSAhPSBvdXRwdXRzMltpXSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQotewotICAgIGF1ZGlvX2RldmljZXNfdCBvbGREZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc3JjT3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2Uob2xkRGV2aWNlLCBtUHJldmlvdXNPdXRwdXRzKTsKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGRzdE91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKG5ld0RldmljZSwgbU91dHB1dHMpOwotCi0gICAgLy8gYWxzbyB0YWtlIGludG8gYWNjb3VudCBleHRlcm5hbCBwb2xpY3ktcmVsYXRlZCBjaGFuZ2VzOiBhZGQgYWxsIG91dHB1dHMgd2hpY2ggYXJlCi0gICAgLy8gYXNzb2NpYXRlZCB3aXRoIHBvbGljaWVzIGluIHRoZSAiYmVmb3JlIiBhbmQgImFmdGVyIiBvdXRwdXQgdmVjdG9ycwotICAgIEFMT0dWVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpOiBwb2xpY3kgcmVsYXRlZCBvdXRwdXRzIik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgbVByZXZpb3VzT3V0cHV0cy5zaXplKCkgOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbVByZXZpb3VzT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoZGVzYyAhPSAwICYmIGRlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCkgewotICAgICAgICAgICAgc3JjT3V0cHV0cy5hZGQoZGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgIEFMT0dWVigiIHByZXZpb3VzIG91dHB1dHM6IGFkZGluZyAlZCIsIGRlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgbU91dHB1dHMuc2l6ZSgpIDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChkZXNjICE9IDAgJiYgZGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkc3RPdXRwdXRzLmFkZChkZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgQUxPR1ZWKCIgbmV3IG91dHB1dHM6IGFkZGluZyAlZCIsIGRlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIXZlY3RvcnNFcXVhbChzcmNPdXRwdXRzLGRzdE91dHB1dHMpKSB7Ci0gICAgICAgIEFMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIG1vdmluZyBmcm9tIG91dHB1dCAlZCB0byBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICBzdHJhdGVneSwgc3JjT3V0cHV0c1swXSwgZHN0T3V0cHV0c1swXSk7Ci0gICAgICAgIC8vIG11dGUgc3RyYXRlZ3kgd2hpbGUgbW92aW5nIHRyYWNrcyBmcm9tIG9uZSBvdXRwdXQgdG8gYW5vdGhlcgotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNyY091dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKHNyY091dHB1dHNbaV0pOwotICAgICAgICAgICAgaWYgKGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoc3RyYXRlZ3kpKSB7Ci0gICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmF0ZWd5LCB0cnVlLCBzcmNPdXRwdXRzW2ldKTsKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIGZhbHNlLCBzcmNPdXRwdXRzW2ldLCBNVVRFX1RJTUVfTVMsIG5ld0RldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNb3ZlIGVmZmVjdHMgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmF0ZWd5IGZyb20gcHJldmlvdXMgb3V0cHV0IHRvIG5ldyBvdXRwdXQKLSAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSB7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBmeE91dHB1dCA9IHNlbGVjdE91dHB1dEZvckVmZmVjdHMoZHN0T3V0cHV0cyk7Ci0gICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG1vdmVkOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSBtRWZmZWN0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChlZmZlY3REZXNjLT5tU2Vzc2lvbiA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1JbyAhPSBmeE91dHB1dCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobW92ZWQuaW5kZXhPZihlZmZlY3REZXNjLT5tSW8pIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBtb3ZpbmcgZWZmZWN0ICVkIHRvIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0cy5rZXlBdChpKSwgZnhPdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm1vdmVFZmZlY3RzKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgZWZmZWN0RGVzYy0+bUlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4T3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVkLmFkZChlZmZlY3REZXNjLT5tSW8pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1JbyA9IGZ4T3V0cHV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBNb3ZlIHRyYWNrcyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICAgICAgaWYgKGkgPT0gQVVESU9fU1RSRUFNX1BBVENIKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCi17Ci0gICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FKTsKLSAgICBpZiAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKQotICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRFRNRik7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9SRVJPVVRJTkcpOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEEyZHBPdXRwdXQoKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKLSAgICAgICAgICAgIHJldHVybiBtT3V0cHV0cy5rZXlBdChpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBMmRwU3VzcGVuZCgpCi17Ci0gICAgYXVkaW9faW9faGFuZGxlX3QgYTJkcE91dHB1dCA9IGdldEEyZHBPdXRwdXQoKTsKLSAgICBpZiAoYTJkcE91dHB1dCA9PSAwKSB7Ci0gICAgICAgIG1BMmRwU3VzcGVuZGVkID0gZmFsc2U7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBib29sIGlzU2NvQ29ubmVjdGVkID0KLSAgICAgICAgICAgICgobUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCAmCi0gICAgICAgICAgICAgICAgICAgIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSB8fAotICAgICAgICAgICAgKChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9BTExfU0NPKSAhPSAwKTsKLSAgICAvLyBzdXNwZW5kIEEyRFAgb3V0cHV0IGlmOgotICAgIC8vICAgICAgKE5PVCBhbHJlYWR5IHN1c3BlbmRlZCkgJiYKLSAgICAvLyAgICAgICgoU0NPIGRldmljZSBpcyBjb25uZWN0ZWQgJiYKLSAgICAvLyAgICAgICAoZm9yY2VkIHVzYWdlIGZvciBjb21tdW5pY2F0aW9uIHx8IGZvciByZWNvcmQgaXMgU0NPKSkpIHx8Ci0gICAgLy8gICAgICAocGhvbmUgc3RhdGUgaXMgcmluZ2luZyB8fCBpbiBjYWxsKQotICAgIC8vCi0gICAgLy8gcmVzdG9yZSBBMkRQIG91dHB1dCBpZjoKLSAgICAvLyAgICAgIChBbHJlYWR5IHN1c3BlbmRlZCkgJiYKLSAgICAvLyAgICAgICgoU0NPIGRldmljZSBpcyBOT1QgY29ubmVjdGVkIHx8Ci0gICAgLy8gICAgICAgKGZvcmNlZCB1c2FnZSBOT1QgZm9yIGNvbW11bmljYXRpb24gJiYgTk9UIGZvciByZWNvcmQgaXMgU0NPKSkpICYmCi0gICAgLy8gICAgICAocGhvbmUgc3RhdGUgaXMgTk9UIHJpbmdpbmcgJiYgTk9UIGluIGNhbGwpCi0gICAgLy8KLSAgICBpZiAobUEyZHBTdXNwZW5kZWQpIHsKLSAgICAgICAgaWYgKCghaXNTY29Db25uZWN0ZWQgfHwKLSAgICAgICAgICAgICAoKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pICYmCi0gICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pKSkgJiYKLSAgICAgICAgICAgICAoKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfSU5fQ0FMTCkgJiYKLSAgICAgICAgICAgICAgKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfUklOR1RPTkUpKSkgewotCi0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVzdG9yZU91dHB1dChhMmRwT3V0cHV0KTsKLSAgICAgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoKGlzU2NvQ29ubmVjdGVkICYmCi0gICAgICAgICAgICAgKChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB8fAotICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkpIHx8Ci0gICAgICAgICAgICAgKChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHx8Ci0gICAgICAgICAgICAgIChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX1JJTkdUT05FKSkpIHsKLQotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN1c3BlbmRPdXRwdXQoYTJkcE91dHB1dCk7Ci0gICAgICAgICAgICBtQTJkcFN1c3BlbmRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld091dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGJvb2wgZnJvbUNhY2hlKQotewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKLQotICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0TmV3T3V0cHV0RGV2aWNlKCkgZGV2aWNlICUwOHggZm9yY2VkIGJ5IHBhdGNoICVkIiwKLSAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZSgpLCBvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgcmV0dXJuIG91dHB1dERlc2MtPmRldmljZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgdGhlIGZvbGxvd2luZyBieSBvcmRlciBvZiBwcmlvcml0eSB0byByZXF1ZXN0IGEgcm91dGluZyBjaGFuZ2UgaWYgbmVjZXNzYXJ5OgotICAgIC8vIDE6IHRoZSBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlIGlzIGFjdGl2ZSBhbmQgZW5mb3JjZWQgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKLSAgICAvLyAyOiB3ZSBhcmUgaW4gY2FsbCBvciB0aGUgc3RyYXRlZ3kgcGhvbmUgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBwaG9uZQotICAgIC8vIDM6IHRoZSBzdHJhdGVneSBmb3IgZW5mb3JjZWQgYXVkaWJsZSBpcyBhY3RpdmUgYnV0IG5vdCBlbmZvcmNlZCBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIHRoZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKLSAgICAvLyA0OiB0aGUgc3RyYXRlZ3kgc29uaWZpY2F0aW9uIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgc29uaWZpY2F0aW9uCi0gICAgLy8gNTogdGhlIHN0cmF0ZWd5ICJyZXNwZWN0ZnVsIiBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSAicmVzcGVjdGZ1bCIgc29uaWZpY2F0aW9uCi0gICAgLy8gNjogdGhlIHN0cmF0ZWd5IGFjY2Vzc2liaWxpdHkgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBhY2Nlc3NpYmlsaXR5Ci0gICAgLy8gNzogdGhlIHN0cmF0ZWd5IG1lZGlhIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgbWVkaWEKLSAgICAvLyA4OiB0aGUgc3RyYXRlZ3kgRFRNRiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IERUTUYKLSAgICAvLyA5OiB0aGUgc3RyYXRlZ3kgZm9yIGJlYWNvbiwgYS5rLmEuICJ0cmFuc21pdHRlZCB0aHJvdWdoIHNwZWFrZXIiIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgdC10LXMKLSAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSAmJgotICAgICAgICBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzSW5DYWxsKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9QSE9ORSkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1NPTklGSUNBVElPTikpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0FDQ0VTU0lCSUxJVFksIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX01FRElBKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfRFRNRikpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRFRNRiwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1JFUk9VVElORykpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUkVST1VUSU5HLCBmcm9tQ2FjaGUpOwotICAgIH0KLQotICAgIEFMT0dWKCJnZXROZXdPdXRwdXREZXZpY2UoKSBzZWxlY3RlZCBkZXZpY2UgJXgiLCBkZXZpY2UpOwotICAgIHJldHVybiBkZXZpY2U7Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld0lucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQotewotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCkgewotICAgICAgICAgICAgQUxPR1YoImdldE5ld0lucHV0RGV2aWNlKCkgZGV2aWNlICUwOHggZm9yY2VkIGJ5IHBhdGNoICVkIiwKLSAgICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSwgaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgcmV0dXJuIGlucHV0RGVzYy0+bURldmljZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShpbnB1dERlc2MtPm1JbnB1dFNvdXJjZSk7Ci0KLSAgICBBTE9HVigiZ2V0TmV3SW5wdXREZXZpY2UoKSBzZWxlY3RlZCBkZXZpY2UgJXgiLCBkZXZpY2UpOwotICAgIHJldHVybiBkZXZpY2U7Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKLSAgICByZXR1cm4gKHVpbnQzMl90KWdldFN0cmF0ZWd5KHN0cmVhbSk7Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKLSAgICAvLyBCeSBjaGVja2luZyB0aGUgcmFuZ2Ugb2Ygc3RyZWFtIGJlZm9yZSBjYWxsaW5nIGdldFN0cmF0ZWd5LCB3ZSBhdm9pZAotICAgIC8vIGdldFN0cmF0ZWd5J3MgYmVoYXZpb3IgZm9yIGludmFsaWQgc3RyZWFtcy4gIGdldFN0cmF0ZWd5IHdvdWxkIGRvIGEgQUxPR0UKLSAgICAvLyBhbmQgdGhlbiByZXR1cm4gU1RSQVRFR1lfTUVESUEsIGJ1dCB3ZSB3YW50IHRvIHJldHVybiB0aGUgZW1wdHkgc2V0LgotICAgIGlmIChzdHJlYW0gPCAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgMCB8fCBzdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOwotICAgIH0KLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlczsKLSAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOwotICAgIGRldmljZXMgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZXMsIG1PdXRwdXRzKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHN0cmF0ZWd5KSkgewotICAgICAgICAgICAgZGV2aWNlcyA9IG91dHB1dERlc2MtPmRldmljZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKkZpbHRlciBTUEVBS0VSX1NBRkUgb3V0IG9mIHJlc3VsdHMsIGFzIEF1ZGlvU2VydmljZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKLSAgICAgIGFuZCBkb2Vzbid0IHJlYWxseSBuZWVkIHRvLiovCi0gICAgaWYgKGRldmljZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkgewotICAgICAgICBkZXZpY2VzIHw9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgZGV2aWNlcyAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGRldmljZXM7Ci19Ci0KLUF1ZGlvUG9saWN5TWFuYWdlcjo6cm91dGluZ19zdHJhdGVneSBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5KAotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgewotCi0gICAgQUxPR19BU1NFUlQoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9QQVRDSCwiZ2V0U3RyYXRlZ3koKSBjYWxsZWQgZm9yIEFVRElPX1NUUkVBTV9QQVRDSCIpOwotCi0gICAgLy8gc3RyZWFtIHRvIHN0cmF0ZWd5IG1hcHBpbmcKLSAgICBzd2l0Y2ggKHN0cmVhbSkgewotICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1BIT05FOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1JJTkc6Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fQUxBUk06Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT047Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX0RUTUY7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR0UoInVua25vd24gc3RyZWFtIHR5cGUgJWQiLCBzdHJlYW0pOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1NZU1RFTToKLSAgICAgICAgLy8gTk9URTogU1lTVEVNIHN0cmVhbSB1c2VzIE1FRElBIHN0cmF0ZWd5IGJlY2F1c2UgbXV0aW5nIG11c2ljIGFuZCBzd2l0Y2hpbmcgb3V0cHV0cwotICAgICAgICAvLyB3aGlsZSBrZXkgY2xpY2tzIGFyZSBwbGF5ZWQgcHJvZHVjZXMgYSBwb29yIHJlc3VsdAotICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfTUVESUE7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRToKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fVFRTOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1JFUk9VVElORzoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1JFUk9VVElORzsKLSAgICB9Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikgewotICAgIC8vIGZsYWdzIHRvIHN0cmF0ZWd5IG1hcHBpbmcKLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19CRUFDT04pID09IEFVRElPX0ZMQUdfQkVBQ09OKSB7Ci0gICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUjsKLSAgICB9Ci0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7Ci0gICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU7Ci0gICAgfQotCi0gICAgLy8gdXNhZ2UgdG8gc3RyYXRlZ3kgbWFwcGluZwotICAgIHN3aXRjaCAoYXR0ci0+dXNhZ2UpIHsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKLSAgICAgICAgaWYgKGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9SSU5HKSB8fCBpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fQUxBUk0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9TT05JRklDQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX1BIT05FOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFk7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgotICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgotICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9NRURJQTsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfUEhPTkU7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfRFRNRjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgotICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9TT05JRklDQVRJT047Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfTUVESUE7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgewotICAgIHN3aXRjaChzdHJlYW0pIHsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCk7Ci0gICAgICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzQW55T3V0cHV0QWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVG9JZ25vcmUpIHsKLSAgICBmb3IgKHNpemVfdCBzID0gMCA7IHMgPCBBVURJT19TVFJFQU1fQ05UIDsgcysrKSB7Ci0gICAgICAgIGlmIChzID09IChzaXplX3QpIHN0cmVhbVRvSWdub3JlKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmhhbmRsZUV2ZW50Rm9yQmVhY29uKGludCBldmVudCkgewotICAgIHN3aXRjaChldmVudCkgewotICAgIGNhc2UgU1RBUlRJTkdfT1VUUFVUOgotICAgICAgICBtQmVhY29uTXV0ZVJlZkNvdW50Kys7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU1RPUFBJTkdfT1VUUFVUOgotICAgICAgICBpZiAobUJlYWNvbk11dGVSZWZDb3VudCA+IDApIHsKLSAgICAgICAgICAgIG1CZWFjb25NdXRlUmVmQ291bnQtLTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFNUQVJUSU5HX0JFQUNPTjoKLSAgICAgICAgbUJlYWNvblBsYXlpbmdSZWZDb3VudCsrOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFNUT1BQSU5HX0JFQUNPTjoKLSAgICAgICAgaWYgKG1CZWFjb25QbGF5aW5nUmVmQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICBtQmVhY29uUGxheWluZ1JlZkNvdW50LS07Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKG1CZWFjb25NdXRlUmVmQ291bnQgPiAwKSB7Ci0gICAgICAgIC8vIGFueSBwbGF5YmFjayBjYXVzZXMgYmVhY29uIHRvIGJlIG11dGVkCi0gICAgICAgIHJldHVybiBzZXRCZWFjb25NdXRlKHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIG5vIG90aGVyIHBsYXliYWNrOiB1bm11dGUgd2hlbiBiZWFjb24gc3RhcnRzIHBsYXlpbmcsIG11dGUgd2hlbiBpdCBzdG9wcwotICAgICAgICByZXR1cm4gc2V0QmVhY29uTXV0ZShtQmVhY29uUGxheWluZ1JlZkNvdW50ID09IDApOwotICAgIH0KLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRCZWFjb25NdXRlKGJvb2wgbXV0ZSkgewotICAgIEFMT0dWKCJzZXRCZWFjb25NdXRlKCVkKSBtQmVhY29uTXV0ZVJlZkNvdW50PSVkIG1CZWFjb25QbGF5aW5nUmVmQ291bnQ9JWQiLAotICAgICAgICAgICAgbXV0ZSwgbUJlYWNvbk11dGVSZWZDb3VudCwgbUJlYWNvblBsYXlpbmdSZWZDb3VudCk7Ci0gICAgLy8ga2VlcCB0cmFjayBvZiBtdXRlZCBzdGF0ZSB0byBhdm9pZCByZXBlYXRpbmcgbXV0ZS91bm11dGUgb3BlcmF0aW9ucwotICAgIGlmIChtQmVhY29uTXV0ZWQgIT0gbXV0ZSkgewotICAgICAgICAvLyBtdXRlL3VubXV0ZSBBVURJT19TVFJFQU1fVFRTIG9uIGFsbCBvdXRwdXRzCi0gICAgICAgIEFMT0dWKCJcdCBtdXRpbmcgJWQiLCBtdXRlKTsKLSAgICAgICAgdWludDMyX3QgbWF4TGF0ZW5jeSA9IDA7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBzZXRTdHJlYW1NdXRlKEFVRElPX1NUUkVBTV9UVFMsIG11dGUvKm9uKi8sCi0gICAgICAgICAgICAgICAgICAgIGRlc2MtPm1Jb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgMCAvKmRlbGF5Ki8sIEFVRElPX0RFVklDRV9OT05FKTsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGxhdGVuY3kgPSBkZXNjLT5sYXRlbmN5KCkgKiAyOwotICAgICAgICAgICAgaWYgKGxhdGVuY3kgPiBtYXhMYXRlbmN5KSB7Ci0gICAgICAgICAgICAgICAgbWF4TGF0ZW5jeSA9IGxhdGVuY3k7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbUJlYWNvbk11dGVkID0gbXV0ZTsKLSAgICAgICAgcmV0dXJuIG1heExhdGVuY3k7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKQotewotICAgIHVpbnQzMl90IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwotCi0gICAgaWYgKGZyb21DYWNoZSkgewotICAgICAgICBBTE9HVlYoImdldERldmljZUZvclN0cmF0ZWd5KCkgZnJvbSBjYWNoZSBzdHJhdGVneSAlZCwgZGV2aWNlICV4IiwKLSAgICAgICAgICAgICAgc3RyYXRlZ3ksIG1EZXZpY2VGb3JTdHJhdGVneVtzdHJhdGVneV0pOwotICAgICAgICByZXR1cm4gbURldmljZUZvclN0cmF0ZWd5W3N0cmF0ZWd5XTsKLSAgICB9Ci0gICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKLSAgICBzd2l0Y2ggKHN0cmF0ZWd5KSB7Ci0KLSAgICBjYXNlIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUjoKLSAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgIGlmICghZGV2aWNlKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yICJcCi0gICAgICAgICAgICAgICAgICAgICJTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIiKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw6Ci0gICAgICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICB9IGVsc2UgaWYgKGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoQVVESU9fU1RSRUFNX01VU0lDLAotICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSkgewotICAgICAgICAgICAgLy8gd2hpbGUgbWVkaWEgaXMgcGxheWluZyBvbiBhIHJlbW90ZSBkZXZpY2UsIHVzZSB0aGUgdGhlIHNvbmlmaWNhdGlvbiBiZWhhdmlvci4KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSB0ZXN0IHRoaXMgdXNlY2FzZSBiZWZvcmUgdGVzdGluZyBpZiBtZWRpYSBpcyBwbGF5aW5nIGJlY2F1c2UKLSAgICAgICAgICAgIC8vICAgdGhlIGlzU3RyZWFtQWN0aXZlKCkgbWV0aG9kIG9ubHkgaW5mb3JtcyBhYm91dCB0aGUgYWN0aXZpdHkgb2YgYSBzdHJlYW0sIG5vdAotICAgICAgICAgICAgLy8gICBpZiBpdCdzIGZvciBsb2NhbCBwbGF5YmFjay4gTm90ZSBhbHNvIHRoYXQgd2UgdXNlIHRoZSBzYW1lIGRlbGF5IGJldHdlZW4gYm90aCB0ZXN0cwotICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgIC8vdXNlciAic2FmZSIgc3BlYWtlciBpZiBhdmFpbGFibGUgaW5zdGVhZCBvZiBub3JtYWwgc3BlYWtlciB0byBhdm9pZCB0cmlnZ2VyaW5nCi0gICAgICAgICAgICAvL290aGVyIGFjb3VzdGljIHNhZmV0eSBtZWNoYW5pc21zIGZvciBub3RpZmljYXRpb24KLSAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSICYmIChhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSkKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKLSAgICAgICAgfSBlbHNlIGlmIChpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSkgewotICAgICAgICAgICAgLy8gd2hpbGUgbWVkaWEgaXMgcGxheWluZyAob3IgaGFzIHJlY2VudGx5IHBsYXllZCksIHVzZSB0aGUgc2FtZSBkZXZpY2UKLSAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHdoZW4gbWVkaWEgaXMgbm90IHBsYXlpbmcgYW55bW9yZSwgZmFsbCBiYWNrIG9uIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IKLSAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICAvL3VzZXIgInNhZmUiIHNwZWFrZXIgaWYgYXZhaWxhYmxlIGluc3RlYWQgb2Ygbm9ybWFsIHNwZWFrZXIgdG8gYXZvaWQgdHJpZ2dlcmluZwotICAgICAgICAgICAgLy9vdGhlciBhY291c3RpYyBzYWZldHkgbWVjaGFuaXNtcyBmb3Igbm90aWZpY2F0aW9uCi0gICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUiAmJiAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkpCi0gICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgU1RSQVRFR1lfRFRNRjoKLSAgICAgICAgaWYgKCFpc0luQ2FsbCgpKSB7Ci0gICAgICAgICAgICAvLyB3aGVuIG9mZiBjYWxsLCBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMgTUVESUEgc3RyYXRlZ3kKLSAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIC8vIHdoZW4gaW4gY2FsbCwgRFRNRiBhbmQgUEhPTkUgc3RyYXRlZ2llcyBmb2xsb3cgdGhlIHNhbWUgcnVsZXMKLSAgICAgICAgLy8gRkFMTCBUSFJPVUdICi0KLSAgICBjYXNlIFNUUkFURUdZX1BIT05FOgotICAgICAgICAvLyBGb3JjZSB1c2Ugb2Ygb25seSBkZXZpY2VzIG9uIHByaW1hcnkgb3V0cHV0IGlmOgotICAgICAgICAvLyAtIGluIGNhbGwgQU5ECi0gICAgICAgIC8vICAgLSBjYW5ub3Qgcm91dGUgZnJvbSB2b2ljZSBjYWxsIFJYIE9SCi0gICAgICAgIC8vICAgLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA8IDMuMCBhbmQgVFggZGV2aWNlIGlzIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZQotICAgICAgICBpZiAobVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHhEZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTik7Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1QcmltYXJ5T3V0cHV0KTsKLSAgICAgICAgICAgIGlmICgoKG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlggJiB+QVVESU9fREVWSUNFX0JJVF9JTikgPT0gMCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKCgodHhEZXZpY2UgJiBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAoaHdPdXRwdXREZXNjLT5nZXRBdWRpb1BvcnQoKS0+bU1vZHVsZS0+bUhhbFZlcnNpb24gPAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSkpIHsKLSAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyA9IGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZm9yIHBob25lIHN0cmF0ZWd5LCB3ZSBmaXJzdCBjb25zaWRlciB0aGUgZm9yY2VkIHVzZSBhbmQgdGhlbiB0aGUgYXZhaWxhYmxlIGRldmljZXMgYnkgb3JkZXIKLSAgICAgICAgLy8gb2YgcHJpb3JpdHkKLSAgICAgICAgc3dpdGNoIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSkgewotICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ086Ci0gICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgfHwgc3RyYXRlZ3kgIT0gU1RSQVRFR1lfRFRNRikgewotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVDsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPOwotICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICAvLyBpZiBTQ08gZGV2aWNlIGlzIHJlcXVlc3RlZCBidXQgbm8gU0NPIGRldmljZSBpcyBhdmFpbGFibGUsIGZhbGwgYmFjayB0byBkZWZhdWx0IGNhc2UKLSAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSAotCi0gICAgICAgIGRlZmF1bHQ6ICAgIC8vIEZPUkNFX05PTkUKLSAgICAgICAgICAgIC8vIHdoZW4gbm90IGluIGEgcGhvbmUgY2FsbCwgcGhvbmUgc3RyYXRlZ3kgc2hvdWxkIHJvdXRlIFNUUkVBTV9WT0lDRV9DQUxMIHRvIEEyRFAKLSAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgotICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgotICAgICAgICAgICAgICAgICAgICAoZ2V0QTJkcE91dHB1dCgpICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORTsKLSAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOwotICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICBpZiAobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0U7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGRldmljZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tRGV2aWNlVHlwZTsKLSAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIFNUUkFURUdZX1BIT05FIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSOgotICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8KLSAgICAgICAgICAgIC8vIEEyRFAgc3BlYWtlciB3aGVuIGZvcmNpbmcgdG8gc3BlYWtlciBvdXRwdXQKLSAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgotICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgotICAgICAgICAgICAgICAgICAgICAoZ2V0QTJkcE91dHB1dCgpICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQ7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVDsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9MSU5FOwotICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgZGV2aWNlID0gbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlOwotICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3IgU1RSQVRFR1lfUEhPTkUsIEZPUkNFX1NQRUFLRVIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTjoKLQotICAgICAgICAvLyBJZiBpbmNhbGwsIGp1c3Qgc2VsZWN0IHRoZSBTVFJBVEVHWV9QSE9ORSBkZXZpY2U6IFRoZSByZXN0IG9mIHRoZSBiZWhhdmlvciBpcyBoYW5kbGVkIGJ5Ci0gICAgICAgIC8vIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpLgotICAgICAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRkFMTCBUSFJPVUdICi0KLSAgICBjYXNlIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU6Ci0gICAgICAgIC8vIHN0cmF0ZWd5IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUgdXNlcyBzYW1lIHJvdXRpbmcgcG9saWN5IGFzIFNUUkFURUdZX1NPTklGSUNBVElPTgotICAgICAgICAvLyBleGNlcHQ6Ci0gICAgICAgIC8vICAgLSB3aGVuIGluIGNhbGwgd2hlcmUgaXQgZG9lc24ndCBkZWZhdWx0IHRvIFNUUkFURUdZX1BIT05FIGJlaGF2aW9yCi0gICAgICAgIC8vICAgLSBpbiBjb3VudHJpZXMgd2hlcmUgbm90IGVuZm9yY2VkIGluIHdoaWNoIGNhc2UgaXQgZm9sbG93cyBTVFJBVEVHWV9NRURJQQotCi0gICAgICAgIGlmICgoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAotICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBzcGVha2VyIGRldmljZSBub3QgZm91bmQgZm9yIFNUUkFURUdZX1NPTklGSUNBVElPTiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFRoZSBzZWNvbmQgZGV2aWNlIHVzZWQgZm9yIHNvbmlmaWNhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgZGV2aWNlIHVzZWQgYnkgbWVkaWEgc3RyYXRlZ3kKLSAgICAgICAgLy8gRkFMTCBUSFJPVUdICi0KLSAgICAvLyBGSVhNRTogU1RSQVRFR1lfQUNDRVNTSUJJTElUWSBhbmQgU1RSQVRFR1lfUkVST1VUSU5HIGZvbGxvdyBTVFJBVEVHWV9NRURJQSBmb3Igbm93Ci0gICAgY2FzZSBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZOgotICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfQUNDRVNTSUJJTElUWSkgewotICAgICAgICAgICAgLy8gZG8gbm90IHJvdXRlIGFjY2Vzc2liaWxpdHkgcHJvbXB0cyB0byBhIGRpZ2l0YWwgb3V0cHV0IGN1cnJlbnRseSBjb25maWd1cmVkIHdpdGggYQotICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBmb3JtYXQgYXMgdGhleSB3b3VsZCBsaWtlbHkgbm90IGJlIG1peGVkIGFuZCBkcm9wcGVkLgotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBkZXNjLT5kZXZpY2UoKSAmCi0gICAgICAgICAgICAgICAgICAgIChBVURJT19ERVZJQ0VfT1VUX0hETUkgfCBBVURJT19ERVZJQ0VfT1VUX1NQRElGIHwgQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQyk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2MtPmlzQWN0aXZlKCkgJiYgIWF1ZGlvX2lzX2xpbmVhcl9wY20oZGVzYy0+bUZvcm1hdCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIH5kZXZpY2VzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBGQUxMIFRIUk9VR0gKLQotICAgIGNhc2UgU1RSQVRFR1lfUkVST1VUSU5HOgotICAgIGNhc2UgU1RSQVRFR1lfTUVESUE6IHsKLSAgICAgICAgdWludDMyX3QgZGV2aWNlMiA9IEFVRElPX0RFVklDRV9OT05FOwotICAgICAgICBpZiAoc3RyYXRlZ3kgIT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB7Ci0gICAgICAgICAgICAvLyBubyBzb25pZmljYXRpb24gb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCi0gICAgICAgICAgICBpZiAobUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwgU3RyaW5nOCgiMCIpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKLSAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgotICAgICAgICAgICAgICAgIChnZXRBMmRwT3V0cHV0KCkgIT0gMCkpIHsKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKLSAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVIpKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkpIHsKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfTElORTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmIChzdHJhdGVneSAhPSBTVFJBVEVHWV9TT05JRklDQVRJT04pKSB7Ci0gICAgICAgICAgICAvLyBubyBzb25pZmljYXRpb24gb24gYXV4IGRpZ2l0YWwgKGUuZy4gSERNSSkKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJgotICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQU5BTE9HX0RPQ0spKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGRldmljZTMgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSB7Ci0gICAgICAgICAgICAvLyBBUkMsIFNQRElGIGFuZCBBVVhfTElORSBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMuCi0gICAgICAgICAgICBkZXZpY2UzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDOwotICAgICAgICAgICAgZGV2aWNlMyB8PSAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRElGKTsKLSAgICAgICAgICAgIGRldmljZTMgfD0gKGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BVVhfTElORSk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZXZpY2UyIHw9IGRldmljZTM7Ci0gICAgICAgIC8vIGRldmljZSBpcyBERVZJQ0VfT1VUX1NQRUFLRVIgaWYgd2UgY29tZSBmcm9tIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OIG9yCi0gICAgICAgIC8vIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIEFVRElPX0RFVklDRV9OT05FIG90aGVyd2lzZQotICAgICAgICBkZXZpY2UgfD0gZGV2aWNlMjsKLQotICAgICAgICAvLyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCi0gICAgICAgIGlmICgoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpICYmCi0gICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU9dID09Ci0gICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0hETUlfU1lTVEVNX0FVRElPX0VORk9SQ0VEKSkgewotICAgICAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgZGV2aWNlID0gbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlOwotICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIFNUUkFURUdZX01FRElBIik7Ci0gICAgICAgIH0KLSAgICAgICAgfSBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dXKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIHVua25vd24gc3RyYXRlZ3k6ICVkIiwgc3RyYXRlZ3kpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBBTE9HVlYoImdldERldmljZUZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIGRldmljZSAleCIsIHN0cmF0ZWd5LCBkZXZpY2UpOwotICAgIHJldHVybiBkZXZpY2U7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7Ci0gICAgICAgIG1EZXZpY2VGb3JTdHJhdGVneVtpXSA9IGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIH0KLSAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByZXZEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcykKLXsKLSAgICAvLyBtdXRlL3VubXV0ZSBzdHJhdGVnaWVzIHVzaW5nIGFuIGluY29tcGF0aWJsZSBkZXZpY2UgY29tYmluYXRpb24KLSAgICAvLyBpZiBtdXRpbmcsIHdhaXQgZm9yIHRoZSBhdWRpbyBpbiBwY20gYnVmZmVyIHRvIGJlIGRyYWluZWQgYmVmb3JlIHByb2NlZWRpbmcKLSAgICAvLyBpZiB1bm11dGluZywgdW5tdXRlIG9ubHkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheQotICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBtdXRlV2FpdE1zID0gMDsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7Ci0gICAgYm9vbCBzaG91bGRNdXRlID0gb3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAocG9wY291bnQoZGV2aWNlKSA+PSAyKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgewotICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIGN1ckRldmljZSA9IGN1ckRldmljZSAmIG91dHB1dERlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpOwotICAgICAgICBib29sIG11dGUgPSBzaG91bGRNdXRlICYmIChjdXJEZXZpY2UgJiBkZXZpY2UpICYmIChjdXJEZXZpY2UgIT0gZGV2aWNlKTsKLSAgICAgICAgYm9vbCBkb011dGUgPSBmYWxzZTsKLQotICAgICAgICBpZiAobXV0ZSAmJiAhb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSkgewotICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKCFtdXRlICYmIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0pewotICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZG9NdXRlKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1PdXRwdXRzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChqKTsKLSAgICAgICAgICAgICAgICAvLyBza2lwIG91dHB1dCBpZiBpdCBkb2VzIG5vdCBzaGFyZSBhbnkgZGV2aWNlIHdpdGggY3VycmVudCBvdXRwdXQKLSAgICAgICAgICAgICAgICBpZiAoKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBjdXJPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChqKTsKLSAgICAgICAgICAgICAgICBBTE9HVlYoImNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoKSAlcyBzdHJhdGVneSAlZCAoY3VyRGV2aWNlICUwNHgpIG9uIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgbXV0ZSA/ICJtdXRpbmciIDogInVubXV0aW5nIiwgaSwgY3VyRGV2aWNlLCBjdXJPdXRwdXQpOwotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCBtdXRlLCBjdXJPdXRwdXQsIG11dGUgPyAwIDogZGVsYXlNcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoKHJvdXRpbmdfc3RyYXRlZ3kpaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG11dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBzaG91bGQgbm90IG5lZWQgdG8gZG91YmxlIGxhdGVuY3kgaWYgdm9sdW1lIGNvdWxkIGJlIGFwcGxpZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGJ5IHRoZSBhdWRpb2ZsaW5nZXIgbWl4ZXIuIFdlIG11c3QgYWNjb3VudCBmb3IgdGhlIGRlbGF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuIG5vdyBhbmQgdGhlIG5leHQgdGltZSB0aGUgYXVkaW9mbGluZ2VyIHRocmVhZCBmb3IgdGhpcyBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgcHJvY2VzcyBhIGJ1ZmZlciAod2hpY2ggY29ycmVzcG9uZHMgdG8gb25lIGJ1ZmZlciBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXN1YWxseSAxLzIgb3IgMS80IG9mIHRoZSBsYXRlbmN5KS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdXRlV2FpdE1zIDwgZGVzYy0+bGF0ZW5jeSgpICogMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGVXYWl0TXMgPSBkZXNjLT5sYXRlbmN5KCkgKiAyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gdGVtcG9yYXJ5IG11dGUgb3V0cHV0IGlmIGRldmljZSBzZWxlY3Rpb24gY2hhbmdlcyB0byBhdm9pZCB2b2x1bWUgYnVyc3RzIGR1ZSB0bwotICAgIC8vIGRpZmZlcmVudCBwZXIgZGV2aWNlIHZvbHVtZXMKLSAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAoZGV2aWNlICE9IHByZXZEZXZpY2UpKSB7Ci0gICAgICAgIGlmIChtdXRlV2FpdE1zIDwgb3V0cHV0RGVzYy0+bGF0ZW5jeSgpICogMikgewotICAgICAgICAgICAgbXV0ZVdhaXRNcyA9IG91dHB1dERlc2MtPmxhdGVuY3koKSAqIDI7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZSgocm91dGluZ19zdHJhdGVneSlpKSkgewotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCB0cnVlLCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgICAgIC8vIGRvIHRlbXBNdXRlIHVubXV0ZSBhZnRlciB0d2ljZSB0aGUgbXV0ZSB3YWl0IHRpbWUKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UsIG91dHB1dERlc2MtPm1Jb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZVdhaXRNcyAqMiwgZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHdhaXQgZm9yIHRoZSBQQ00gb3V0cHV0IGJ1ZmZlcnMgdG8gZW1wdHkgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZAotICAgIGlmIChtdXRlV2FpdE1zID4gZGVsYXlNcykgewotICAgICAgICBtdXRlV2FpdE1zIC09IGRlbGF5TXM7Ci0gICAgICAgIHVzbGVlcChtdXRlV2FpdE1zICogMTAwMCk7Ci0gICAgICAgIHJldHVybiBtdXRlV2FpdE1zOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRPdXRwdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MpCi17Ci0gICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIG91dHB1dCAlZCBkZXZpY2UgJTA0eCBkZWxheU1zICVkIiwgb3V0cHV0LCBkZXZpY2UsIGRlbGF5TXMpOwotICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07Ci0gICAgdWludDMyX3QgbXV0ZVdhaXRNczsKLQotICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPm1PdXRwdXQxLT5tSW9IYW5kbGUsIGRldmljZSwgZm9yY2UsIGRlbGF5TXMpOwotICAgICAgICBtdXRlV2FpdE1zICs9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5tT3V0cHV0Mi0+bUlvSGFuZGxlLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zKTsKLSAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7Ci0gICAgfQotICAgIC8vIG5vIG5lZWQgdG8gcHJvY2VlZCBpZiBuZXcgZGV2aWNlIGlzIG5vdCBBVURJT19ERVZJQ0VfTk9ORSBhbmQgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50Ci0gICAgLy8gb3V0cHV0IHByb2ZpbGUKLSAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKLSAgICAgICAgICAgICgoZGV2aWNlICYgb3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpID09IDApKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIGZpbHRlciBkZXZpY2VzIGFjY29yZGluZyB0byBvdXRwdXQgc2VsZWN0ZWQKLSAgICBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KShkZXZpY2UgJiBvdXRwdXREZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSk7Ci0KLSAgICBhdWRpb19kZXZpY2VzX3QgcHJldkRldmljZSA9IG91dHB1dERlc2MtPm1EZXZpY2U7Ci0KLSAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgcHJldkRldmljZSAlMDR4IiwgcHJldkRldmljZSk7Ci0KLSAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgfQotICAgIG11dGVXYWl0TXMgPSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKG91dHB1dERlc2MsIHByZXZEZXZpY2UsIGRlbGF5TXMpOwotCi0gICAgLy8gRG8gbm90IGNoYW5nZSB0aGUgcm91dGluZyBpZjoKLSAgICAvLyAgICAgIHRoZSByZXF1ZXN0ZWQgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9OT05FCi0gICAgLy8gICAgICBPUiB0aGUgcmVxdWVzdGVkIGRldmljZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50IGRldmljZQotICAgIC8vICBBTkQgZm9yY2UgaXMgbm90IHNwZWNpZmllZAotICAgIC8vICBBTkQgdGhlIG91dHB1dCBpcyBjb25uZWN0ZWQgYnkgYSB2YWxpZCBhdWRpbyBwYXRjaC4KLSAgICAvLyBEb2luZyB0aGlzIGNoZWNrIGhlcmUgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY2FsbCBzZXRPdXRwdXREZXZpY2UoKSB3aXRob3V0IGNvbmRpdGlvbnMKLSAgICBpZiAoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fCBkZXZpY2UgPT0gcHJldkRldmljZSkgJiYgIWZvcmNlICYmCi0gICAgICAgICAgICBvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUgIT0gMCkgewotICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgc2V0dGluZyBzYW1lIGRldmljZSAlMDR4IG9yIG51bGwgZGV2aWNlIGZvciBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICBkZXZpY2UsIG91dHB1dCk7Ci0gICAgICAgIHJldHVybiBtdXRlV2FpdE1zOwotICAgIH0KLQotICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBjaGFuZ2luZyBkZXZpY2UiKTsKLQotICAgIC8vIGRvIHRoZSByb3V0aW5nCi0gICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICByZXNldE91dHB1dERldmljZShvdXRwdXQsIGRlbGF5TXMsIE5VTEwpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gKGFkZHJlc3MgPT0gTlVMTCkgPwotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpCi0gICAgICAgICAgICAgICAgOiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVBZGRyKGRldmljZSwgU3RyaW5nOChhZGRyZXNzKSk7Ci0gICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDA7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZUxpc3Quc2l6ZSgpICYmIGkgPCBBVURJT19QQVRDSF9QT1JUU19NQVg7IGkrKykgewotICAgICAgICAgICAgICAgIGRldmljZUxpc3QuaXRlbUF0KGkpLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbaV0pOwotICAgICAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3NpemVfdCBpbmRleDsKLSAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOwotICAgICAgICAgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiCi0gICAgICAgICAgICAgICAgICAgICJudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlLCBwYXRjaC5udW1fc291cmNlcywgcGF0Y2gubnVtX3NpbmtzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKChhdWRpb19wYXRjaF9oYW5kbGVfdCluZXh0VW5pcXVlSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGNoLCBtVWlkQ2FjaGVkKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBwYXRjaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tVWlkID0gbVVpZENhY2hlZDsKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7Ci0gICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaW5mb3JtIGFsbCBpbnB1dCBhcyB3ZWxsCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWlzVmlydHVhbElucHV0RGV2aWNlKGlucHV0RGVzY3JpcHRvci0+bURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBpbnB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBpbmZvcm0gaW5wdXQgJWQgb2YgZGV2aWNlOiVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgaW5wdXRDbWQuYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLGRldmljZSk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDbWQudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHVwZGF0ZSBzdHJlYW0gdm9sdW1lcyBhY2NvcmRpbmcgdG8gbmV3IGRldmljZQotICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXQsIGRldmljZSwgZGVsYXlNcyk7Ci0KLSAgICByZXR1cm4gbXV0ZVdhaXRNczsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZXNldE91dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUpCi17Ci0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICBzc2l6ZV90IGluZGV4OwotICAgIGlmIChwYXRjaEhhbmRsZSkgewotICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7Ci0gICAgfQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgZGVsYXlNcyk7Ci0gICAgQUxPR1YoInJlc2V0T3V0cHV0RGV2aWNlKCkgcmVsZWFzZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQiLCBzdGF0dXMpOwotICAgIG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IDA7Ci0gICAgcmVtb3ZlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUpOwotICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0KLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7Ci0gICAgaWYgKChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpICYmICgoZGV2aWNlICE9IGlucHV0RGVzYy0+bURldmljZSkgfHwgZm9yY2UpKSB7Ci0gICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKLQotICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKLSAgICAgICAgICAgIGlucHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKLSAgICAgICAgICAgIC8vIEFVRElPX1NPVVJDRV9IT1RXT1JEIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seToKLSAgICAgICAgICAgIC8vIGhhbmRsZWQgYXMgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIGJ5IHRoZSBhdWRpbyBIQUwKLSAgICAgICAgICAgIGlmIChwYXRjaC5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmCi0gICAgICAgICAgICAgICAgICAgICFpbnB1dERlc2MtPm1Jc1NvdW5kVHJpZ2dlcikgewotICAgICAgICAgICAgICAgIHBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAxOwotICAgICAgICAgICAgLy9vbmx5IG9uZSBpbnB1dCBkZXZpY2UgZm9yIG5vdwotICAgICAgICAgICAgZGV2aWNlTGlzdC5pdGVtQXQoMCktPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXg7Ci0gICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUgJiYgKnBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXRJbnB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goKGF1ZGlvX3BhdGNoX2hhbmRsZV90KW5leHRVbmlxdWVJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0Y2gsIG1VaWRDYWNoZWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IHBhdGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1VaWQgPSBtVWlkQ2FjaGVkOwotICAgICAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOwotICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlc2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlKQotewotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKLSAgICBzc2l6ZV90IGluZGV4OwotICAgIGlmIChwYXRjaEhhbmRsZSkgewotICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKLSAgICB9Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKLSAgICBBTE9HVigicmVzZXRJbnB1dERldmljZSgpIHJlbGVhc2VBdWRpb1BhdGNoIHJldHVybmVkICVkIiwgc3RhdHVzKTsKLSAgICBpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IDA7Ci0gICAgcmVtb3ZlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUpOwotICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zcDxBdWRpb1BvbGljeU1hbmFnZXI6OklPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dFByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCi17Ci0gICAgLy8gQ2hvb3NlIGFuIGlucHV0IHByb2ZpbGUgYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBjYXB0dXJlIHBhcmFtZXRlcnM6IHNlbGVjdCB0aGUgZmlyc3QgYXZhaWxhYmxlCi0gICAgLy8gcHJvZmlsZSBzdXBwb3J0aW5nIGFsbCByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzW2pdOwotICAgICAgICAgICAgLy8gcHJvZmlsZS0+bG9nKCk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIGFkZHJlc3MsIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIGZsYWdzKSkgewotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCkKLXsKLSAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+QVVESU9fREVWSUNFX0JJVF9JTjsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBvbGljeU1peGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtUG9saWN5TWl4ZXNbaV0tPm1NaXgubU1peFR5cGUgIT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tQ3JpdGVyaWEuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIGlmICgoUlVMRV9NQVRDSF9BVFRSSUJVVEVfQ0FQVFVSRV9QUkVTRVQgPT0gbVBvbGljeU1peGVzW2ldLT5tTWl4Lm1Dcml0ZXJpYVtqXS5tUnVsZSAmJgotICAgICAgICAgICAgICAgICAgICBtUG9saWN5TWl4ZXNbaV0tPm1NaXgubUNyaXRlcmlhW2pdLm1BdHRyLm1Tb3VyY2UgPT0gaW5wdXRTb3VyY2UpIHx8Ci0gICAgICAgICAgICAgICAoUlVMRV9FWENMVURFX0FUVFJJQlVURV9DQVBUVVJFX1BSRVNFVCA9PSBtUG9saWN5TWl4ZXNbaV0tPm1NaXgubUNyaXRlcmlhW2pdLm1SdWxlICYmCi0gICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tQ3JpdGVyaWFbal0ubUF0dHIubVNvdXJjZSAhPSBpbnB1dFNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwb2xpY3lNaXggPSAmbVBvbGljeU1peGVzW2ldLT5tTWl4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpOwotfQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkKLXsKLSAgICB1aW50MzJfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+QVVESU9fREVWSUNFX0JJVF9JTjsKLQotICAgIHN3aXRjaCAoaW5wdXRTb3VyY2UpIHsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks6Ci0gICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCkgewotICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFVRElPX1NPVVJDRV9ERUZBVUxUOgotICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzoKLSAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQOwotICAgIH0gZWxzZSBpZiAoKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgJiYKLSAgICAgICAgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkpIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKLSAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7Ci0gICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSB7Ci0gICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFOwotICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOwotICAgIH0KLSAgICBicmVhazsKLQotICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgIC8vIEFsbG93IG9ubHkgdXNlIG9mIGRldmljZXMgb24gcHJpbWFyeSBpbnB1dCBpZiBpbiBjYWxsIGFuZCBIQUwgZG9lcyBub3Qgc3VwcG9ydCByb3V0aW5nCi0gICAgICAgIC8vIHRvIHZvaWNlIGNhbGwgcGF0aC4KLSAgICAgICAgaWYgKChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpICYmCi0gICAgICAgICAgICAgICAgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCkgPT0gMCkgewotICAgICAgICAgICAgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pIHsKLSAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPOgotICAgICAgICAgICAgLy8gaWYgU0NPIGRldmljZSBpcyByZXF1ZXN0ZWQgYnV0IG5vIFNDTyBkZXZpY2UgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gZGVmYXVsdCBjYXNlCi0gICAgICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSAotCi0gICAgICAgIGRlZmF1bHQ6ICAgIC8vIEZPUkNFX05PTkUKLSAgICAgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSOgotICAgICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgewotICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT046Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfSE9UV09SRDoKLSAgICAgICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTyAmJgotICAgICAgICAgICAgICAgIGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKLSAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVDsKLSAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRTsKLSAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKLSAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUM7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOgotICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCkgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEw7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDoKLSAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICBjYXNlIEFVRElPX1NPVVJDRV9GTV9UVU5FUjoKLSAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1coImdldERldmljZUZvcklucHV0U291cmNlKCkgaW52YWxpZCBpbnB1dCBzb3VyY2UgJWQiLCBpbnB1dFNvdXJjZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBBTE9HVigiZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKWlucHV0IHNvdXJjZSAlZCwgZGV2aWNlICUwOHgiLCBpbnB1dFNvdXJjZSwgZGV2aWNlKTsKLSAgICByZXR1cm4gZGV2aWNlOwotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNWaXJ0dWFsSW5wdXREZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBpZiAoKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApIHsKLSAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgICAgICBpZiAoKHBvcGNvdW50KGRldmljZSkgPT0gMSkgJiYgKChkZXZpY2UgJiB+QVBNX0FVRElPX0lOX0RFVklDRV9WSVJUVUFMX0FMTCkgPT0gMCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSB7Ci0gICAgcmV0dXJuICgoZGV2aWNlICYgQVBNX0FVRElPX0RFVklDRV9NQVRDSF9BRERSRVNTX0FMTCAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKTsKLX0KLQotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRBY3RpdmVJbnB1dChib29sIGlnbm9yZVZpcnR1YWxJbnB1dHMpCi17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXRfZGVzY3JpcHRvciA9IG1JbnB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKChpbnB1dF9kZXNjcmlwdG9yLT5tUmVmQ291bnQgPiAwKQotICAgICAgICAgICAgICAgICYmICghaWdub3JlVmlydHVhbElucHV0cyB8fCAhaXNWaXJ0dWFsSW5wdXREZXZpY2UoaW5wdXRfZGVzY3JpcHRvci0+bURldmljZSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUlucHV0cy5rZXlBdChpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphY3RpdmVJbnB1dHNDb3VudCgpIGNvbnN0Ci17Ci0gICAgdWludDMyX3QgY291bnQgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChkZXNjLT5tUmVmQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjb3VudDsKLX0KLQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIC8vIHRoaXMgaGFwcGVucyB3aGVuIGZvcmNpbmcgYSByb3V0ZSB1cGRhdGUgYW5kIG5vIHRyYWNrIGlzIGFjdGl2ZSBvbiBhbiBvdXRwdXQuCi0gICAgICAgIC8vIEluIHRoaXMgY2FzZSB0aGUgcmV0dXJuZWQgY2F0ZWdvcnkgaXMgbm90IGltcG9ydGFudC4KLSAgICAgICAgZGV2aWNlID0gIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICB9IGVsc2UgaWYgKHBvcGNvdW50KGRldmljZSkgPiAxKSB7Ci0gICAgICAgIC8vIE11bHRpcGxlIGRldmljZSBzZWxlY3Rpb24gaXMgZWl0aGVyOgotICAgICAgICAvLyAgLSBzcGVha2VyICsgb25lIG90aGVyIGRldmljZTogZ2l2ZSBwcmlvcml0eSB0byBzcGVha2VyIGluIHRoaXMgY2FzZS4KLSAgICAgICAgLy8gIC0gb25lIEEyRFAgZGV2aWNlICsgYW5vdGhlciBkZXZpY2U6IGhhcHBlbnMgd2l0aCBkdXBsaWNhdGVkIG91dHB1dC4gSW4gdGhpcyBjYXNlCi0gICAgICAgIC8vIHJldGFpbiB0aGUgZGV2aWNlIG9uIHRoZSBBMkRQIG91dHB1dCBhcyB0aGUgb3RoZXIgbXVzdCBub3QgY29ycmVzcG9uZCB0byBhbiBhY3RpdmUKLSAgICAgICAgLy8gc2VsZWN0aW9uIGlmIG5vdCB0aGUgc3BlYWtlci4KLSAgICAgICAgLy8gIC0gSERNSS1DRUMgc3lzdGVtIGF1ZGlvIG1vZGUgb25seSBvdXRwdXQ6IGdpdmUgcHJpb3JpdHkgdG8gYXZhaWxhYmxlIGl0ZW0gaW4gb3JkZXIuCi0gICAgICAgIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDOwotICAgICAgICB9IGVsc2UgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUERJRikgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUERJRjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLypTUEVBS0VSX1NBRkUgaXMgYW4gYWxpYXMgb2YgU1BFQUtFUiBmb3IgcHVycG9zZXMgb2Ygdm9sdW1lIGNvbnRyb2wqLwotICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpCi0gICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLQotICAgIEFMT0dXX0lGKHBvcGNvdW50KGRldmljZSkgIT0gMSwKLSAgICAgICAgICAgICJnZXREZXZpY2VGb3JWb2x1bWUoKSBpbnZhbGlkIGRldmljZSBjb21iaW5hdGlvbjogJTA4eCIsCi0gICAgICAgICAgICBkZXZpY2UpOwotCi0gICAgcmV0dXJuIGRldmljZTsKLX0KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkZXZpY2VfY2F0ZWdvcnkgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VDYXRlZ29yeShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotewotICAgIHN3aXRjaChnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKSkgewotICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0U6Ci0gICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFOwotICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVDoKLSAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORToKLSAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ086Ci0gICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQ6Ci0gICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDoKLSAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6Ci0gICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQ7Ci0gICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9MSU5FOgotICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw6Ci0gICAgICAgIC8qVVNCPyAgUmVtb3RlIHN1Ym1peD8qLwotICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUE7Ci0gICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOgotICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQ6Ci0gICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOgotICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWToKLSAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6Ci0gICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9TUEVBS0VSOwotICAgIH0KLX0KLQotLyogc3RhdGljICovCi1mbG9hdCBBdWRpb1BvbGljeU1hbmFnZXI6OnZvbEluZGV4VG9BbXBsKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IFN0cmVhbURlc2NyaXB0b3ImIHN0cmVhbURlc2MsCi0gICAgICAgIGludCBpbmRleEluVWkpCi17Ci0gICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5ID0gZ2V0RGV2aWNlQ2F0ZWdvcnkoZGV2aWNlKTsKLSAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpjdXJ2ZSA9IHN0cmVhbURlc2MubVZvbHVtZUN1cnZlW2RldmljZUNhdGVnb3J5XTsKLQotICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0gdHlwZQotICAgIGludCBuYlN0ZXBzID0gMSArIGN1cnZlW1ZPTE1BWF0ubUluZGV4IC0KLSAgICAgICAgICAgIGN1cnZlW1ZPTE1JTl0ubUluZGV4OwotICAgIGludCB2b2xJZHggPSAobmJTdGVwcyAqIChpbmRleEluVWkgLSBzdHJlYW1EZXNjLm1JbmRleE1pbikpIC8KLSAgICAgICAgICAgIChzdHJlYW1EZXNjLm1JbmRleE1heCAtIHN0cmVhbURlc2MubUluZGV4TWluKTsKLQotICAgIC8vIGZpbmQgd2hhdCBwYXJ0IG9mIHRoZSBjdXJ2ZSB0aGlzIGluZGV4IHZvbHVtZSBiZWxvbmdzIHRvLCBvciBpZiBpdCdzIG91dCBvZiBib3VuZHMKLSAgICBpbnQgc2VnbWVudCA9IDA7Ci0gICAgaWYgKHZvbElkeCA8IGN1cnZlW1ZPTE1JTl0ubUluZGV4KSB7ICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcwotICAgICAgICByZXR1cm4gMC4wZjsKLSAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZPTEtORUUxXS5tSW5kZXgpIHsKLSAgICAgICAgc2VnbWVudCA9IDA7Ci0gICAgfSBlbHNlIGlmICh2b2xJZHggPCBjdXJ2ZVtWT0xLTkVFMl0ubUluZGV4KSB7Ci0gICAgICAgIHNlZ21lbnQgPSAxOwotICAgIH0gZWxzZSBpZiAodm9sSWR4IDw9IGN1cnZlW1ZPTE1BWF0ubUluZGV4KSB7Ci0gICAgICAgIHNlZ21lbnQgPSAyOwotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcwotICAgICAgICByZXR1cm4gMS4wZjsKLSAgICB9Ci0KLSAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpbiB0aGUgYXR0ZW51YXRpb24gdGFibGUgaW4gZEIKLSAgICBmbG9hdCBkZWNpYmVscyA9IGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uICsKLSAgICAgICAgICAgICgoZmxvYXQpKHZvbElkeCAtIGN1cnZlW3NlZ21lbnRdLm1JbmRleCkpICoKLSAgICAgICAgICAgICAgICAoIChjdXJ2ZVtzZWdtZW50KzFdLm1EQkF0dGVudWF0aW9uIC0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uKSAvCi0gICAgICAgICAgICAgICAgICAgICgoZmxvYXQpKGN1cnZlW3NlZ21lbnQrMV0ubUluZGV4IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgpKSApOwotCi0gICAgZmxvYXQgYW1wbGlmaWNhdGlvbiA9IGV4cCggZGVjaWJlbHMgKiAwLjExNTEyOWYpOyAvLyBleHAoIGRCICogbG4oMTApIC8gMjAgKQotCi0gICAgQUxPR1ZWKCJWT0xVTUUgdm9sIGluZGV4PVslZCAlZCAlZF0sIGRCPVslLjFmICUuMWYgJS4xZl0gYW1wbD0lLjVmIiwKLSAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1JbmRleCwgdm9sSWR4LAotICAgICAgICAgICAgY3VydmVbc2VnbWVudCsxXS5tSW5kZXgsCi0gICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbiwKLSAgICAgICAgICAgIGRlY2liZWxzLAotICAgICAgICAgICAgY3VydmVbc2VnbWVudCsxXS5tREJBdHRlbnVhdGlvbiwKLSAgICAgICAgICAgIGFtcGxpZmljYXRpb24pOwotCi0gICAgcmV0dXJuIGFtcGxpZmljYXRpb247Ci19Ci0KLWNvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAotICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0RlZmF1bHRWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7Ci0gICAgezEsIC00OS41Zn0sIHszMywgLTMzLjVmfSwgezY2LCAtMTcuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTguMGZ9LCB7MjAsIC00MC4wZn0sIHs2MCwgLTE3LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAotICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTguMGZ9LCB7MjAsIC00MC4wZn0sIHs2MCwgLTIxLjBmfSwgezEwMCwgLTEwLjBmfQotfTsKLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTYuMGZ9LCB7MjAsIC0zNC4wZn0sIHs2MCwgLTExLjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAotICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTU1LjBmfSwgezIwLCAtNDMuMGZ9LCB7ODYsIC0xMi4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKLSAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0gewotICAgIHsxLCAtMjkuN2Z9LCB7MzMsIC0yMC4xZn0sIHs2NiwgLTEwLjJmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAotICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyY1tBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0zNS43Zn0sIHszMywgLTI2LjFmfSwgezY2LCAtMTMuMmZ9LCB7MTAwLCAwLjBmfQotfTsKLQotLy8gQVVESU9fU1RSRUFNX1NZU1RFTSwgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUgYW5kIEFVRElPX1NUUkVBTV9EVE1GIHZvbHVtZSB0cmFja3MKLS8vIEFVRElPX1NUUkVBTV9SSU5HIG9uIHBob25lcyBhbmQgQVVESU9fU1RSRUFNX01VU0lDIG9uIHRhYmxldHMuCi0vLyBBVURJT19TVFJFQU1fRFRNRiB0cmFja3MgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgd2hpbGUgaW4gY2FsbCAoU2VlIEF1ZGlvU2VydmljZS5qYXZhKS4KLS8vIFRoZSByYW5nZSBpcyBjb25zdHJhaW5lZCBiZXR3ZWVuIC0yNGRCIGFuZCAtNmRCIG92ZXIgc3BlYWtlciBhbmQgLTMwZEIgYW5kIC0xOGRCIG92ZXIgaGVhZHNldC4KLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTI0LjBmfSwgezMzLCAtMTguMGZ9LCB7NjYsIC0xMi4wZn0sIHsxMDAsIC02LjBmfQotfTsKLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTM0LjBmfSwgezMzLCAtMjQuMGZ9LCB7NjYsIC0xNS4wZn0sIHsxMDAsIC02LjBmfQotfTsKLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTMwLjBmfSwgezMzLCAtMjYuMGZ9LCB7NjYsIC0yMi4wZn0sIHsxMDAsIC0xOC4wZn0KLX07Ci0KLWNvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAotICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKLSAgICB7MCwgLTQyLjBmfSwgezMzLCAtMjguMGZ9LCB7NjYsIC0xNC4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKLSAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7Ci0gICAgezAsIC0yNC4wZn0sIHszMywgLTE2LjBmfSwgezY2LCAtOC4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKLSAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNMaW5lYXJWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7Ci0gICAgezAsIC05Ni4wZn0sIHszMywgLTY4LjBmfSwgezY2LCAtMzQuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzU2lsZW50Vm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0gewotICAgIHswLCAtOTYuMGZ9LCB7MSwgLTk2LjBmfSwgezIsIC05Ni4wZn0sIHsxMDAsIC05Ni4wZn0KLX07Ci0KLWNvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAotICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKLSAgICB7MCwgMC4wZn0sIHsxLCAwLjBmfSwgezIsIDAuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgICAgICAgICAqQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0NOVF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBdWRpb1BvbGljeU1hbmFnZXI6OkRFVklDRV9DQVRFR09SWV9DTlRdID0gewotICAgIHsgLy8gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwKLSAgICAgICAgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fU1lTVEVNCi0gICAgICAgIHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX1JJTkcKLSAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fTVVTSUMKLSAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fQUxBUk0KLSAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OCi0gICAgICAgIHNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08KLSAgICAgICAgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRQotICAgICAgICBzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICB9LAotICAgIHsgIC8vIEFVRElPX1NUUkVBTV9EVE1GCi0gICAgICAgIHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fVFRTCi0gICAgICAvLyAiVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyIjogYWx3YXlzIHNpbGVudCBleGNlcHQgb24gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgc1NpbGVudFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBzTGluZWFyVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNTaWxlbnRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIHNTaWxlbnRWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWQotICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9SRVJPVVRJTkcKLSAgICAgICAgc0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIHNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fUEFUQ0gKLSAgICAgICAgc0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIHNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi19OwotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdGlhbGl6ZVZvbHVtZUN1cnZlcygpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBERVZJQ0VfQ0FURUdPUllfQ05UOyBqKyspIHsKLSAgICAgICAgICAgIG1TdHJlYW1zW2ldLm1Wb2x1bWVDdXJ2ZVtqXSA9Ci0gICAgICAgICAgICAgICAgICAgIHNWb2x1bWVQcm9maWxlc1tpXVtqXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENoZWNrIGF2YWlsYWJpbGl0eSBvZiBEUkMgb24gc3BlYWtlciBwYXRoOiBpZiBhdmFpbGFibGUsIG92ZXJyaWRlIHNvbWUgb2YgdGhlIHNwZWFrZXIgY3VydmVzCi0gICAgaWYgKG1TcGVha2VyRHJjRW5hYmxlZCkgewotICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fU1lTVEVNXS5tVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJdID0KLSAgICAgICAgICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjOwotICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fUklOR10ubVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9TUEVBS0VSXSA9Ci0gICAgICAgICAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYzsKLSAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0FMQVJNXS5tVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJdID0KLSAgICAgICAgICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjOwotICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OXS5tVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJdID0KLSAgICAgICAgICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjOwotICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fTVVTSUNdLm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl0gPQotICAgICAgICAgICAgICAgIHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyYzsKLSAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFldLm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl0gPQotICAgICAgICAgICAgICAgIHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyYzsKLSAgICB9Ci19Ci0KLWZsb2F0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29tcHV0ZVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi17Ci0gICAgZmxvYXQgdm9sdW1lID0gMS4wOwotICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgU3RyZWFtRGVzY3JpcHRvciAmc3RyZWFtRGVzYyA9IG1TdHJlYW1zW3N0cmVhbV07Ci0KLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOwotICAgIH0KLQotICAgIHZvbHVtZSA9IHZvbEluZGV4VG9BbXBsKGRldmljZSwgc3RyZWFtRGVzYywgaW5kZXgpOwotCi0gICAgLy8gaWYgYSBoZWFkc2V0IGlzIGNvbm5lY3RlZCwgYXBwbHkgdGhlIGZvbGxvd2luZyBydWxlcyB0byByaW5nIHRvbmVzIGFuZCBub3RpZmljYXRpb25zCi0gICAgLy8gdG8gYXZvaWQgc291bmQgbGV2ZWwgYnVyc3RzIGluIHVzZXIncyBlYXJzOgotICAgIC8vIC0gYWx3YXlzIGF0dGVudWF0ZSByaW5nIHRvbmVzIGFuZCBub3RpZmljYXRpb25zIHZvbHVtZSBieSA2ZEIKLSAgICAvLyAtIGlmIG11c2ljIGlzIHBsYXlpbmcsIGFsd2F5cyBsaW1pdCB0aGUgdm9sdW1lIHRvIGN1cnJlbnQgbXVzaWMgdm9sdW1lLAotICAgIC8vIHdpdGggYSBtaW5pbXVtIHRocmVzaG9sZCBhdCAtMzZkQiBzbyB0aGF0IG5vdGlmaWNhdGlvbiBpcyBhbHdheXMgcGVyY2VpdmVkLgotICAgIGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgc3RyZWFtX3N0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLSAgICBpZiAoKGRldmljZSAmIChBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIHwKLSAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyB8Ci0gICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQgfAotICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUpKSAmJgotICAgICAgICAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pCi0gICAgICAgICAgICAgICAgfHwgKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkKLSAgICAgICAgICAgICAgICB8fCAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9TWVNURU0pCi0gICAgICAgICAgICAgICAgfHwgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgJiYKLSAgICAgICAgc3RyZWFtRGVzYy5tQ2FuQmVNdXRlZCkgewotICAgICAgICB2b2x1bWUgKj0gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX0ZBQ1RPUjsKLSAgICAgICAgLy8gd2hlbiB0aGUgcGhvbmUgaXMgcmluZ2luZyB3ZSBtdXN0IGNvbnNpZGVyIHRoYXQgbXVzaWMgY291bGQgaGF2ZSBiZWVuIHBhdXNlZCBqdXN0IGJlZm9yZQotICAgICAgICAvLyBieSB0aGUgbXVzaWMgYXBwbGljYXRpb24gYW5kIGJlaGF2ZSBhcyBpZiBtdXNpYyB3YXMgYWN0aXZlIGlmIHRoZSBsYXN0IG11c2ljIHRyYWNrIHdhcwotICAgICAgICAvLyBqdXN0IHN0b3BwZWQKLSAgICAgICAgaWYgKGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkpIHx8Ci0gICAgICAgICAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUpIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtdXNpY0RldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCB0cnVlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgZmxvYXQgbXVzaWNWb2wgPSBjb21wdXRlVm9sdW1lKEFVRElPX1NUUkVBTV9NVVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fTVVTSUNdLmdldFZvbHVtZUluZGV4KG11c2ljRGV2aWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWNEZXZpY2UpOwotICAgICAgICAgICAgZmxvYXQgbWluVm9sID0gKG11c2ljVm9sID4gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTikgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpY1ZvbCA6IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU47Ci0gICAgICAgICAgICBpZiAodm9sdW1lID4gbWluVm9sKSB7Ci0gICAgICAgICAgICAgICAgdm9sdW1lID0gbWluVm9sOwotICAgICAgICAgICAgICAgIEFMT0dWKCJjb21wdXRlVm9sdW1lIGxpbWl0aW5nIHZvbHVtZSB0byAlZiBtdXNpY1ZvbCAlZiIsIG1pblZvbCwgbXVzaWNWb2wpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHZvbHVtZTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0FuZFNldFZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCi17Ci0KLSAgICAvLyBkbyBub3QgY2hhbmdlIGFjdHVhbCBzdHJlYW0gdm9sdW1lIGlmIHRoZSBzdHJlYW0gaXMgbXV0ZWQKLSAgICBpZiAobU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bU11dGVDb3VudFtzdHJlYW1dICE9IDApIHsKLSAgICAgICAgQUxPR1ZWKCJjaGVja0FuZFNldFZvbHVtZSgpIHN0cmVhbSAlZCBtdXRlZCBjb3VudCAlZCIsCi0gICAgICAgICAgICAgIHN0cmVhbSwgbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bU11dGVDb3VudFtzdHJlYW1dKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8vIGRvIG5vdCBjaGFuZ2UgaW4gY2FsbCB2b2x1bWUgaWYgYmx1ZXRvb3RoIGlzIGNvbm5lY3RlZCBhbmQgdmljZSB2ZXJzYQotICAgIGlmICgoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMICYmCi0gICAgICAgICAgICBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB8fAotICAgICAgICAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPICYmCi0gICAgICAgICAgICAgICAgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykpIHsKLSAgICAgICAgQUxPR1YoImNoZWNrQW5kU2V0Vm9sdW1lKCkgY2Fubm90IHNldCBzdHJlYW0gJWQgdm9sdW1lIHdpdGggZm9yY2UgdXNlID0gJWQgZm9yIGNvbW0iLAotICAgICAgICAgICAgIHN0cmVhbSwgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgZmxvYXQgdm9sdW1lID0gY29tcHV0ZVZvbHVtZShzdHJlYW0sIGluZGV4LCBvdXRwdXQsIGRldmljZSk7Ci0gICAgLy8gdW5pdCBnYWluIGlmIHJlcm91dGluZyB0byBleHRlcm5hbCBwb2xpY3kKLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkgewotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIm1heCBnYWluIHdoZW4gcmVyb3V0aW5nIGZvciBvdXRwdXQ9JWQiLCBvdXRwdXQpOwotICAgICAgICAgICAgICAgIHZvbHVtZSA9IDEuMGY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAvLyBXZSBhY3R1YWxseSBjaGFuZ2UgdGhlIHZvbHVtZSBpZjoKLSAgICAvLyAtIHRoZSBmbG9hdCB2YWx1ZSByZXR1cm5lZCBieSBjb21wdXRlVm9sdW1lKCkgY2hhbmdlZAotICAgIC8vIC0gdGhlIGZvcmNlIGZsYWcgaXMgc2V0Ci0gICAgaWYgKHZvbHVtZSAhPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tQ3VyVm9sdW1lW3N0cmVhbV0gfHwKLSAgICAgICAgICAgIGZvcmNlKSB7Ci0gICAgICAgIG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1DdXJWb2x1bWVbc3RyZWFtXSA9IHZvbHVtZTsKLSAgICAgICAgQUxPR1ZWKCJjaGVja0FuZFNldFZvbHVtZSgpIGZvciBvdXRwdXQgJWQgc3RyZWFtICVkLCB2b2x1bWUgJWYsIGRlbGF5ICVkIiwgb3V0cHV0LCBzdHJlYW0sIHZvbHVtZSwgZGVsYXlNcyk7Ci0gICAgICAgIC8vIEZvcmNlIFZPSUNFX0NBTEwgdG8gdHJhY2sgQkxVRVRPT1RIX1NDTyBzdHJlYW0gdm9sdW1lIHdoZW4gYmx1ZXRvb3RoIGF1ZGlvIGlzCi0gICAgICAgIC8vIGVuYWJsZWQKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgewotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9sdW1lLCBvdXRwdXQsIGRlbGF5TXMpOwotICAgICAgICB9Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWUsIG91dHB1dCwgZGVsYXlNcyk7Ci0gICAgfQotCi0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCB8fAotICAgICAgICBzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pIHsKLSAgICAgICAgZmxvYXQgdm9pY2VWb2x1bWU7Ci0gICAgICAgIC8vIEZvcmNlIHZvaWNlIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08gYXMgdm9sdW1lIGlzIG1hbmFnZWQgYnkgdGhlIGhlYWRzZXQKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgewotICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAoZmxvYXQpaW5kZXgvKGZsb2F0KW1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodm9pY2VWb2x1bWUgIT0gbUxhc3RWb2ljZVZvbHVtZSAmJiBvdXRwdXQgPT0gbVByaW1hcnlPdXRwdXQpIHsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRWb2ljZVZvbHVtZSh2b2ljZVZvbHVtZSwgZGVsYXlNcyk7Ci0gICAgICAgICAgICBtTGFzdFZvaWNlVm9sdW1lID0gdm9pY2VWb2x1bWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphcHBseVN0cmVhbVZvbHVtZXMoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKLXsKLSAgICBBTE9HVlYoImFwcGx5U3RyZWFtVm9sdW1lcygpIGZvciBvdXRwdXQgJWQgYW5kIGRldmljZSAleCIsIG91dHB1dCwgZGV2aWNlKTsKLQotICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1BBVENIKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0FuZFNldFZvbHVtZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zW3N0cmVhbV0uZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlKTsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdHJhdGVneU11dGUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi17Ci0gICAgQUxPR1ZWKCJzZXRTdHJhdGVneU11dGUoKSBzdHJhdGVneSAlZCwgbXV0ZSAlZCwgb3V0cHV0ICVkIiwgc3RyYXRlZ3ksIG9uLCBvdXRwdXQpOwotICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1BBVENIKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSA9PSBzdHJhdGVneSkgewotICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIG9uLCBvdXRwdXQsIGRlbGF5TXMsIGRldmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi17Ci0gICAgU3RyZWFtRGVzY3JpcHRvciAmc3RyZWFtRGVzYyA9IG1TdHJlYW1zW3N0cmVhbV07Ci0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOwotICAgIH0KLQotICAgIEFMT0dWVigic2V0U3RyZWFtTXV0ZSgpIHN0cmVhbSAlZCwgbXV0ZSAlZCwgb3V0cHV0ICVkLCBtTXV0ZUNvdW50ICVkIGRldmljZSAlMDR4IiwKLSAgICAgICAgICBzdHJlYW0sIG9uLCBvdXRwdXQsIG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSwgZGV2aWNlKTsKLQotICAgIGlmIChvbikgewotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKLSAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjLm1DYW5CZU11dGVkICYmCi0gICAgICAgICAgICAgICAgICAgICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAotICAgICAgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgewotICAgICAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwgMCwgb3V0cHV0LCBkZXZpY2UsIGRlbGF5TXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIGluY3JlbWVudCBtTXV0ZUNvdW50IGFmdGVyIGNhbGxpbmcgY2hlY2tBbmRTZXRWb2x1bWUoKSBzbyB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgbm90IGlnbm9yZWQKLSAgICAgICAgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigic2V0U3RyZWFtTXV0ZSgpIHVubXV0aW5nIG5vbiBtdXRlZCBzdHJlYW0hIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKC0tb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKLSAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2MuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSkKLXsKLSAgICAvLyBpZiB0aGUgc3RyZWFtIHBlcnRhaW5zIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBhbmQgd2UgYXJlIGluIGNhbGwgd2UgbXVzdAotICAgIC8vIG11dGUgdGhlIHN0cmVhbSBpZiBpdCBpcyBsb3cgdmlzaWJpbGl0eS4gSWYgaXQgaXMgaGlnaCB2aXNpYmlsaXR5LCB3ZSBtdXN0IHBsYXkgYSB0b25lCi0gICAgLy8gaW4gdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneSBhbmQgcGxheSB0aGUgdG9uZSBpZiB0aGUgc2VsZWN0ZWQgZGV2aWNlIGRvZXMgbm90Ci0gICAgLy8gaW50ZXJmZXJlIHdpdGggdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneQotICAgIC8vIGlmIHN0YXRlQ2hhbmdlIGlzIHRydWUsIHdlIGFyZSBjYWxsZWQgZnJvbSBzZXRQaG9uZVN0YXRlKCkgYW5kIHdlIG11c3QgbXV0ZSBvciB1bm11dGUgYXMKLSAgICAvLyBtYW55IHRpbWVzIGFzIHRoZXJlIGFyZSBhY3RpdmUgdHJhY2tzIG9uIHRoZSBvdXRwdXQKLSAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7Ci0gICAgaWYgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAotICAgICAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSkgewotICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7Ci0gICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBzdHJlYW0gJWQgc3RhcnRpbmcgJWQgZGV2aWNlICV4IHN0YXRlQ2hhbmdlICVkIiwKLSAgICAgICAgICAgICAgICBzdHJlYW0sIHN0YXJ0aW5nLCBvdXRwdXREZXNjLT5tRGV2aWNlLCBzdGF0ZUNoYW5nZSk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSkgewotICAgICAgICAgICAgaW50IG11dGVDb3VudCA9IDE7Ci0gICAgICAgICAgICBpZiAoc3RhdGVDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICBtdXRlQ291bnQgPSBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdWRpb19pc19sb3dfdmlzaWJpbGl0eShzdHJlYW0pKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGxvdyB2aXNpYmlsaXR5LCBtdXRlQ291bnQgJWQiLCBtdXRlQ291bnQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHN0YXJ0aW5nLCBtUHJpbWFyeU91dHB1dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgaGlnaCB2aXNpYmlsaXR5Iik7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmRldmljZSgpICYKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCB0cnVlIC8qZnJvbUNhY2hlKi8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBoaWdoIHZpc2liaWxpdHkgbXV0ZWQsIG11dGVDb3VudCAlZCIsIG11dGVDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbVByaW1hcnlPdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdGFydGluZykgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RhcnRUb25lKEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RvcFRvbmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0luQ2FsbCgpCi17Ci0gICAgcmV0dXJuIGlzU3RhdGVJbkNhbGwobVBob25lU3RhdGUpOwotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdGF0ZUluQ2FsbChpbnQgc3RhdGUpIHsKLSAgICByZXR1cm4gKChzdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHx8Ci0gICAgICAgICAgICAoc3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OKSk7Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TWF4RWZmZWN0c0NwdUxvYWQoKQotewotICAgIHJldHVybiBNQVhfRUZGRUNUU19DUFVfTE9BRDsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNYXhFZmZlY3RzTWVtb3J5KCkKLXsKLSAgICByZXR1cm4gTUFYX0VGRkVDVFNfTUVNT1JZOwotfQotCi0KLS8vIC0tLSBBdWRpb091dHB1dERlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcigKLSAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSkKLSAgICA6IG1JZCgwKSwgbUlvSGFuZGxlKDApLCBtTGF0ZW5jeSgwKSwKLSAgICBtRmxhZ3MoKGF1ZGlvX291dHB1dF9mbGFnc190KTApLCBtRGV2aWNlKEFVRElPX0RFVklDRV9OT05FKSwgbVBvbGljeU1peChOVUxMKSwKLSAgICBtUGF0Y2hIYW5kbGUoMCksCi0gICAgbU91dHB1dDEoMCksIG1PdXRwdXQyKDApLCBtUHJvZmlsZShwcm9maWxlKSwgbURpcmVjdE9wZW5Db3VudCgwKQotewotICAgIC8vIGNsZWFyIHVzYWdlIGNvdW50IGZvciBhbGwgc3RyZWFtIHR5cGVzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgbVJlZkNvdW50W2ldID0gMDsKLSAgICAgICAgbUN1clZvbHVtZVtpXSA9IC0xLjA7Ci0gICAgICAgIG1NdXRlQ291bnRbaV0gPSAwOwotICAgICAgICBtU3RvcFRpbWVbaV0gPSAwOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKLSAgICAgICAgbVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAocHJvZmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdClwcm9maWxlLT5tRmxhZ3M7Ci0gICAgICAgIG1TYW1wbGluZ1JhdGUgPSBwcm9maWxlLT5waWNrU2FtcGxpbmdSYXRlKCk7Ci0gICAgICAgIG1Gb3JtYXQgPSBwcm9maWxlLT5waWNrRm9ybWF0KCk7Ci0gICAgICAgIG1DaGFubmVsTWFzayA9IHByb2ZpbGUtPnBpY2tDaGFubmVsTWFzaygpOwotICAgICAgICBpZiAocHJvZmlsZS0+bUdhaW5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHByb2ZpbGUtPm1HYWluc1swXS0+Z2V0RGVmYXVsdENvbmZpZygmbUdhaW4pOwotICAgICAgICB9Ci0gICAgfQotfQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmRldmljZSgpIGNvbnN0Ci17Ci0gICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgIHJldHVybiAoYXVkaW9fZGV2aWNlc190KShtT3V0cHV0MS0+bURldmljZSB8IG1PdXRwdXQyLT5tRGV2aWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbURldmljZTsKLSAgICB9Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpsYXRlbmN5KCkKLXsKLSAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIChtT3V0cHV0MS0+bUxhdGVuY3kgPiBtT3V0cHV0Mi0+bUxhdGVuY3kpID8gbU91dHB1dDEtPm1MYXRlbmN5IDogbU91dHB1dDItPm1MYXRlbmN5OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtTGF0ZW5jeTsKLSAgICB9Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OnNoYXJlc0h3TW9kdWxlV2l0aCgKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjKQotewotICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICByZXR1cm4gbU91dHB1dDEtPnNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjKSB8fCBtT3V0cHV0Mi0+c2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MpOwotICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpewotICAgICAgICByZXR1cm4gc2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MtPm1PdXRwdXQxKSB8fCBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+bU91dHB1dDIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAobVByb2ZpbGUtPm1Nb2R1bGUgPT0gb3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1Nb2R1bGUpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhKQotewotICAgIC8vIGZvcndhcmQgdXNhZ2UgY291bnQgY2hhbmdlIHRvIGF0dGFjaGVkIG91dHB1dHMKLSAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgbU91dHB1dDEtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOwotICAgICAgICBtT3V0cHV0Mi0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7Ci0gICAgfQotICAgIGlmICgoZGVsdGEgKyAoaW50KW1SZWZDb3VudFtzdHJlYW1dKSA8IDApIHsKLSAgICAgICAgQUxPR1coImNoYW5nZVJlZkNvdW50KCkgaW52YWxpZCBkZWx0YSAlZCBmb3Igc3RyZWFtICVkLCByZWZDb3VudCAlZCIsCi0gICAgICAgICAgICAgIGRlbHRhLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKLSAgICAgICAgbVJlZkNvdW50W3N0cmVhbV0gPSAwOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1SZWZDb3VudFtzdHJlYW1dICs9IGRlbHRhOwotICAgIEFMT0dWKCJjaGFuZ2VSZWZDb3VudCgpIHN0cmVhbSAlZCwgY291bnQgJWQiLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKLX0KLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdXBwb3J0ZWREZXZpY2VzKCkKLXsKLSAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpKG1PdXRwdXQxLT5zdXBwb3J0ZWREZXZpY2VzKCkgfCBtT3V0cHV0Mi0+c3VwcG9ydGVkRGV2aWNlcygpKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgOwotICAgIH0KLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlzU3RyYXRlZ3lBY3RpdmUoTlVNX1NUUkFURUdJRVMsIGluUGFzdE1zKTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNTdHJhdGVneUFjdGl2ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAotewotICAgIGlmICgoc3lzVGltZSA9PSAwKSAmJiAoaW5QYXN0TXMgIT0gMCkpIHsKLSAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBpZiAoaSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWkpID09IHN0cmF0ZWd5KSB8fAotICAgICAgICAgICAgICAgIChOVU1fU1RSQVRFR0lFUyA9PSBzdHJhdGVneSkpICYmCi0gICAgICAgICAgICAgICAgaXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAotewotICAgIGlmIChtUmVmQ291bnRbc3RyZWFtXSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoaW5QYXN0TXMgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChzeXNUaW1lID09IDApIHsKLSAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKLSAgICB9Ci0gICAgaWYgKG5zMm1zKHN5c1RpbWUgLSBtU3RvcFRpbWVbc3RyZWFtXSkgPCBpblBhc3RNcykgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKLXsKLSAgICBBTE9HX0FTU0VSVCghaXNEdXBsaWNhdGVkKCksICJ0b0F1ZGlvUG9ydENvbmZpZygpIGNhbGxlZCBvbiBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIG1Jb0hhbmRsZSk7Ci0KLSAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEV8QVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVHxBVURJT19QT1JUX0NPTkZJR19HQUlOOwotICAgIGlmIChzcmNDb25maWcgIT0gTlVMTCkgewotICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IHNyY0NvbmZpZy0+Y29uZmlnX21hc2s7Ci0gICAgfQotICAgIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOwotCi0gICAgZHN0Q29uZmlnLT5pZCA9IG1JZDsKLSAgICBkc3RDb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFOwotICAgIGRzdENvbmZpZy0+dHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVg7Ci0gICAgZHN0Q29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1Qcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlOwotICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5oYW5kbGUgPSBtSW9IYW5kbGU7Ci0gICAgZHN0Q29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAotewotICAgIEFMT0dfQVNTRVJUKCFpc0R1cGxpY2F0ZWQoKSwgInRvQXVkaW9Qb3J0KCkgY2FsbGVkIG9uIGR1cGxpY2F0ZWQgb3V0cHV0ICVkIiwgbUlvSGFuZGxlKTsKLSAgICBtUHJvZmlsZS0+dG9BdWRpb1BvcnQocG9ydCk7Ci0gICAgcG9ydC0+aWQgPSBtSWQ7Ci0gICAgdG9BdWRpb1BvcnRDb25maWcoJnBvcnQtPmFjdGl2ZV9jb25maWcpOwotICAgIHBvcnQtPmV4dC5taXguaHdfbW9kdWxlID0gbVByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGU7Ci0gICAgcG9ydC0+ZXh0Lm1peC5oYW5kbGUgPSBtSW9IYW5kbGU7Ci0gICAgcG9ydC0+ZXh0Lm1peC5sYXRlbmN5X2NsYXNzID0KLSAgICAgICAgICAgIG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgPyBBVURJT19MQVRFTkNZX0xPVyA6IEFVRElPX0xBVEVOQ1lfTk9STUFMOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBtSWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlMDh4XG4iLCBtRm9ybWF0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTGF0ZW5jeTogJWRcbiIsIG1MYXRlbmN5KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZsYWdzICUwOHhcbiIsIG1GbGFncyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBEZXZpY2VzICUwOHhcbiIsIGRldmljZSgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFN0cmVhbSB2b2x1bWUgcmVmQ291bnQgbXV0ZUNvdW50XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyZCAgICAgJS4wM2YgICAgICUwMmQgICAgICAgJTAyZFxuIiwKLSAgICAgICAgICAgICAgICAgaSwgbUN1clZvbHVtZVtpXSwgbVJlZkNvdW50W2ldLCBtTXV0ZUNvdW50W2ldKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tIEF1ZGlvSW5wdXREZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCi0KLUF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9JbnB1dERlc2NyaXB0b3I6OkF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUpCi0gICAgOiBtSWQoMCksIG1Jb0hhbmRsZSgwKSwKLSAgICAgIG1EZXZpY2UoQVVESU9fREVWSUNFX05PTkUpLCBtUG9saWN5TWl4KE5VTEwpLCBtUGF0Y2hIYW5kbGUoMCksIG1SZWZDb3VudCgwKSwKLSAgICAgIG1JbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfREVGQVVMVCksIG1Qcm9maWxlKHByb2ZpbGUpLCBtSXNTb3VuZFRyaWdnZXIoZmFsc2UpCi17Ci0gICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgewotICAgICAgICBtU2FtcGxpbmdSYXRlID0gcHJvZmlsZS0+cGlja1NhbXBsaW5nUmF0ZSgpOwotICAgICAgICBtRm9ybWF0ID0gcHJvZmlsZS0+cGlja0Zvcm1hdCgpOwotICAgICAgICBtQ2hhbm5lbE1hc2sgPSBwcm9maWxlLT5waWNrQ2hhbm5lbE1hc2soKTsKLSAgICAgICAgaWYgKHByb2ZpbGUtPm1HYWlucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBwcm9maWxlLT5tR2FpbnNbMF0tPmdldERlZmF1bHRDb25maWcoJm1HYWluKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Ci17Ci0gICAgQUxPR19BU1NFUlQobVByb2ZpbGUgIT0gMCwKLSAgICAgICAgICAgICAgICAidG9BdWRpb1BvcnRDb25maWcoKSBjYWxsZWQgb24gaW5wdXQgd2l0aCBudWxsIHByb2ZpbGUgJWQiLCBtSW9IYW5kbGUpOwotICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURXxBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0t8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUfEFVRElPX1BPUlRfQ09ORklHX0dBSU47Ci0gICAgaWYgKHNyY0NvbmZpZyAhPSBOVUxMKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gc3JjQ29uZmlnLT5jb25maWdfbWFzazsKLSAgICB9Ci0KLSAgICBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKLQotICAgIGRzdENvbmZpZy0+aWQgPSBtSWQ7Ci0gICAgZHN0Q29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTks7Ci0gICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKLSAgICBkc3RDb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbVByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGU7Ci0gICAgZHN0Q29uZmlnLT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKLSAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBtSW5wdXRTb3VyY2U7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0lucHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0Ci17Ci0gICAgQUxPR19BU1NFUlQobVByb2ZpbGUgIT0gMCwgInRvQXVkaW9Qb3J0KCkgY2FsbGVkIG9uIGlucHV0IHdpdGggbnVsbCBwcm9maWxlICVkIiwgbUlvSGFuZGxlKTsKLQotICAgIG1Qcm9maWxlLT50b0F1ZGlvUG9ydChwb3J0KTsKLSAgICBwb3J0LT5pZCA9IG1JZDsKLSAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7Ci0gICAgcG9ydC0+ZXh0Lm1peC5od19tb2R1bGUgPSBtUHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZTsKLSAgICBwb3J0LT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKLSAgICBwb3J0LT5leHQubWl4LmxhdGVuY3lfY2xhc3MgPSBBVURJT19MQVRFTkNZX05PUk1BTDsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0lucHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBtSWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgbURldmljZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBSZWYgQ291bnQgJWRcbiIsIG1SZWZDb3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBPcGVuIFJlZiBDb3VudCAlZFxuIiwgbU9wZW5SZWZDb3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLSBTdHJlYW1EZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCi0KLUF1ZGlvUG9saWN5TWFuYWdlcjo6U3RyZWFtRGVzY3JpcHRvcjo6U3RyZWFtRGVzY3JpcHRvcigpCi0gICAgOiAgIG1JbmRleE1pbigwKSwgbUluZGV4TWF4KDEpLCBtQ2FuQmVNdXRlZCh0cnVlKQotewotICAgIG1JbmRleEN1ci5hZGQoQVVESU9fREVWSUNFX09VVF9ERUZBVUxULCAwKTsKLX0KLQotaW50IEF1ZGlvUG9saWN5TWFuYWdlcjo6U3RyZWFtRGVzY3JpcHRvcjo6Z2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBkZXZpY2UgPSBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOwotICAgIC8vIHRoZXJlIGlzIGFsd2F5cyBhIHZhbGlkIGVudHJ5IGZvciBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQKLSAgICBpZiAobUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA8IDApIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUOwotICAgIH0KLSAgICByZXR1cm4gbUluZGV4Q3VyLnZhbHVlRm9yKGRldmljZSk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpTdHJlYW1EZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVzICAgICAgICAgJTAyZCAgICAgICAgICUwMmQgICAgICAgICAiLAotICAgICAgICAgICAgIG1DYW5CZU11dGVkID8gInRydWUgIiA6ICJmYWxzZSIsIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5kZXhDdXIuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJTA0eCA6ICUwMmQsICIsCi0gICAgICAgICAgICAgICAgIG1JbmRleEN1ci5rZXlBdChpKSwKLSAgICAgICAgICAgICAgICAgbUluZGV4Q3VyLnZhbHVlQXQoaSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLX0KLQotLy8gLS0tIEVmZmVjdERlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpFZmZlY3REZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJL086ICVkXG4iLCBtSW8pOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU3RyYXRlZ3k6ICVkXG4iLCBtU3RyYXRlZ3kpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2Vzc2lvbjogJWRcbiIsIG1TZXNzaW9uKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIE5hbWU6ICVzXG4iLCAgbURlc2MubmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlc1xuIiwgIG1FbmFibGVkID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0gSHdNb2R1bGUgY2xhc3MgaW1wbGVtZW50YXRpb24KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6SHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKLSAgICA6IG1OYW1lKHN0cm5kdXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01BWF9MRU4pKSwKLSAgICAgIG1IYWxWZXJzaW9uKEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pLCBtSGFuZGxlKDApCi17Ci19Ci0KLUF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6On5Id01vZHVsZSgpCi17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbU91dHB1dFByb2ZpbGVzW2ldLT5tU3VwcG9ydGVkRGV2aWNlcy5jbGVhcigpOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1JbnB1dFByb2ZpbGVzW2ldLT5tU3VwcG9ydGVkRGV2aWNlcy5jbGVhcigpOwotICAgIH0KLSAgICBmcmVlKCh2b2lkICopbU5hbWUpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjpsb2FkSW5wdXQoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKLQotICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOChyb290LT5uYW1lKSwgQVVESU9fUE9SVF9ST0xFX1NJTkssIHRoaXMpOwotCi0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBTQU1QTElOR19SQVRFU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRTYW1wbGluZ1JhdGVzKChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBGT1JNQVRTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEZvcm1hdHMoKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEluQ2hhbm5lbHMoKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIERFVklDRVNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21OYW1lKChjaGFyICopbm9kZS0+dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWNsYXJlZERldmljZXMpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBGTEFHU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIHByb2ZpbGUtPm1GbGFncyA9IHBhcnNlSW5wdXRGbGFnTmFtZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgewotICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEdhaW5zKG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICBBTE9HV19JRihwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCksCi0gICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZGV2aWNlcyIpOwotICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpID09IDAsCi0gICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgY2hhbm5lbCBtYXNrcyIpOwotICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSA9PSAwLAotICAgICAgICAgICAgImxvYWRJbnB1dCgpIGludmFsaWQgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzIik7Ci0gICAgQUxPR1dfSUYocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpID09IDAsCi0gICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZm9ybWF0cyIpOwotICAgIGlmICghcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpICYmCi0gICAgICAgICAgICAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgIT0gMCkgJiYKLSAgICAgICAgICAgIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgIT0gMCkgJiYKLSAgICAgICAgICAgIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgIT0gMCkpIHsKLQotICAgICAgICBBTE9HVigibG9hZElucHV0KCkgYWRkaW5nIGlucHV0IFN1cHBvcnRlZCBEZXZpY2VzICUwNHgiLAotICAgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKTsKLQotICAgICAgICBtSW5wdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6bG9hZE91dHB1dChjbm9kZSAqcm9vdCkKLXsKLSAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotCi0gICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KHJvb3QtPm5hbWUpLCBBVURJT19QT1JUX1JPTEVfU09VUkNFLCB0aGlzKTsKLQotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgU0FNUExJTkdfUkFURVNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBwcm9maWxlLT5sb2FkU2FtcGxpbmdSYXRlcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRk9STUFUU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRGb3JtYXRzKChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBDSEFOTkVMU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRPdXRDaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmxvYWREZXZpY2VzRnJvbU5hbWUoKGNoYXIgKilub2RlLT52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZMQUdTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgcHJvZmlsZS0+bUZsYWdzID0gcGFyc2VPdXRwdXRGbGFnTmFtZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgewotICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEdhaW5zKG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICBBTE9HV19JRihwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCksCi0gICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGRldmljZXMiKTsKLSAgICBBTE9HV19JRihwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA9PSAwLAotICAgICAgICAgICAgImxvYWRPdXRwdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBjaGFubmVsIG1hc2tzIik7Ci0gICAgQUxPR1dfSUYocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpID09IDAsCi0gICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzIik7Ci0gICAgQUxPR1dfSUYocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpID09IDAsCi0gICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGZvcm1hdHMiKTsKLSAgICBpZiAoIXByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSAmJgotICAgICAgICAgICAgKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpICE9IDApICYmCi0gICAgICAgICAgICAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpICE9IDApICYmCi0gICAgICAgICAgICAocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpICE9IDApKSB7Ci0KLSAgICAgICAgQUxPR1YoImxvYWRPdXRwdXQoKSBhZGRpbmcgb3V0cHV0IFN1cHBvcnRlZCBEZXZpY2VzICUwNHgsIG1GbGFncyAlMDR4IiwKLSAgICAgICAgICAgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSwgcHJvZmlsZS0+bUZsYWdzKTsKLQotICAgICAgICBtT3V0cHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6OmxvYWREZXZpY2UoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKLQotICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBERVZJQ0VfVFlQRSkgPT0gMCkgewotICAgICAgICAgICAgdHlwZSA9IHBhcnNlRGV2aWNlTmFtZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKHR5cGUgPT0gQVVESU9fREVWSUNFX05PTkUgfHwKLSAgICAgICAgICAgICghYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpICYmICFhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpKSkgewotICAgICAgICBBTE9HVygibG9hZERldmljZSgpIGJhZCB0eXBlICUwOHgiLCB0eXBlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgocm9vdC0+bmFtZSksIHR5cGUpOwotICAgIGRldmljZURlc2MtPm1Nb2R1bGUgPSB0aGlzOwotCi0gICAgbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFX0FERFJFU1MpID09IDApIHsKLSAgICAgICAgICAgIGRldmljZURlc2MtPm1BZGRyZXNzID0gU3RyaW5nOCgoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlRGVzYy0+bG9hZEluQ2hhbm5lbHMoKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRldmljZURlc2MtPmxvYWRPdXRDaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXZpY2VEZXNjLT5sb2FkR2FpbnMobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotCi0gICAgQUxPR1YoImxvYWREZXZpY2UoKSBhZGRpbmcgZGV2aWNlIG5hbWUgJXMgdHlwZSAlMDh4IGFkZHJlc3MgJXMiLAotICAgICAgICAgIGRldmljZURlc2MtPm1OYW1lLnN0cmluZygpLCB0eXBlLCBkZXZpY2VEZXNjLT5tQWRkcmVzcy5zdHJpbmcoKSk7Ci0KLSAgICBtRGVjbGFyZWREZXZpY2VzLmFkZChkZXZpY2VEZXNjKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6YWRkT3V0cHV0UHJvZmlsZShTdHJpbmc4IG5hbWUsIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIFN0cmluZzggYWRkcmVzcykKLXsKLSAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKG5hbWUsIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIHRoaXMpOwotCi0gICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKGNvbmZpZy0+c2FtcGxlX3JhdGUpOwotICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKLSAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoY29uZmlnLT5mb3JtYXQpOwotCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCBkZXZpY2UpOwotICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKLSAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5hZGQoZGV2RGVzYyk7Ci0KLSAgICBtT3V0cHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjpyZW1vdmVPdXRwdXRQcm9maWxlKFN0cmluZzggbmFtZSkKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobU91dHB1dFByb2ZpbGVzW2ldLT5tTmFtZSA9PSBuYW1lKSB7Ci0gICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXMucmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6YWRkSW5wdXRQcm9maWxlKFN0cmluZzggbmFtZSwgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgU3RyaW5nOCBhZGRyZXNzKQotewotICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUobmFtZSwgQVVESU9fUE9SVF9ST0xFX1NJTkssIHRoaXMpOwotCi0gICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKGNvbmZpZy0+c2FtcGxlX3JhdGUpOwotICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKLSAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoY29uZmlnLT5mb3JtYXQpOwotCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCBkZXZpY2UpOwotICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKLSAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5hZGQoZGV2RGVzYyk7Ci0KLSAgICBBTE9HVigiYWRkSW5wdXRQcm9maWxlKCkgbmFtZSAlcyByYXRlICVkIG1hc2sgMHgwOCIsIG5hbWUuc3RyaW5nKCksIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKLQotICAgIG1JbnB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6cmVtb3ZlSW5wdXRQcm9maWxlKFN0cmluZzggbmFtZSkKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtSW5wdXRQcm9maWxlc1tpXS0+bU5hbWUgPT0gbmFtZSkgewotICAgICAgICAgICAgbUlucHV0UHJvZmlsZXMucmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6OmR1bXAoaW50IGZkKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIG5hbWU6ICVzXG4iLCBtTmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSBoYW5kbGU6ICVkXG4iLCBtSGFuZGxlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIHZlcnNpb246ICV1LiV1XG4iLCBtSGFsVmVyc2lvbiA+PiA4LCBtSGFsVmVyc2lvbiAmIDB4RkYpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBpZiAobU91dHB1dFByb2ZpbGVzLnNpemUoKSkgewotICAgICAgICB3cml0ZShmZCwgIiAgLSBvdXRwdXRzOlxuIiwgc3RybGVuKCIgIC0gb3V0cHV0czpcbiIpKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICBvdXRwdXQgJXp1OlxuIiwgaSk7Ci0gICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXNbaV0tPmR1bXAoZmQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtSW5wdXRQcm9maWxlcy5zaXplKCkpIHsKLSAgICAgICAgd3JpdGUoZmQsICIgIC0gaW5wdXRzOlxuIiwgc3RybGVuKCIgIC0gaW5wdXRzOlxuIikpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgaW5wdXQgJXp1OlxuIiwgaSk7Ci0gICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgICAgICBtSW5wdXRQcm9maWxlc1tpXS0+ZHVtcChmZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1EZWNsYXJlZERldmljZXMuc2l6ZSgpKSB7Ci0gICAgICAgIHdyaXRlKGZkLCAiICAtIGRldmljZXM6XG4iLCBzdHJsZW4oIiAgLSBkZXZpY2VzOlxuIikpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EZWNsYXJlZERldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG1EZWNsYXJlZERldmljZXNbaV0tPmR1bXAoZmQsIDQsIGkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyAtLS0gQXVkaW9Qb3J0IGNsYXNzIGltcGxlbWVudGF0aW9uCi0KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OkF1ZGlvUG9ydChjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAotICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsIGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKSA6Ci0gICAgbU5hbWUobmFtZSksIG1UeXBlKHR5cGUpLCBtUm9sZShyb2xlKSwgbU1vZHVsZShtb2R1bGUpLCBtRmxhZ3MoMCkKLXsKLSAgICBtVXNlSW5DaGFubmVsTWFzayA9ICgodHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSAmJiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKCh0eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpICYmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAotewotICAgIHBvcnQtPnJvbGUgPSBtUm9sZTsKLSAgICBwb3J0LT50eXBlID0gbVR5cGU7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKSAmJiBpIDwgQVVESU9fUE9SVF9NQVhfU0FNUExJTkdfUkFURVM7IGkrKykgewotICAgICAgICBpZiAobVNhbXBsaW5nUmF0ZXNbaV0gIT0gMCkgewotICAgICAgICAgICAgcG9ydC0+c2FtcGxlX3JhdGVzW2ldID0gbVNhbXBsaW5nUmF0ZXNbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcG9ydC0+bnVtX3NhbXBsZV9yYXRlcyA9IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpICYmIGkgPCBBVURJT19QT1JUX01BWF9DSEFOTkVMX01BU0tTOyBpKyspIHsKLSAgICAgICAgaWYgKG1DaGFubmVsTWFza3NbaV0gIT0gMCkgewotICAgICAgICAgICAgcG9ydC0+Y2hhbm5lbF9tYXNrc1tpXSA9IG1DaGFubmVsTWFza3NbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcG9ydC0+bnVtX2NoYW5uZWxfbWFza3MgPSBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBtRm9ybWF0cy5zaXplKCkgJiYgaSA8IEFVRElPX1BPUlRfTUFYX0ZPUk1BVFM7IGkrKykgewotICAgICAgICBpZiAobUZvcm1hdHNbaV0gIT0gMCkgewotICAgICAgICAgICAgcG9ydC0+Zm9ybWF0c1tpXSA9IG1Gb3JtYXRzW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIHBvcnQtPm51bV9mb3JtYXRzID0gaTsKLQotICAgIEFMT0dWKCJBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KCkgbnVtIGdhaW5zICV6dSIsIG1HYWlucy5zaXplKCkpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG1HYWlucy5zaXplKCkgJiYgaSA8IEFVRElPX1BPUlRfTUFYX0dBSU5TOyBpKyspIHsKLSAgICAgICAgcG9ydC0+Z2FpbnNbaV0gPSBtR2FpbnNbaV0tPm1HYWluOwotICAgIH0KLSAgICBwb3J0LT5udW1fZ2FpbnMgPSBpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjppbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiBwb3J0KSB7Ci0gICAgZm9yIChzaXplX3QgayA9IDAgOyBrIDwgcG9ydC0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDsgaysrKSB7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IHJhdGUgPSBwb3J0LT5tU2FtcGxpbmdSYXRlcy5pdGVtQXQoayk7Ci0gICAgICAgIGlmIChyYXRlICE9IDApIHsgLy8gc2tpcCAiZHluYW1pYyIgcmF0ZXMKLSAgICAgICAgICAgIGJvb2wgaGFzUmF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDsgbCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJhdGUgPT0gbVNhbXBsaW5nUmF0ZXMuaXRlbUF0KGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1JhdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWhhc1JhdGUpIHsgLy8gbmV2ZXIgaW1wb3J0IGEgc2FtcGxpbmcgcmF0ZSB0d2ljZQotICAgICAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzLmFkZChyYXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKHNpemVfdCBrID0gMCA7IGsgPCBwb3J0LT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA7IGsrKykgewotICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrID0gcG9ydC0+bUNoYW5uZWxNYXNrcy5pdGVtQXQoayk7Ci0gICAgICAgIGlmIChtYXNrICE9IDApIHsgLy8gc2tpcCAiZHluYW1pYyIgbWFza3MKLSAgICAgICAgICAgIGJvb2wgaGFzTWFzayA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbUNoYW5uZWxNYXNrcy5zaXplKCkgOyBsKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobWFzayA9PSBtQ2hhbm5lbE1hc2tzLml0ZW1BdChsKSkgewotICAgICAgICAgICAgICAgICAgICBoYXNNYXNrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFoYXNNYXNrKSB7IC8vIG5ldmVyIGltcG9ydCBhIGNoYW5uZWwgbWFzayB0d2ljZQotICAgICAgICAgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKG1hc2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGsgPSAwIDsgayA8IHBvcnQtPm1Gb3JtYXRzLnNpemUoKSA7IGsrKykgewotICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBwb3J0LT5tRm9ybWF0cy5pdGVtQXQoayk7Ci0gICAgICAgIGlmIChmb3JtYXQgIT0gMCkgeyAvLyBza2lwICJkeW5hbWljIiBmb3JtYXRzCi0gICAgICAgICAgICBib29sIGhhc0Zvcm1hdCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbUZvcm1hdHMuc2l6ZSgpIDsgbCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBtRm9ybWF0cy5pdGVtQXQobCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFzRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFoYXNGb3JtYXQpIHsgLy8gbmV2ZXIgaW1wb3J0IGEgY2hhbm5lbCBtYXNrIHR3aWNlCi0gICAgICAgICAgICAgICAgbUZvcm1hdHMuYWRkKGZvcm1hdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChzaXplX3QgayA9IDAgOyBrIDwgcG9ydC0+bUdhaW5zLnNpemUoKSA7IGsrKykgewotICAgICAgICBzcDxBdWRpb0dhaW4+IGdhaW4gPSBwb3J0LT5tR2FpbnMuaXRlbUF0KGspOwotICAgICAgICBpZiAoZ2FpbiAhPSAwKSB7Ci0gICAgICAgICAgICBib29sIGhhc0dhaW4gPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGwgPSAwIDsgbCA8IG1HYWlucy5zaXplKCkgOyBsKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2FpbiA9PSBtR2FpbnMuaXRlbUF0KGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhc0dhaW4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWhhc0dhaW4pIHsgLy8gbmV2ZXIgaW1wb3J0IGEgZ2FpbiB0d2ljZQotICAgICAgICAgICAgICAgIG1HYWlucy5hZGQoZ2Fpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNsZWFyQ2FwYWJpbGl0aWVzKCkgewotICAgIG1DaGFubmVsTWFza3MuY2xlYXIoKTsKLSAgICBtRm9ybWF0cy5jbGVhcigpOwotICAgIG1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7Ci0gICAgbUdhaW5zLmNsZWFyKCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRTYW1wbGluZ1JhdGVzKGNoYXIgKm5hbWUpCi17Ci0gICAgY2hhciAqc3RyID0gc3RydG9rKG5hbWUsICJ8Iik7Ci0KLSAgICAvLyBieSBjb252ZW50aW9uLCAiMCcgaW4gdGhlIGZpcnN0IGVudHJ5IGluIG1TYW1wbGluZ1JhdGVzIGluZGljYXRlcyB0aGUgc3VwcG9ydGVkIHNhbXBsaW5nCi0gICAgLy8gcmF0ZXMgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbSBhZnRlciBpdCBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCi0gICAgaWYgKHN0ciAhPSBOVUxMICYmIHN0cmNtcChzdHIsIERZTkFNSUNfVkFMVUVfVEFHKSA9PSAwKSB7Ci0gICAgICAgIG1TYW1wbGluZ1JhdGVzLmFkZCgwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgewotICAgICAgICB1aW50MzJfdCByYXRlID0gYXRvaShzdHIpOwotICAgICAgICBpZiAocmF0ZSAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigibG9hZFNhbXBsaW5nUmF0ZXMoKSBhZGRpbmcgcmF0ZSAlZCIsIHJhdGUpOwotICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZXMuYWRkKHJhdGUpOwotICAgICAgICB9Ci0gICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZEZvcm1hdHMoY2hhciAqbmFtZSkKLXsKLSAgICBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKLQotICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbUZvcm1hdHMgaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgZm9ybWF0cwotICAgIC8vIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQotICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgewotICAgICAgICBtRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7Ci0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdClzdHJpbmdUb0VudW0oc0Zvcm1hdE5hbWVUb0VudW1UYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNGb3JtYXROYW1lVG9FbnVtVGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7Ci0gICAgICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKLSAgICAgICAgICAgIG1Gb3JtYXRzLmFkZChmb3JtYXQpOwotICAgICAgICB9Ci0gICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZEluQ2hhbm5lbHMoY2hhciAqbmFtZSkKLXsKLSAgICBjb25zdCBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKLQotICAgIEFMT0dWKCJsb2FkSW5DaGFubmVscygpICVzIiwgbmFtZSk7Ci0KLSAgICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyY21wKHN0ciwgRFlOQU1JQ19WQUxVRV9UQUcpID09IDApIHsKLSAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoMCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQotICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClzdHJpbmdUb0VudW0oc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7Ci0gICAgICAgIGlmIChjaGFubmVsTWFzayAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEluQ2hhbm5lbHMoKSBhZGRpbmcgY2hhbm5lbE1hc2sgJTA0eCIsIGNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKGNoYW5uZWxNYXNrKTsKLSAgICAgICAgfQotICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRPdXRDaGFubmVscyhjaGFyICpuYW1lKQotewotICAgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOwotCi0gICAgQUxPR1YoImxvYWRPdXRDaGFubmVscygpICVzIiwgbmFtZSk7Ci0KLSAgICAvLyBieSBjb252ZW50aW9uLCAiMCcgaW4gdGhlIGZpcnN0IGVudHJ5IGluIG1DaGFubmVsTWFza3MgaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgY2hhbm5lbAotICAgIC8vIG1hc2tzIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQotICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgewotICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZCgwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgewotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9Ci0gICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KXN0cmluZ1RvRW51bShzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOwotICAgICAgICBpZiAoY2hhbm5lbE1hc2sgIT0gMCkgewotICAgICAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoY2hhbm5lbE1hc2spOwotICAgICAgICB9Ci0gICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLWF1ZGlvX2dhaW5fbW9kZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkR2Fpbk1vZGUoY2hhciAqbmFtZSkKLXsKLSAgICBjb25zdCBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKLQotICAgIEFMT0dWKCJsb2FkR2Fpbk1vZGUoKSAlcyIsIG5hbWUpOwotICAgIGF1ZGlvX2dhaW5fbW9kZV90IG1vZGUgPSAwOwotICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgewotICAgICAgICBtb2RlIHw9IChhdWRpb19nYWluX21vZGVfdClzdHJpbmdUb0VudW0oc0dhaW5Nb2RlTmFtZVRvRW51bVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzR2Fpbk1vZGVOYW1lVG9FbnVtVGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKLSAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7Ci0gICAgfQotICAgIHJldHVybiBtb2RlOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkR2Fpbihjbm9kZSAqcm9vdCwgaW50IGluZGV4KQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0KLSAgICBzcDxBdWRpb0dhaW4+IGdhaW4gPSBuZXcgQXVkaW9HYWluKGluZGV4LCBtVXNlSW5DaGFubmVsTWFzayk7Ci0KLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTU9ERSkgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubW9kZSA9IGxvYWRHYWluTW9kZSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9DSEFOTkVMUykgPT0gMCkgewotICAgICAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7Ci0gICAgICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uY2hhbm5lbF9tYXNrID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClzdHJpbmdUb0VudW0oc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uY2hhbm5lbF9tYXNrID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClzdHJpbmdUb0VudW0oc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01JTl9WQUxVRSkgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWluX3ZhbHVlID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NQVhfVkFMVUUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPm1HYWluLm1heF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fREVGQVVMVF9WQUxVRSkgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uZGVmYXVsdF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fU1RFUF9WQUxVRSkgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uc3RlcF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUlOX1JBTVBfTVMpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPm1HYWluLm1pbl9yYW1wX21zID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NQVhfUkFNUF9NUykgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWF4X3JhbXBfbXMgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLQotICAgIEFMT0dWKCJsb2FkR2FpbigpIGFkZGluZyBuZXcgZ2FpbiBtb2RlICUwOHggY2hhbm5lbCBtYXNrICUwOHggbWluIG1CICVkIG1heCBtQiAlZCIsCi0gICAgICAgICAgZ2Fpbi0+bUdhaW4ubW9kZSwgZ2Fpbi0+bUdhaW4uY2hhbm5lbF9tYXNrLCBnYWluLT5tR2Fpbi5taW5fdmFsdWUsIGdhaW4tPm1HYWluLm1heF92YWx1ZSk7Ci0KLSAgICBpZiAoZ2Fpbi0+bUdhaW4ubW9kZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbUdhaW5zLmFkZChnYWluKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZEdhaW5zKGNub2RlICpyb290KQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBBTE9HVigibG9hZEdhaW5zKCkgbG9hZGluZyBnYWluICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgIGxvYWRHYWluKG5vZGUsIGluZGV4KyspOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0V4YWN0U2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkgY29uc3QKLXsKLSAgICBpZiAobVNhbXBsaW5nUmF0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSArKykgewotICAgICAgICBpZiAobVNhbXBsaW5nUmF0ZXNbaV0gPT0gc2FtcGxpbmdSYXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlKSBjb25zdAotewotICAgIGlmIChtU2FtcGxpbmdSYXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8vIFNlYXJjaCBmb3IgdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGUgdGhhdCBpcyBhYm92ZSAocHJlZmVycmVkKQotICAgIC8vIG9yIGJlbG93IChhY2NlcHRhYmxlKSB0aGUgZGVzaXJlZCBzYW1wbGluZyByYXRlLCB3aXRoaW4gYSBwZXJtaXR0ZWQgcmF0aW8uCi0gICAgLy8gVGhlIHNhbXBsaW5nIHJhdGVzIGRvIG5vdCBuZWVkIHRvIGJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuCi0gICAgc3NpemVfdCBtYXhCZWxvdyA9IC0xOwotICAgIHNzaXplX3QgbWluQWJvdmUgPSAtMTsKLSAgICB1aW50MzJfdCBjYW5kaWRhdGU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgewotICAgICAgICBjYW5kaWRhdGUgPSBtU2FtcGxpbmdSYXRlc1tpXTsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZSA9PSBzYW1wbGluZ1JhdGUpIHsKLSAgICAgICAgICAgIGlmICh1cGRhdGVkU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICAvLyBjYW5kaWRhdGUgPCBkZXNpcmVkCi0gICAgICAgIGlmIChjYW5kaWRhdGUgPCBzYW1wbGluZ1JhdGUpIHsKLSAgICAgICAgICAgIGlmIChtYXhCZWxvdyA8IDAgfHwgY2FuZGlkYXRlID4gbVNhbXBsaW5nUmF0ZXNbbWF4QmVsb3ddKSB7Ci0gICAgICAgICAgICAgICAgbWF4QmVsb3cgPSBpOwotICAgICAgICAgICAgfQotICAgICAgICAvLyBjYW5kaWRhdGUgPiBkZXNpcmVkCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobWluQWJvdmUgPCAwIHx8IGNhbmRpZGF0ZSA8IG1TYW1wbGluZ1JhdGVzW21pbkFib3ZlXSkgewotICAgICAgICAgICAgICAgIG1pbkFib3ZlID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBUaGlzIHVzZXMgaGFyZC1jb2RlZCBrbm93bGVkZ2UgYWJvdXQgQXVkaW9GbGluZ2VyIHJlc2FtcGxpbmcgcmF0aW9zLgotICAgIC8vIFRPRE8gTW92ZSB0aGVzZSBhc3N1bXB0aW9ucyBvdXQuCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhEb3duU2FtcGxlUmF0aW8gPSA2OyAgLy8gYmV5b25kIHRoaXMgYWxpYXNpbmcgb2NjdXJzCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhVcFNhbXBsZVJhdGlvID0gMjU2OyAgLy8gYmV5b25kIHRoaXMgc2FtcGxlIHJhdGUgaW5hY2N1cmFjaWVzIG9jY3VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVlIHRvIGFwcHJveGltYXRpb24gYnkgYW4gaW50MzJfdCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaGFzZSBpbmNyZW1lbnRzCi0gICAgLy8gUHJlZmVyIHRvIGRvd24tc2FtcGxlIGZyb20gYSBoaWdoZXIgc2FtcGxpbmcgcmF0ZSwgYXMgd2UgZ2V0IHRoZSBkZXNpcmVkIGZyZXF1ZW5jeSBzcGVjdHJ1bS4KLSAgICBpZiAobWluQWJvdmUgPj0gMCkgewotICAgICAgICBjYW5kaWRhdGUgPSBtU2FtcGxpbmdSYXRlc1ttaW5BYm92ZV07Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgLyBrTWF4RG93blNhbXBsZVJhdGlvIDw9IHNhbXBsaW5nUmF0ZSkgewotICAgICAgICAgICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICp1cGRhdGVkU2FtcGxpbmdSYXRlID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIEJ1dCBpZiB3ZSBoYXZlIHRvIHVwLXNhbXBsZSBmcm9tIGEgbG93ZXIgc2FtcGxpbmcgcmF0ZSwgdGhhdCdzIE9LLgotICAgIGlmIChtYXhCZWxvdyA+PSAwKSB7Ci0gICAgICAgIGNhbmRpZGF0ZSA9IG1TYW1wbGluZ1JhdGVzW21heEJlbG93XTsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZSAqIGtNYXhVcFNhbXBsZVJhdGlvID49IHNhbXBsaW5nUmF0ZSkgewotICAgICAgICAgICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICp1cGRhdGVkU2FtcGxpbmdSYXRlID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIGxlYXZlIHVwZGF0ZWRTYW1wbGluZ1JhdGUgdW5tb2RpZmllZAotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0V4YWN0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIGNvbnN0Ci17Ci0gICAgaWYgKG1DaGFubmVsTWFza3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1DaGFubmVsTWFza3NbaV0gPT0gY2hhbm5lbE1hc2spIHsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQkFEX1ZBTFVFOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y2hlY2tDb21wYXRpYmxlQ2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spCi0gICAgICAgIGNvbnN0Ci17Ci0gICAgaWYgKG1DaGFubmVsTWFza3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBjb25zdCBib29sIGlzUmVjb3JkVGhyZWFkID0gbVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSzsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIC8vIEZJWE1FIERvZXMgbm90IGhhbmRsZSBtdWx0aS1jaGFubmVsIGF1dG9tYXRpYyBjb252ZXJzaW9ucyB5ZXQKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgc3VwcG9ydGVkID0gbUNoYW5uZWxNYXNrc1tpXTsKLSAgICAgICAgaWYgKHN1cHBvcnRlZCA9PSBjaGFubmVsTWFzaykgewotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc1JlY29yZFRocmVhZCkgewotICAgICAgICAgICAgLy8gVGhpcyB1c2VzIGhhcmQtY29kZWQga25vd2xlZGdlIHRoYXQgQXVkaW9GbGluZ2VyIGNhbiBzaWxlbnRseSBkb3duLW1peCBhbmQgdXAtbWl4LgotICAgICAgICAgICAgLy8gRklYTUUgQWJzdHJhY3QgdGhpcyBvdXQgdG8gYSB0YWJsZS4KLSAgICAgICAgICAgIGlmICgoKHN1cHBvcnRlZCA9PSBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0sgfHwgc3VwcG9ydGVkID09IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKQotICAgICAgICAgICAgICAgICAgICAmJiBjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX01PTk8pIHx8Ci0gICAgICAgICAgICAgICAgKHN1cHBvcnRlZCA9PSBBVURJT19DSEFOTkVMX0lOX01PTk8gJiYgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSwotICAgICAgICAgICAgICAgICAgICB8fCBjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX1NURVJFTykpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Ci17Ci0gICAgaWYgKG1Gb3JtYXRzLmlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRm9ybWF0cy5zaXplKCk7IGkgKyspIHsKLSAgICAgICAgaWYgKG1Gb3JtYXRzW2ldID09IGZvcm1hdCkgewotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnBpY2tTYW1wbGluZ1JhdGUoKSBjb25zdAotewotICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdW5pbml0aWFsaXplZCBkeW5hbWljIHByb2ZpbGUKLSAgICBpZiAobVNhbXBsaW5nUmF0ZXMuc2l6ZSgpID09IDEgJiYgbVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyBGb3IgZGlyZWN0IG91dHB1dHMsIHBpY2sgbWluaW11bSBzYW1wbGluZyByYXRlOiB0aGlzIGhlbHBzIGVuc3VyaW5nIHRoYXQgdGhlCi0gICAgLy8gY2hhbm5lbCBjb3VudCAvIHNhbXBsaW5nIHJhdGUgY29tYmluYXRpb24gY2hvc2VuIHdpbGwgYmUgc3VwcG9ydGVkIGJ5IHRoZSBjb25uZWN0ZWQKLSAgICAvLyBzaW5rCi0gICAgaWYgKChtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSAmJiAobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgJiYKLSAgICAgICAgICAgIChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkpKSB7Ci0gICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IFVJTlRfTUFYOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSArKykgewotICAgICAgICAgICAgaWYgKChtU2FtcGxpbmdSYXRlc1tpXSA8IHNhbXBsaW5nUmF0ZSkgJiYgKG1TYW1wbGluZ1JhdGVzW2ldID4gMCkpIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtU2FtcGxpbmdSYXRlc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKHNhbXBsaW5nUmF0ZSA9PSBVSU5UX01BWCkgPyAwIDogc2FtcGxpbmdSYXRlOwotICAgIH0KLQotICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDA7Ci0gICAgdWludDMyX3QgbWF4UmF0ZSA9IE1BWF9NSVhFUl9TQU1QTElOR19SQVRFOwotCi0gICAgLy8gRm9yIG1peGVkIG91dHB1dCBhbmQgaW5wdXRzLCB1c2UgbWF4IG1peGVyIHNhbXBsaW5nIHJhdGVzLiBEbyBub3QKLSAgICAvLyBsaW1pdCBzYW1wbGluZyByYXRlIG90aGVyd2lzZQotICAgIGlmIChtVHlwZSAhPSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgIG1heFJhdGUgPSBVSU5UX01BWDsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkgKyspIHsKLSAgICAgICAgaWYgKChtU2FtcGxpbmdSYXRlc1tpXSA+IHNhbXBsaW5nUmF0ZSkgJiYgKG1TYW1wbGluZ1JhdGVzW2ldIDw9IG1heFJhdGUpKSB7Ci0gICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtU2FtcGxpbmdSYXRlc1tpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc2FtcGxpbmdSYXRlOwotfQotCi1hdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6cGlja0NoYW5uZWxNYXNrKCkgY29uc3QKLXsKLSAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHVuaW5pdGlhbGl6ZWQgZHluYW1pYyBwcm9maWxlCi0gICAgaWYgKG1DaGFubmVsTWFza3Muc2l6ZSgpID09IDEgJiYgbUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX05PTkU7Ci0gICAgfQotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOwotCi0gICAgLy8gRm9yIGRpcmVjdCBvdXRwdXRzLCBwaWNrIG1pbmltdW0gY2hhbm5lbCBjb3VudDogdGhpcyBoZWxwcyBlbnN1cmluZyB0aGF0IHRoZQotICAgIC8vIGNoYW5uZWwgY291bnQgLyBzYW1wbGluZyByYXRlIGNvbWJpbmF0aW9uIGNob3NlbiB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGUgY29ubmVjdGVkCi0gICAgLy8gc2luawotICAgIGlmICgobVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgJiYgKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpICYmCi0gICAgICAgICAgICAobUZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpKSkgewotICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBVSU5UX01BWDsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSArKykgewotICAgICAgICAgICAgdWludDMyX3QgY25sQ291bnQ7Ci0gICAgICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKLSAgICAgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFza3NbaV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hhbm5lbE1hc2tzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoY25sQ291bnQgPCBjaGFubmVsQ291bnQpICYmIChjbmxDb3VudCA+IDApKSB7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2tzW2ldOwotICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGNubENvdW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGFubmVsTWFzazsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSAwOwotICAgIHVpbnQzMl90IG1heENvdW50ID0gTUFYX01JWEVSX0NIQU5ORUxfQ09VTlQ7Ci0KLSAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBtYXggbWl4ZXIgY2hhbm5lbCBjb3VudC4gRG8gbm90Ci0gICAgLy8gbGltaXQgY2hhbm5lbCBjb3VudCBvdGhlcndpc2UKLSAgICBpZiAobVR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewotICAgICAgICBtYXhDb3VudCA9IFVJTlRfTUFYOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIHVpbnQzMl90IGNubENvdW50OwotICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKLSAgICAgICAgICAgIGNubENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrc1tpXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hhbm5lbE1hc2tzW2ldKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGNubENvdW50ID4gY2hhbm5lbENvdW50KSAmJiAoY25sQ291bnQgPD0gbWF4Q291bnQpKSB7Ci0gICAgICAgICAgICBjaGFubmVsTWFzayA9IG1DaGFubmVsTWFza3NbaV07Ci0gICAgICAgICAgICBjaGFubmVsQ291bnQgPSBjbmxDb3VudDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY2hhbm5lbE1hc2s7Ci19Ci0KLS8qIGZvcm1hdCBpbiBvcmRlciBvZiBpbmNyZWFzaW5nIHByZWZlcmVuY2UgKi8KLWNvbnN0IGF1ZGlvX2Zvcm1hdF90IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpzUGNtRm9ybWF0Q29tcGFyZVRhYmxlW10gPSB7Ci0gICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxULAotICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVCwKLSAgICAgICAgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VELAotICAgICAgICBBVURJT19GT1JNQVRfUENNXzMyX0JJVCwKLSAgICAgICAgQVVESU9fRk9STUFUX1BDTV9GTE9BVCwKLX07Ci0KLWludCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y29tcGFyZUZvcm1hdHMoYXVkaW9fZm9ybWF0X3QgZm9ybWF0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0MikKLXsKLSAgICAvLyBOT1RFOiBBVURJT19GT1JNQVRfSU5WQUxJRCBpcyBhbHNvIGNvbnNpZGVyZWQgbm90IFBDTSBhbmQgd2lsbCBiZSBjb21wYXJlZCBlcXVhbCB0byBhbnkKLSAgICAvLyBjb21wcmVzc2VkIGZvcm1hdCBhbmQgYmV0dGVyIHRoYW4gYW55IFBDTSBmb3JtYXQuIFRoaXMgaXMgYnkgZGVzaWduIG9mIHBpY2tGb3JtYXQoKQotICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQxKSkgewotICAgICAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0MikpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0MikpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGludCBpbmRleDEgPSAtMSwgaW5kZXgyID0gLTE7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7Ci0gICAgICAgICAgICAoaSA8IEFSUkFZX1NJWkUoc1BjbUZvcm1hdENvbXBhcmVUYWJsZSkpICYmICgoaW5kZXgxID09IC0xKSB8fCAoaW5kZXgyID09IC0xKSk7Ci0gICAgICAgICAgICBpICsrKSB7Ci0gICAgICAgIGlmIChzUGNtRm9ybWF0Q29tcGFyZVRhYmxlW2ldID09IGZvcm1hdDEpIHsKLSAgICAgICAgICAgIGluZGV4MSA9IGk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNQY21Gb3JtYXRDb21wYXJlVGFibGVbaV0gPT0gZm9ybWF0MikgewotICAgICAgICAgICAgaW5kZXgyID0gaTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBmb3JtYXQxIG5vdCBmb3VuZCA9PiBpbmRleDEgPCAwID0+IGZvcm1hdDIgPiBmb3JtYXQxCi0gICAgLy8gZm9ybWF0MiBub3QgZm91bmQgPT4gaW5kZXgyIDwgMCA9PiBmb3JtYXQyIDwgZm9ybWF0MQotICAgIHJldHVybiBpbmRleDEgLSBpbmRleDI7Ci19Ci0KLWF1ZGlvX2Zvcm1hdF90IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpwaWNrRm9ybWF0KCkgY29uc3QKLXsKLSAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHVuaW5pdGlhbGl6ZWQgZHluYW1pYyBwcm9maWxlCi0gICAgaWYgKG1Gb3JtYXRzLnNpemUoKSA9PSAxICYmIG1Gb3JtYXRzWzBdID09IDApIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9ERUZBVUxUOwotICAgIH0KLQotICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwotICAgIGF1ZGlvX2Zvcm1hdF90IGJlc3RGb3JtYXQgPQotICAgICAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnNQY21Gb3JtYXRDb21wYXJlVGFibGVbCi0gICAgICAgICAgICAgICAgQVJSQVlfU0laRShBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6c1BjbUZvcm1hdENvbXBhcmVUYWJsZSkgLSAxXTsKLSAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBiZXN0IG1peGVyIG91dHB1dCBmb3JtYXQuIERvIG5vdAotICAgIC8vIGxpbWl0IGZvcm1hdCBvdGhlcndpc2UKLSAgICBpZiAoKG1UeXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHx8Ci0gICAgICAgICAgICAoKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpICYmCi0gICAgICAgICAgICAgKCgobUZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpKSAhPSAwKSkpKSB7Ci0gICAgICAgIGJlc3RGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSArKykgewotICAgICAgICBpZiAoKGNvbXBhcmVGb3JtYXRzKG1Gb3JtYXRzW2ldLCBmb3JtYXQpID4gMCkgJiYKLSAgICAgICAgICAgICAgICAoY29tcGFyZUZvcm1hdHMobUZvcm1hdHNbaV0sIGJlc3RGb3JtYXQpIDw9IDApKSB7Ci0gICAgICAgICAgICBmb3JtYXQgPSBtRm9ybWF0c1tpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZm9ybWF0OwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y2hlY2tHYWluKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqZ2FpbkNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdAotewotICAgIGlmIChpbmRleCA8IDAgfHwgKHNpemVfdClpbmRleCA+PSBtR2FpbnMuc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHJldHVybiBtR2FpbnNbaW5kZXhdLT5jaGVja0NvbmZpZyhnYWluQ29uZmlnKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBpZiAobU5hbWUuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotCi0gICAgaWYgKG1TYW1wbGluZ1JhdGVzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc2FtcGxpbmcgcmF0ZXM6ICIsIHNwYWNlcywgIiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpID09IDAgJiYgbVNhbXBsaW5nUmF0ZXNbaV0gPT0gMCkgewotICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkR5bmFtaWMiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJWQiLCBtU2FtcGxpbmdSYXRlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1TYW1wbGluZ1JhdGVzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgIH0KLQotICAgIGlmIChtQ2hhbm5lbE1hc2tzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gY2hhbm5lbCBtYXNrczogIiwgc3BhY2VzLCAiIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBTE9HVigiQXVkaW9Qb3J0OjpkdW1wIG1DaGFubmVsTWFza3MgJXp1ICUwOHgiLCBpLCBtQ2hhbm5lbE1hc2tzW2ldKTsKLQotICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiBtQ2hhbm5lbE1hc2tzW2ldID09IDApIHsKLSAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJEeW5hbWljIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIjB4JTA0eCIsIG1DaGFubmVsTWFza3NbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtQ2hhbm5lbE1hc2tzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgIH0KLQotICAgIGlmIChtRm9ybWF0cy5zaXplKCkgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGZvcm1hdHM6ICIsIHNwYWNlcywgIiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdFN0ciA9IGVudW1Ub1N0cmluZyhzRm9ybWF0TmFtZVRvRW51bVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0Zvcm1hdE5hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdHNbaV0pOwotICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiBzdHJjbXAoZm9ybWF0U3RyLCAiIikgPT0gMCkgewotICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkR5bmFtaWMiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMiLCBmb3JtYXRTdHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtRm9ybWF0cy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLSAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgaWYgKG1HYWlucy5zaXplKCkgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGdhaW5zOlxuIiwgc3BhY2VzLCAiIik7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpICsgMSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtR2FpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG1HYWluc1tpXS0+ZHVtcChmZCwgc3BhY2VzICsgMiwgaSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIC0tLSBBdWRpb0dhaW4gY2xhc3MgaW1wbGVtZW50YXRpb24KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0dhaW46OkF1ZGlvR2FpbihpbnQgaW5kZXgsIGJvb2wgdXNlSW5DaGFubmVsTWFzaykKLXsKLSAgICBtSW5kZXggPSBpbmRleDsKLSAgICBtVXNlSW5DaGFubmVsTWFzayA9IHVzZUluQ2hhbm5lbE1hc2s7Ci0gICAgbWVtc2V0KCZtR2FpbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19nYWluKSk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0dhaW46OmdldERlZmF1bHRDb25maWcoc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpCi17Ci0gICAgY29uZmlnLT5pbmRleCA9IG1JbmRleDsKLSAgICBjb25maWctPm1vZGUgPSBtR2Fpbi5tb2RlOwotICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrID0gbUdhaW4uY2hhbm5lbF9tYXNrOwotICAgIGlmICgobUdhaW4ubW9kZSAmIEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgPT0gQVVESU9fR0FJTl9NT0RFX0pPSU5UKSB7Ci0gICAgICAgIGNvbmZpZy0+dmFsdWVzWzBdID0gbUdhaW4uZGVmYXVsdF92YWx1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICB1aW50MzJfdCBudW1WYWx1ZXM7Ci0gICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgewotICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUdhaW4uY2hhbm5lbF9tYXNrKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtR2Fpbi5jaGFubmVsX21hc2spOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHsKLSAgICAgICAgICAgIGNvbmZpZy0+dmFsdWVzW2ldID0gbUdhaW4uZGVmYXVsdF92YWx1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoKG1HYWluLm1vZGUgJiBBVURJT19HQUlOX01PREVfUkFNUCkgPT0gQVVESU9fR0FJTl9NT0RFX1JBTVApIHsKLSAgICAgICAgY29uZmlnLT5yYW1wX2R1cmF0aW9uX21zID0gbUdhaW4ubWluX3JhbXBfbXM7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvR2Fpbjo6Y2hlY2tDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpCi17Ci0gICAgaWYgKChjb25maWctPm1vZGUgJiB+bUdhaW4ubW9kZSkgIT0gMCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAoKGNvbmZpZy0+bW9kZSAmIEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgPT0gQVVESU9fR0FJTl9NT0RFX0pPSU5UKSB7Ci0gICAgICAgIGlmICgoY29uZmlnLT52YWx1ZXNbMF0gPCBtR2Fpbi5taW5fdmFsdWUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChjb25maWctPnZhbHVlc1swXSA+IG1HYWluLm1heF92YWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoKGNvbmZpZy0+Y2hhbm5lbF9tYXNrICYgfm1HYWluLmNoYW5uZWxfbWFzaykgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICB1aW50MzJfdCBudW1WYWx1ZXM7Ci0gICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgewotICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY29uZmlnLT5jaGFubmVsX21hc2spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVZhbHVlczsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoKGNvbmZpZy0+dmFsdWVzW2ldIDwgbUdhaW4ubWluX3ZhbHVlKSB8fAotICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT52YWx1ZXNbaV0gPiBtR2Fpbi5tYXhfdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoKGNvbmZpZy0+bW9kZSAmIEFVRElPX0dBSU5fTU9ERV9SQU1QKSA9PSBBVURJT19HQUlOX01PREVfUkFNUCkgewotICAgICAgICBpZiAoKGNvbmZpZy0+cmFtcF9kdXJhdGlvbl9tcyA8IG1HYWluLm1pbl9yYW1wX21zKSB8fAotICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT5yYW1wX2R1cmF0aW9uX21zID4gbUdhaW4ubWF4X3JhbXBfbXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvR2Fpbjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0dhaW4gJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtb2RlOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tb2RlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsX21hc2s6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLmNoYW5uZWxfbWFzayk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWluX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3ZhbHVlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtYXhfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tYXhfdmFsdWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGRlZmF1bHRfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5kZWZhdWx0X3ZhbHVlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzdGVwX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uc3RlcF92YWx1ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWluX3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fcmFtcF9tcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWF4X3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tYXhfcmFtcF9tcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci19Ci0KLS8vIC0tLSBBdWRpb1BvcnRDb25maWcgY2xhc3MgaW1wbGVtZW50YXRpb24KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnRDb25maWc6OkF1ZGlvUG9ydENvbmZpZygpCi17Ci0gICAgbVNhbXBsaW5nUmF0ZSA9IDA7Ci0gICAgbUNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOwotICAgIG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICBtR2Fpbi5pbmRleCA9IC0xOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydENvbmZpZzo6YXBwbHlBdWRpb1BvcnRDb25maWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmJhY2t1cENvbmZpZykKLXsKLSAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbG9jYWxCYWNrdXBDb25maWc7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0KLSAgICBsb2NhbEJhY2t1cENvbmZpZy5jb25maWdfbWFzayA9IGNvbmZpZy0+Y29uZmlnX21hc2s7Ci0gICAgdG9BdWRpb1BvcnRDb25maWcoJmxvY2FsQmFja3VwQ29uZmlnKTsKLQotICAgIHNwPEF1ZGlvUG9ydD4gYXVkaW9wb3J0ID0gZ2V0QXVkaW9Qb3J0KCk7Ci0gICAgaWYgKGF1ZGlvcG9ydCA9PSAwKSB7Ci0gICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICB9Ci0gICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgewotICAgICAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrRXhhY3RTYW1wbGluZ1JhdGUoY29uZmlnLT5zYW1wbGVfcmF0ZSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgfQotICAgICAgICBtU2FtcGxpbmdSYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKLSAgICB9Ci0gICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spIHsKLSAgICAgICAgc3RhdHVzID0gYXVkaW9wb3J0LT5jaGVja0V4YWN0Q2hhbm5lbE1hc2soY29uZmlnLT5jaGFubmVsX21hc2spOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgIH0KLSAgICAgICAgbUNoYW5uZWxNYXNrID0gY29uZmlnLT5jaGFubmVsX21hc2s7Ci0gICAgfQotICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7Ci0gICAgICAgIHN0YXR1cyA9IGF1ZGlvcG9ydC0+Y2hlY2tGb3JtYXQoY29uZmlnLT5mb3JtYXQpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgIH0KLSAgICAgICAgbUZvcm1hdCA9IGNvbmZpZy0+Zm9ybWF0OwotICAgIH0KLSAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKLSAgICAgICAgc3RhdHVzID0gYXVkaW9wb3J0LT5jaGVja0dhaW4oJmNvbmZpZy0+Z2FpbiwgY29uZmlnLT5nYWluLmluZGV4KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICB9Ci0gICAgICAgIG1HYWluID0gY29uZmlnLT5nYWluOwotICAgIH0KLQotZXhpdDoKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIGFwcGx5QXVkaW9Qb3J0Q29uZmlnKCZsb2NhbEJhY2t1cENvbmZpZyk7Ci0gICAgfQotICAgIGlmIChiYWNrdXBDb25maWcgIT0gTlVMTCkgewotICAgICAgICAqYmFja3VwQ29uZmlnID0gbG9jYWxCYWNrdXBDb25maWc7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAotewotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKLSAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IG1TYW1wbGluZ1JhdGU7Ci0gICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gc3JjQ29uZmlnLT5zYW1wbGVfcmF0ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSAwOwotICAgIH0KLSAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgewotICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IHNyY0NvbmZpZy0+Y2hhbm5lbF9tYXNrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7Ci0gICAgfQotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gbUZvcm1hdDsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IHNyY0NvbmZpZy0+Zm9ybWF0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICB9Ci0gICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Z2FpbiA9IG1HYWluOwotICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmdhaW4gPSBzcmNDb25maWctPmdhaW47Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBkc3RDb25maWctPmdhaW4uaW5kZXggPSAtMTsKLSAgICB9Ci0gICAgaWYgKGRzdENvbmZpZy0+Z2Fpbi5pbmRleCAhPSAtMSkgewotICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0dBSU47Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayAmPSB+QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKLSAgICB9Ci19Ci0KLS8vIC0tLSBJT1Byb2ZpbGUgY2xhc3MgaW1wbGVtZW50YXRpb24KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU6OklPUHJvZmlsZShjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkKLSAgICA6IEF1ZGlvUG9ydChuYW1lLCBBVURJT19QT1JUX1RZUEVfTUlYLCByb2xlLCBtb2R1bGUpCi17Ci19Ci0KLUF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjp+SU9Qcm9maWxlKCkKLXsKLX0KLQotLy8gY2hlY2tzIGlmIHRoZSBJTyBwcm9maWxlIGlzIGNvbXBhdGlibGUgd2l0aCBzcGVjaWZpZWQgcGFyYW1ldGVycy4KLS8vIFNhbXBsaW5nIHJhdGUsIGZvcm1hdCBhbmQgY2hhbm5lbCBtYXNrIG11c3QgYmUgc3BlY2lmaWVkIGluIG9yZGVyIHRvCi0vLyBnZXQgYSB2YWxpZCBhIG1hdGNoCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjppc0NvbXBhdGlibGVQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpIGNvbnN0Ci17Ci0gICAgY29uc3QgYm9vbCBpc1BsYXliYWNrVGhyZWFkID0gbVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFOwotICAgIGNvbnN0IGJvb2wgaXNSZWNvcmRUaHJlYWQgPSBtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYICYmIG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LOwotICAgIEFMT0dfQVNTRVJUKGlzUGxheWJhY2tUaHJlYWQgIT0gaXNSZWNvcmRUaHJlYWQpOwotCi0gICAgaWYgKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSAmJiBtU3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlLCBhZGRyZXNzKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoc2FtcGxpbmdSYXRlID09IDApIHsKLSAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgdWludDMyX3QgbXlVcGRhdGVkU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOwotICAgIGlmIChpc1BsYXliYWNrVGhyZWFkICYmIGNoZWNrRXhhY3RTYW1wbGluZ1JhdGUoc2FtcGxpbmdSYXRlKSAhPSBOT19FUlJPUikgewotICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoaXNSZWNvcmRUaHJlYWQgJiYgY2hlY2tDb21wYXRpYmxlU2FtcGxpbmdSYXRlKHNhbXBsaW5nUmF0ZSwgJm15VXBkYXRlZFNhbXBsaW5nUmF0ZSkgIT0KLSAgICAgICAgICAgIE5PX0VSUk9SKSB7Ci0gICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSB8fCBjaGVja0Zvcm1hdChmb3JtYXQpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoaXNQbGF5YmFja1RocmVhZCAmJiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSB8fAotICAgICAgICAgICAgY2hlY2tFeGFjdENoYW5uZWxNYXNrKGNoYW5uZWxNYXNrKSAhPSBOT19FUlJPUikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoaXNSZWNvcmRUaHJlYWQgJiYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSB8fAotICAgICAgICAgICAgY2hlY2tDb21wYXRpYmxlQ2hhbm5lbE1hc2soY2hhbm5lbE1hc2spICE9IE5PX0VSUk9SKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKGlzUGxheWJhY2tUaHJlYWQgJiYgKG1GbGFncyAmIGZsYWdzKSAhPSBmbGFncykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIC8vIFRoZSBvbmx5IGlucHV0IGZsYWcgdGhhdCBpcyBhbGxvd2VkIHRvIGJlIGRpZmZlcmVudCBpcyB0aGUgZmFzdCBmbGFnLgotICAgIC8vIEFuIGV4aXN0aW5nIGZhc3Qgc3RyZWFtIGlzIGNvbXBhdGlibGUgd2l0aCBhIG5vcm1hbCB0cmFjayByZXF1ZXN0LgotICAgIC8vIEFuIGV4aXN0aW5nIG5vcm1hbCBzdHJlYW0gaXMgY29tcGF0aWJsZSB3aXRoIGEgZmFzdCB0cmFjayByZXF1ZXN0LAotICAgIC8vIGJ1dCB0aGUgZmFzdCByZXF1ZXN0IHdpbGwgYmUgZGVuaWVkIGJ5IEF1ZGlvRmxpbmdlciBhbmQgY29udmVydGVkIHRvIG5vcm1hbCB0cmFjay4KLSAgICBpZiAoaXNSZWNvcmRUaHJlYWQgJiYgKChtRmxhZ3MgXiBmbGFncykgJgotICAgICAgICAgICAgfkFVRElPX0lOUFVUX0ZMQUdfRkFTVCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh1cGRhdGVkU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKLSAgICAgICAgKnVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBteVVwZGF0ZWRTYW1wbGluZ1JhdGU7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIEF1ZGlvUG9ydDo6ZHVtcChmZCwgNCk7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLSBmbGFnczogMHglMDR4XG4iLCBtRmxhZ3MpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLSBkZXZpY2VzOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbVN1cHBvcnRlZERldmljZXNbaV0tPmR1bXAoZmQsIDYsIGkpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OklPUHJvZmlsZTo6bG9nKCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIEFMT0dWKCIgICAgLSBzYW1wbGluZyByYXRlczogIik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgewotICAgICAgICBBTE9HVigiICAlZCIsIG1TYW1wbGluZ1JhdGVzW2ldKTsKLSAgICB9Ci0KLSAgICBBTE9HVigiICAgIC0gY2hhbm5lbCBtYXNrczogIik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIEFMT0dWKCIgIDB4JTA0eCIsIG1DaGFubmVsTWFza3NbaV0pOwotICAgIH0KLQotICAgIEFMT0dWKCIgICAgLSBmb3JtYXRzOiAiKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIEFMT0dWKCIgIDB4JTA4eCIsIG1Gb3JtYXRzW2ldKTsKLSAgICB9Ci0KLSAgICBBTE9HVigiICAgIC0gZGV2aWNlczogMHglMDR4XG4iLCBtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKTsKLSAgICBBTE9HVigiICAgIC0gZmxhZ3M6IDB4JTA0eFxuIiwgbUZsYWdzKTsKLX0KLQotCi0vLyAtLS0gRGV2aWNlRGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbgotCi0KLUF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcjo6RGV2aWNlRGVzY3JpcHRvcihjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19kZXZpY2VzX3QgdHlwZSkgOgotICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb3J0KG5hbWUsIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faXNfb3V0cHV0X2RldmljZSh0eXBlKSA/IEFVRElPX1BPUlRfUk9MRV9TSU5LIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCksCi0gICAgICAgICAgICAgICAgICAgICBtRGV2aWNlVHlwZSh0eXBlKSwgbUFkZHJlc3MoIiIpLCBtSWQoMCkKLXsKLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OmVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgLy8gRGV2aWNlcyBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiB0aGV5OgotICAgIC8vIC0gYXJlIG9mIHRoZSBzYW1lIHR5cGUgKGEgZGV2aWNlIHR5cGUgY2Fubm90IGJlIEFVRElPX0RFVklDRV9OT05FKQotICAgIC8vIC0gaGF2ZSB0aGUgc2FtZSBhZGRyZXNzIG9yIG9uZSBkZXZpY2UgZG9lcyBub3Qgc3BlY2lmeSB0aGUgYWRkcmVzcwotICAgIC8vIC0gaGF2ZSB0aGUgc2FtZSBjaGFubmVsIG1hc2sgb3Igb25lIGRldmljZSBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBjaGFubmVsIG1hc2sKLSAgICByZXR1cm4gKG1EZXZpY2VUeXBlID09IG90aGVyLT5tRGV2aWNlVHlwZSkgJiYKLSAgICAgICAgICAgKG1BZGRyZXNzID09ICIiIHx8IG90aGVyLT5tQWRkcmVzcyA9PSAiIiB8fCBtQWRkcmVzcyA9PSBvdGhlci0+bUFkZHJlc3MpICYmCi0gICAgICAgICAgIChtQ2hhbm5lbE1hc2sgPT0gMCB8fCBvdGhlci0+bUNoYW5uZWxNYXNrID09IDAgfHwKLSAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgPT0gb3RoZXItPm1DaGFubmVsTWFzayk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yOjpsb2FkR2FpbnMoY25vZGUgKnJvb3QpCi17Ci0gICAgQXVkaW9Qb3J0Ojpsb2FkR2FpbnMocm9vdCk7Ci0gICAgaWYgKG1HYWlucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIG1HYWluc1swXS0+Z2V0RGVmYXVsdENvbmZpZygmbUdhaW4pOwotICAgIH0KLX0KLQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpyZWZyZXNoVHlwZXMoKQotewotICAgIG1EZXZpY2VUeXBlcyA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBtRGV2aWNlVHlwZXMgfD0gaXRlbUF0KGkpLT5tRGV2aWNlVHlwZTsKLSAgICB9Ci0gICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6cmVmcmVzaFR5cGVzKCkgbURldmljZVR5cGVzICUwOHgiLCBtRGV2aWNlVHlwZXMpOwotfQotCi1zc2l6ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjppbmRleE9mKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSBjb25zdAotewotICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbS0+ZXF1YWxzKGl0ZW1BdChpKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQotc3NpemVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6YWRkKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKQotewotICAgIHNzaXplX3QgcmV0ID0gaW5kZXhPZihpdGVtKTsKLQotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIHJldCA9IFNvcnRlZFZlY3Rvcjo6YWRkKGl0ZW0pOwotICAgICAgICBpZiAocmV0ID49IDApIHsKLSAgICAgICAgICAgIHJlZnJlc2hUeXBlcygpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIkRldmljZVZlY3Rvcjo6YWRkIGRldmljZSAlMDh4IGFscmVhZHkgaW4iLCBpdGVtLT5tRGV2aWNlVHlwZSk7Ci0gICAgICAgIHJldCA9IC0xOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zc2l6ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpyZW1vdmUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pCi17Ci0gICAgc2l6ZV90IGk7Ci0gICAgc3NpemVfdCByZXQgPSBpbmRleE9mKGl0ZW0pOwotCi0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgQUxPR1coIkRldmljZVZlY3Rvcjo6cmVtb3ZlIGRldmljZSAlMDh4IG5vdCBpbiIsIGl0ZW0tPm1EZXZpY2VUeXBlKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBTb3J0ZWRWZWN0b3I6OnJlbW92ZUF0KHJldCk7Ci0gICAgICAgIGlmIChyZXQgPj0gMCkgewotICAgICAgICAgICAgcmVmcmVzaFR5cGVzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6bG9hZERldmljZXNGcm9tVHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZXMpCi17Ci0gICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3Q7Ci0KLSAgICB1aW50MzJfdCByb2xlX2JpdCA9IEFVRElPX0RFVklDRV9CSVRfSU4gJiB0eXBlczsKLSAgICB0eXBlcyAmPSB+cm9sZV9iaXQ7Ci0KLSAgICB3aGlsZSAodHlwZXMpIHsKLSAgICAgICAgdWludDMyX3QgaSA9IDMxIC0gX19idWlsdGluX2Nseih0eXBlcyk7Ci0gICAgICAgIHVpbnQzMl90IHR5cGUgPSAxIDw8IGk7Ci0gICAgICAgIHR5cGVzICY9IH50eXBlOwotICAgICAgICBhZGQobmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIHR5cGUgfCByb2xlX2JpdCkpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6bG9hZERldmljZXNGcm9tTmFtZShjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRlY2xhcmVkRGV2aWNlcykKLXsKLSAgICBjaGFyICpkZXZOYW1lID0gc3RydG9rKG5hbWUsICJ8Iik7Ci0gICAgd2hpbGUgKGRldk5hbWUgIT0gTlVMTCkgewotICAgICAgICBpZiAoc3RybGVuKGRldk5hbWUpICE9IDApIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gc3RyaW5nVG9FbnVtKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2TmFtZSk7Ci0gICAgICAgICAgICBpZiAodHlwZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldiA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCB0eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVggKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldi0+bUFkZHJlc3MgPSBTdHJpbmc4KCIwIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZChkZXYpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VGcm9tTmFtZShTdHJpbmc4KGRldk5hbWUpKTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGVzYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZChkZXZpY2VEZXNjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBkZXZOYW1lID0gc3RydG9rKE5VTEwsICJ8Iik7Ci0gICAgIH0KLX0KLQotc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSBjb25zdAotewotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtQXQoaSktPm1EZXZpY2VUeXBlID09IHR5cGUpIHsKLSAgICAgICAgICAgIGlmIChhZGRyZXNzID09ICIiIHx8IGl0ZW1BdChpKS0+bUFkZHJlc3MgPT0gYWRkcmVzcykgewotICAgICAgICAgICAgICAgIGRldmljZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoKSBmb3IgdHlwZSAlMDh4IGFkZHJlc3MgJXMgZm91bmQgJXAiLAotICAgICAgICAgIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCksIGRldmljZS5nZXQoKSk7Ci0gICAgcmV0dXJuIGRldmljZTsKLX0KLQotc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRnJvbUlkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAotewotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21JZCglZCkgaXRlbUF0KCV6dSktPm1JZCAlZCIsIGlkLCBpLCBpdGVtQXQoaSktPm1JZCk7Ci0gICAgICAgIGlmIChpdGVtQXQoaSktPm1JZCA9PSBpZCkgewotICAgICAgICAgICAgZGV2aWNlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRldmljZTsKLX0KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3IgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlKSBjb25zdAotewotICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgIGJvb2wgaXNPdXRwdXQgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh0eXBlKTsKLSAgICB0eXBlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyAoaSA8IHNpemUoKSkgJiYgKHR5cGUgIT0gQVVESU9fREVWSUNFX05PTkUpOyBpKyspIHsKLSAgICAgICAgYm9vbCBjdXJJc091dHB1dCA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKGl0ZW1BdChpKS0+bURldmljZVR5cGUpOwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyVHlwZSA9IGl0ZW1BdChpKS0+bURldmljZVR5cGUgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICAgICAgaWYgKChpc091dHB1dCA9PSBjdXJJc091dHB1dCkgJiYgKCh0eXBlICYgY3VyVHlwZSkgIT0gMCkpIHsKLSAgICAgICAgICAgIGRldmljZXMuYWRkKGl0ZW1BdChpKSk7Ci0gICAgICAgICAgICB0eXBlICY9IH5jdXJUeXBlOwotICAgICAgICAgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlKCkgZm9yIHR5cGUgJXggZm91bmQgJXAiLAotICAgICAgICAgICAgICAgICAgaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSwgaXRlbUF0KGkpLmdldCgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlczsKLX0KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3IgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZUFkZHIoCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlLCBTdHJpbmc4IGFkZHJlc3MpIGNvbnN0Ci17Ci0gICAgRGV2aWNlVmVjdG9yIGRldmljZXM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSA9PSB0eXBlKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoaXRlbUF0KGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlczsKLX0KLQotc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRnJvbU5hbWUoCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUpIGNvbnN0Ci17Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1BdChpKS0+bU5hbWUgPT0gbmFtZSkgewotICAgICAgICAgICAgZGV2aWNlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRldmljZTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAotewotICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0t8QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKLSAgICBpZiAoc3JjQ29uZmlnICE9IE5VTEwpIHsKLSAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayB8PSBzcmNDb25maWctPmNvbmZpZ19tYXNrOwotICAgIH0KLQotICAgIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOwotCi0gICAgZHN0Q29uZmlnLT5pZCA9IG1JZDsKLSAgICBkc3RDb25maWctPnJvbGUgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKG1EZXZpY2VUeXBlKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU0lOSyA6IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7Ci0gICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRTsKLSAgICBkc3RDb25maWctPmV4dC5kZXZpY2UudHlwZSA9IG1EZXZpY2VUeXBlOwotICAgIGRzdENvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBtTW9kdWxlLT5tSGFuZGxlOwotICAgIHN0cm5jcHkoZHN0Q29uZmlnLT5leHQuZGV2aWNlLmFkZHJlc3MsIG1BZGRyZXNzLnN0cmluZygpLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAotewotICAgIEFMT0dWKCJEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgpIGhhbmRsZSAlZCB0eXBlICV4IiwgbUlkLCBtRGV2aWNlVHlwZSk7Ci0gICAgQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChwb3J0KTsKLSAgICBwb3J0LT5pZCA9IG1JZDsKLSAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7Ci0gICAgcG9ydC0+ZXh0LmRldmljZS50eXBlID0gbURldmljZVR5cGU7Ci0gICAgcG9ydC0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBtTW9kdWxlLT5tSGFuZGxlOwotICAgIHN0cm5jcHkocG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSwgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTik7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0RldmljZSAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBpZiAobUlkICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtSWQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gdHlwZTogJS00OHNcbiIsIHNwYWNlcywgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bVRvU3RyaW5nKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VUeXBlKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGlmIChtQWRkcmVzcy5zaXplKCkgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGFkZHJlc3M6ICUtMzJzXG4iLCBzcGFjZXMsICIiLCBtQWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgQXVkaW9Qb3J0OjpkdW1wKGZkLCBzcGFjZXMpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUGF0Y2g6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIHBhdGNoICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaGFuZGxlOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1IYW5kbGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGF1ZGlvIGZsaW5nZXIgaGFuZGxlOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1BZlBhdGNoSGFuZGxlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBvd25lciB1aWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVVpZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJWQgc291cmNlczpcbiIsIHNwYWNlcywgIiIsIG1QYXRjaC5udW1fc291cmNlcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhdGNoLm51bV9zb3VyY2VzOyBpKyspIHsKLSAgICAgICAgaWYgKG1QYXRjaC5zb3VyY2VzW2ldLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBEZXZpY2UgSUQgJWQgJXNcbiIsIHNwYWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uaWQsIGVudW1Ub1N0cmluZyhzRGV2aWNlTmFtZVRvRW51bVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5leHQuZGV2aWNlLnR5cGUpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gTWl4IElEICVkIEkvTyBoYW5kbGUgJWRcbiIsIHNwYWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uaWQsIG1QYXRjaC5zb3VyY2VzW2ldLmV4dC5taXguaGFuZGxlKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJWQgc2lua3M6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NpbmtzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NpbmtzOyBpKyspIHsKLSAgICAgICAgaWYgKG1QYXRjaC5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gRGV2aWNlIElEICVkICVzXG4iLCBzcGFjZXMgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5pZCwgZW51bVRvU3RyaW5nKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGUpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gTWl4IElEICVkIEkvTyBoYW5kbGUgJWRcbiIsIHNwYWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNpbmtzW2ldLmlkLCBtUGF0Y2guc2lua3NbaV0uZXh0Lm1peC5oYW5kbGUpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLSBhdWRpb19wb2xpY3kuY29uZiBmaWxlIHBhcnNpbmcKLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpwYXJzZU91dHB1dEZsYWdOYW1lcyhjaGFyICpuYW1lKQotewotICAgIHVpbnQzMl90IGZsYWcgPSAwOwotCi0gICAgLy8gaXQgaXMgT0sgdG8gY2FzdCBuYW1lIHRvIG5vbiBjb25zdCBoZXJlIGFzIHdlIGFyZSBub3QgZ29pbmcgdG8gdXNlIGl0IGFmdGVyCi0gICAgLy8gc3RydG9rKCkgbW9kaWZpZXMgaXQKLSAgICBjaGFyICpmbGFnTmFtZSA9IHN0cnRvayhuYW1lLCAifCIpOwotICAgIHdoaWxlIChmbGFnTmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChzdHJsZW4oZmxhZ05hbWUpICE9IDApIHsKLSAgICAgICAgICAgIGZsYWcgfD0gc3RyaW5nVG9FbnVtKHNPdXRwdXRGbGFnTmFtZVRvRW51bVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc091dHB1dEZsYWdOYW1lVG9FbnVtVGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBmbGFnTmFtZSA9IHN0cnRvayhOVUxMLCAifCIpOwotICAgIH0KLSAgICAvL2ZvcmNlIGRpcmVjdCBmbGFnIGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQ6IG9mZmxvYWRpbmcgaW1wbGllcyBhIGRpcmVjdCBvdXRwdXQgc3RyZWFtCi0gICAgLy8gYW5kIGFsbCBjb21tb24gYmVoYXZpb3JzIGFyZSBkcml2ZW4gYnkgY2hlY2tpbmcgb25seSB0aGUgZGlyZWN0IGZsYWcKLSAgICAvLyB0aGlzIHNob3VsZCBub3JtYWxseSBiZSBzZXQgYXBwcm9wcmlhdGVseSBpbiB0aGUgcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZQotICAgIGlmICgoZmxhZyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKLSAgICAgICAgZmxhZyB8PSBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1Q7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZsYWc7Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6cGFyc2VJbnB1dEZsYWdOYW1lcyhjaGFyICpuYW1lKQotewotICAgIHVpbnQzMl90IGZsYWcgPSAwOwotCi0gICAgLy8gaXQgaXMgT0sgdG8gY2FzdCBuYW1lIHRvIG5vbiBjb25zdCBoZXJlIGFzIHdlIGFyZSBub3QgZ29pbmcgdG8gdXNlIGl0IGFmdGVyCi0gICAgLy8gc3RydG9rKCkgbW9kaWZpZXMgaXQKLSAgICBjaGFyICpmbGFnTmFtZSA9IHN0cnRvayhuYW1lLCAifCIpOwotICAgIHdoaWxlIChmbGFnTmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChzdHJsZW4oZmxhZ05hbWUpICE9IDApIHsKLSAgICAgICAgICAgIGZsYWcgfD0gc3RyaW5nVG9FbnVtKHNJbnB1dEZsYWdOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzSW5wdXRGbGFnTmFtZVRvRW51bVRhYmxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmxhZ05hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZsYWc7Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnBhcnNlRGV2aWNlTmFtZXMoY2hhciAqbmFtZSkKLXsKLSAgICB1aW50MzJfdCBkZXZpY2UgPSAwOwotCi0gICAgY2hhciAqZGV2TmFtZSA9IHN0cnRvayhuYW1lLCAifCIpOwotICAgIHdoaWxlIChkZXZOYW1lICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHN0cmxlbihkZXZOYW1lKSAhPSAwKSB7Ci0gICAgICAgICAgICBkZXZpY2UgfD0gc3RyaW5nVG9FbnVtKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2TmFtZSk7Ci0gICAgICAgICB9Ci0gICAgICAgIGRldk5hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKLSAgICAgfQotICAgIHJldHVybiBkZXZpY2U7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkSHdNb2R1bGUoY25vZGUgKnJvb3QpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgY25vZGUgKm5vZGU7Ci0gICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG5ldyBId01vZHVsZShyb290LT5uYW1lKTsKLQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBERVZJQ0VTX1RBRyk7Ci0gICAgaWYgKG5vZGUgIT0gTlVMTCkgewotICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBkZXZpY2UgJXMiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgICAgIHN0YXR1c190IHRtcFN0YXR1cyA9IG1vZHVsZS0+bG9hZERldmljZShub2RlKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTkFNRV9OT1RfRk9VTkQgfHwgc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gdG1wU3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIE9VVFBVVFNfVEFHKTsKLSAgICBpZiAobm9kZSAhPSBOVUxMKSB7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIG91dHB1dCAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbW9kdWxlLT5sb2FkT3V0cHV0KG5vZGUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgfQotICAgIH0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgSU5QVVRTX1RBRyk7Ci0gICAgaWYgKG5vZGUgIT0gTlVMTCkgewotICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBpbnB1dCAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbW9kdWxlLT5sb2FkSW5wdXQobm9kZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICB9Ci0gICAgfQotICAgIGxvYWRHbG9iYWxDb25maWcocm9vdCwgbW9kdWxlKTsKLQotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkSHdNb2R1bGVzKGNub2RlICpyb290KQotewotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgQVVESU9fSFdfTU9EVUxFX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGVzKCkgbG9hZGluZyBtb2R1bGUgJXMiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgbG9hZEh3TW9kdWxlKG5vZGUpOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkKLXsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEdMT0JBTF9DT05GSUdfVEFHKTsKLQotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBEZXZpY2VWZWN0b3IgZGVjbGFyZWREZXZpY2VzOwotICAgIGlmIChtb2R1bGUgIT0gTlVMTCkgewotICAgICAgICBkZWNsYXJlZERldmljZXMgPSBtb2R1bGUtPm1EZWNsYXJlZERldmljZXM7Ci0gICAgfQotCi0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoQVRUQUNIRURfT1VUUFVUX0RFVklDRVNfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21OYW1lKChjaGFyICopbm9kZS0+dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcyk7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIEF0dGFjaGVkIE91dHB1dCBEZXZpY2VzICUwOHgiLAotICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKERFRkFVTFRfT1VUUFVUX0RFVklDRV9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KXN0cmluZ1RvRW51bShzRGV2aWNlTmFtZVRvRW51bVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KCIiKSwgZGV2aWNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImxvYWRHbG9iYWxDb25maWcoKSBkZWZhdWx0IGRldmljZSBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1EZWZhdWx0T3V0cHV0RGV2aWNlICUwOHgiLCBtRGVmYXVsdE91dHB1dERldmljZS0+bURldmljZVR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChBVFRBQ0hFRF9JTlBVVF9ERVZJQ0VTX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgewotICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21OYW1lKChjaGFyICopbm9kZS0+dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWREZXZpY2VzKTsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgQXZhaWxhYmxlIElucHV0RGV2aWNlcyAlMDh4IiwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoU1BFQUtFUl9EUkNfRU5BQkxFRF9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIG1TcGVha2VyRHJjRW5hYmxlZCA9IHN0cmluZ1RvQm9vbCgoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgbVNwZWFrZXJEcmNFbmFibGVkID0gJWQiLCBtU3BlYWtlckRyY0VuYWJsZWQpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChBVURJT19IQUxfVkVSU0lPTl9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIHVpbnQzMl90IG1ham9yLCBtaW5vcjsKLSAgICAgICAgICAgIHNzY2FuZigoY2hhciAqKW5vZGUtPnZhbHVlLCAiJXUuJXUiLCAmbWFqb3IsICZtaW5vcik7Ci0gICAgICAgICAgICBtb2R1bGUtPm1IYWxWZXJzaW9uID0gSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKG1ham9yLCBtaW5vcik7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1IYWxWZXJzaW9uID0gJTA0eCBtYWpvciAldSBtaW5vciAldSIsCi0gICAgICAgICAgICAgICAgICBtb2R1bGUtPm1IYWxWZXJzaW9uLCBtYWpvciwgbWlub3IpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkQXVkaW9Qb2xpY3lDb25maWcoY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgICBjbm9kZSAqcm9vdDsKLSAgICBjaGFyICpkYXRhOwotCi0gICAgZGF0YSA9IChjaGFyICopbG9hZF9maWxlKHBhdGgsIE5VTEwpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOwotICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOwotCi0gICAgbG9hZEh3TW9kdWxlcyhyb290KTsKLSAgICAvLyBsZWdhY3kgYXVkaW9fcG9saWN5LmNvbmYgZmlsZXMgaGF2ZSBvbmUgZ2xvYmFsX2NvbmZpZ3VyYXRpb24gc2VjdGlvbgotICAgIGxvYWRHbG9iYWxDb25maWcocm9vdCwgZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpKTsKLSAgICBjb25maWdfZnJlZShyb290KTsKLSAgICBmcmVlKHJvb3QpOwotICAgIGZyZWUoZGF0YSk7Ci0KLSAgICBBTE9HSSgibG9hZEF1ZGlvUG9saWN5Q29uZmlnKCkgbG9hZGVkICVzXG4iLCBwYXRoKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmRlZmF1bHRBdWRpb1BvbGljeUNvbmZpZyh2b2lkKQotewotICAgIHNwPEh3TW9kdWxlPiBtb2R1bGU7Ci0gICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOwotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRlZmF1bHRJbnB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyk7Ci0gICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKG1EZWZhdWx0T3V0cHV0RGV2aWNlKTsKLSAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZWZhdWx0SW5wdXREZXZpY2UpOwotCi0gICAgbW9kdWxlID0gbmV3IEh3TW9kdWxlKCJwcmltYXJ5Iik7Ci0KLSAgICBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IiksIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIG1vZHVsZSk7Ci0gICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKDQ0MTAwKTsKLSAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOwotICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7Ci0gICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuYWRkKG1EZWZhdWx0T3V0cHV0RGV2aWNlKTsKLSAgICBwcm9maWxlLT5tRmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZOwotICAgIG1vZHVsZS0+bU91dHB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKLQotICAgIHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSwgQVVESU9fUE9SVF9ST0xFX1NJTkssIG1vZHVsZSk7Ci0gICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKDgwMDApOwotICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7Ci0gICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoQVVESU9fQ0hBTk5FTF9JTl9NT05PKTsKLSAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5hZGQoZGVmYXVsdElucHV0RGV2aWNlKTsKLSAgICBtb2R1bGUtPm1JbnB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKLQotICAgIG1Id01vZHVsZXMuYWRkKG1vZHVsZSk7Ci19Ci0KLWF1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKQotewotICAgIC8vIGZsYWdzIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOwotICAgIH0KLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19TQ08pID09IEFVRElPX0ZMQUdfU0NPKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzsKLSAgICB9Ci0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQkVBQ09OKSA9PSBBVURJT19GTEFHX0JFQUNPTikgewotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1RUUzsKLSAgICB9Ci0KLSAgICAvLyB1c2FnZSB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCi0gICAgc3dpdGNoIChhdHRyLT51c2FnZSkgewotICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgotICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX0FMQVJNKSkgewotICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9TWVNURU07Ci0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9EVE1GOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUklORzsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIH0KLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKSB7Ci0gICAgLy8gaGFzIGZsYWdzIHRoYXQgbWFwIHRvIGEgc3RyYXRlZ3k/Ci0gICAgaWYgKChwYWEtPmZsYWdzICYgKEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCB8IEFVRElPX0ZMQUdfU0NPIHwgQVVESU9fRkxBR19CRUFDT04pKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIGhhcyBrbm93biB1c2FnZT8KLSAgICBzd2l0Y2ggKHBhYS0+dXNhZ2UpIHsKLSAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046Ci0gICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKLSAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRToKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZGFmYTYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KLSNpbmNsdWRlICJBdWRpb1BvbGljeUludGVyZmFjZS5oIgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBBdHRlbnVhdGlvbiBhcHBsaWVkIHRvIFNUUkFURUdZX1NPTklGSUNBVElPTiBzdHJlYW1zIHdoZW4gYSBoZWFkc2V0IGlzIGNvbm5lY3RlZDogNmRCCi0jZGVmaW5lIFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1IgMC41Ci0vLyBNaW4gdm9sdW1lIGZvciBTVFJBVEVHWV9TT05JRklDQVRJT04gc3RyZWFtcyB3aGVuIGxpbWl0ZWQgYnkgbXVzaWMgdm9sdW1lOiAtMzZkQgotI2RlZmluZSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOICAwLjAxNgotLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgZHVyaW5nIHdoaWNoIHdlIGNvbnNpZGVyIHRoYXQgbXVzaWMgaXMgc3RpbGwgYWN0aXZlIGFmdGVyIGEgbXVzaWMKLS8vIHRyYWNrIHdhcyBzdG9wcGVkIC0gc2VlIGNvbXB1dGVWb2x1bWUoKQotI2RlZmluZSBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSAgNTAwMAotLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgbWVkaWEgc3RvcHBlZCBwbGF5aW5nIGR1cmluZyB3aGljaCB3ZSBjb25zaWRlciB0aGF0IHRoZQotLy8gc29uaWZpY2F0aW9uIHNob3VsZCBiZSBhcyB1bm9idHJ1c2l2ZSBhcyBkdXJpbmcgdGhlIHRpbWUgbWVkaWEgd2FzIHBsYXlpbmcuCi0jZGVmaW5lIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZIDUwMDAKLS8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGR1cmluZyB3aXRjaCBzb21lIHN0cmVhbXMgYXJlIG11dGVkIHdoaWxlIHRoZSBhdWRpbyBwYXRoCi0vLyBpcyBzd2l0Y2hlZAotI2RlZmluZSBNVVRFX1RJTUVfTVMgMjAwMAotCi0jZGVmaW5lIE5VTV9URVNUX09VVFBVVFMgNQotCi0jZGVmaW5lIE5VTV9WT0xfQ1VSVkVfS05FRVMgMgotCi0vLyBEZWZhdWx0IG1pbmltdW0gbGVuZ3RoIGFsbG93ZWQgZm9yIG9mZmxvYWRpbmcgYSBjb21wcmVzc2VkIHRyYWNrCi0vLyBDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyBwcm9wZXJ0eQotI2RlZmluZSBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MgNjAKLQotI2RlZmluZSBNQVhfTUlYRVJfU0FNUExJTkdfUkFURSA0ODAwMAotI2RlZmluZSBNQVhfTUlYRVJfQ0hBTk5FTF9DT1VOVCA4Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEF1ZGlvUG9saWN5TWFuYWdlciBpbXBsZW1lbnRzIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGJlaGF2aW9yIGNvbW1vbiB0byBhbGwgcGxhdGZvcm1zLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBBdWRpb1BvbGljeU1hbmFnZXI6IHB1YmxpYyBBdWRpb1BvbGljeUludGVyZmFjZQotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgLCBwdWJsaWMgVGhyZWFkCi0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotewotCi1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwotICAgICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeU1hbmFnZXIoKTsKLQotICAgICAgICAvLyBBdWRpb1BvbGljeUludGVyZmFjZQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwotICAgICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHNldFN5c3RlbVByb3BlcnR5KGNvbnN0IGNoYXIqIHByb3BlcnR5LCBjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF90eXBlX3QgKmlucHV0VHlwZSk7Ci0KLSAgICAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdGFydHMgYmVpbmcgdXNlZC4KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotCi0gICAgICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RvcHMgYmVpbmcgdXNlZC4KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBjbG9zZUFsbElucHV0cygpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLQotICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cik7Ci0KLSAgICAgICAgLy8gcmV0dXJuIHRoZSBlbmFibGVkIG91dHB1dCBkZXZpY2VzIGZvciB0aGUgZ2l2ZW4gc3RyZWFtIHR5cGUKLSAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0KLSAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwotICAgICAgICAvLyByZXR1cm4gd2hldGhlciBhIHN0cmVhbSBpcyBwbGF5aW5nIHJlbW90ZWx5LCBvdmVycmlkZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YKLSAgICAgICAgLy8gICBsb2NhbC9yZW1vdGUgcGxheWJhY2ssIHVzZWQgZm9yIGluc3RhbmNlIGJ5IG5vdGlmaWNhdGlvbiBtYW5hZ2VyIHRvIG5vdCBtYWtlCi0gICAgICAgIC8vICAgbWVkaWEgcGxheWVycyBsb3NlIGF1ZGlvIGZvY3VzIHdoZW4gbm90IHBsYXlpbmcgbG9jYWxseQotICAgICAgICAvLyAgIEZvciB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiwgInJlbW90ZWx5IiBtZWFucyBwbGF5aW5nIGR1cmluZyBzY3JlZW4gbWlycm9yaW5nIHdoaWNoCi0gICAgICAgIC8vICAgdXNlcyBhbiBvdXRwdXQgZm9yIHBsYXliYWNrIHdpdGggYSBub24tZW1wdHksIG5vbiAiMCIgYWRkcmVzcy4KLSAgICAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OwotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIG9mZmxvYWRJbmZvKTsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgY2xlYXJBdWRpb1BhdGNoZXModWlkX3QgdWlkKTsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSk7Ci0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzKTsKLQotcHJvdGVjdGVkOgotCi0gICAgICAgIGVudW0gcm91dGluZ19zdHJhdGVneSB7Ci0gICAgICAgICAgICBTVFJBVEVHWV9NRURJQSwKLSAgICAgICAgICAgIFNUUkFURUdZX1BIT05FLAotICAgICAgICAgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLAotICAgICAgICAgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwsCi0gICAgICAgICAgICBTVFJBVEVHWV9EVE1GLAotICAgICAgICAgICAgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwKLSAgICAgICAgICAgIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiwKLSAgICAgICAgICAgIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFksCi0gICAgICAgICAgICBTVFJBVEVHWV9SRVJPVVRJTkcsCi0gICAgICAgICAgICBOVU1fU1RSQVRFR0lFUwotICAgICAgICB9OwotCi0gICAgICAgIC8vIDQgcG9pbnRzIHRvIGRlZmluZSB0aGUgdm9sdW1lIGF0dGVudWF0aW9uIGN1cnZlLCBlYWNoIGNoYXJhY3Rlcml6ZWQgYnkgdGhlIHZvbHVtZQotICAgICAgICAvLyBpbmRleCAoZnJvbSAwIHRvIDEwMCkgYXQgd2hpY2ggdGhleSBhcHBseSwgYW5kIHRoZSBhdHRlbnVhdGlvbiBpbiBkQiBhdCB0aGF0IGluZGV4LgotICAgICAgICAvLyB3ZSB1c2UgMTAwIHN0ZXBzIHRvIGF2b2lkIHJvdW5kaW5nIGVycm9ycyB3aGVuIGNvbXB1dGluZyB0aGUgdm9sdW1lIGluIHZvbEluZGV4VG9BbXBsKCkKLQotICAgICAgICBlbnVtIHsgVk9MTUlOID0gMCwgVk9MS05FRTEgPSAxLCBWT0xLTkVFMiA9IDIsIFZPTE1BWCA9IDMsIFZPTENOVCA9IDR9OwotCi0gICAgICAgIGNsYXNzIFZvbHVtZUN1cnZlUG9pbnQKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBpbnQgbUluZGV4OwotICAgICAgICAgICAgZmxvYXQgbURCQXR0ZW51YXRpb247Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gZGV2aWNlIGNhdGVnb3JpZXMgdXNlZCBmb3Igdm9sdW1lIGN1cnZlIG1hbmFnZW1lbnQuCi0gICAgICAgIGVudW0gZGV2aWNlX2NhdGVnb3J5IHsKLSAgICAgICAgICAgIERFVklDRV9DQVRFR09SWV9IRUFEU0VULAotICAgICAgICAgICAgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UsCi0gICAgICAgICAgICBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBLAotICAgICAgICAgICAgREVWSUNFX0NBVEVHT1JZX0NOVAotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIEh3TW9kdWxlOwotCi0gICAgICAgIGNsYXNzIEF1ZGlvR2FpbjogcHVibGljIFJlZkJhc2UKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBBdWRpb0dhaW4oaW50IGluZGV4LCBib29sIHVzZUluQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgdmlydHVhbCB+QXVkaW9HYWluKCkge30KLQotICAgICAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKLQotICAgICAgICAgICAgdm9pZCBnZXREZWZhdWx0Q29uZmlnKHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKTsKLSAgICAgICAgICAgIHN0YXR1c190IGNoZWNrQ29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKTsKLSAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG1JbmRleDsKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19nYWluIG1HYWluOwotICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgbVVzZUluQ2hhbm5lbE1hc2s7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgY2xhc3MgQXVkaW9Qb3J0OiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCi0gICAgICAgIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgQXVkaW9Qb3J0KGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOwotICAgICAgICAgICAgdmlydHVhbCB+QXVkaW9Qb3J0KCkge30KLQotICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKLQotICAgICAgICAgICAgdm9pZCBpbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiBwb3J0KTsKLSAgICAgICAgICAgIHZvaWQgY2xlYXJDYXBhYmlsaXRpZXMoKTsKLQotICAgICAgICAgICAgdm9pZCBsb2FkU2FtcGxpbmdSYXRlcyhjaGFyICpuYW1lKTsKLSAgICAgICAgICAgIHZvaWQgbG9hZEZvcm1hdHMoY2hhciAqbmFtZSk7Ci0gICAgICAgICAgICB2b2lkIGxvYWRPdXRDaGFubmVscyhjaGFyICpuYW1lKTsKLSAgICAgICAgICAgIHZvaWQgbG9hZEluQ2hhbm5lbHMoY2hhciAqbmFtZSk7Ci0KLSAgICAgICAgICAgIGF1ZGlvX2dhaW5fbW9kZV90IGxvYWRHYWluTW9kZShjaGFyICpuYW1lKTsKLSAgICAgICAgICAgIHZvaWQgbG9hZEdhaW4oY25vZGUgKnJvb3QsIGludCBpbmRleCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbG9hZEdhaW5zKGNub2RlICpyb290KTsKLQotICAgICAgICAgICAgLy8gc2VhcmNoZXMgZm9yIGFuIGV4YWN0IG1hdGNoCi0gICAgICAgICAgICBzdGF0dXNfdCBjaGVja0V4YWN0U2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkgY29uc3Q7Ci0gICAgICAgICAgICAvLyBzZWFyY2hlcyBmb3IgYSBjb21wYXRpYmxlIG1hdGNoLCBhbmQgcmV0dXJucyB0aGUgYmVzdCBtYXRjaCB2aWEgdXBkYXRlZFNhbXBsaW5nUmF0ZQotICAgICAgICAgICAgc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlU2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnVwZGF0ZWRTYW1wbGluZ1JhdGUpIGNvbnN0OwotICAgICAgICAgICAgLy8gc2VhcmNoZXMgZm9yIGFuIGV4YWN0IG1hdGNoCi0gICAgICAgICAgICBzdGF0dXNfdCBjaGVja0V4YWN0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIGNvbnN0OwotICAgICAgICAgICAgLy8gc2VhcmNoZXMgZm9yIGEgY29tcGF0aWJsZSBtYXRjaCwgY3VycmVudGx5IGltcGxlbWVudGVkIGZvciBpbnB1dCBjaGFubmVsIG1hc2tzIG9ubHkKLSAgICAgICAgICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZUNoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdDsKLSAgICAgICAgICAgIHN0YXR1c190IGNoZWNrRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7Ci0gICAgICAgICAgICBzdGF0dXNfdCBjaGVja0dhaW4oY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpnYWluQ29uZmlnLCBpbnQgaW5kZXgpIGNvbnN0OwotCi0gICAgICAgICAgICB1aW50MzJfdCBwaWNrU2FtcGxpbmdSYXRlKCkgY29uc3Q7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBwaWNrQ2hhbm5lbE1hc2soKSBjb25zdDsKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IHBpY2tGb3JtYXQoKSBjb25zdDsKLQotICAgICAgICAgICAgc3RhdGljIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHNQY21Gb3JtYXRDb21wYXJlVGFibGVbXTsKLSAgICAgICAgICAgIHN0YXRpYyBpbnQgY29tcGFyZUZvcm1hdHMoYXVkaW9fZm9ybWF0X3QgZm9ybWF0MSwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0Mik7Ci0KLSAgICAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OwotCi0gICAgICAgICAgICBTdHJpbmc4ICAgICAgICAgICBtTmFtZTsKLSAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IG1UeXBlOwotICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3QgbVJvbGU7Ci0gICAgICAgICAgICBib29sICAgICAgICAgICAgICBtVXNlSW5DaGFubmVsTWFzazsKLSAgICAgICAgICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbVNhbXBsaW5nUmF0ZXMsIG1DaGFubmVsTWFza3Mgb3IgbUZvcm1hdHMKLSAgICAgICAgICAgIC8vIGluZGljYXRlcyB0aGUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbQotICAgICAgICAgICAgLy8gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQotICAgICAgICAgICAgVmVjdG9yIDx1aW50MzJfdD4gbVNhbXBsaW5nUmF0ZXM7IC8vIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcwotICAgICAgICAgICAgVmVjdG9yIDxhdWRpb19jaGFubmVsX21hc2tfdD4gbUNoYW5uZWxNYXNrczsgLy8gc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MKLSAgICAgICAgICAgIFZlY3RvciA8YXVkaW9fZm9ybWF0X3Q+IG1Gb3JtYXRzOyAvLyBzdXBwb3J0ZWQgYXVkaW8gZm9ybWF0cwotICAgICAgICAgICAgVmVjdG9yIDwgc3A8QXVkaW9HYWluPiA+IG1HYWluczsgLy8gZ2FpbiBjb250cm9sbGVycwotICAgICAgICAgICAgc3A8SHdNb2R1bGU+IG1Nb2R1bGU7ICAgICAgICAgICAgICAgICAvLyBhdWRpbyBIVyBtb2R1bGUgZXhwb3NpbmcgdGhpcyBJL08gc3RyZWFtCi0gICAgICAgICAgICB1aW50MzJfdCBtRmxhZ3M7IC8vIGF0dHJpYnV0ZSBmbGFncyAoZS5nIHByaW1hcnkgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlyZWN0IG91dHB1dC4uLikuCi0gICAgICAgIH07Ci0KLSAgICAgICAgY2xhc3MgQXVkaW9Qb3J0Q29uZmlnOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCi0gICAgICAgIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgQXVkaW9Qb3J0Q29uZmlnKCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIH5BdWRpb1BvcnRDb25maWcoKSB7fQotCi0gICAgICAgICAgICBzdGF0dXNfdCBhcHBseUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnID0gTlVMTCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3QgPSAwOwotICAgICAgICAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0ID0gMDsKLSAgICAgICAgICAgIHVpbnQzMl90IG1TYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OwotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUNoYW5uZWxNYXNrOwotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnIG1HYWluOwotICAgICAgICB9OwotCi0KLSAgICAgICAgY2xhc3MgQXVkaW9QYXRjaDogcHVibGljIFJlZkJhc2UKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwgdWlkX3QgdWlkKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlKGhhbmRsZSksIG1QYXRjaCgqcGF0Y2gpLCBtVWlkKHVpZCksIG1BZlBhdGNoSGFuZGxlKDApIHt9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OwotCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlOwotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG1QYXRjaDsKLSAgICAgICAgICAgIHVpZF90IG1VaWQ7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgfTsKLQotICAgICAgICBjbGFzcyBEZXZpY2VEZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0LCBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnCi0gICAgICAgIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgRGV2aWNlRGVzY3JpcHRvcihjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19kZXZpY2VzX3QgdHlwZSk7Ci0KLSAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZURlc2NyaXB0b3IoKSB7fQotCi0gICAgICAgICAgICBib29sIGVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgb3RoZXIpIGNvbnN0OwotCi0gICAgICAgICAgICAvLyBBdWRpb1BvcnRDb25maWcKLSAgICAgICAgICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCB7IHJldHVybiAoQXVkaW9Qb3J0KikgdGhpczsgfQotICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwotCi0gICAgICAgICAgICAvLyBBdWRpb1BvcnQKLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBsb2FkR2FpbnMoY25vZGUgKnJvb3QpOwotICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlVHlwZTsKLSAgICAgICAgICAgIFN0cmluZzggbUFkZHJlc3M7Ci0gICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZDsKLSAgICAgICAgfTsKLQotICAgICAgICBjbGFzcyBEZXZpY2VWZWN0b3IgOiBwdWJsaWMgU29ydGVkVmVjdG9yPCBzcDxEZXZpY2VEZXNjcmlwdG9yPiA+Ci0gICAgICAgIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgRGV2aWNlVmVjdG9yKCkgOiBTb3J0ZWRWZWN0b3IoKSwgbURldmljZVR5cGVzKEFVRElPX0RFVklDRV9OT05FKSB7fQotCi0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgYWRkKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICByZW1vdmUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0OwotCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZXMoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZXM7IH0KLQotICAgICAgICAgICAgdm9pZCBsb2FkRGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcyk7Ci0gICAgICAgICAgICB2b2lkIGxvYWREZXZpY2VzRnJvbU5hbWUoY2hhciAqbmFtZSwgY29uc3QgRGV2aWNlVmVjdG9yJiBkZWNsYXJlZERldmljZXMpOwotCi0gICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgY29uc3Q7Ci0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcykgY29uc3Q7Ci0gICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7Ci0gICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tTmFtZShjb25zdCBTdHJpbmc4JiBuYW1lKSBjb25zdDsKLSAgICAgICAgICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGVBZGRyKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBTdHJpbmc4IGFkZHJlc3MpCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0OwotCi0gICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICB2b2lkIHJlZnJlc2hUeXBlcygpOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VUeXBlczsKLSAgICAgICAgfTsKLQotICAgICAgICAvLyB0aGUgSU9Qcm9maWxlIGNsYXNzIGRlc2NyaWJlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIGFuIG91dHB1dCBvciBpbnB1dCBzdHJlYW0uCi0gICAgICAgIC8vIEl0IGlzIGN1cnJlbnRseSBhc3N1bWVkIHRoYXQgYWxsIGNvbWJpbmF0aW9uIG9mIGxpc3RlZCBwYXJhbWV0ZXJzIGFyZSBzdXBwb3J0ZWQuCi0gICAgICAgIC8vIEl0IGlzIHVzZWQgYnkgdGhlIHBvbGljeSBtYW5hZ2VyIHRvIGRldGVybWluZSBpZiBhbiBvdXRwdXQgb3IgaW5wdXQgaXMgc3VpdGFibGUgZm9yCi0gICAgICAgIC8vIGEgZ2l2ZW4gdXNlIGNhc2UsICBvcGVuL2Nsb3NlIGl0IGFjY29yZGluZ2x5IGFuZCBjb25uZWN0L2Rpc2Nvbm5lY3QgYXVkaW8gdHJhY2tzCi0gICAgICAgIC8vIHRvL2Zyb20gaXQuCi0gICAgICAgIGNsYXNzIElPUHJvZmlsZSA6IHB1YmxpYyBBdWRpb1BvcnQKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBJT1Byb2ZpbGUoY29uc3QgU3RyaW5nOCYgbmFtZSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOwotICAgICAgICAgICAgdmlydHVhbCB+SU9Qcm9maWxlKCk7Ci0KLSAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGJvdGggb3V0cHV0IGFuZCBpbnB1dC4KLSAgICAgICAgICAgIC8vIElmIHBhcmFtZXRlciB1cGRhdGVkU2FtcGxpbmdSYXRlIGlzIG5vbi1OVUxMLCBpdCBpcyBhc3NpZ25lZCB0aGUgYWN0dWFsIHNhbXBsZSByYXRlLgotICAgICAgICAgICAgLy8gRm9yIGlucHV0LCBmbGFncyBpcyBpbnRlcnByZXRlZCBhcyBhdWRpb19pbnB1dF9mbGFnc190LgotICAgICAgICAgICAgLy8gVE9ETzogbWVyZ2UgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgYW5kIGF1ZGlvX2lucHV0X2ZsYWdzX3QuCi0gICAgICAgICAgICBib29sIGlzQ29tcGF0aWJsZVByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykgY29uc3Q7Ci0KLSAgICAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQpOwotICAgICAgICAgICAgdm9pZCBsb2coKTsKLQotICAgICAgICAgICAgRGV2aWNlVmVjdG9yICBtU3VwcG9ydGVkRGV2aWNlczsgLy8gc3VwcG9ydGVkIGRldmljZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChkZXZpY2VzIHRoaXMgb3V0cHV0IGNhbiBiZSByb3V0ZWQgdG8pCi0gICAgICAgIH07Ci0KLSAgICAgICAgY2xhc3MgSHdNb2R1bGUgOiBwdWJsaWMgUmVmQmFzZQotICAgICAgICB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgSHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH5Id01vZHVsZSgpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBsb2FkT3V0cHV0KGNub2RlICpyb290KTsKLSAgICAgICAgICAgIHN0YXR1c190IGxvYWRJbnB1dChjbm9kZSAqcm9vdCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBsb2FkRGV2aWNlKGNub2RlICpyb290KTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgYWRkT3V0cHV0UHJvZmlsZShTdHJpbmc4IG5hbWUsIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIFN0cmluZzggYWRkcmVzcyk7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZW1vdmVPdXRwdXRQcm9maWxlKFN0cmluZzggbmFtZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBhZGRJbnB1dFByb2ZpbGUoU3RyaW5nOCBuYW1lLCBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBTdHJpbmc4IGFkZHJlc3MpOwotICAgICAgICAgICAgc3RhdHVzX3QgcmVtb3ZlSW5wdXRQcm9maWxlKFN0cmluZzggbmFtZSk7Ci0KLSAgICAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQpOwotCi0gICAgICAgICAgICBjb25zdCBjaGFyICpjb25zdCAgICAgICAgbU5hbWU7IC8vIGJhc2UgbmFtZSBvZiB0aGUgYXVkaW8gSFcgbW9kdWxlIChwcmltYXJ5LCBhMmRwIC4uLikKLSAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBtSGFsVmVyc2lvbjsgLy8gYXVkaW8gSEFMIEFQSSB2ZXJzaW9uCi0gICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgICAgbUhhbmRsZTsKLSAgICAgICAgICAgIFZlY3RvciA8IHNwPElPUHJvZmlsZT4gPiBtT3V0cHV0UHJvZmlsZXM7IC8vIG91dHB1dCBwcm9maWxlcyBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCi0gICAgICAgICAgICBWZWN0b3IgPCBzcDxJT1Byb2ZpbGU+ID4gbUlucHV0UHJvZmlsZXM7ICAvLyBpbnB1dCBwcm9maWxlcyBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCi0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlczsgLy8gZGV2aWNlcyBkZWNsYXJlZCBpbiBhdWRpb19wb2xpY3kuY29uZgotCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmUKLSAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07Ci0gICAgICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlIGZvciBtZWRpYSBzdHJhdGVneQotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICAvLyB2b2x1bWUgY3VydmUgZm9yIG5vbi1tZWRpYSBhdWRpbyBvbiBleHQgbWVkaWEgb3V0cHV0cyAoSERNSSwgTGluZSwgZXRjKQotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07Ci0gICAgICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3IgbWVkaWEgc3RyYXRlZ3kgb24gc3BlYWtlcnMKLSAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKLSAgICAgICAgLy8gdm9sdW1lIGN1cnZlIGZvciBzb25pZmljYXRpb24gc3RyYXRlZ3kgb24gc3BlYWtlcnMKLSAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07Ci0gICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyY1tBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07Ci0gICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzTGluZWFyVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU2lsZW50Vm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRnVsbFNjYWxlVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZXMgcGVyIHN0cmVhbSBhbmQgZGV2aWNlIGNhdGVnb3J5LiBTZWUgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcygpCi0gICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0NOVF1bREVWSUNFX0NBVEVHT1JZX0NOVF07Ci0KLSAgICAgICAgLy8gZGVzY3JpcHRvciBmb3IgYXVkaW8gb3V0cHV0cy4gVXNlZCB0byBtYWludGFpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBvcGVuZWQgYXVkaW8gb3V0cHV0Ci0gICAgICAgIC8vIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSB1c2FnZSBvZiB0aGlzIG91dHB1dCBieSBlYWNoIGF1ZGlvIHN0cmVhbSB0eXBlLgotICAgICAgICBjbGFzcyBBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKLQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSgpIGNvbnN0OwotICAgICAgICAgICAgdm9pZCBjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGRlbHRhKTsKLQotICAgICAgICAgICAgYm9vbCBpc0R1cGxpY2F0ZWQoKSBjb25zdCB7IHJldHVybiAobU91dHB1dDEgIT0gTlVMTCAmJiBtT3V0cHV0MiAhPSBOVUxMKTsgfQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IGxhdGVuY3koKTsKLSAgICAgICAgICAgIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICBib29sIGlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7Ci0gICAgICAgICAgICBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OwotICAgICAgICAgICAgYm9vbCBpc1N0cmF0ZWd5QWN0aXZlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKLSAgICAgICAgICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCB7IHJldHVybiBtUHJvZmlsZTsgfQotICAgICAgICAgICAgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlvSGFuZGxlOyAgICAgICAgICAgICAgLy8gb3V0cHV0IGhhbmRsZQotICAgICAgICAgICAgdWludDMyX3QgbUxhdGVuY3k7ICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsgICAvLwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2U7ICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0bwotICAgICAgICAgICAgQXVkaW9NaXggKm1Qb2xpY3lNaXg7ICAgICAgICAgICAgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICB1aW50MzJfdCBtUmVmQ291bnRbQVVESU9fU1RSRUFNX0NOVF07IC8vIG51bWJlciBvZiBzdHJlYW1zIG9mIGVhY2ggdHlwZSB1c2luZyB0aGlzIG91dHB1dAotICAgICAgICAgICAgbnNlY3NfdCBtU3RvcFRpbWVbQVVESU9fU1RSRUFNX0NOVF07Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQxOyAgICAvLyB1c2VkIGJ5IGR1cGxpY2F0ZWQgb3V0cHV0czogZmlyc3Qgb3V0cHV0Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQyOyAgICAvLyB1c2VkIGJ5IGR1cGxpY2F0ZWQgb3V0cHV0czogc2Vjb25kIG91dHB1dAotICAgICAgICAgICAgZmxvYXQgbUN1clZvbHVtZVtBVURJT19TVFJFQU1fQ05UXTsgICAvLyBjdXJyZW50IHN0cmVhbSB2b2x1bWUKLSAgICAgICAgICAgIGludCBtTXV0ZUNvdW50W0FVRElPX1NUUkVBTV9DTlRdOyAgICAgLy8gbXV0ZSByZXF1ZXN0IGNvdW50ZXIKLSAgICAgICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gbVByb2ZpbGU7ICAgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQotICAgICAgICAgICAgYm9vbCBtU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW05VTV9TVFJBVEVHSUVTXTsgLy8gc3RyYXRlZ2llcyBtdXRlZCBiZWNhdXNlIG9mIGluY29tcGF0aWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIHNlbGVjdGlvbi4gU2VlIGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoKQotICAgICAgICAgICAgdWludDMyX3QgbURpcmVjdE9wZW5Db3VudDsgLy8gbnVtYmVyIG9mIGNsaWVudHMgdXNpbmcgdGhpcyBvdXRwdXQgKGRpcmVjdCBvdXRwdXRzIG9ubHkpCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gZGVzY3JpcHRvciBmb3IgYXVkaW8gaW5wdXRzLiBVc2VkIHRvIG1haW50YWluIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiBlYWNoIG9wZW5lZCBhdWRpbyBpbnB1dAotICAgICAgICAvLyBhbmQga2VlcCB0cmFjayBvZiB0aGUgdXNhZ2Ugb2YgdGhpcyBpbnB1dC4KLSAgICAgICAgY2xhc3MgQXVkaW9JbnB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBBdWRpb0lucHV0RGVzY3JpcHRvcihjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOwotCi0gICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICAgICAgICBtSWQ7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICAgICAgICBtSW9IYW5kbGU7ICAgICAgIC8vIGlucHV0IGhhbmRsZQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgICAgICAgbURldmljZTsgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIGlucHV0IGlzIHJvdXRlZCB0bwotICAgICAgICAgICAgQXVkaW9NaXggICAgICAgICAgICAgICAgICAgICAgKm1Qb2xpY3lNaXg7ICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgbVBhdGNoSGFuZGxlOwotICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgbVJlZkNvdW50OyAgICAgICAvLyBudW1iZXIgb2YgQXVkaW9SZWNvcmQgY2xpZW50cyB1c2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlucHV0Ci0gICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBtT3BlblJlZkNvdW50OwotICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgICAgICAgICAgICAgICAgbUlucHV0U291cmNlOyAgICAvLyBpbnB1dCBzb3VyY2Ugc2VsZWN0ZWQgYnkgYXBwbGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8obWVkaWFyZWNvcmRlci5oKQotICAgICAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiAgICAgICAgICAgbVByb2ZpbGU7ICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KLSAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19zZXNzaW9uX3Q+IG1TZXNzaW9uczsgICAgICAgLy8gYXVkaW8gc2Vzc2lvbnMgYXR0YWNoZWQgdG8gdGhpcyBpbnB1dAotICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzU291bmRUcmlnZ2VyOyAvLyB1c2VkIGJ5IGEgc291bmR0cmlnZ2VyIGNhcHR1cmUKLQotICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwotICAgICAgICAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0IHsgcmV0dXJuIG1Qcm9maWxlOyB9Ci0gICAgICAgICAgICB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKLSAgICAgICAgfTsKLQotICAgICAgICAvLyBzdHJlYW0gZGVzY3JpcHRvciB1c2VkIGZvciB2b2x1bWUgY29udHJvbAotICAgICAgICBjbGFzcyBTdHJlYW1EZXNjcmlwdG9yCi0gICAgICAgIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgU3RyZWFtRGVzY3JpcHRvcigpOwotCi0gICAgICAgICAgICBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0gICAgICAgICAgICB2b2lkIGR1bXAoaW50IGZkKTsKLQotICAgICAgICAgICAgaW50IG1JbmRleE1pbjsgICAgICAvLyBtaW4gdm9sdW1lIGluZGV4Ci0gICAgICAgICAgICBpbnQgbUluZGV4TWF4OyAgICAgIC8vIG1heCB2b2x1bWUgaW5kZXgKLSAgICAgICAgICAgIEtleWVkVmVjdG9yPGF1ZGlvX2RldmljZXNfdCwgaW50PiBtSW5kZXhDdXI7ICAgLy8gY3VycmVudCB2b2x1bWUgaW5kZXggcGVyIGRldmljZQotICAgICAgICAgICAgYm9vbCBtQ2FuQmVNdXRlZDsgICAvLyB0cnVlIGlzIHRoZSBzdHJlYW0gY2FuIGJlIG11dGVkCi0KLSAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfQ05UXTsKLSAgICAgICAgfTsKLQotICAgICAgICAvLyBzdHJlYW0gZGVzY3JpcHRvciB1c2VkIGZvciB2b2x1bWUgY29udHJvbAotICAgICAgICBjbGFzcyBFZmZlY3REZXNjcmlwdG9yIDogcHVibGljIFJlZkJhc2UKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgICAgICAgICAgaW50IG1JbzsgICAgICAgICAgICAgICAgLy8gaW8gdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0bwotICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBtU3RyYXRlZ3k7IC8vIHJvdXRpbmcgc3RyYXRlZ3kgdGhlIGVmZmVjdCBpcyBhc3NvY2lhdGVkIHRvCi0gICAgICAgICAgICBpbnQgbVNlc3Npb247ICAgICAgICAgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiB0aGUgZWZmZWN0IGlzIG9uCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IG1EZXNjOyAgLy8gZWZmZWN0IGRlc2NyaXB0b3IKLSAgICAgICAgICAgIGJvb2wgbUVuYWJsZWQ7ICAgICAgICAgICAgICAvLyBlbmFibGVkIHN0YXRlOiBDUFUgbG9hZCBiZWluZyB1c2VkIG9yIG5vdAotICAgICAgICB9OwotCi0gICAgICAgIHZvaWQgYWRkT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjKTsKLSAgICAgICAgdm9pZCBhZGRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyk7Ci0KLSAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gc3RyZWFtIHR5cGUKLSAgICAgICAgc3RhdGljIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3koYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotCi0gICAgICAgIC8vIHJldHVybiBhcHByb3ByaWF0ZSBkZXZpY2UgZm9yIHN0cmVhbXMgaGFuZGxlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmF0ZWd5IGFjY29yZGluZyB0byBjdXJyZW50Ci0gICAgICAgIC8vIHBob25lIHN0YXRlLCBjb25uZWN0ZWQgZGV2aWNlcy4uLgotICAgICAgICAvLyBpZiBmcm9tQ2FjaGUgaXMgdHJ1ZSwgdGhlIGRldmljZSBpcyByZXR1cm5lZCBmcm9tIG1EZXZpY2VGb3JTdHJhdGVneVtdLAotICAgICAgICAvLyBvdGhlcndpc2UgaXQgaXMgZGV0ZXJtaW5lIGJ5IGN1cnJlbnQgc3RhdGUKLSAgICAgICAgLy8gKGRldmljZSBjb25uZWN0ZWQscGhvbmUgc3RhdGUsIGZvcmNlIHVzZSwgYTJkcCBvdXRwdXQuLi4pCi0gICAgICAgIC8vIFRoaXMgYWxsb3dzIHRvOgotICAgICAgICAvLyAgMSBzcGVlZCB1cCBwcm9jZXNzIHdoZW4gdGhlIHN0YXRlIGlzIHN0YWJsZSAod2hlbiBzdGFydGluZyBvciBzdG9wcGluZyBhbiBvdXRwdXQpCi0gICAgICAgIC8vICAyIGFjY2VzcyB0byBlaXRoZXIgY3VycmVudCBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gdHJ1ZSkgb3IKLSAgICAgICAgLy8gImZ1dHVyZSIgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IGZhbHNlKSB3aGVuIGNhbGxlZCBmcm9tIGEgY29udGV4dAotICAgICAgICAvLyAgd2hlcmUgY29uZGl0aW9ucyBhcmUgY2hhbmdpbmcgKHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpLCBzZXRQaG9uZVN0YXRlKCkuLi4pIEFORAotICAgICAgICAvLyAgYmVmb3JlIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkgaXMgY2FsbGVkLgotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSk7Ci0KLSAgICAgICAgLy8gY2hhbmdlIHRoZSByb3V0ZSBvZiB0aGUgc3BlY2lmaWVkIG91dHB1dC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1zIHdlIGhhdmUgc2xlcHQgdG8KLSAgICAgICAgLy8gYWxsb3cgbmV3IHJvdXRpbmcgdG8gdGFrZSBlZmZlY3QgaW4gY2VydGFpbiBjYXNlcy4KLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCBzZXRPdXRwdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWRkcmVzcyA9IE5VTEwpOwotICAgICAgICBzdGF0dXNfdCByZXNldE91dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7Ci0gICAgICAgIHN0YXR1c190IHNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOwotICAgICAgICBzdGF0dXNfdCByZXNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOwotCi0gICAgICAgIC8vIHNlbGVjdCBpbnB1dCBkZXZpY2UgY29ycmVzcG9uZGluZyB0byByZXF1ZXN0ZWQgYXVkaW8gc291cmNlCi0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKTsKLQotICAgICAgICAvLyByZXR1cm4gaW8gaGFuZGxlIG9mIGFjdGl2ZSBpbnB1dCBvciAwIGlmIG5vIGlucHV0IGlzIGFjdGl2ZQotICAgICAgICAvLyAgICBPbmx5IGNvbnNpZGVycyBpbnB1dHMgZnJvbSBwaHlzaWNhbCBkZXZpY2VzIChlLmcuIG1haW4gbWljLCBoZWFkc2V0IG1pYykgd2hlbgotICAgICAgICAvLyAgICBpZ25vcmVWaXJ0dWFsSW5wdXRzIGlzIHRydWUuCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldEFjdGl2ZUlucHV0KGJvb2wgaWdub3JlVmlydHVhbElucHV0cyA9IHRydWUpOwotCi0gICAgICAgIHVpbnQzMl90IGFjdGl2ZUlucHV0c0NvdW50KCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gaW5pdGlhbGl6ZSB2b2x1bWUgY3VydmVzIGZvciBlYWNoIHN0cmF0ZWd5IGFuZCBkZXZpY2UgY2F0ZWdvcnkKLSAgICAgICAgdm9pZCBpbml0aWFsaXplVm9sdW1lQ3VydmVzKCk7Ci0KLSAgICAgICAgLy8gY29tcHV0ZSB0aGUgYWN0dWFsIHZvbHVtZSBmb3IgYSBnaXZlbiBzdHJlYW0gYWNjb3JkaW5nIHRvIHRoZSByZXF1ZXN0ZWQgaW5kZXggYW5kIGEgcGFydGljdWxhcgotICAgICAgICAvLyBkZXZpY2UKLSAgICAgICAgdmlydHVhbCBmbG9hdCBjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwotCi0gICAgICAgIC8vIGNoZWNrIHRoYXQgdm9sdW1lIGNoYW5nZSBpcyBwZXJtaXR0ZWQsIGNvbXB1dGUgYW5kIHNlbmQgbmV3IHZvbHVtZSB0byBhdWRpbyBoYXJkd2FyZQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNoZWNrQW5kU2V0Vm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLCBib29sIGZvcmNlID0gZmFsc2UpOwotCi0gICAgICAgIC8vIGFwcGx5IGFsbCBzdHJlYW0gdm9sdW1lcyB0byB0aGUgc3BlY2lmaWVkIG91dHB1dCBhbmQgZGV2aWNlCi0gICAgICAgIHZvaWQgYXBwbHlTdHJlYW1Wb2x1bWVzKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGRlbGF5TXMgPSAwLCBib29sIGZvcmNlID0gZmFsc2UpOwotCi0gICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIGFsbCBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJhdGVneSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAotICAgICAgICB2b2lkIHNldFN0cmF0ZWd5TXV0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpMCk7Ci0KLSAgICAgICAgLy8gTXV0ZSBvciB1bm11dGUgdGhlIHN0cmVhbSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAotICAgICAgICB2b2lkIHNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpMCk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZXMgZm9yIHNvbmlmaWNhdGlvbiBzdHJhdGVneSB3aGlsZSBpbiBjYWxsOiBtdXRlIHN0cmVhbXMgb3IgcmVwbGFjZSBieQotICAgICAgICAvLyBhIHNwZWNpYWwgdG9uZSBpbiB0aGUgZGV2aWNlIHVzZWQgZm9yIGNvbW11bmljYXRpb24KLSAgICAgICAgdm9pZCBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgc3RhcnRpbmcsIGJvb2wgc3RhdGVDaGFuZ2UpOwotCi0gICAgICAgIC8vIHRydWUgaWYgZGV2aWNlIGlzIGluIGEgdGVsZXBob255IG9yIFZvSVAgY2FsbAotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbkNhbGwoKTsKLQotICAgICAgICAvLyB0cnVlIGlmIGdpdmVuIHN0YXRlIHJlcHJlc2VudHMgYSBkZXZpY2UgaW4gYSB0ZWxlcGhvbnkgb3IgVm9JUCBjYWxsCi0gICAgICAgIHZpcnR1YWwgYm9vbCBpc1N0YXRlSW5DYWxsKGludCBzdGF0ZSk7Ci0KLSAgICAgICAgLy8gd2hlbiBhIGRldmljZSBpcyBjb25uZWN0ZWQsIGNoZWNrcyBpZiBhbiBvcGVuIG91dHB1dCBjYW4gYmUgcm91dGVkCi0gICAgICAgIC8vIHRvIHRoaXMgZGV2aWNlLiBJZiBub25lIGlzIG9wZW4sIHRyaWVzIHRvIG9wZW4gb25lIG9mIHRoZSBhdmFpbGFibGUgb3V0cHV0cy4KLSAgICAgICAgLy8gUmV0dXJucyBhbiBvdXRwdXQgc3VpdGFibGUgdG8gdGhpcyBkZXZpY2Ugb3IgMC4KLSAgICAgICAgLy8gd2hlbiBhIGRldmljZSBpcyBkaXNjb25uZWN0ZWQsIGNoZWNrcyBpZiBhbiBvdXRwdXQgaXMgbm90IHVzZWQgYW55IG1vcmUgYW5kCi0gICAgICAgIC8vIHJldHVybnMgaXRzIGhhbmRsZSBpZiBhbnkuCi0gICAgICAgIC8vIHRyYW5zZmVycyB0aGUgYXVkaW8gdHJhY2tzIGFuZCBlZmZlY3RzIGZyb20gb25lIG91dHB1dCB0aHJlYWQgdG8gYW5vdGhlciBhY2NvcmRpbmdseS4KLSAgICAgICAgc3RhdHVzX3QgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKTsKLQotICAgICAgICBzdGF0dXNfdCBjaGVja0lucHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIGlucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKTsKLQotICAgICAgICAvLyBjbG9zZSBhbiBvdXRwdXQgYW5kIGl0cyBjb21wYW5pb24gZHVwbGljYXRpbmcgb3V0cHV0LgotICAgICAgICB2b2lkIGNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7Ci0KLSAgICAgICAgLy8gY2xvc2UgYW4gaW5wdXQuCi0gICAgICAgIHZvaWQgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0KLSAgICAgICAgLy8gY2hlY2tzIGFuZCBpZiBuZWNlc3NhcnkgY2hhbmdlcyBvdXRwdXRzIHVzZWQgZm9yIGFsbCBzdHJhdGVnaWVzLgotICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgb3V0cHV0IGNob2ljZSBmb3IgYSBnaXZlbiBzdHJhdGVneQotICAgICAgICAvLyBjaGFuZ2VzOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCi0gICAgICAgIC8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpCi0gICAgICAgIHZvaWQgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KTsKLQotICAgICAgICAvLyBTYW1lIGFzIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBidXQgZm9yIGEgYWxsIHN0cmF0ZWdpZXMgaW4gb3JkZXIgb2YgcHJpb3JpdHkKLSAgICAgICAgdm9pZCBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKLQotICAgICAgICAvLyBtYW5hZ2VzIEEyRFAgb3V0cHV0IHN1c3BlbmQvcmVzdG9yZSBhY2NvcmRpbmcgdG8gcGhvbmUgc3RhdGUgYW5kIEJUIFNDTyB1c2FnZQotICAgICAgICB2b2lkIGNoZWNrQTJkcFN1c3BlbmQoKTsKLQotICAgICAgICAvLyByZXR1cm5zIHRoZSBBMkRQIG91dHB1dCBoYW5kbGUgaWYgaXQgaXMgb3BlbiBvciAwIG90aGVyd2lzZQotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRBMmRwT3V0cHV0KCk7Ci0KLSAgICAgICAgLy8gc2VsZWN0cyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBkZXZpY2Ugb24gb3V0cHV0IGZvciBjdXJyZW50IHN0YXRlCi0gICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBkZXZpY2UgY2hvaWNlIGZvciBhIGdpdmVuIG91dHB1dCBpcwotICAgICAgICAvLyBjaGFuZ2VkOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLCBvdXRwdXQgc3RhcnQsIG91dHB1dCBzdG9wLi4KLSAgICAgICAgLy8gc2VlIGdldERldmljZUZvclN0cmF0ZWd5KCkgZm9yIHRoZSB1c2Ugb2YgZnJvbUNhY2hlIHBhcmFtZXRlcgotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0TmV3T3V0cHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYm9vbCBmcm9tQ2FjaGUpOwotCi0gICAgICAgIC8vIHVwZGF0ZXMgY2FjaGUgb2YgZGV2aWNlIHVzZWQgYnkgYWxsIHN0cmF0ZWdpZXMgKG1EZXZpY2VGb3JTdHJhdGVneVtdKQotICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBmb3IgYSBnaXZlbiBzdHJhdGVneSBpcwotICAgICAgICAvLyBjaGFuZ2VkOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCi0gICAgICAgIC8vIGNhY2hlZCB2YWx1ZXMgYXJlIHVzZWQgYnkgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBpZiBwYXJhbWV0ZXIgZnJvbUNhY2hlIGlzIHRydWUuCi0gICAgICAgICAvLyBNdXN0IGJlIGNhbGxlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQotICAgICAgICB2b2lkIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7Ci0KLSAgICAgICAgLy8gc2VsZWN0cyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBkZXZpY2Ugb24gaW5wdXQgZm9yIGN1cnJlbnQgc3RhdGUKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGdldE5ld0lucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKLQotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldE1heEVmZmVjdHNDcHVMb2FkKCk7Ci0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0TWF4RWZmZWN0c01lbW9yeSgpOwotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOwotICAgICAgICBpbnQgdGVzdE91dHB1dEluZGV4KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotCi0gICAgICAgIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4mIGVmZmVjdERlc2MsIGJvb2wgZW5hYmxlZCk7Ci0KLSAgICAgICAgLy8gcmV0dXJucyB0aGUgY2F0ZWdvcnkgdGhlIGRldmljZSBiZWxvbmdzIHRvIHdpdGggcmVnYXJkIHRvIHZvbHVtZSBjdXJ2ZSBtYW5hZ2VtZW50Ci0gICAgICAgIHN0YXRpYyBkZXZpY2VfY2F0ZWdvcnkgZ2V0RGV2aWNlQ2F0ZWdvcnkoYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0KLSAgICAgICAgLy8gZXh0cmFjdCBvbmUgZGV2aWNlIHJlbGV2YW50IGZvciB2b2x1bWUgY29udHJvbCBmcm9tIG11bHRpcGxlIGRldmljZSBzZWxlY3Rpb24KLSAgICAgICAgc3RhdGljIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0KLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBnZXRPdXRwdXRzRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gPiBvcGVuT3V0cHV0cyk7Ci0gICAgICAgIGJvb2wgdmVjdG9yc0VxdWFsKFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMyKTsKLQotICAgICAgICAvLyBtdXRlL3VubXV0ZSBzdHJhdGVnaWVzIHVzaW5nIGFuIGluY29tcGF0aWJsZSBkZXZpY2UgY29tYmluYXRpb24KLSAgICAgICAgLy8gaWYgbXV0aW5nLCB3YWl0IGZvciB0aGUgYXVkaW8gaW4gcGNtIGJ1ZmZlciB0byBiZSBkcmFpbmVkIGJlZm9yZSBwcm9jZWVkaW5nCi0gICAgICAgIC8vIGlmIHVubXV0aW5nLCB1bm11dGUgb25seSBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5Ci0gICAgICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBtcyB3YWl0ZWQKLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKTsKLQotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXQoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKLSAgICAgICAgLy8gc2FtcGxpbmdSYXRlIHBhcmFtZXRlciBpcyBhbiBpbi9vdXQgYW5kIHNvIG1heSBiZSBtb2RpZmllZAotICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldElucHV0UHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOwotICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKLQotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMpOwotCi0gICAgICAgIGJvb2wgaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKTsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+JiBwYXRjaCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOwotCi0gICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0T3V0cHV0RnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0OwotICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZ2V0SW5wdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7Ci0gICAgICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGVGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7Ci0gICAgICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGVGcm9tTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCk7Ci0KLSAgICAgICAgdm9pZCB1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIGludCBkZWxheU1zID0gMCk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzaW5nIChhdWRpb19wb2xpY3kuY29uZikKLSAgICAgICAgLy8KLSAgICAgICAgc3RhdGljIHVpbnQzMl90IHN0cmluZ1RvRW51bShjb25zdCBzdHJ1Y3QgU3RyaW5nVG9FbnVtICp0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmVudW1Ub1N0cmluZyhjb25zdCBzdHJ1Y3QgU3RyaW5nVG9FbnVtICp0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKTsKLSAgICAgICAgc3RhdGljIGJvb2wgc3RyaW5nVG9Cb29sKGNvbnN0IGNoYXIgKnZhbHVlKTsKLSAgICAgICAgc3RhdGljIHVpbnQzMl90IHBhcnNlT3V0cHV0RmxhZ05hbWVzKGNoYXIgKm5hbWUpOwotICAgICAgICBzdGF0aWMgdWludDMyX3QgcGFyc2VJbnB1dEZsYWdOYW1lcyhjaGFyICpuYW1lKTsKLSAgICAgICAgc3RhdGljIGF1ZGlvX2RldmljZXNfdCBwYXJzZURldmljZU5hbWVzKGNoYXIgKm5hbWUpOwotICAgICAgICB2b2lkIGxvYWRId01vZHVsZShjbm9kZSAqcm9vdCk7Ci0gICAgICAgIHZvaWQgbG9hZEh3TW9kdWxlcyhjbm9kZSAqcm9vdCk7Ci0gICAgICAgIHZvaWQgbG9hZEdsb2JhbENvbmZpZyhjbm9kZSAqcm9vdCwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOwotICAgICAgICBzdGF0dXNfdCBsb2FkQXVkaW9Qb2xpY3lDb25maWcoY29uc3QgY2hhciAqcGF0aCk7Ci0gICAgICAgIHZvaWQgZGVmYXVsdEF1ZGlvUG9saWN5Q29uZmlnKHZvaWQpOwotCi0KLSAgICAgICAgdWlkX3QgbVVpZENhY2hlZDsKLSAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1wQ2xpZW50SW50ZXJmYWNlOyAgLy8gYXVkaW8gcG9saWN5IGNsaWVudCBpbnRlcmZhY2UKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbVByaW1hcnlPdXRwdXQ7ICAgICAgICAgICAgICAvLyBwcmltYXJ5IG91dHB1dCBoYW5kbGUKLSAgICAgICAgLy8gbGlzdCBvZiBkZXNjcmlwdG9ycyBmb3Igb3V0cHV0cyBjdXJyZW50bHkgb3BlbmVkCi0gICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiA+IG1PdXRwdXRzOwotICAgICAgICAvLyBjb3B5IG9mIG1PdXRwdXRzIGJlZm9yZSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBvcGVucyBuZXcgb3V0cHV0cwotICAgICAgICAvLyByZXNldCB0byBtT3V0cHV0cyB3aGVuIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkgaXMgY2FsbGVkLgotICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gPiBtUHJldmlvdXNPdXRwdXRzOwotICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IG1JbnB1dHM7ICAgICAvLyBsaXN0IG9mIGlucHV0IGRlc2NyaXB0b3JzCi0gICAgICAgIERldmljZVZlY3RvciAgbUF2YWlsYWJsZU91dHB1dERldmljZXM7IC8vIGFsbCBhdmFpbGFibGUgb3V0cHV0IGRldmljZXMKLSAgICAgICAgRGV2aWNlVmVjdG9yICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzOyAgLy8gYWxsIGF2YWlsYWJsZSBpbnB1dCBkZXZpY2VzCi0gICAgICAgIGludCBtUGhvbmVTdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBwaG9uZSBzdGF0ZQotICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVF07ICAgLy8gY3VycmVudCBmb3JjZWQgdXNlIGNvbmZpZ3VyYXRpb24KLQotICAgICAgICBTdHJlYW1EZXNjcmlwdG9yIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9DTlRdOyAgICAgICAgICAgLy8gc3RyZWFtIGRlc2NyaXB0b3JzIGZvciB2b2x1bWUgY29udHJvbAotICAgICAgICBib29sICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbWl0IHJpbmd0b25lIHZvbHVtZSB0byBtdXNpYyB2b2x1bWUgaWYgaGVhZHNldCBjb25uZWN0ZWQKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VGb3JTdHJhdGVneVtOVU1fU1RSQVRFR0lFU107Ci0gICAgICAgIGZsb2F0ICAgbUxhc3RWb2ljZVZvbHVtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCB2b2ljZSB2b2x1bWUgdmFsdWUgc2VudCB0byBhdWRpbyBIQUwKLQotICAgICAgICAvLyBNYXhpbXVtIENQVSBsb2FkIGFsbG9jYXRlZCB0byBhdWRpbyBlZmZlY3RzIGluIDAuMSBNSVBTIChBUk12NVRFLCAwIFdTIG1lbW9yeSkgdW5pdHMKLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9FRkZFQ1RTX0NQVV9MT0FEID0gMTAwMDsKLSAgICAgICAgLy8gTWF4aW11bSBtZW1vcnkgYWxsb2NhdGVkIHRvIGF1ZGlvIGVmZmVjdHMgaW4gS0IKLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9FRkZFQ1RTX01FTU9SWSA9IDUxMjsKLSAgICAgICAgdWludDMyX3QgbVRvdGFsRWZmZWN0c0NwdUxvYWQ7IC8vIGN1cnJlbnQgQ1BVIGxvYWQgdXNlZCBieSBlZmZlY3RzCi0gICAgICAgIHVpbnQzMl90IG1Ub3RhbEVmZmVjdHNNZW1vcnk7ICAvLyBjdXJyZW50IG1lbW9yeSB1c2VkIGJ5IGVmZmVjdHMKLSAgICAgICAgS2V5ZWRWZWN0b3I8aW50LCBzcDxFZmZlY3REZXNjcmlwdG9yPiA+IG1FZmZlY3RzOyAgLy8gbGlzdCBvZiByZWdpc3RlcmVkIGF1ZGlvIGVmZmVjdHMKLSAgICAgICAgYm9vbCAgICBtQTJkcFN1c3BlbmRlZDsgIC8vIHRydWUgaWYgQTJEUCBvdXRwdXQgaXMgc3VzcGVuZGVkCi0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1EZWZhdWx0T3V0cHV0RGV2aWNlOyAvLyBvdXRwdXQgZGV2aWNlIHNlbGVjdGVkIGJ5IGRlZmF1bHQgYXQgYm9vdCB0aW1lCi0gICAgICAgIGJvb2wgbVNwZWFrZXJEcmNFbmFibGVkOy8vIHRydWUgb24gZGV2aWNlcyB0aGF0IHVzZSBEUkMgb24gdGhlIERFVklDRV9DQVRFR09SWV9TUEVBS0VSIHBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYm9vc3Qgc29mdCBzb3VuZHMsIHVzZWQgdG8gYWRqdXN0IHZvbHVtZSBjdXJ2ZXMgYWNjb3JkaW5nbHkKLQotICAgICAgICBWZWN0b3IgPCBzcDxId01vZHVsZT4gPiBtSHdNb2R1bGVzOwotICAgICAgICB2b2xhdGlsZSBpbnQzMl90IG1OZXh0VW5pcXVlSWQ7Ci0gICAgICAgIHZvbGF0aWxlIGludDMyX3QgbUF1ZGlvUG9ydEdlbmVyYXRpb247Ci0KLSAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBzcDxBdWRpb1BhdGNoPiA+IG1BdWRpb1BhdGNoZXM7Ci0KLSAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdCwgYXVkaW9faW9faGFuZGxlX3Q+IG1Tb3VuZFRyaWdnZXJTZXNzaW9uczsKLQotICAgICAgICBzcDxBdWRpb1BhdGNoPiBtQ2FsbFR4UGF0Y2g7Ci0gICAgICAgIHNwPEF1ZGlvUGF0Y2g+IG1DYWxsUnhQYXRjaDsKLQotICAgICAgICAvLyBmb3Igc3VwcG9ydGluZyAiYmVhY29uIiBzdHJlYW1zLCBpLmUuIHN0cmVhbXMgdGhhdCBvbmx5IHBsYXkgb24gc3BlYWtlciwgYW5kIG5ldmVyCi0gICAgICAgIC8vIHdoZW4gc29tZXRoaW5nIG90aGVyIHRoYW4gU1RSRUFNX1RUUyAoYS5rLmEuICJUcmFuc21pdHRlZCBUaHJvdWdoIFNwZWFrZXIiKSBpcyBwbGF5aW5nCi0gICAgICAgIGVudW0gewotICAgICAgICAgICAgU1RBUlRJTkdfT1VUUFVULAotICAgICAgICAgICAgU1RBUlRJTkdfQkVBQ09OLAotICAgICAgICAgICAgU1RPUFBJTkdfT1VUUFVULAotICAgICAgICAgICAgU1RPUFBJTkdfQkVBQ09OCi0gICAgICAgIH07Ci0gICAgICAgIHVpbnQzMl90IG1CZWFjb25NdXRlUmVmQ291bnQ7ICAgLy8gcmVmIGNvdW50IGZvciBzdHJlYW0gdGhhdCB3b3VsZCBtdXRlIGJlYWNvbgotICAgICAgICB1aW50MzJfdCBtQmVhY29uUGxheWluZ1JlZkNvdW50Oy8vIHJlZiBjb3VudCBmb3IgdGhlIHBsYXlpbmcgYmVhY29uIHN0cmVhbXMKLSAgICAgICAgYm9vbCBtQmVhY29uTXV0ZWQ7ICAgICAgICAgICAgICAvLyBoYXMgU1RSRUFNX1RUUyBiZWVuIG11dGVkCi0KLSAgICAgICAgLy8gY3VzdG9tIG1peCBlbnRyeSBpbiBtUG9saWN5TWl4ZXMKLSAgICAgICAgY2xhc3MgQXVkaW9Qb2xpY3lNaXggOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIEF1ZGlvUG9saWN5TWl4KCkge30KLQotICAgICAgICAgICAgQXVkaW9NaXggICAgbU1peDsgICAgICAgICAgICAgICAgICAgLy8gQXVkaW8gcG9saWN5IG1peCBkZXNjcmlwdG9yCi0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQ7ICAvLyBDb3JyZXNwb25kaW5nIG91dHB1dCBzdHJlYW0KLSAgICAgICAgfTsKLSAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPFN0cmluZzgsIHNwPEF1ZGlvUG9saWN5TWl4PiA+IG1Qb2xpY3lNaXhlczsgLy8gbGlzdCBvZiByZWdpc3RlcmVkIG1peGVzCi0KLQotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgICAgIE11dGV4ICAgbUxvY2s7Ci0gICAgICAgIENvbmRpdGlvbiBtV2FpdFdvcmtDVjsKLQotICAgICAgICBpbnQgICAgICAgICAgICAgbUN1ck91dHB1dDsKLSAgICAgICAgYm9vbCAgICAgICAgICAgIG1EaXJlY3RPdXRwdXQ7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1UZXN0T3V0cHV0c1tOVU1fVEVTVF9PVVRQVVRTXTsKLSAgICAgICAgaW50ICAgICAgICAgICAgIG1UZXN0SW5wdXQ7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdERldmljZTsKLSAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlOwotICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RGb3JtYXQ7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdENoYW5uZWxzOwotICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RMYXRlbmN5TXM7Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotICAgICAgICBzdGF0aWMgZmxvYXQgdm9sSW5kZXhUb0FtcGwoYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgU3RyZWFtRGVzY3JpcHRvciYgc3RyZWFtRGVzYywKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKTsKLSAgICAgICAgc3RhdGljIGJvb2wgaXNWaXJ0dWFsSW5wdXREZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0gICAgICAgIHVpbnQzMl90IG5leHRVbmlxdWVJZCgpOwotICAgICAgICB1aW50MzJfdCBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwotcHJpdmF0ZToKLSAgICAgICAgLy8gdXBkYXRlcyBkZXZpY2UgY2FjaGluZyBhbmQgb3V0cHV0IGZvciBzdHJlYW1zIHRoYXQgY2FuIGluZmx1ZW5jZSB0aGUKLSAgICAgICAgLy8gICAgcm91dGluZyBvZiBub3RpZmljYXRpb25zCi0gICAgICAgIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgICAgIHN0YXRpYyBib29sIGRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0gICAgICAgIC8vIGZpbmQgdGhlIG91dHB1dHMgb24gYSBnaXZlbiBvdXRwdXQgZGVzY3JpcHRvciB0aGF0IGhhdmUgdGhlIGdpdmVuIGFkZHJlc3MuCi0gICAgICAgIC8vIHRvIGJlIGNhbGxlZCBvbiBhbiBBdWRpb091dHB1dERlc2NyaXB0b3Igd2hvc2Ugc3VwcG9ydGVkIGRldmljZXMgKGFzIGRlZmluZWQKLSAgICAgICAgLy8gICBpbiBtUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMpIG1hdGNoZXMgdGhlIGRldmljZSB3aG9zZSBhZGRyZXNzIGlzIHRvIGJlIG1hdGNoZWQuCi0gICAgICAgIC8vIHNlZSBkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGF1ZGlvX2RldmljZXNfdCkgZm9yIHdoZXRoZXIgdGhlIGRldmljZSB0eXBlIGlzIG9uZQotICAgICAgICAvLyAgIHdoZXJlIGFkZHJlc3NlcyBhcmUgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIG9uZSBjb25uZWN0ZWQgZGV2aWNlIGFuZCBhbm90aGVyLgotICAgICAgICB2b2lkIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3Moc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjIC8qaW4qLywKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlIC8qaW4qLywKLSAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MgLyppbiovLAotICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMgLypvdXQqLyk7Ci0gICAgICAgIHVpbnQzMl90IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsgfQotICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gcmV0dXJuIHRoZSBvdXRwdXQgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIGFuZCBmb3JtYXQKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRGV2aWNlKAotICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOwotICAgICAgICAvLyBpbnRlcm5hbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBzdHJlYW0gdHlwZSB2YWx1ZSBmcm9tIGF1ZGlvIGF0dHJpYnV0ZXMKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKLSAgICAgICAgLy8gcmV0dXJuIHRydWUgaWYgYW55IG91dHB1dCBpcyBwbGF5aW5nIGFueXRoaW5nIGJlc2lkZXMgdGhlIHN0cmVhbSB0byBpZ25vcmUKLSAgICAgICAgYm9vbCBpc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKTsKLSAgICAgICAgLy8gZXZlbnQgaXMgb25lIG9mIFNUQVJUSU5HX09VVFBVVCwgU1RBUlRJTkdfQkVBQ09OLCBTVE9QUElOR19PVVRQVVQsIFNUT1BQSU5HX0JFQUNPTgotICAgICAgICAvLyByZXR1cm5zIDAgaWYgbm8gbXV0ZS91bm11dGUgZXZlbnQgaGFwcGVuZWQsIHRoZSBsYXJnZXN0IGxhdGVuY3kgb2YgdGhlIGRldmljZSB3aGVyZQotICAgICAgICAvLyAgIHRoZSBtdXRlL3VubXV0ZSBoYXBwZW5lZAotICAgICAgICB1aW50MzJfdCBoYW5kbGVFdmVudEZvckJlYWNvbihpbnQgZXZlbnQpOwotICAgICAgICB1aW50MzJfdCBzZXRCZWFjb25NdXRlKGJvb2wgbXV0ZSk7Ci0gICAgICAgIGJvb2wgICAgIGlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKTsKLQotICAgICAgICAvLyBzZWxlY3QgaW5wdXQgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8gcmVxdWVzdGVkIGF1ZGlvIHNvdXJjZSBhbmQgcmV0dXJuIGFzc29jaWF0ZWQgcG9saWN5Ci0gICAgICAgIC8vIG1peCBpZiBhbnkuIENhbGxzIGdldERldmljZUZvcklucHV0U291cmNlKCkuCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXggPSBOVUxMKTsKLQotICAgICAgICAvLyBDYWxsZWQgYnkgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkuCi0gICAgICAgIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICBnZXREZXZpY2VEZXNjcmlwdG9yKGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKLQotfTsKLQotfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjZThlMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsOSBAQAorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUmVjdXJzaXZlIGNhbGwgc3ViLWZvbGRlciBBbmRyb2lkLm1rCisjCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvUm91dGluZ1N0cmF0ZWd5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4OTY3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUaW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciBtZWRpYSBzdG9wcGVkIHBsYXlpbmcgZHVyaW5nIHdoaWNoIHdlIGNvbnNpZGVyIHRoYXQgdGhlCisvLyBzb25pZmljYXRpb24gc2hvdWxkIGJlIGFzIHVub2J0cnVzaXZlIGFzIGR1cmluZyB0aGUgdGltZSBtZWRpYSB3YXMgcGxheWluZy4KKyNkZWZpbmUgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkgNTAwMAorCitlbnVtIHJvdXRpbmdfc3RyYXRlZ3kgeworICAgIFNUUkFURUdZX01FRElBLAorICAgIFNUUkFURUdZX1BIT05FLAorICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwKKyAgICBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCwKKyAgICBTVFJBVEVHWV9EVE1GLAorICAgIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsCisgICAgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSLAorICAgIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFksCisgICAgU1RSQVRFR1lfUkVST1VUSU5HLAorICAgIE5VTV9TVFJBVEVHSUVTCit9OworCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcxMmY3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaApAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisvLyBBYnNvbHV0ZSBtaW4gdm9sdW1lIGluIGRCIChjYW4gYmUgcmVwcmVzZW50ZWQgaW4gc2luZ2xlIHByZWNpc2lvbiBub3JtYWwgZmxvYXQgdmFsdWUpCisjZGVmaW5lIFZPTFVNRV9NSU5fREIgKC03NTgpCisKK2NsYXNzIFZvbHVtZUN1cnZlUG9pbnQKK3sKK3B1YmxpYzoKKyAgICBpbnQgbUluZGV4OworICAgIGZsb2F0IG1EQkF0dGVudWF0aW9uOworfTsKKworY2xhc3MgVm9sdW1lCit7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogNCBwb2ludHMgdG8gZGVmaW5lIHRoZSB2b2x1bWUgYXR0ZW51YXRpb24gY3VydmUsIGVhY2ggY2hhcmFjdGVyaXplZCBieSB0aGUgdm9sdW1lCisgICAgICogaW5kZXggKGZyb20gMCB0byAxMDApIGF0IHdoaWNoIHRoZXkgYXBwbHksIGFuZCB0aGUgYXR0ZW51YXRpb24gaW4gZEIgYXQgdGhhdCBpbmRleC4KKyAgICAgKiB3ZSB1c2UgMTAwIHN0ZXBzIHRvIGF2b2lkIHJvdW5kaW5nIGVycm9ycyB3aGVuIGNvbXB1dGluZyB0aGUgdm9sdW1lIGluIHZvbEluZGV4VG9EYigpCisgICAgICoKKyAgICAgKiBAdG9kbyBzaGFsbCBiZWNvbWUgY29uZmlndXJhYmxlCisgICAgICovCisgICAgZW51bSB7CisgICAgICAgIFZPTE1JTiA9IDAsCisgICAgICAgIFZPTEtORUUxID0gMSwKKyAgICAgICAgVk9MS05FRTIgPSAyLAorICAgICAgICBWT0xNQVggPSAzLAorCisgICAgICAgIFZPTENOVCA9IDQKKyAgICB9OworCisgICAgLyoqCisgICAgICogZGV2aWNlIGNhdGVnb3JpZXMgdXNlZCBmb3Igdm9sdW1lIGN1cnZlIG1hbmFnZW1lbnQuCisgICAgICovCisgICAgZW51bSBkZXZpY2VfY2F0ZWdvcnkgeworICAgICAgICBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCwKKyAgICAgICAgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCisgICAgICAgIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRSwKKyAgICAgICAgREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSwKKyAgICAgICAgREVWSUNFX0NBVEVHT1JZX0NOVAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBleHRyYWN0IG9uZSBkZXZpY2UgcmVsZXZhbnQgZm9yIHZvbHVtZSBjb250cm9sIGZyb20gbXVsdGlwbGUgZGV2aWNlIHNlbGVjdGlvbgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkZXZpY2UgZm9yIHdoaWNoIHRoZSB2b2x1bWUgY2F0ZWdvcnkgaXMgYXNzb2NpYXRlZAorICAgICAqCisgICAgICogQHJldHVybiBzdWJzZXQgb2YgZGV2aWNlIHJlcXVpcmVkIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygdm9sdW1lIGNhdGVnb3J5IHBlciBkZXZpY2UKKyAgICAgKi8KKyAgICBzdGF0aWMgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQorICAgIHsKKyAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgLy8gdGhpcyBoYXBwZW5zIHdoZW4gZm9yY2luZyBhIHJvdXRlIHVwZGF0ZSBhbmQgbm8gdHJhY2sgaXMgYWN0aXZlIG9uIGFuIG91dHB1dC4KKyAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSB0aGUgcmV0dXJuZWQgY2F0ZWdvcnkgaXMgbm90IGltcG9ydGFudC4KKyAgICAgICAgICAgIGRldmljZSA9ICBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIH0gZWxzZSBpZiAocG9wY291bnQoZGV2aWNlKSA+IDEpIHsKKyAgICAgICAgICAgIC8vIE11bHRpcGxlIGRldmljZSBzZWxlY3Rpb24gaXMgZWl0aGVyOgorICAgICAgICAgICAgLy8gIC0gc3BlYWtlciArIG9uZSBvdGhlciBkZXZpY2U6IGdpdmUgcHJpb3JpdHkgdG8gc3BlYWtlciBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAvLyAgLSBvbmUgQTJEUCBkZXZpY2UgKyBhbm90aGVyIGRldmljZTogaGFwcGVucyB3aXRoIGR1cGxpY2F0ZWQgb3V0cHV0LiBJbiB0aGlzIGNhc2UKKyAgICAgICAgICAgIC8vIHJldGFpbiB0aGUgZGV2aWNlIG9uIHRoZSBBMkRQIG91dHB1dCBhcyB0aGUgb3RoZXIgbXVzdCBub3QgY29ycmVzcG9uZCB0byBhbiBhY3RpdmUKKyAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBpZiBub3QgdGhlIHNwZWFrZXIuCisgICAgICAgICAgICAvLyAgLSBIRE1JLUNFQyBzeXN0ZW0gYXVkaW8gbW9kZSBvbmx5IG91dHB1dDogZ2l2ZSBwcmlvcml0eSB0byBhdmFpbGFibGUgaXRlbSBpbiBvcmRlci4KKyAgICAgICAgICAgIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDOworICAgICAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9BVVhfTElORTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUERJRikgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BESUY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLypTUEVBS0VSX1NBRkUgaXMgYW4gYWxpYXMgb2YgU1BFQUtFUiBmb3IgcHVycG9zZXMgb2Ygdm9sdW1lIGNvbnRyb2wqLworICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKQorICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworCisgICAgICAgIEFMT0dXX0lGKHBvcGNvdW50KGRldmljZSkgIT0gMSwKKyAgICAgICAgICAgICAgICAgImdldERldmljZUZvclZvbHVtZSgpIGludmFsaWQgZGV2aWNlIGNvbWJpbmF0aW9uOiAlMDh4IiwKKyAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKworICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybnMgdGhlIGNhdGVnb3J5IHRoZSBkZXZpY2UgYmVsb25ncyB0byB3aXRoIHJlZ2FyZCB0byB2b2x1bWUgY3VydmUgbWFuYWdlbWVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkZXZpY2UgdG8gY2hlY2sgdXBvbiB0aGUgY2F0ZWdvcnkgdG8gd2hvbSBpdCBiZWxvbmdzIHRvLgorICAgICAqCisgICAgICogQHJldHVybiBkZXZpY2UgY2F0ZWdvcnkuCisgICAgICovCisgICAgc3RhdGljIGRldmljZV9jYXRlZ29yeSBnZXREZXZpY2VDYXRlZ29yeShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQorICAgIHsKKyAgICAgICAgc3dpdGNoKGdldERldmljZUZvclZvbHVtZShkZXZpY2UpKSB7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRToKKyAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0U7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTzoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzoKKyAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVDsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0xJTkU6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDoKKyAgICAgICAgICAgIC8qVVNCPyAgUmVtb3RlIHN1Ym1peD8qLworICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUE7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQ6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWToKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9TUEVBS0VSOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGlubGluZSBmbG9hdCBEYlRvQW1wbChmbG9hdCBkZWNpYmVscykKKyAgICB7CisgICAgICAgIGlmIChkZWNpYmVscyA8PSBWT0xVTUVfTUlOX0RCKSB7CisgICAgICAgICAgICByZXR1cm4gMC4wZjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhwKCBkZWNpYmVscyAqIDAuMTE1MTI5Zik7IC8vIGV4cCggZEIgKiBsbigxMCkgLyAyMCApCisgICAgfQorCisgICAgc3RhdGljIGlubGluZSBmbG9hdCBBbXBsVG9EYihmbG9hdCBhbXBsaWZpY2F0aW9uKQorICAgIHsKKyAgICAgICAgaWYgKGFtcGxpZmljYXRpb24gPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFZPTFVNRV9NSU5fREI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDIwICogbG9nMTAoYW1wbGlmaWNhdGlvbik7CisgICAgfQorCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvcG9saWN5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YjczZTNjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvcG9saWN5LmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKy8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdGhlIHBvbGljeSB3aWxsIHVzZSBtYXggbWl4ZXIgc2FtcGxpbmcgcmF0ZXMuCisvLyBEbyBub3QgbGltaXQgc2FtcGxpbmcgcmF0ZSBvdGhlcndpc2UKKyNkZWZpbmUgTUFYX01JWEVSX1NBTVBMSU5HX1JBVEUgMTkyMDAwCisKKy8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdGhlIHBvbGljeSB3aWxsIHVzZSBtYXggbWl4ZXIgY2hhbm5lbCBjb3VudC4KKy8vIERvIG5vdCBsaW1pdCBjaGFubmVsIGNvdW50IG90aGVyd2lzZQorI2RlZmluZSBNQVhfTUlYRVJfQ0hBTk5FTF9DT1VOVCA4CisKKy8qKgorICogQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIGlucHV0IGRldmljZXMgdGhhdCBhcmUgY29uc2lkZXJlZCAidmlydHVhbCIgd2hlbiBldmFsdWF0aW5nCisgKiBhY3RpdmUgaW5wdXRzIGluIGdldEFjdGl2ZUlucHV0KCkKKyAqLworI2RlZmluZSBBUE1fQVVESU9fSU5fREVWSUNFX1ZJUlRVQUxfQUxMICAoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVh8QVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKQorCisKKy8qKgorICogQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlcyB3aGVyZSBtYXRjaGluZyBpbnB1dHMvb3V0cHV0cyBvbiBkZXZpY2UKKyAqIHR5cGUgYWxvbmUgaXMgbm90IGVub3VnaDogdGhlIGFkZHJlc3MgbXVzdCBtYXRjaCB0b28KKyAqLworI2RlZmluZSBBUE1fQVVESU9fREVWSUNFX09VVF9NQVRDSF9BRERSRVNTX0FMTCAoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKQorCisjZGVmaW5lIEFQTV9BVURJT19ERVZJQ0VfSU5fTUFUQ0hfQUREUkVTU19BTEwgKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKQorCisvKioKKyAqIENoZWNrIGlmIHRoZSBzdGF0ZSBnaXZlbiBjb3JyZXNwb25kIHRvIGFuIGluIGNhbGwgc3RhdGUuCisgKiBAVE9ETyBmaW5kIGEgYmV0dGVyIG5hbWUgZm9yIHdpZGVseSBjYWxsIHN0YXRlCisgKgorICogQHBhcmFtW2luXSBzdGF0ZSB0byBjb25zaWRlcgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiBnaXZlbiBzdGF0ZSByZXByZXNlbnRzIGEgZGV2aWNlIGluIGEgdGVsZXBob255IG9yIFZvSVAgY2FsbAorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfc3RhdGVfaW5fY2FsbChpbnQgc3RhdGUpCit7CisgICAgcmV0dXJuIChzdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHx8IChzdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NPTU1VTklDQVRJT04pOworfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSBpbnB1dCBkZXZpY2UgZ2l2ZW4gaXMgY29uc2lkZXJlZCBhcyBhIHZpcnR1YWwgZGV2aWNlLgorICoKKyAqIEBwYXJhbVtpbl0gZGV2aWNlIHRvIGNvbnNpZGVyCisgKgorICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgYSB2aXJ0dWFsIG9uZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAoKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApIHsKKyAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgICAgICBpZiAoKHBvcGNvdW50KGRldmljZSkgPT0gMSkgJiYgKChkZXZpY2UgJiB+QVBNX0FVRElPX0lOX0RFVklDRV9WSVJUVUFMX0FMTCkgPT0gMCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgdGhlIGRldmljZSB0eXBlIGlzIG9uZQorICogd2hlcmUgYWRkcmVzc2VzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb25lIGNvbm5lY3RlZCBkZXZpY2UgYW5kIGFub3RoZXIKKyAqCisgKiBAcGFyYW1baW5dIGRldmljZSB0byBjb25zaWRlcgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIG5lZWRzIGRpc3Rpbmd1aXNoIG9uIGFkZHJlc3MsIGZhbHNlIG90aGVyd2lzZS4uCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgcmV0dXJuICgoKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCisgICAgICAgICAgICAoKH5BVURJT19ERVZJQ0VfQklUX0lOICYgZGV2aWNlICYgQVBNX0FVRElPX0RFVklDRV9JTl9NQVRDSF9BRERSRVNTX0FMTCkgIT0gMCkpIHx8CisgICAgICAgICAgICgoKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pID09IDApICYmCisgICAgICAgICAgICAoKGRldmljZSAmIEFQTV9BVURJT19ERVZJQ0VfT1VUX01BVENIX0FERFJFU1NfQUxMKSAhPSAwKSk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyOGZmMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM2IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgICBzcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAgXAorICAgIHNyYy9BdWRpb0dhaW4uY3BwIFwKKyAgICBzcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAgXAorICAgIHNyYy9Id01vZHVsZS5jcHAgXAorICAgIHNyYy9JT1Byb2ZpbGUuY3BwIFwKKyAgICBzcmMvQXVkaW9Qb3J0LmNwcCBcCisgICAgc3JjL0F1ZGlvUG9saWN5TWl4LmNwcCBcCisgICAgc3JjL0F1ZGlvUGF0Y2guY3BwIFwKKyAgICBzcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwIFwKKyAgICBzcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCBcCisgICAgc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwIFwKKyAgICBzcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcCBcCisgICAgc3JjL1NvdW5kVHJpZ2dlclNlc3Npb24uY3BwIFwKKyAgICBzcmMvU2Vzc2lvblJvdXRlLmNwcCBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmN1dGlscyBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmxvZyBcCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeQorCitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gXAorICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZQorCitMT0NBTF9NT0RVTEUgOj0gbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWZiZjliCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBdWRpb0dhaW46IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgQXVkaW9HYWluKGludCBpbmRleCwgYm9vbCB1c2VJbkNoYW5uZWxNYXNrKTsKKyAgICB2aXJ0dWFsIH5BdWRpb0dhaW4oKSB7fQorCisgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKworICAgIHZvaWQgZ2V0RGVmYXVsdENvbmZpZyhzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZyk7CisgICAgc3RhdHVzX3QgY2hlY2tDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpOworICAgIGludCAgICAgICAgICAgICAgIG1JbmRleDsKKyAgICBzdHJ1Y3QgYXVkaW9fZ2FpbiBtR2FpbjsKKyAgICBib29sICAgICAgICAgICAgICBtVXNlSW5DaGFubmVsTWFzazsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YmNmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJBdWRpb1BvcnQuaCIKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElPUHJvZmlsZTsKK2NsYXNzIEF1ZGlvTWl4OworCisvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBpbnB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIGlucHV0CisvLyBhbmQga2VlcCB0cmFjayBvZiB0aGUgdXNhZ2Ugb2YgdGhpcyBpbnB1dC4KK2NsYXNzIEF1ZGlvSW5wdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnCit7CitwdWJsaWM6CisgICAgQXVkaW9JbnB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSk7CisgICAgdm9pZCBzZXRJb0hhbmRsZShhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0OworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKKworICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKworICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgICAgICAgIG1Jb0hhbmRsZTsgICAgICAgLy8gaW5wdXQgaGFuZGxlCisgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgICAgICAgbURldmljZTsgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIGlucHV0IGlzIHJvdXRlZCB0bworICAgIEF1ZGlvTWl4ICAgICAgICAgICAgICAgICAgICAgICptUG9saWN5TWl4OyAgICAgLy8gbm9uIE5VTEwgd2hlbiB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICBtUGF0Y2hIYW5kbGU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgbVJlZkNvdW50OyAgICAgICAvLyBudW1iZXIgb2YgQXVkaW9SZWNvcmQgY2xpZW50cyB1c2luZworICAgIC8vIHRoaXMgaW5wdXQKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBtT3BlblJlZkNvdW50OworICAgIGF1ZGlvX3NvdXJjZV90ICAgICAgICAgICAgICAgIG1JbnB1dFNvdXJjZTsgICAgLy8gaW5wdXQgc291cmNlIHNlbGVjdGVkIGJ5IGFwcGxpY2F0aW9uCisgICAgLy8obWVkaWFyZWNvcmRlci5oKQorICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gICAgICAgICAgIG1Qcm9maWxlOyAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4gbVNlc3Npb25zOyAgICAgICAvLyBhdWRpbyBzZXNzaW9ucyBhdHRhY2hlZCB0byB0aGlzIGlucHV0CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzU291bmRUcmlnZ2VyOyAvLyB1c2VkIGJ5IGEgc291bmR0cmlnZ2VyIGNhcHR1cmUKKworICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CisgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0IHsgcmV0dXJuIG1Qcm9maWxlOyB9CisgICAgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgICAgICAgbUlkOworfTsKKworY2xhc3MgQXVkaW9JbnB1dENvbGxlY3Rpb24gOgorICAgICAgICBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4KK3sKK3B1YmxpYzoKKyAgICBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZ2V0SW5wdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CisKKyAgICB1aW50MzJfdCBhY3RpdmVJbnB1dHNDb3VudCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogcmV0dXJuIGlvIGhhbmRsZSBvZiBhY3RpdmUgaW5wdXQgb3IgMCBpZiBubyBpbnB1dCBpcyBhY3RpdmUKKyAgICAgKiBPbmx5IGNvbnNpZGVycyBpbnB1dHMgZnJvbSBwaHlzaWNhbCBkZXZpY2VzIChlLmcuIG1haW4gbWljLCBoZWFkc2V0IG1pYykgd2hlbgorICAgICAqIGlnbm9yZVZpcnR1YWxJbnB1dHMgaXMgdHJ1ZS4KKyAgICAgKi8KKyAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRBY3RpdmVJbnB1dChib29sIGlnbm9yZVZpcnR1YWxJbnB1dHMgPSB0cnVlKTsKKworICAgIGF1ZGlvX2RldmljZXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7Cit9OworCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmNjIyZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJT1Byb2ZpbGU7CitjbGFzcyBBdWRpb01peDsKK2NsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlOworCisvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBvdXRwdXRzLiBVc2VkIHRvIG1haW50YWluIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiBlYWNoIG9wZW5lZCBhdWRpbyBvdXRwdXQKKy8vIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSB1c2FnZSBvZiB0aGlzIG91dHB1dCBieSBlYWNoIGF1ZGlvIHN0cmVhbSB0eXBlLgorY2xhc3MgQXVkaW9PdXRwdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnCit7CitwdWJsaWM6CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPEF1ZGlvUG9ydD4mIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOworICAgIHZpcnR1YWwgfkF1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CisKKyAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisgICAgdm9pZCAgICAgICAgbG9nKGNvbnN0IGNoYXIqIGluZGVudCk7CisKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldElkKCkgY29uc3Q7CisgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpOworICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNEdXBsaWNhdGVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIHVpbnQzMl90IGxhdGVuY3koKSB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBib29sIGlzRml4ZWRWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgdmlydHVhbCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDEoKSB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDIoKSB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSk7CisgICAgdmlydHVhbCB2b2lkIGNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgZGVsdGEpOworCisgICAgYm9vbCBpc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CisgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0IHsgcmV0dXJuIG1Qb3J0OyB9CisgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKKworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKKworICAgIHNwPEF1ZGlvUG9ydD4gICAgICAgbVBvcnQ7CisgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2U7ICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0bworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZTsKKyAgICB1aW50MzJfdCBtUmVmQ291bnRbQVVESU9fU1RSRUFNX0NOVF07IC8vIG51bWJlciBvZiBzdHJlYW1zIG9mIGVhY2ggdHlwZSB1c2luZyB0aGlzIG91dHB1dAorICAgIG5zZWNzX3QgbVN0b3BUaW1lW0FVRElPX1NUUkVBTV9DTlRdOworICAgIGZsb2F0IG1DdXJWb2x1bWVbQVVESU9fU1RSRUFNX0NOVF07ICAgLy8gY3VycmVudCBzdHJlYW0gdm9sdW1lIGluIGRCCisgICAgaW50IG1NdXRlQ291bnRbQVVESU9fU1RSRUFNX0NOVF07ICAgICAvLyBtdXRlIHJlcXVlc3QgY291bnRlcgorICAgIGJvb2wgbVN0cmF0ZWd5TXV0ZWRCeURldmljZVtOVU1fU1RSQVRFR0lFU107IC8vIHN0cmF0ZWdpZXMgbXV0ZWQgYmVjYXVzZSBvZiBpbmNvbXBhdGlibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2Ugc2VsZWN0aW9uLiBTZWUgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpCisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1DbGllbnRJbnRlcmZhY2U7CisKK3Byb3RlY3RlZDoKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZDsKK307CisKKy8vIEF1ZGlvIG91dHB1dCBkcml2ZW4gYnkgYSBzb2Z0d2FyZSBtaXhlciBpbiBhdWRpbyBmbGluZ2VyLgorY2xhc3MgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb091dHB1dERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOworICAgIHZpcnR1YWwgflN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKCkge30KKworICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKworICAgIHZvaWQgc2V0SW9IYW5kbGUoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpOworCisgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpOworICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGxhdGVuY3koKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNEdXBsaWNhdGVkKCkgY29uc3QgeyByZXR1cm4gKG1PdXRwdXQxICE9IE5VTEwgJiYgbU91dHB1dDIgIT0gTlVMTCk7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICB2aXJ0dWFsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MSgpIHsgcmV0dXJuIG1PdXRwdXQxOyB9CisgICAgdmlydHVhbCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDIoKSB7IHJldHVybiBtT3V0cHV0MjsgfQorICAgIHZpcnR1YWwgdm9pZCBjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGRlbHRhKTsKKyAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKTsKKworICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKKworICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gbVByb2ZpbGU7ICAgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQorICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1Jb0hhbmRsZTsgICAgICAgICAgIC8vIG91dHB1dCBoYW5kbGUKKyAgICB1aW50MzJfdCBtTGF0ZW5jeTsgICAgICAgICAgICAgICAgICAvLworICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsgICAvLworICAgIEF1ZGlvTWl4ICptUG9saWN5TWl4OyAgICAgICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQorICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MTsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IGZpcnN0IG91dHB1dAorICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MjsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IHNlY29uZCBvdXRwdXQKKyAgICB1aW50MzJfdCBtRGlyZWN0T3BlbkNvdW50OyAvLyBudW1iZXIgb2YgY2xpZW50cyB1c2luZyB0aGlzIG91dHB1dCAoZGlyZWN0IG91dHB1dHMgb25seSkKKyAgICB1aW50MzJfdCBtR2xvYmFsUmVmQ291bnQ7ICAvLyBub24tc3RyZWFtLXNwZWNpZmljIHJlZiBjb3VudAorfTsKKworY2xhc3MgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gOgorICAgICAgICBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ID4KK3sKK3B1YmxpYzoKKyAgICBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworCisgICAgLyoqCisgICAgICogcmV0dXJuIHdoZXRoZXIgYSBzdHJlYW0gaXMgcGxheWluZyByZW1vdGVseSwgb3ZlcnJpZGUgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mCisgICAgICogbG9jYWwvcmVtb3RlIHBsYXliYWNrLCB1c2VkIGZvciBpbnN0YW5jZSBieSBub3RpZmljYXRpb24gbWFuYWdlciB0byBub3QgbWFrZQorICAgICAqIG1lZGlhIHBsYXllcnMgbG9zZSBhdWRpbyBmb2N1cyB3aGVuIG5vdCBwbGF5aW5nIGxvY2FsbHkKKyAgICAgKiBGb3IgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24sICJyZW1vdGVseSIgbWVhbnMgcGxheWluZyBkdXJpbmcgc2NyZWVuIG1pcnJvcmluZyB3aGljaAorICAgICAqIHVzZXMgYW4gb3V0cHV0IGZvciBwbGF5YmFjayB3aXRoIGEgbm9uLWVtcHR5LCBub24gIjAiIGFkZHJlc3MuCisgICAgICovCisgICAgYm9vbCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworCisgICAgLyoqCisgICAgICogcmV0dXJucyB0aGUgQTJEUCBvdXRwdXQgaGFuZGxlIGlmIGl0IGlzIG9wZW4gb3IgMCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRBMmRwT3V0cHV0KCkgY29uc3Q7CisKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0T3V0cHV0RnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0OworCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGdldFByaW1hcnlPdXRwdXQoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIHJldHVybiB0cnVlIGlmIGFueSBvdXRwdXQgaXMgcGxheWluZyBhbnl0aGluZyBiZXNpZGVzIHRoZSBzdHJlYW0gdG8gaWdub3JlCisgICAgICovCisgICAgYm9vbCBpc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKSBjb25zdDsKKworICAgIGF1ZGlvX2RldmljZXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1ZjI1NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9QYXRjaCA6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLCB1aWRfdCB1aWQpOworCisgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlOworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBtUGF0Y2g7CisgICAgdWlkX3QgbVVpZDsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtQWZQYXRjaEhhbmRsZTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgdm9sYXRpbGUgaW50MzJfdCBtTmV4dFVuaXF1ZUlkOworfTsKKworY2xhc3MgQXVkaW9QYXRjaENvbGxlY3Rpb24gOiBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBzcDxBdWRpb1BhdGNoPiA+Cit7CitwdWJsaWM6CisgICAgc3RhdHVzX3QgYWRkQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+JiBwYXRjaCk7CisKKyAgICBzdGF0dXNfdCByZW1vdmVBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcykgY29uc3Q7CisKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTFmNGUxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjsKKworLyoqCisgKiBjdXN0b20gbWl4IGVudHJ5IGluIG1Qb2xpY3lNaXhlcworICovCitjbGFzcyBBdWRpb1BvbGljeU1peCA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBBdWRpb1BvbGljeU1peCgpIHt9CisKKyAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJmdldE91dHB1dCgpIGNvbnN0OworCisgICAgdm9pZCBzZXRPdXRwdXQoc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZvdXRwdXQpOworCisgICAgdm9pZCBjbGVhck91dHB1dCgpOworCisgICAgYW5kcm9pZDo6QXVkaW9NaXggKmdldE1peCgpOworCisgICAgdm9pZCBzZXRNaXgoQXVkaW9NaXggJm1peCk7CisKK3ByaXZhdGU6CisgICAgQXVkaW9NaXggICAgbU1peDsgICAgICAgICAgICAgICAgICAgLy8gQXVkaW8gcG9saWN5IG1peCBkZXNjcmlwdG9yCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQ7ICAvLyBDb3JyZXNwb25kaW5nIG91dHB1dCBzdHJlYW0KK307CisKKworY2xhc3MgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uIDogcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjxTdHJpbmc4LCBzcDxBdWRpb1BvbGljeU1peD4gPgoreworcHVibGljOgorICAgIHN0YXR1c190IGdldEF1ZGlvUG9saWN5TWl4KFN0cmluZzggYWRkcmVzcywgc3A8QXVkaW9Qb2xpY3lNaXg+ICZwb2xpY3lNaXgpIGNvbnN0OworCisgICAgc3RhdHVzX3QgcmVnaXN0ZXJNaXgoU3RyaW5nOCBhZGRyZXNzLCBBdWRpb01peCBtaXgpOworCisgICAgc3RhdHVzX3QgdW5yZWdpc3Rlck1peChTdHJpbmc4IGFkZHJlc3MpOworCisgICAgdm9pZCBjbG9zZU91dHB1dChzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJmRlc2MpOworCisgICAgLyoqCisgICAgICogVHJ5IHRvIGZpbmQgYW4gb3V0cHV0IGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBhdHRyaWJ1dGVzIHRvIGNvbnNpZGVyIGZvd3IgdGhlIHJlc2VhcmNoIG9mIG91dHB1dCBkZXNjcmlwdG9yLgorICAgICAqIEBwYXJhbVtvdXRdIGRlc2MgdG8gcmV0dXJuIGlmIGFuIG91dHB1dCBjb3VsZCBiZSBmb3VuZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgYW4gb3V0cHV0IHdhcyBmb3VuZCBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSAoaW4gdGhpcyBjYXNlLCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3Igb3V0cHV0IHBhcmFtIGlzIGluaXRpYWxpemVkKSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZkZXNjKTsKKworICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZURldmljZVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCk7CisKKyAgICBzdGF0dXNfdCBnZXRJbnB1dE1peEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190IGF0dHIsIEF1ZGlvTWl4ICoqcG9saWN5TWl4KTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkZjViNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSHdNb2R1bGU7CitjbGFzcyBBdWRpb0dhaW47CisKK2NsYXNzIEF1ZGlvUG9ydCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKK3sKK3B1YmxpYzoKKyAgICBBdWRpb1BvcnQoY29uc3QgU3RyaW5nOCYgbmFtZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSk7CisgICAgdmlydHVhbCB+QXVkaW9Qb3J0KCkge30KKworICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOworICAgIGJvb2wgaXNBdHRhY2hlZCgpIHsgcmV0dXJuIG1Nb2R1bGUgIT0gMDsgfQorCisgICAgc3RhdGljIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0TmV4dFVuaXF1ZUlkKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIGltcG9ydEF1ZGlvUG9ydChjb25zdCBzcDxBdWRpb1BvcnQ+IHBvcnQpOworICAgIHZvaWQgY2xlYXJDYXBhYmlsaXRpZXMoKTsKKworICAgIHZvaWQgbG9hZFNhbXBsaW5nUmF0ZXMoY2hhciAqbmFtZSk7CisgICAgdm9pZCBsb2FkRm9ybWF0cyhjaGFyICpuYW1lKTsKKyAgICB2b2lkIGxvYWRPdXRDaGFubmVscyhjaGFyICpuYW1lKTsKKyAgICB2b2lkIGxvYWRJbkNoYW5uZWxzKGNoYXIgKm5hbWUpOworCisgICAgYXVkaW9fZ2Fpbl9tb2RlX3QgbG9hZEdhaW5Nb2RlKGNoYXIgKm5hbWUpOworICAgIHZvaWQgbG9hZEdhaW4oY25vZGUgKnJvb3QsIGludCBpbmRleCk7CisgICAgdmlydHVhbCB2b2lkIGxvYWRHYWlucyhjbm9kZSAqcm9vdCk7CisKKyAgICAvLyBzZWFyY2hlcyBmb3IgYW4gZXhhY3QgbWF0Y2gKKyAgICBzdGF0dXNfdCBjaGVja0V4YWN0U2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkgY29uc3Q7CisgICAgLy8gc2VhcmNoZXMgZm9yIGEgY29tcGF0aWJsZSBtYXRjaCwgYW5kIHJldHVybnMgdGhlIGJlc3QgbWF0Y2ggdmlhIHVwZGF0ZWRTYW1wbGluZ1JhdGUKKyAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgdWludDMyX3QgKnVwZGF0ZWRTYW1wbGluZ1JhdGUpIGNvbnN0OworICAgIC8vIHNlYXJjaGVzIGZvciBhbiBleGFjdCBtYXRjaAorICAgIHN0YXR1c190IGNoZWNrRXhhY3RDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3Q7CisgICAgLy8gc2VhcmNoZXMgZm9yIGEgY29tcGF0aWJsZSBtYXRjaCwgY3VycmVudGx5IGltcGxlbWVudGVkIGZvciBpbnB1dCBjaGFubmVsIG1hc2tzIG9ubHkKKyAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICp1cGRhdGVkQ2hhbm5lbE1hc2spIGNvbnN0OworCisgICAgc3RhdHVzX3QgY2hlY2tFeGFjdEZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OworICAgIC8vIHNlYXJjaGVzIGZvciBhIGNvbXBhdGlibGUgbWF0Y2gsIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBmb3IgaW5wdXQgZm9ybWF0cyBvbmx5CisgICAgc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgYXVkaW9fZm9ybWF0X3QgKnVwZGF0ZWRGb3JtYXQpIGNvbnN0OworICAgIHN0YXR1c190IGNoZWNrR2Fpbihjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmdhaW5Db25maWcsIGludCBpbmRleCkgY29uc3Q7CisKKyAgICB1aW50MzJfdCBwaWNrU2FtcGxpbmdSYXRlKCkgY29uc3Q7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgcGlja0NoYW5uZWxNYXNrKCkgY29uc3Q7CisgICAgYXVkaW9fZm9ybWF0X3QgcGlja0Zvcm1hdCgpIGNvbnN0OworCisgICAgc3RhdGljIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHNQY21Gb3JtYXRDb21wYXJlVGFibGVbXTsKKyAgICBzdGF0aWMgaW50IGNvbXBhcmVGb3JtYXRzKGNvbnN0IGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQxLCBjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MikgeworICAgICAgICByZXR1cm4gY29tcGFyZUZvcm1hdHMoKmZvcm1hdDEsICpmb3JtYXQyKTsKKyAgICB9CisgICAgc3RhdGljIGludCBjb21wYXJlRm9ybWF0cyhhdWRpb19mb3JtYXRfdCBmb3JtYXQxLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQyKTsKKworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKKyAgICB1aW50MzJfdCBnZXRNb2R1bGVWZXJzaW9uKCkgY29uc3Q7CisgICAgY29uc3QgY2hhciAqZ2V0TW9kdWxlTmFtZSgpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7CisgICAgdm9pZCBsb2coY29uc3QgY2hhciogaW5kZW50KSBjb25zdDsKKworICAgIFN0cmluZzggICAgICAgICAgIG1OYW1lOworICAgIGF1ZGlvX3BvcnRfdHlwZV90IG1UeXBlOworICAgIGF1ZGlvX3BvcnRfcm9sZV90IG1Sb2xlOworICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VJbkNoYW5uZWxNYXNrOworICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbVNhbXBsaW5nUmF0ZXMsIG1DaGFubmVsTWFza3Mgb3IgbUZvcm1hdHMKKyAgICAvLyBpbmRpY2F0ZXMgdGhlIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAvLyBhZnRlciBpdCBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCisgICAgVmVjdG9yIDx1aW50MzJfdD4gbVNhbXBsaW5nUmF0ZXM7IC8vIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcworICAgIFZlY3RvciA8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IG1DaGFubmVsTWFza3M7IC8vIHN1cHBvcnRlZCBjaGFubmVsIG1hc2tzCisgICAgVmVjdG9yIDxhdWRpb19mb3JtYXRfdD4gbUZvcm1hdHM7IC8vIHN1cHBvcnRlZCBhdWRpbyBmb3JtYXRzCisgICAgVmVjdG9yIDwgc3A8QXVkaW9HYWluPiA+IG1HYWluczsgLy8gZ2FpbiBjb250cm9sbGVycworICAgIHNwPEh3TW9kdWxlPiBtTW9kdWxlOyAgICAgICAgICAgICAgICAgLy8gYXVkaW8gSFcgbW9kdWxlIGV4cG9zaW5nIHRoaXMgSS9PIHN0cmVhbQorICAgIHVpbnQzMl90IG1GbGFnczsgLy8gYXR0cmlidXRlIGZsYWdzIChlLmcgcHJpbWFyeSBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3Qgb3V0cHV0Li4uKS4KKworcHJpdmF0ZToKKyAgICBzdGF0aWMgdm9sYXRpbGUgaW50MzJfdCBtTmV4dFVuaXF1ZUlkOworfTsKKworY2xhc3MgQXVkaW9Qb3J0Q29uZmlnIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQoreworcHVibGljOgorICAgIEF1ZGlvUG9ydENvbmZpZygpOworICAgIHZpcnR1YWwgfkF1ZGlvUG9ydENvbmZpZygpIHt9CisKKyAgICBzdGF0dXNfdCBhcHBseUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnID0gTlVMTCk7CisgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0ID0gMDsKKyAgICB1aW50MzJfdCBtU2FtcGxpbmdSYXRlOworICAgIGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUNoYW5uZWxNYXNrOworICAgIHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyBtR2FpbjsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ29uZmlnUGFyc2luZ1V0aWxzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ29uZmlnUGFyc2luZ1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhkMmNkZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Db25maWdQYXJzaW5nVXRpbHMuaApAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkh3TW9kdWxlLmgiCisjaW5jbHVkZSAiYXVkaW9fcG9saWN5X2NvbmYuaCIKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZpbml0aW9ucyBmb3IgYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBwYXJzaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBTdHJpbmdUb0VudW0geworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgdWludDMyX3QgdmFsdWU7Cit9OworCisvLyBUT0RPOiBtb3ZlIHRvIGEgc2VwYXJhdGUgZmlsZS4gU2hvdWxkIGJlIGluIHN5bmMgd2l0aCBhdWRpby5oLgorI2RlZmluZSBTVFJJTkdfVE9fRU5VTShzdHJpbmcpIHsgI3N0cmluZywgKHVpbnQzMl90KXN0cmluZyB9IC8vIHVpbnQzMl90IGNhc3QgcmVtb3ZlcyB3YXJuaW5nCisjZGVmaW5lIE5BTUVfVE9fRU5VTShuYW1lLCB2YWx1ZSkgeyBuYW1lLCB2YWx1ZSB9CisjaWZuZGVmIEFSUkFZX1NJWkUKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCisjZW5kaWYKKworY29uc3QgU3RyaW5nVG9FbnVtIHNEZXZpY2VUeXBlVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9TQ08pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFApLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0hETUkpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfTElORSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUERJRiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9GTSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BVVhfTElORSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9JUCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FNQklFTlQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FMTF9TQ08pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQVVYX0RJR0lUQUwpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9IRE1JKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FOTEdfRE9DS19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fREdUTF9ET0NLX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9VU0JfQUNDRVNTT1JZKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVFZfVFVORVIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9MSU5FKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fU1BESUYpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0xPT1BCQUNLKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fSVApLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNEZXZpY2VOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBOQU1FX1RPX0VOVU0oIkVhcnBpZWNlIiwgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSksCisgICAgTkFNRV9UT19FTlVNKCJTcGVha2VyIiwgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSwKKyAgICBOQU1FX1RPX0VOVU0oIlNwZWFrZXIgUHJvdGVjdGVkIiwgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpLAorICAgIE5BTUVfVE9fRU5VTSgiV2lyZWQgSGVhZHNldCIsIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCksCisgICAgTkFNRV9UT19FTlVNKCJXaXJlZCBIZWFkcGhvbmVzIiwgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUpLAorICAgIE5BTUVfVE9fRU5VTSgiQlQgU0NPIiwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPKSwKKyAgICBOQU1FX1RPX0VOVU0oIkJUIFNDTyBIZWFkc2V0IiwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQpLAorICAgIE5BTUVfVE9fRU5VTSgiQlQgU0NPIENhciBLaXQiLCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKSwKKyAgICBOQU1FX1RPX0VOVU0oIiIsIEFVRElPX0RFVklDRV9PVVRfQUxMX1NDTyksCisgICAgTkFNRV9UT19FTlVNKCJCVCBBMkRQIE91dCIsIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFApLAorICAgIE5BTUVfVE9fRU5VTSgiQlQgQTJEUCBIZWFkcGhvbmVzIiwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTKSwKKyAgICBOQU1FX1RPX0VOVU0oIkJUIEEyRFAgU3BlYWtlciIsIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiksCisgICAgTkFNRV9UT19FTlVNKCIiLCBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSwKKyAgICBOQU1FX1RPX0VOVU0oIkhETUkgT3V0IiwgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCksCisgICAgTkFNRV9UT19FTlVNKCJIRE1JIE91dCIsIEFVRElPX0RFVklDRV9PVVRfSERNSSksCisgICAgTkFNRV9UT19FTlVNKCJBbmFsb2cgRG9jayBPdXQiLCBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUKSwKKyAgICBOQU1FX1RPX0VOVU0oIkRpZ2l0YWwgRG9jayBPdXQiLCBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUKSwKKyAgICBOQU1FX1RPX0VOVU0oIlVTQiBIb3N0IE91dCIsIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWSksCisgICAgTkFNRV9UT19FTlVNKCJVU0IgRGV2aWNlIE91dCIsIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRSksCisgICAgTkFNRV9UT19FTlVNKCIiLCBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpLAorICAgIE5BTUVfVE9fRU5VTSgiUmVyb3V0ZSBTdWJtaXggT3V0IiwgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSwKKyAgICBOQU1FX1RPX0VOVU0oIlRlbGVwaG9ueSBUeCIsIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSwKKyAgICBOQU1FX1RPX0VOVU0oIkxpbmUgT3V0IiwgQVVESU9fREVWSUNFX09VVF9MSU5FKSwKKyAgICBOQU1FX1RPX0VOVU0oIkhETUkgQVJDIE91dCIsIEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpLAorICAgIE5BTUVfVE9fRU5VTSgiUy9QRElGIE91dCIsIEFVRElPX0RFVklDRV9PVVRfU1BESUYpLAorICAgIE5BTUVfVE9fRU5VTSgiRk0gdHJhbnNjZWl2ZXIgT3V0IiwgQVVESU9fREVWSUNFX09VVF9GTSksCisgICAgTkFNRV9UT19FTlVNKCJBdXggTGluZSBPdXQiLCBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FKSwKKyAgICBOQU1FX1RPX0VOVU0oIklQIE91dCIsIEFVRElPX0RFVklDRV9PVVRfSVApLAorICAgIE5BTUVfVE9fRU5VTSgiQW1iaWVudCBNaWMiLCBBVURJT19ERVZJQ0VfSU5fQU1CSUVOVCksCisgICAgTkFNRV9UT19FTlVNKCJCdWlsdC1JbiBNaWMiLCBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpLAorICAgIE5BTUVfVE9fRU5VTSgiQlQgU0NPIEhlYWRzZXQgTWljIiwgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCksCisgICAgTkFNRV9UT19FTlVNKCIiLCBBVURJT19ERVZJQ0VfSU5fQUxMX1NDTyksCisgICAgTkFNRV9UT19FTlVNKCJXaXJlZCBIZWFkc2V0IE1pYyIsIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSwKKyAgICBOQU1FX1RPX0VOVU0oIkhETUkgSW4iLCBBVURJT19ERVZJQ0VfSU5fQVVYX0RJR0lUQUwpLAorICAgIE5BTUVfVE9fRU5VTSgiSERNSSBJbiIsIEFVRElPX0RFVklDRV9JTl9IRE1JKSwKKyAgICBOQU1FX1RPX0VOVU0oIlRlbGVwaG9ueSBSeCIsIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpLAorICAgIE5BTUVfVE9fRU5VTSgiVGVsZXBob255IFJ4IiwgQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpLAorICAgIE5BTUVfVE9fRU5VTSgiQnVpbHQtSW4gQmFjayBNaWMiLCBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpLAorICAgIE5BTUVfVE9fRU5VTSgiUmVyb3V0ZSBTdWJtaXggSW4iLCBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCksCisgICAgTkFNRV9UT19FTlVNKCJBbmFsb2cgRG9jayBJbiIsIEFVRElPX0RFVklDRV9JTl9BTkxHX0RPQ0tfSEVBRFNFVCksCisgICAgTkFNRV9UT19FTlVNKCJEaWdpdGFsIERvY2sgSW4iLCBBVURJT19ERVZJQ0VfSU5fREdUTF9ET0NLX0hFQURTRVQpLAorICAgIE5BTUVfVE9fRU5VTSgiVVNCIEhvc3QgSW4iLCBBVURJT19ERVZJQ0VfSU5fVVNCX0FDQ0VTU09SWSksCisgICAgTkFNRV9UT19FTlVNKCJVU0IgRGV2aWNlIEluIiwgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpLAorICAgIE5BTUVfVE9fRU5VTSgiRk0gVHVuZXIgSW4iLCBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpLAorICAgIE5BTUVfVE9fRU5VTSgiVFYgVHVuZXIgSW4iLCBBVURJT19ERVZJQ0VfSU5fVFZfVFVORVIpLAorICAgIE5BTUVfVE9fRU5VTSgiTGluZSBJbiIsIEFVRElPX0RFVklDRV9JTl9MSU5FKSwKKyAgICBOQU1FX1RPX0VOVU0oIlMvUERJRiBJbiIsIEFVRElPX0RFVklDRV9JTl9TUERJRiksCisgICAgTkFNRV9UT19FTlVNKCJCVCBBMkRQIEluIiwgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSwKKyAgICBOQU1FX1RPX0VOVU0oIkxvb3BiYWNrIEluIiwgQVVESU9fREVWSUNFX0lOX0xPT1BCQUNLKSwKKyAgICBOQU1FX1RPX0VOVU0oIklQIEluIiwgQVVESU9fREVWSUNFX0lOX0lQKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzT3V0cHV0RmxhZ05hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfVFRTKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19SQVcpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX1NZTkMpLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNJbnB1dEZsYWdOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19JTlBVVF9GTEFHX0ZBU1QpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0lOUFVUX0ZMQUdfSFdfSE9UV09SRCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fSU5QVVRfRkxBR19SQVcpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0lOUFVUX0ZMQUdfU1lOQyksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc0Zvcm1hdE5hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzhfQklUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzMyX0JJVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV9GTE9BVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfTVAzKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX01BSU4pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfU1NSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0xUUCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19IRV9WMSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19TQ0FMQUJMRSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19FUkxDKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0xEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0hFX1YyKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0VMRCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1ZPUkJJUyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0hFX0FBQ19WMSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0hFX0FBQ19WMiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX09QVVMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQzMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9FX0FDMyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0RUUyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0RUU19IRCksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF9RVUFEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF81UE9JTlQxKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5fTU9OTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc0luZGV4Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18zKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzUpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS182KSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzgpLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNHYWluTW9kZU5hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0dBSU5fTU9ERV9KT0lOVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19HQUlOX01PREVfUkFNUCksCit9OworCitjbGFzcyBDb25maWdQYXJzaW5nVXRpbHMKK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgdWludDMyX3Qgc3RyaW5nVG9FbnVtKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZW51bVRvU3RyaW5nKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSk7CisgICAgc3RhdGljIGJvb2wgc3RyaW5nVG9Cb29sKGNvbnN0IGNoYXIgKnZhbHVlKTsKKyAgICBzdGF0aWMgdWludDMyX3QgcGFyc2VPdXRwdXRGbGFnTmFtZXMoY2hhciAqbmFtZSk7CisgICAgc3RhdGljIHVpbnQzMl90IHBhcnNlSW5wdXRGbGFnTmFtZXMoY2hhciAqbmFtZSk7CisgICAgc3RhdGljIGF1ZGlvX2RldmljZXNfdCBwYXJzZURldmljZU5hbWVzKGNoYXIgKm5hbWUpOworCisgICAgc3RhdGljIHZvaWQgbG9hZEh3TW9kdWxlcyhjbm9kZSAqcm9vdCwgSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJmlzU3BlYWtlckRyY0VuYWJsZWQpOworCisgICAgc3RhdGljIHZvaWQgbG9hZEdsb2JhbENvbmZpZyhjbm9kZSAqcm9vdCwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJmlzU3BlYWtlckRyY0VuYWJsZWQpOworCisgICAgc3RhdGljIHN0YXR1c190IGxvYWRBdWRpb1BvbGljeUNvbmZpZyhjb25zdCBjaGFyICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJmlzU3BlYWtlckRyY0VuYWJsZWQpOworCitwcml2YXRlOgorICAgIHN0YXRpYyB2b2lkIGxvYWRId01vZHVsZShjbm9kZSAqcm9vdCwgSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlSW5wdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNTcGVha2VyRHJjRW5hYmxlZCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyZWNlNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGV2aWNlRGVzY3JpcHRvciA6IHB1YmxpYyBBdWRpb1BvcnQsIHB1YmxpYyBBdWRpb1BvcnRDb25maWcKK3sKK3B1YmxpYzoKKyAgICBEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlKTsKKworICAgIHZpcnR1YWwgfkRldmljZURlc2NyaXB0b3IoKSB7fQorCisgICAgYm9vbCBlcXVhbHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIG90aGVyKSBjb25zdDsKKworICAgIC8vIEF1ZGlvUG9ydENvbmZpZworICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCB7IHJldHVybiAoQXVkaW9Qb3J0KikgdGhpczsgfQorICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CisKKyAgICAvLyBBdWRpb1BvcnQKKyAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKTsKKyAgICB2aXJ0dWFsIHZvaWQgbG9hZEdhaW5zKGNub2RlICpyb290KTsKKyAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBpbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiBwb3J0KTsKKworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0SWQoKSBjb25zdDsKKyAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlOyB9CisgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCBsb2coKSBjb25zdDsKKworICAgIFN0cmluZzggbVRhZzsKKyAgICBTdHJpbmc4IG1BZGRyZXNzOworCitwcml2YXRlOgorICAgIGF1ZGlvX2RldmljZXNfdCAgICAgbURldmljZVR5cGU7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQ7CisKK2ZyaWVuZCBjbGFzcyBEZXZpY2VWZWN0b3I7Cit9OworCitjbGFzcyBEZXZpY2VWZWN0b3IgOiBwdWJsaWMgU29ydGVkVmVjdG9yPCBzcDxEZXZpY2VEZXNjcmlwdG9yPiA+Cit7CitwdWJsaWM6CisgICAgRGV2aWNlVmVjdG9yKCkgOiBTb3J0ZWRWZWN0b3IoKSwgbURldmljZVR5cGVzKEFVRElPX0RFVklDRV9OT05FKSB7fQorCisgICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOworICAgIHNzaXplX3QgcmVtb3ZlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKTsKKyAgICBzc2l6ZV90IGluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0OworCisgICAgYXVkaW9fZGV2aWNlc190IHR5cGVzKCkgY29uc3QgeyByZXR1cm4gbURldmljZVR5cGVzOyB9CisKKyAgICB2b2lkIGxvYWREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGVzKTsKKyAgICB2b2lkIGxvYWREZXZpY2VzRnJvbVRhZyhjaGFyICp0YWcsIGNvbnN0IERldmljZVZlY3RvciYgZGVjbGFyZWREZXZpY2VzKTsKKworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSBjb25zdDsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcykgY29uc3Q7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlRnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0OworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUZyb21UYWcoY29uc3QgU3RyaW5nOCYgdGFnKSBjb25zdDsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlQWRkcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSBjb25zdDsKKworICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0OworCisgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2RGVzYykgY29uc3Q7CisKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgU3RyaW5nOCAmZGlyZWN0aW9uKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB2b2lkIHJlZnJlc2hUeXBlcygpOworICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlVHlwZXM7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3ODNhMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworCitjbGFzcyBFZmZlY3REZXNjcmlwdG9yIDogcHVibGljIFJlZkJhc2UKK3sKK3B1YmxpYzoKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICBpbnQgbUlvOyAgICAgICAgICAgICAgICAvLyBpbyB0aGUgZWZmZWN0IGlzIGF0dGFjaGVkIHRvCisgICAgcm91dGluZ19zdHJhdGVneSBtU3RyYXRlZ3k7IC8vIHJvdXRpbmcgc3RyYXRlZ3kgdGhlIGVmZmVjdCBpcyBhc3NvY2lhdGVkIHRvCisgICAgaW50IG1TZXNzaW9uOyAgICAgICAgICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gdGhlIGVmZmVjdCBpcyBvbgorICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgbURlc2M7ICAvLyBlZmZlY3QgZGVzY3JpcHRvcgorICAgIGJvb2wgbUVuYWJsZWQ7ICAgICAgICAgICAgICAvLyBlbmFibGVkIHN0YXRlOiBDUFUgbG9hZCBiZWluZyB1c2VkIG9yIG5vdAorfTsKKworY2xhc3MgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gOiBwdWJsaWMgS2V5ZWRWZWN0b3I8aW50LCBzcDxFZmZlY3REZXNjcmlwdG9yPiA+Cit7CitwdWJsaWM6CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24oKTsKKworICAgIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LCBpbnQgc2Vzc2lvbiwgaW50IGlkKTsKKyAgICBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7CisgICAgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7CisgICAgdWludDMyX3QgZ2V0TWF4RWZmZWN0c0NwdUxvYWQoKSBjb25zdDsKKyAgICB1aW50MzJfdCBnZXRNYXhFZmZlY3RzTWVtb3J5KCkgY29uc3Q7CisgICAgYm9vbCBpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpOworCisgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCitwcml2YXRlOgorICAgIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdERlc2MsIGJvb2wgZW5hYmxlZCk7CisKKyAgICB1aW50MzJfdCBtVG90YWxFZmZlY3RzQ3B1TG9hZDsgLy8gY3VycmVudCBDUFUgbG9hZCB1c2VkIGJ5IGVmZmVjdHMKKyAgICB1aW50MzJfdCBtVG90YWxFZmZlY3RzTWVtb3J5OyAgLy8gY3VycmVudCBtZW1vcnkgdXNlZCBieSBlZmZlY3RzCisKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIENQVSBsb2FkIGFsbG9jYXRlZCB0byBhdWRpbyBlZmZlY3RzIGluIDAuMSBNSVBTIChBUk12NVRFLCAwIFdTIG1lbW9yeSkgdW5pdHMKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0VGRkVDVFNfQ1BVX0xPQUQgPSAxMDAwOworICAgIC8qKgorICAgICAqIE1heGltdW0gbWVtb3J5IGFsbG9jYXRlZCB0byBhdWRpbyBlZmZlY3RzIGluIEtCCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9FRkZFQ1RTX01FTU9SWSA9IDUxMjsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzNlYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU9Qcm9maWxlOworCitjbGFzcyBId01vZHVsZSA6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgSHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSk7CisgICAgfkh3TW9kdWxlKCk7CisKKyAgICBzdGF0dXNfdCBsb2FkT3V0cHV0KGNub2RlICpyb290KTsKKyAgICBzdGF0dXNfdCBsb2FkSW5wdXQoY25vZGUgKnJvb3QpOworICAgIHN0YXR1c190IGxvYWREZXZpY2UoY25vZGUgKnJvb3QpOworCisgICAgc3RhdHVzX3QgYWRkT3V0cHV0UHJvZmlsZShTdHJpbmc4IG5hbWUsIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBTdHJpbmc4IGFkZHJlc3MpOworICAgIHN0YXR1c190IHJlbW92ZU91dHB1dFByb2ZpbGUoU3RyaW5nOCBuYW1lKTsKKyAgICBzdGF0dXNfdCBhZGRJbnB1dFByb2ZpbGUoU3RyaW5nOCBuYW1lLCBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgU3RyaW5nOCBhZGRyZXNzKTsKKyAgICBzdGF0dXNfdCByZW1vdmVJbnB1dFByb2ZpbGUoU3RyaW5nOCBuYW1lKTsKKworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9CisKKyAgICB2b2lkIGR1bXAoaW50IGZkKTsKKworICAgIGNvbnN0IGNoYXIgKmNvbnN0ICAgICAgICBtTmFtZTsgLy8gYmFzZSBuYW1lIG9mIHRoZSBhdWRpbyBIVyBtb2R1bGUgKHByaW1hcnksIGEyZHAgLi4uKQorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBtSGFsVmVyc2lvbjsgLy8gYXVkaW8gSEFMIEFQSSB2ZXJzaW9uCisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90ICAgIG1IYW5kbGU7CisgICAgVmVjdG9yIDwgc3A8SU9Qcm9maWxlPiA+IG1PdXRwdXRQcm9maWxlczsgLy8gb3V0cHV0IHByb2ZpbGVzIGV4cG9zZWQgYnkgdGhpcyBtb2R1bGUKKyAgICBWZWN0b3IgPCBzcDxJT1Byb2ZpbGU+ID4gbUlucHV0UHJvZmlsZXM7ICAvLyBpbnB1dCBwcm9maWxlcyBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCisgICAgRGV2aWNlVmVjdG9yICAgICAgICAgICAgIG1EZWNsYXJlZERldmljZXM7IC8vIGRldmljZXMgZGVjbGFyZWQgaW4gYXVkaW9fcG9saWN5LmNvbmYKK307CisKK2NsYXNzIEh3TW9kdWxlQ29sbGVjdGlvbiA6IHB1YmxpYyBWZWN0b3I8IHNwPEh3TW9kdWxlPiA+Cit7CitwdWJsaWM6CisgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZyb21OYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OworCisgICAgc3AgPEh3TW9kdWxlPiBnZXRNb2R1bGVGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAgZ2V0RGV2aWNlRGVzY3JpcHRvcihjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKSBjb25zdDsKKworICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2ZmNjMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJBdWRpb1BvcnQuaCIKKyNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEh3TW9kdWxlOworCisvLyB0aGUgSU9Qcm9maWxlIGNsYXNzIGRlc2NyaWJlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIGFuIG91dHB1dCBvciBpbnB1dCBzdHJlYW0uCisvLyBJdCBpcyBjdXJyZW50bHkgYXNzdW1lZCB0aGF0IGFsbCBjb21iaW5hdGlvbiBvZiBsaXN0ZWQgcGFyYW1ldGVycyBhcmUgc3VwcG9ydGVkLgorLy8gSXQgaXMgdXNlZCBieSB0aGUgcG9saWN5IG1hbmFnZXIgdG8gZGV0ZXJtaW5lIGlmIGFuIG91dHB1dCBvciBpbnB1dCBpcyBzdWl0YWJsZSBmb3IKKy8vIGEgZ2l2ZW4gdXNlIGNhc2UsICBvcGVuL2Nsb3NlIGl0IGFjY29yZGluZ2x5IGFuZCBjb25uZWN0L2Rpc2Nvbm5lY3QgYXVkaW8gdHJhY2tzCisvLyB0by9mcm9tIGl0LgorY2xhc3MgSU9Qcm9maWxlIDogcHVibGljIEF1ZGlvUG9ydAoreworcHVibGljOgorICAgIElPUHJvZmlsZShjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKTsKKyAgICB2aXJ0dWFsIH5JT1Byb2ZpbGUoKTsKKworICAgIC8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGJvdGggb3V0cHV0IGFuZCBpbnB1dC4KKyAgICAvLyBJZiBwYXJhbWV0ZXIgdXBkYXRlZFNhbXBsaW5nUmF0ZSBpcyBub24tTlVMTCwgaXQgaXMgYXNzaWduZWQgdGhlIGFjdHVhbCBzYW1wbGUgcmF0ZS4KKyAgICAvLyBGb3IgaW5wdXQsIGZsYWdzIGlzIGludGVycHJldGVkIGFzIGF1ZGlvX2lucHV0X2ZsYWdzX3QuCisgICAgLy8gVE9ETzogbWVyZ2UgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgYW5kIGF1ZGlvX2lucHV0X2ZsYWdzX3QuCisgICAgYm9vbCBpc0NvbXBhdGlibGVQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqdXBkYXRlZEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICp1cGRhdGVkQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKSBjb25zdDsKKworICAgIHZvaWQgZHVtcChpbnQgZmQpOworICAgIHZvaWQgbG9nKCk7CisKKyAgICBEZXZpY2VWZWN0b3IgIG1TdXBwb3J0ZWREZXZpY2VzOyAvLyBzdXBwb3J0ZWQgZGV2aWNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChkZXZpY2VzIHRoaXMgb3V0cHV0IGNhbiBiZSByb3V0ZWQgdG8pCit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1Nlc3Npb25Sb3V0ZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1Nlc3Npb25Sb3V0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZmVhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERldmljZURlc2NyaXB0b3I7CisKK2NsYXNzIFNlc3Npb25Sb3V0ZSA6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgLy8gRm9yIElucHV0IChTb3VyY2UpIHJvdXRlcywgdXNlIFNUUkVBTV9UWVBFX05BICgiTkEiID0gIm5vdCBhcHBsaWNhYmxlKWZvciB0aGUKKyAgICAvLyBzdHJlYW1UeXBlIGFyZ3VtZW50CisgICAgc3RhdGljIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgU1RSRUFNX1RZUEVfTkEgPSBBVURJT19TVFJFQU1fREVGQVVMVDsKKworICAgIC8vIEZvciBPdXRwdXQgKFNpbmspIHJvdXRlcywgdXNlIFNPVVJDRV9UWVBFX05BICgiTkEiID0gIm5vdCBhcHBsaWNhYmxlIikgZm9yIHRoZQorICAgIC8vIHNvdXJjZSBhcmd1bWVudAorCisgICAgc3RhdGljIGNvbnN0IGF1ZGlvX3NvdXJjZV90IFNPVVJDRV9UWVBFX05BID0gQVVESU9fU09VUkNFX0RFRkFVTFQ7CisKKyAgICBTZXNzaW9uUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCisgICAgICAgIDogbVVpZCh1aWQpLAorICAgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLAorICAgICAgICAgIG1EZXZpY2VEZXNjcmlwdG9yKGRldmljZURlc2NyaXB0b3IpLAorICAgICAgICAgIG1SZWZDb3VudCgwKSwKKyAgICAgICAgICBtQWN0aXZpdHlDb3VudCgwKSwKKyAgICAgICAgICBtQ2hhbmdlZChmYWxzZSksCisgICAgICAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCisgICAgICAgICAgbVNvdXJjZShzb3VyY2UpCisgICAge30KKworICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIHByZWZpeCk7CisKKyAgICBib29sIGlzQWN0aXZlKCkgeworICAgICAgICByZXR1cm4gKG1EZXZpY2VEZXNjcmlwdG9yICE9IDApICYmIChtQ2hhbmdlZCB8fCAobUFjdGl2aXR5Q291bnQgPiAwKSk7CisgICAgfQorCisgICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7CisgICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgICAgIG1TZXNzaW9uOworICAgIHNwPERldmljZURlc2NyaXB0b3I+ICAgICAgICBtRGV2aWNlRGVzY3JpcHRvcjsKKworICAgIC8vICJyZWZlcmVuY2UiIGNvdW50aW5nCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWZDb3VudDsgICAgICAvLyArLy0gb24gcmVmZXJlbmNlcworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlDb3VudDsgLy8gKy8tIG9uIHN0YXJ0L3N0b3AKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5nZWQ7CisgICAgLy8gZm9yIG91dHB1dHMKKyAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICAgbVN0cmVhbVR5cGU7CisgICAgLy8gZm9yIGlucHV0cworICAgIGNvbnN0IGF1ZGlvX3NvdXJjZV90ICAgICAgICBtU291cmNlOworfTsKKworY2xhc3MgU2Vzc2lvblJvdXRlTWFwOiBwdWJsaWMgS2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBzcDxTZXNzaW9uUm91dGU+ID4KK3sKK3B1YmxpYzoKKyAgICAvLyBUaGVzZSBjb25zdGFudHMgaWRlbnRpZnkgdGhlIFNlc3Npb25Sb3V0TWFwIGFzIGhvbGRpbmcgRUlUSEVSIGlucHV0IHJvdXRlcywKKyAgICAvLyBvciBvdXRwdXQgcm91dGVzLiAgQW4gZXJyb3Igd2lsbCBvY2N1ciBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYWRkIGEgU2Vzc2lvblJvdXRlCisgICAgLy8gb2JqZWN0IHdpdGggbVN0cmVhbVR5cGUgPT0gU1RSRUFNX1RZUEVfTkEgKGkuZS4gYW4gaW5wdXQgU2Vzc2lvblJvdXRlKSB0byBhCisgICAgLy8gU2Vzc2lvblJvdXRNYXAgdGhhdCBpcyBtYXJrZWQgZm9yIG91dHB1dCAoaS5lLiBtTWFwVHlwZSA9PSBTRVNTSU9OX1JPVVRFX01BUF9PVVRQVVQpCisgICAgLy8gYW5kIHNpbWlsYXJseSAgZm9yIG91dHB1dCBTZXNzaW9uUm91dGVzIGFuZCBJbnB1dCBTZXNzaW9uUm91dGVNYXBzLgorICAgIHR5cGVkZWYgZW51bQorICAgIHsKKyAgICAgICAgTUFQVFlQRV9JTlBVVCA9IDAsCisgICAgICAgIE1BUFRZUEVfT1VUUFVUID0gMQorICAgIH0gc2Vzc2lvbl9yb3V0ZV9tYXBfdHlwZV90OworCisgICAgU2Vzc2lvblJvdXRlTWFwKHNlc3Npb25fcm91dGVfbWFwX3R5cGVfdCBtYXBUeXBlKSA6CisgICAgICAgIG1NYXBUeXBlKG1hcFR5cGUpCisgICAge30KKworICAgIGJvb2wgaGFzUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworCisgICAgdm9pZCByZW1vdmVSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisKKyAgICBpbnQgaW5jUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgaW50IGRlY1JvdXRlQWN0aXZpdHkoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIGJvb2wgaGFzUm91dGVDaGFuZ2VkKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsgLy8gYWxzbyBjbGVhcnMgdGhlIGNoYW5nZWQgZmxhZworICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIGNhcHRpb24pOworCisgICAgLy8gU3BlY2lmeSBhbiBPdXRwdXQoU2luaykgcm91dGUgYnkgcGFzc2luZyBTZXNzaW9uUm91dGU6OlNPVVJDRV9UWVBFX05BIGluIHRoZQorICAgIC8vIHNvdXJjZSBhcmd1bWVudC4KKyAgICAvLyBTcGVjaWZ5IGFuIElucHV0KFNvdXJjZSkgcm91dCBieSBwYXNzaW5nIFNlc3Npb25Sb3V0ZTo6QVVESU9fU1RSRUFNX0RFRkFVTFQKKyAgICAvLyBpbiB0aGUgc3RyZWFtVHlwZSBhcmd1bWVudC4KKyAgICB2b2lkIGFkZFJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7CisKK3ByaXZhdGU6CisgICAgLy8gVXNlZCB0byBtYXJrIGEgU2Vzc2lvblJvdXRlIGFzIGZvciBlaXRoZXIgaW5wdXRzIChtTWFwVHlwZSA9PSBrU2Vzc2lvblJvdXRlTWFwX0lucHV0KQorICAgIC8vIG9yIG91dHB1dHMgKG1NYXBUeXBlID09IGtTZXNzaW9uUm91dGVNYXBfT3V0cHV0KQorICAgIGNvbnN0IHNlc3Npb25fcm91dGVfbWFwX3R5cGVfdCBtTWFwVHlwZTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUZhY3RvcnkuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NvdW5kVHJpZ2dlclNlc3Npb24uaApzaW1pbGFyaXR5IGluZGV4IDYwJQpjb3B5IGZyb20gc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcApjb3B5IHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Tb3VuZFRyaWdnZXJTZXNzaW9uLmgKaW5kZXggMmFlN2JjMS4uNDIwZTZkNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU291bmRUcmlnZ2VyU2Vzc2lvbi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTkgKzE0LDIwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotZXh0ZXJuICJDIiBBdWRpb1BvbGljeUludGVyZmFjZSogY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyKAotICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQorY2xhc3MgU291bmRUcmlnZ2VyU2Vzc2lvbkNvbGxlY3Rpb24gOiBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdCwgYXVkaW9faW9faGFuZGxlX3Q+CiB7Ci0gICAgcmV0dXJuIG5ldyBBdWRpb1BvbGljeU1hbmFnZXIoY2xpZW50SW50ZXJmYWNlKTsKLX0KK3B1YmxpYzoKKyAgICBzdGF0dXNfdCByZWxlYXNlU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CiAKLWV4dGVybiAiQyIgdm9pZCBkZXN0cm95QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5SW50ZXJmYWNlICppbnRlcmZhY2UpCi17Ci0gICAgZGVsZXRlIGludGVyZmFjZTsKLX0KKyAgICBzdGF0dXNfdCBhY3F1aXJlU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpOworfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TdHJlYW1EZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU3RyZWFtRGVzY3JpcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZGI1YWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU3RyZWFtRGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPFZvbHVtZS5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RyZWFtIGRlc2NyaXB0b3IgdXNlZCBmb3Igdm9sdW1lIGNvbnRyb2wKK2NsYXNzIFN0cmVhbURlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBTdHJlYW1EZXNjcmlwdG9yKCk7CisKKyAgICBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7CisgICAgYm9vbCBjYW5CZU11dGVkKCkgY29uc3QgeyByZXR1cm4gbUNhbkJlTXV0ZWQ7IH0KKyAgICB2b2lkIGNsZWFyQ3VycmVudFZvbHVtZUluZGV4KCk7CisgICAgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGluZGV4KTsKKyAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNaW4oKSBjb25zdCB7IHJldHVybiBtSW5kZXhNaW47IH0KKyAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNYXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXhNYXg7IH0KKyAgICB2b2lkIHNldFZvbHVtZUluZGV4TWluKGludCB2b2xJbmRleE1pbik7CisgICAgdm9pZCBzZXRWb2x1bWVJbmRleE1heChpbnQgdm9sSW5kZXhNYXgpOworCisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7CisKKyAgICB2b2lkIHNldFZvbHVtZUN1cnZlUG9pbnQoVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnBvaW50KTsKKyAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpnZXRWb2x1bWVDdXJ2ZVBvaW50KFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVDdXJ2ZVtkZXZpY2VDYXRlZ29yeV07CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKm1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OkRFVklDRV9DQVRFR09SWV9DTlRdOworICAgIEtleWVkVmVjdG9yPGF1ZGlvX2RldmljZXNfdCwgaW50PiBtSW5kZXhDdXI7IC8qKjwgY3VycmVudCB2b2x1bWUgaW5kZXggcGVyIGRldmljZS4gKi8KKyAgICBpbnQgbUluZGV4TWluOyAvKio8IG1pbiB2b2x1bWUgaW5kZXguICovCisgICAgaW50IG1JbmRleE1heDsgLyoqPCBtYXggdm9sdW1lIGluZGV4LiAqLworICAgIGJvb2wgbUNhbkJlTXV0ZWQ7IC8qKjwgdHJ1ZSBpcyB0aGUgc3RyZWFtIGNhbiBiZSBtdXRlZC4gKi8KK307CisKKy8qKgorICogc3RyZWFtIGRlc2NyaXB0b3JzIGNvbGxlY3Rpb24gZm9yIHZvbHVtZSBjb250cm9sCisgKi8KK2NsYXNzIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uIDogcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19zdHJlYW1fdHlwZV90LCBTdHJlYW1EZXNjcmlwdG9yPgoreworcHVibGljOgorICAgIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uKCk7CisKKyAgICB2b2lkIGNsZWFyQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICB2b2lkIGFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGluZGV4KTsKKworICAgIGJvb2wgY2FuQmVNdXRlZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisKKyAgICB2b2lkIHNldFZvbHVtZUN1cnZlUG9pbnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpwb2ludCk7CisKKyAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpnZXRWb2x1bWVDdXJ2ZVBvaW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0OworCisgICAgdm9pZCBzZXRWb2x1bWVJbmRleE1pbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSxpbnQgdm9sSW5kZXhNaW4pOworICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWF4KTsKKworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2F1ZGlvX3BvbGljeV9jb25mLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvYXVkaW9fcG9saWN5X2NvbmYuaApzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9hdWRpb19wb2xpY3lfY29uZi5oCnJlbmFtZSB0byBzZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvYXVkaW9fcG9saWN5X2NvbmYuaAppbmRleCAyNTM1YTY3Li5hMzkzZTNiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9hdWRpb19wb2xpY3lfY29uZi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9hdWRpb19wb2xpY3lfY29uZi5oCkBAIC0xNCw5ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0KLSNpZm5kZWYgQU5EUk9JRF9BVURJT19QT0xJQ1lfQ09ORl9ICi0jZGVmaW5lIEFORFJPSURfQVVESU9fUE9MSUNZX0NPTkZfSAorI3ByYWdtYSBvbmNlCiAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTMsOSArNTEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gImZvcm1hdHMiIGluIG91dHB1dHMgZGVzY3JpcHRvcnMgaW5kaWNhdGluZyB0aGF0IHN1cHBvcnRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIHNob3VsZCBiZSBxdWVyaWVkIGFmdGVyIG9wZW5pbmcgdGhlIG91dHB1dC4KIAotI2RlZmluZSBERVZJQ0VTX1RBRyAiZGV2aWNlcyIKLSNkZWZpbmUgREVWSUNFX1RZUEUgInR5cGUiCi0jZGVmaW5lIERFVklDRV9BRERSRVNTICJhZGRyZXNzIgorI2RlZmluZSBBUE1fREVWSUNFU19UQUcgImRldmljZXMiCisjZGVmaW5lIEFQTV9ERVZJQ0VfVFlQRSAidHlwZSIKKyNkZWZpbmUgQVBNX0RFVklDRV9BRERSRVNTICJhZGRyZXNzIgogCiAjZGVmaW5lIE1JWEVSU19UQUcgIm1peGVycyIKICNkZWZpbmUgTUlYRVJfVFlQRSAidHlwZSIKQEAgLTcxLDcgKzY5LDMgQEAKICNkZWZpbmUgR0FJTl9TVEVQX1ZBTFVFICJzdGVwX3ZhbHVlX21CIgogI2RlZmluZSBHQUlOX01JTl9SQU1QX01TICJtaW5fcmFtcF9tcyIKICNkZWZpbmUgR0FJTl9NQVhfUkFNUF9NUyAibWF4X3JhbXBfbXMiCi0KLQotCi0jZW5kaWYgIC8vIEFORFJPSURfQVVESU9fUE9MSUNZX0NPTkZfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3YjBjYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9HYWluIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisvLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSAiU3RyZWFtRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPG1hdGguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBdWRpb0dhaW46OkF1ZGlvR2FpbihpbnQgaW5kZXgsIGJvb2wgdXNlSW5DaGFubmVsTWFzaykKK3sKKyAgICBtSW5kZXggPSBpbmRleDsKKyAgICBtVXNlSW5DaGFubmVsTWFzayA9IHVzZUluQ2hhbm5lbE1hc2s7CisgICAgbWVtc2V0KCZtR2FpbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19nYWluKSk7Cit9CisKK3ZvaWQgQXVkaW9HYWluOjpnZXREZWZhdWx0Q29uZmlnKHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKQoreworICAgIGNvbmZpZy0+aW5kZXggPSBtSW5kZXg7CisgICAgY29uZmlnLT5tb2RlID0gbUdhaW4ubW9kZTsKKyAgICBjb25maWctPmNoYW5uZWxfbWFzayA9IG1HYWluLmNoYW5uZWxfbWFzazsKKyAgICBpZiAoKG1HYWluLm1vZGUgJiBBVURJT19HQUlOX01PREVfSk9JTlQpID09IEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgeworICAgICAgICBjb25maWctPnZhbHVlc1swXSA9IG1HYWluLmRlZmF1bHRfdmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDMyX3QgbnVtVmFsdWVzOworICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1HYWluLmNoYW5uZWxfbWFzayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUdhaW4uY2hhbm5lbF9tYXNrKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVZhbHVlczsgaSsrKSB7CisgICAgICAgICAgICBjb25maWctPnZhbHVlc1tpXSA9IG1HYWluLmRlZmF1bHRfdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKChtR2Fpbi5tb2RlICYgQVVESU9fR0FJTl9NT0RFX1JBTVApID09IEFVRElPX0dBSU5fTU9ERV9SQU1QKSB7CisgICAgICAgIGNvbmZpZy0+cmFtcF9kdXJhdGlvbl9tcyA9IG1HYWluLm1pbl9yYW1wX21zOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9HYWluOjpjaGVja0NvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZykKK3sKKyAgICBpZiAoKGNvbmZpZy0+bW9kZSAmIH5tR2Fpbi5tb2RlKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICgoY29uZmlnLT5tb2RlICYgQVVESU9fR0FJTl9NT0RFX0pPSU5UKSA9PSBBVURJT19HQUlOX01PREVfSk9JTlQpIHsKKyAgICAgICAgaWYgKChjb25maWctPnZhbHVlc1swXSA8IG1HYWluLm1pbl92YWx1ZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+dmFsdWVzWzBdID4gbUdhaW4ubWF4X3ZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgoY29uZmlnLT5jaGFubmVsX21hc2sgJiB+bUdhaW4uY2hhbm5lbF9tYXNrKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IG51bVZhbHVlczsKKyAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWctPmNoYW5uZWxfbWFzayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY29uZmlnLT5jaGFubmVsX21hc2spOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoY29uZmlnLT52YWx1ZXNbaV0gPCBtR2Fpbi5taW5fdmFsdWUpIHx8CisgICAgICAgICAgICAgICAgICAgIChjb25maWctPnZhbHVlc1tpXSA+IG1HYWluLm1heF92YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICgoY29uZmlnLT5tb2RlICYgQVVESU9fR0FJTl9NT0RFX1JBTVApID09IEFVRElPX0dBSU5fTU9ERV9SQU1QKSB7CisgICAgICAgIGlmICgoY29uZmlnLT5yYW1wX2R1cmF0aW9uX21zIDwgbUdhaW4ubWluX3JhbXBfbXMpIHx8CisgICAgICAgICAgICAgICAgICAgIChjb25maWctPnJhbXBfZHVyYXRpb25fbXMgPiBtR2Fpbi5tYXhfcmFtcF9tcykpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvR2Fpbjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0dhaW4gJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtb2RlOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tb2RlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsX21hc2s6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLmNoYW5uZWxfbWFzayk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWluX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3ZhbHVlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtYXhfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tYXhfdmFsdWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGRlZmF1bHRfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5kZWZhdWx0X3ZhbHVlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzdGVwX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uc3RlcF92YWx1ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWluX3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fcmFtcF9tcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWF4X3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tYXhfcmFtcF9tcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM3MTYwYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb0lucHV0RGVzY3JpcHRvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkF1ZGlvSW5wdXREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiSU9Qcm9maWxlLmgiCisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0F1ZGlvSW5wdXREZXNjcmlwdG9yOjpBdWRpb0lucHV0RGVzY3JpcHRvcihjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlKQorICAgIDogbUlvSGFuZGxlKDApLAorICAgICAgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksIG1Qb2xpY3lNaXgoTlVMTCksIG1QYXRjaEhhbmRsZSgwKSwgbVJlZkNvdW50KDApLAorICAgICAgbUlucHV0U291cmNlKEFVRElPX1NPVVJDRV9ERUZBVUxUKSwgbVByb2ZpbGUocHJvZmlsZSksIG1Jc1NvdW5kVHJpZ2dlcihmYWxzZSksIG1JZCgwKQoreworICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IHByb2ZpbGUtPnBpY2tTYW1wbGluZ1JhdGUoKTsKKyAgICAgICAgbUZvcm1hdCA9IHByb2ZpbGUtPnBpY2tGb3JtYXQoKTsKKyAgICAgICAgbUNoYW5uZWxNYXNrID0gcHJvZmlsZS0+cGlja0NoYW5uZWxNYXNrKCk7CisgICAgICAgIGlmIChwcm9maWxlLT5tR2FpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bUdhaW5zWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZtR2Fpbik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnNldElvSGFuZGxlKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKQoreworICAgIG1JZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisgICAgbUlvSGFuZGxlID0gaW9IYW5kbGU7Cit9CisKK2F1ZGlvX21vZHVsZV9oYW5kbGVfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0TW9kdWxlSGFuZGxlKCkgY29uc3QKK3sKKyAgICBpZiAobVByb2ZpbGUgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG1Qcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKTsKK30KKworYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0SWQoKSBjb25zdAoreworICAgIHJldHVybiBtSWQ7Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Cit7CisgICAgQUxPR19BU1NFUlQobVByb2ZpbGUgIT0gMCwKKyAgICAgICAgICAgICAgICAidG9BdWRpb1BvcnRDb25maWcoKSBjYWxsZWQgb24gaW5wdXQgd2l0aCBudWxsIHByb2ZpbGUgJWQiLCBtSW9IYW5kbGUpOworICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURXxBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0t8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUfEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgaWYgKHNyY0NvbmZpZyAhPSBOVUxMKSB7CisgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gc3JjQ29uZmlnLT5jb25maWdfbWFzazsKKyAgICB9CisKKyAgICBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKKworICAgIGRzdENvbmZpZy0+aWQgPSBtSWQ7CisgICAgZHN0Q29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTks7CisgICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKKyAgICBkc3RDb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CisgICAgZHN0Q29uZmlnLT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKKyAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBtSW5wdXRTb3VyY2U7Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAoreworICAgIEFMT0dfQVNTRVJUKG1Qcm9maWxlICE9IDAsICJ0b0F1ZGlvUG9ydCgpIGNhbGxlZCBvbiBpbnB1dCB3aXRoIG51bGwgcHJvZmlsZSAlZCIsIG1Jb0hhbmRsZSk7CisKKyAgICBtUHJvZmlsZS0+dG9BdWRpb1BvcnQocG9ydCk7CisgICAgcG9ydC0+aWQgPSBtSWQ7CisgICAgdG9BdWRpb1BvcnRDb25maWcoJnBvcnQtPmFjdGl2ZV9jb25maWcpOworICAgIHBvcnQtPmV4dC5taXguaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CisgICAgcG9ydC0+ZXh0Lm1peC5oYW5kbGUgPSBtSW9IYW5kbGU7CisgICAgcG9ydC0+ZXh0Lm1peC5sYXRlbmN5X2NsYXNzID0gQVVESU9fTEFURU5DWV9OT1JNQUw7Cit9CisKK3N0YXR1c190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJRDogJWRcbiIsIGdldElkKCkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgbURldmljZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBSZWYgQ291bnQgJWRcbiIsIG1SZWZDb3VudCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBPcGVuIFJlZiBDb3VudCAlZFxuIiwgbU9wZW5SZWZDb3VudCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2Jvb2wgQXVkaW9JbnB1dENvbGxlY3Rpb246OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXREZXNjcmlwdG9yID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGlucHV0RGVzY3JpcHRvci0+bVJlZkNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dERlc2NyaXB0b3ItPm1JbnB1dFNvdXJjZSA9PSAoaW50KXNvdXJjZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldElucHV0RnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0Cit7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IE5VTEw7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpbnB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoaW5wdXREZXNjLT5nZXRJZCgpID09IGlkKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5wdXREZXNjOworfQorCit1aW50MzJfdCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6YWN0aXZlSW5wdXRzQ291bnQoKSBjb25zdAoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgZGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChkZXNjLT5tUmVmQ291bnQgPiAwKSB7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldEFjdGl2ZUlucHV0KGJvb2wgaWdub3JlVmlydHVhbElucHV0cykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXRfZGVzY3JpcHRvciA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmICgoaW5wdXRfZGVzY3JpcHRvci0+bVJlZkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAmJiAoIWlnbm9yZVZpcnR1YWxJbnB1dHMgfHwgIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGlucHV0X2Rlc2NyaXB0b3ItPm1EZXZpY2UpKSkgeworICAgICAgICAgICAgcmV0dXJuIGtleUF0KGkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdAoreworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSB2YWx1ZUZvcihoYW5kbGUpOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gaW5wdXREZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKTsKKyAgICByZXR1cm4gZGV2aWNlczsKK30KKworc3RhdHVzX3QgQXVkaW9JbnB1dENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5JbnB1dHMgZHVtcDpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gSW5wdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNzgzNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCkBAIC0wLDAgKzEsNDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvT3V0cHV0RGVzY3JpcHRvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPEF1ZGlvUG9saWN5SW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiSU9Qcm9maWxlLmgiCisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSAiVm9sdW1lLmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorCisvLyBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gb3V0cHV0IGRldmljZXMgdGhhdCBhcmUgY29uc2lkZXJlZCAicmVtb3RlIiB3aGVuIGV2YWx1YXRpbmcKKy8vIGFjdGl2ZSBvdXRwdXQgZGV2aWNlcyBpbiBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KCkKKyNkZWZpbmUgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCAgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCisgICAgOiBtUG9ydChwb3J0KSwgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksCisgICAgICBtUGF0Y2hIYW5kbGUoMCksIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKSwgbUlkKDApCit7CisgICAgLy8gY2xlYXIgdXNhZ2UgY291bnQgZm9yIGFsbCBzdHJlYW0gdHlwZXMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICBtUmVmQ291bnRbaV0gPSAwOworICAgICAgICBtQ3VyVm9sdW1lW2ldID0gLTEuMDsKKyAgICAgICAgbU11dGVDb3VudFtpXSA9IDA7CisgICAgICAgIG1TdG9wVGltZVtpXSA9IDA7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgeworICAgICAgICBtU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldID0gZmFsc2U7CisgICAgfQorICAgIGlmIChwb3J0ICE9IE5VTEwpIHsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IHBvcnQtPnBpY2tTYW1wbGluZ1JhdGUoKTsKKyAgICAgICAgbUZvcm1hdCA9IHBvcnQtPnBpY2tGb3JtYXQoKTsKKyAgICAgICAgbUNoYW5uZWxNYXNrID0gcG9ydC0+cGlja0NoYW5uZWxNYXNrKCk7CisgICAgICAgIGlmIChwb3J0LT5tR2FpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgcG9ydC0+bUdhaW5zWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZtR2Fpbik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2F1ZGlvX21vZHVsZV9oYW5kbGVfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmdldE1vZHVsZUhhbmRsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qb3J0LT5nZXRNb2R1bGVIYW5kbGUoKTsKK30KKworYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmdldElkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUlkOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2UoKSBjb25zdAoreworICAgIHJldHVybiBtRGV2aWNlOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdXBwb3J0ZWREZXZpY2VzKCkKK3sKKyAgICByZXR1cm4gbURldmljZTsKK30KKworYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNoYXJlc0h3TW9kdWxlV2l0aCgKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjKQoreworICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gc2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MtPnN1Yk91dHB1dDEoKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgc2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MtPnN1Yk91dHB1dDIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChnZXRNb2R1bGVIYW5kbGUoKSA9PSBvdXRwdXREZXNjLT5nZXRNb2R1bGVIYW5kbGUoKSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhKQoreworICAgIGlmICgoZGVsdGEgKyAoaW50KW1SZWZDb3VudFtzdHJlYW1dKSA8IDApIHsKKyAgICAgICAgQUxPR1coImNoYW5nZVJlZkNvdW50KCkgaW52YWxpZCBkZWx0YSAlZCBmb3Igc3RyZWFtICVkLCByZWZDb3VudCAlZCIsCisgICAgICAgICAgICAgIGRlbHRhLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKKyAgICAgICAgbVJlZkNvdW50W3N0cmVhbV0gPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1SZWZDb3VudFtzdHJlYW1dICs9IGRlbHRhOworICAgIEFMT0dWKCJjaGFuZ2VSZWZDb3VudCgpIHN0cmVhbSAlZCwgY291bnQgJWQiLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKK30KKworYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIG5zZWNzX3Qgc3lzVGltZSA9IDA7CisgICAgaWYgKGluUGFzdE1zICE9IDApIHsKKyAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICBpZiAoaSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSkgY29uc3QKK3sKKyAgICBpZiAobVJlZkNvdW50W3N0cmVhbV0gIT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGluUGFzdE1zID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoc3lzVGltZSA9PSAwKSB7CisgICAgICAgIHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgfQorICAgIGlmIChuczJtcyhzeXNUaW1lIC0gbVN0b3BUaW1lW3N0cmVhbV0pIDwgaW5QYXN0TXMpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworCitib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlIF9fdW51c2VkKQoreworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQoreworICAgIC8vIFdlIGFjdHVhbGx5IGNoYW5nZSB0aGUgdm9sdW1lIGlmOgorICAgIC8vIC0gdGhlIGZsb2F0IHZhbHVlIHJldHVybmVkIGJ5IGNvbXB1dGVWb2x1bWUoKSBjaGFuZ2VkCisgICAgLy8gLSB0aGUgZm9yY2UgZmxhZyBpcyBzZXQKKyAgICBpZiAodm9sdW1lICE9IG1DdXJWb2x1bWVbc3RyZWFtXSB8fCBmb3JjZSkgeworICAgICAgICBBTE9HVigic2V0Vm9sdW1lKCkgZm9yIHN0cmVhbSAlZCwgdm9sdW1lICVmLCBkZWxheSAlZCIsIHN0cmVhbSwgdm9sdW1lLCBkZWxheU1zKTsKKyAgICAgICAgbUN1clZvbHVtZVtzdHJlYW1dID0gdm9sdW1lOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Cit7CisgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFfEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTS3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX0NPTkZJR19GT1JNQVR8QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICBpZiAoc3JjQ29uZmlnICE9IE5VTEwpIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayB8PSBzcmNDb25maWctPmNvbmZpZ19tYXNrOworICAgIH0KKyAgICBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKKworICAgIGRzdENvbmZpZy0+aWQgPSBtSWQ7CisgICAgZHN0Q29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKKyAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKKyAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVDsKK30KKwordm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAoreworICAgIG1Qb3J0LT50b0F1ZGlvUG9ydChwb3J0KTsKKyAgICBwb3J0LT5pZCA9IG1JZDsKKyAgICBwb3J0LT5leHQubWl4Lmh3X21vZHVsZSA9IGdldE1vZHVsZUhhbmRsZSgpOworfQorCitzdGF0dXNfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIElEOiAlZFxuIiwgbUlkKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcm1hdDogJTA4eFxuIiwgbUZvcm1hdCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgZGV2aWNlKCkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU3RyZWFtIHZvbHVtZSByZWZDb3VudCBtdXRlQ291bnRcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlMDJkICAgICAlLjAzZiAgICAgJTAyZCAgICAgICAlMDJkXG4iLAorICAgICAgICAgICAgICAgICBpLCBtQ3VyVm9sdW1lW2ldLCBtUmVmQ291bnRbaV0sIG1NdXRlQ291bnRbaV0pOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6bG9nKGNvbnN0IGNoYXIqIGluZGVudCkKK3sKKyAgICBBTE9HSSgiJXNJRDogJWQsMHglWCwgW3J0OiVkIGZtdDoweCVYIGNoOjB4JVhdIiwKKyAgICAgICAgICBpbmRlbnQsIG1JZCwgbUlkLCBtU2FtcGxpbmdSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2spOworfQorCisvLyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbgorU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OlN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKAorICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlLCBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQorICAgIDogQXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIGNsaWVudEludGVyZmFjZSksCisgICAgbVByb2ZpbGUocHJvZmlsZSksIG1Jb0hhbmRsZSgwKSwgbUxhdGVuY3koMCksCisgICAgbUZsYWdzKChhdWRpb19vdXRwdXRfZmxhZ3NfdCkwKSwgbVBvbGljeU1peChOVUxMKSwKKyAgICBtT3V0cHV0MSgwKSwgbU91dHB1dDIoMCksIG1EaXJlY3RPcGVuQ291bnQoMCksIG1HbG9iYWxSZWZDb3VudCgwKQoreworICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKKyAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KXByb2ZpbGUtPm1GbGFnczsKKyAgICB9Cit9CisKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldElvSGFuZGxlKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKQoreworICAgIG1JZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisgICAgbUlvSGFuZGxlID0gaW9IYW5kbGU7Cit9CisKKworc3RhdHVzX3QgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIExhdGVuY3k6ICVkXG4iLCBtTGF0ZW5jeSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGbGFncyAlMDh4XG4iLCBtRmxhZ3MpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChmZCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlKCkgY29uc3QKK3sKKyAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpKG1PdXRwdXQxLT5tRGV2aWNlIHwgbU91dHB1dDItPm1EZXZpY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlOworICAgIH0KK30KKworYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2hhcmVzSHdNb2R1bGVXaXRoKAorICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpCit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiBtT3V0cHV0MS0+c2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MpIHx8IG1PdXRwdXQyLT5zaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYyk7CisgICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSl7CisgICAgICAgIHJldHVybiBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+c3ViT3V0cHV0MSgpKSB8fAorICAgICAgICAgICAgICAgICAgICBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+c3ViT3V0cHV0MigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYyk7CisgICAgfQorfQorCithdWRpb19kZXZpY2VzX3QgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRlZERldmljZXMoKQoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkobU91dHB1dDEtPnN1cHBvcnRlZERldmljZXMoKSB8IG1PdXRwdXQyLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSA7CisgICAgfQorfQorCit1aW50MzJfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6bGF0ZW5jeSgpCit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiAobU91dHB1dDEtPm1MYXRlbmN5ID4gbU91dHB1dDItPm1MYXRlbmN5KSA/IG1PdXRwdXQxLT5tTGF0ZW5jeSA6IG1PdXRwdXQyLT5tTGF0ZW5jeTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbUxhdGVuY3k7CisgICAgfQorfQorCit2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEpCit7CisgICAgLy8gZm9yd2FyZCB1c2FnZSBjb3VudCBjaGFuZ2UgdG8gYXR0YWNoZWQgb3V0cHV0cworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICBtT3V0cHV0MS0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7CisgICAgICAgIG1PdXRwdXQyLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKKyAgICB9CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKKworICAgIC8vIGhhbmRsZSBzdHJlYW0taW5kZXBlbmRlbnQgcmVmIGNvdW50CisgICAgdWludDMyX3Qgb2xkR2xvYmFsUmVmQ291bnQgPSBtR2xvYmFsUmVmQ291bnQ7CisgICAgaWYgKChkZWx0YSArIChpbnQpbUdsb2JhbFJlZkNvdW50KSA8IDApIHsKKyAgICAgICAgQUxPR1coImNoYW5nZVJlZkNvdW50KCkgaW52YWxpZCBkZWx0YSAlZCBnbG9iYWxSZWZDb3VudCAlZCIsIGRlbHRhLCBtR2xvYmFsUmVmQ291bnQpOworICAgICAgICBtR2xvYmFsUmVmQ291bnQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIG1HbG9iYWxSZWZDb3VudCArPSBkZWx0YTsKKyAgICB9CisgICAgaWYgKChvbGRHbG9iYWxSZWZDb3VudCA9PSAwKSAmJiAobUdsb2JhbFJlZkNvdW50ID4gMCkpIHsKKyAgICAgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUobVBvbGljeU1peC0+bVJlZ2lzdHJhdGlvbklkLAorICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfTUlYSU5HKTsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIGlmICgob2xkR2xvYmFsUmVmQ291bnQgPiAwKSAmJiAobUdsb2JhbFJlZkNvdW50ID09IDApKSB7CisgICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1SZWdpc3RyYXRpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX0lETEUpOworICAgICAgICB9CisgICAgfQorfQorCisKK2Jvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzRml4ZWRWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICAvLyB1bml0IGdhaW4gaWYgcmVyb3V0aW5nIHRvIGV4dGVybmFsIHBvbGljeQorICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSB7CisgICAgICAgIGlmIChtUG9saWN5TWl4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dWKCJtYXggZ2FpbiB3aGVuIHJlcm91dGluZyBmb3Igb3V0cHV0PSVkIiwgbUlvSGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Cit7CisKKyAgICBBTE9HX0FTU0VSVCghaXNEdXBsaWNhdGVkKCksICJ0b0F1ZGlvUG9ydENvbmZpZygpIGNhbGxlZCBvbiBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIG1Jb0hhbmRsZSk7CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CisKKyAgICBkc3RDb25maWctPmV4dC5taXguaGFuZGxlID0gbUlvSGFuZGxlOworfQorCit2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKK3sKKyAgICBBTE9HX0FTU0VSVCghaXNEdXBsaWNhdGVkKCksICJ0b0F1ZGlvUG9ydCgpIGNhbGxlZCBvbiBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIG1Jb0hhbmRsZSk7CisKKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHBvcnQpOworCisgICAgdG9BdWRpb1BvcnRDb25maWcoJnBvcnQtPmFjdGl2ZV9jb25maWcpOworICAgIHBvcnQtPmV4dC5taXguaGFuZGxlID0gbUlvSGFuZGxlOworICAgIHBvcnQtPmV4dC5taXgubGF0ZW5jeV9jbGFzcyA9CisgICAgICAgICAgICBtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUID8gQVVESU9fTEFURU5DWV9MT1cgOiBBVURJT19MQVRFTkNZX05PUk1BTDsKK30KKworYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKK3sKKyAgICBib29sIGNoYW5nZWQgPSBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZSh2b2x1bWUsIHN0cmVhbSwgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7CisKKyAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICAvLyBGb3JjZSBWT0lDRV9DQUxMIHRvIHRyYWNrIEJMVUVUT09USF9TQ08gc3RyZWFtIHZvbHVtZSB3aGVuIGJsdWV0b290aCBhdWRpbyBpcworICAgICAgICAvLyBlbmFibGVkCisgICAgICAgIGZsb2F0IHZvbHVtZSA9IFZvbHVtZTo6RGJUb0FtcGwobUN1clZvbHVtZVtzdHJlYW1dKTsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKAorICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9sdW1lLCBtSW9IYW5kbGUsIGRlbGF5TXMpOworICAgICAgICB9CisgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZSwgbUlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICB9CisgICAgcmV0dXJuIGNoYW5nZWQ7Cit9CisKKy8vIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uCisKK2Jvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aGlzLT5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHRoaXMtPnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zLCBzeXNUaW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoKChvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFQTV9BVURJT19PVVRfREVWSUNFX1JFTU9URV9BTEwpICE9IDApICYmCisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdCBjb25zaWRlciByZSByb3V0aW5nICh3aGVuIHRoZSBvdXRwdXQgaXMgZ29pbmcgdG8gYSBkeW5hbWljIHBvbGljeSkKKyAgICAgICAgICAgIC8vIGFzICJyZW1vdGUgcGxheWJhY2siCisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCithdWRpb19pb19oYW5kbGVfdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6Z2V0QTJkcE91dHB1dCgpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgb3V0cHV0RGVzYy0+ZGV2aWNlKCkgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy0+a2V5QXQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3NwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6Z2V0UHJpbWFyeU91dHB1dCgpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSB7CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0RGVzYzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRPdXRwdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3QKK3sKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IE5VTEw7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmdldElkKCkgPT0gaWQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvdXRwdXREZXNjOworfQorCitib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IHMgPSAwIDsgcyA8IEFVRElPX1NUUkVBTV9DTlQgOyBzKyspIHsKKyAgICAgICAgaWYgKHMgPT0gKHNpemVfdCkgc3RyZWFtVG9JZ25vcmUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc10gIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYXVkaW9fZGV2aWNlc190IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3QKK3sKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlRm9yKGhhbmRsZSk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBvdXRwdXREZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKTsKKyAgICByZXR1cm4gZGV2aWNlczsKK30KKworCitzdGF0dXNfdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbk91dHB1dHMgZHVtcDpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNmQ4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BhdGNoIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiQXVkaW9QYXRjaC5oIgorI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgIkNvbmZpZ1BhcnNpbmdVdGlscy5oIgorI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworaW50MzJfdCB2b2xhdGlsZSBBdWRpb1BhdGNoOjptTmV4dFVuaXF1ZUlkID0gMTsKKworQXVkaW9QYXRjaDo6QXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLCB1aWRfdCB1aWQpIDoKKyAgICBtSGFuZGxlKHN0YXRpY19jYXN0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PihhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpKSksCisgICAgbVBhdGNoKCpwYXRjaCksCisgICAgbVVpZCh1aWQpLAorICAgIG1BZlBhdGNoSGFuZGxlKDApCit7Cit9CisKK3N0YXR1c190IEF1ZGlvUGF0Y2g6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBwYXRjaCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGhhbmRsZTogJTJkXG4iLCBzcGFjZXMsICIiLCBtSGFuZGxlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBhdWRpbyBmbGluZ2VyIGhhbmRsZTogJTJkXG4iLCBzcGFjZXMsICIiLCBtQWZQYXRjaEhhbmRsZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1VaWQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtICVkIHNvdXJjZXM6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NvdXJjZXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYXRjaC5udW1fc291cmNlczsgaSsrKSB7CisgICAgICAgIGlmIChtUGF0Y2guc291cmNlc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gRGV2aWNlIElEICVkICVzXG4iLCBzcGFjZXMgKyAyLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zb3VyY2VzW2ldLmlkLCBDb25maWdQYXJzaW5nVXRpbHM6OmVudW1Ub1N0cmluZyhzRGV2aWNlVHlwZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VUeXBlVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5leHQuZGV2aWNlLnR5cGUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gTWl4IElEICVkIEkvTyBoYW5kbGUgJWRcbiIsIHNwYWNlcyArIDIsICIiLAorICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uaWQsIG1QYXRjaC5zb3VyY2VzW2ldLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJWQgc2lua3M6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NpbmtzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgaWYgKG1QYXRjaC5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gRGV2aWNlIElEICVkICVzXG4iLCBzcGFjZXMgKyAyLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5pZCwgQ29uZmlnUGFyc2luZ1V0aWxzOjplbnVtVG9TdHJpbmcoc0RldmljZVR5cGVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRGV2aWNlVHlwZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBNaXggSUQgJWQgSS9PIGhhbmRsZSAlZFxuIiwgc3BhY2VzICsgMiwgIiIsCisgICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uaWQsIG1QYXRjaC5zaW5rc1tpXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9QYXRjaENvbGxlY3Rpb246OmFkZEF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoKQoreworICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGhhbmRsZSk7CisKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBBTE9HVygiYWRkQXVkaW9QYXRjaCgpIHBhdGNoICVkIGFscmVhZHkgaW4iLCBoYW5kbGUpOworICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgfQorICAgIGFkZChoYW5kbGUsIHBhdGNoKTsKKyAgICBBTE9HVigiYWRkQXVkaW9QYXRjaCgpIGhhbmRsZSAlZCBhZiBoYW5kbGUgJWQgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIHNvdXJjZSBoYW5kbGUgJWQiCisgICAgICAgICAgICAic2luayBoYW5kbGUgJWQiLAorICAgICAgICAgIGhhbmRsZSwgcGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCBwYXRjaC0+bVBhdGNoLm51bV9zb3VyY2VzLCBwYXRjaC0+bVBhdGNoLm51bV9zaW5rcywKKyAgICAgICAgICBwYXRjaC0+bVBhdGNoLnNvdXJjZXNbMF0uaWQsIHBhdGNoLT5tUGF0Y2guc2lua3NbMF0uaWQpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9QYXRjaENvbGxlY3Rpb246OnJlbW92ZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGhhbmRsZSk7CisKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJyZW1vdmVBdWRpb1BhdGNoKCkgcGF0Y2ggJWQgbm90IGluIiwgaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIH0KKyAgICBBTE9HVigicmVtb3ZlQXVkaW9QYXRjaCgpIGhhbmRsZSAlZCBhZiBoYW5kbGUgJWQiLCBoYW5kbGUsIHZhbHVlQXQoaW5kZXgpLT5tQWZQYXRjaEhhbmRsZSk7CisgICAgcmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BhdGNoQ29sbGVjdGlvbjo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKSBjb25zdAoreworICAgIGlmIChudW1fcGF0Y2hlcyA9PSBOVUxMIHx8ICgqbnVtX3BhdGNoZXMgIT0gMCAmJiBwYXRjaGVzID09IE5VTEwpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJsaXN0QXVkaW9QYXRjaGVzKCkgbnVtX3BhdGNoZXMgJWQgcGF0Y2hlcyAlcCBhdmFpbGFibGUgcGF0Y2hlcyAlenUiLAorICAgICAgICAgICpudW1fcGF0Y2hlcywgcGF0Y2hlcywgc2l6ZSgpKTsKKyAgICBpZiAocGF0Y2hlcyA9PSBOVUxMKSB7CisgICAgICAgICpudW1fcGF0Y2hlcyA9IDA7CisgICAgfQorCisgICAgc2l6ZV90IHBhdGNoZXNXcml0dGVuID0gMDsKKyAgICBzaXplX3QgcGF0Y2hlc01heCA9ICpudW1fcGF0Y2hlczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAgPCBzaXplKCkgJiYgcGF0Y2hlc1dyaXR0ZW4gPCBwYXRjaGVzTWF4OyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4gIHBhdGNoID0gdmFsdWVBdChpKTsKKyAgICAgICAgcGF0Y2hlc1twYXRjaGVzV3JpdHRlbl0gPSBwYXRjaC0+bVBhdGNoOworICAgICAgICBwYXRjaGVzW3BhdGNoZXNXcml0dGVuKytdLmlkID0gcGF0Y2gtPm1IYW5kbGU7CisgICAgICAgIEFMT0dWKCJsaXN0QXVkaW9QYXRjaGVzKCkgcGF0Y2ggJXp1IG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCIsCisgICAgICAgICAgICAgIGksIHBhdGNoLT5tUGF0Y2gubnVtX3NvdXJjZXMsIHBhdGNoLT5tUGF0Y2gubnVtX3NpbmtzKTsKKyAgICB9CisgICAgKm51bV9wYXRjaGVzID0gc2l6ZSgpOworCisgICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMoKSBnb3QgJXp1IHBhdGNoZXMgbmVlZGVkICVkIiwgcGF0Y2hlc1dyaXR0ZW4sICpudW1fcGF0Y2hlcyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BhdGNoQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5BdWRpbyBQYXRjaGVzOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCwgMiwgaSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjE5OThjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5TWl4IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNaXguaCIKKyNpbmNsdWRlICJId01vZHVsZS5oIgorI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgorI2luY2x1ZGUgIklPUHJvZmlsZS5oIgorI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgPEF1ZGlvT3V0cHV0RGVzY3JpcHRvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgQXVkaW9Qb2xpY3lNaXg6OnNldE91dHB1dChzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dCkKK3sKKyAgICBtT3V0cHV0ID0gb3V0cHV0OworfQorCitjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJkF1ZGlvUG9saWN5TWl4OjpnZXRPdXRwdXQoKSBjb25zdAoreworICAgIHJldHVybiBtT3V0cHV0OworfQorCit2b2lkIEF1ZGlvUG9saWN5TWl4OjpjbGVhck91dHB1dCgpCit7CisgICAgbU91dHB1dC5jbGVhcigpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWl4OjpzZXRNaXgoQXVkaW9NaXggJm1peCkKK3sKKyAgICBtTWl4ID0gbWl4OworfQorCithbmRyb2lkOjpBdWRpb01peCAqQXVkaW9Qb2xpY3lNaXg6OmdldE1peCgpCit7CisgICAgcmV0dXJuICZtTWl4OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnJlZ2lzdGVyTWl4KFN0cmluZzggYWRkcmVzcywgQXVkaW9NaXggbWl4KQoreworICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGFkZHJlc3MpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIEFMT0dFKCJyZWdpc3RlclBvbGljeU1peGVzKCk6IG1peCBmb3IgYWRkcmVzcyAlcyBhbHJlYWR5IHJlZ2lzdGVyZWQiLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IG5ldyBBdWRpb1BvbGljeU1peCgpOworICAgIHBvbGljeU1peC0+c2V0TWl4KG1peCk7CisgICAgYWRkKGFkZHJlc3MsIHBvbGljeU1peCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnVucmVnaXN0ZXJNaXgoU3RyaW5nOCBhZGRyZXNzKQoreworICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGFkZHJlc3MpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoInVucmVnaXN0ZXJQb2xpY3lNaXhlcygpOiBtaXggZm9yIGFkZHJlc3MgJXMgbm90IHJlZ2lzdGVyZWQiLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0QXVkaW9Qb2xpY3lNaXgoU3RyaW5nOCBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gJnBvbGljeU1peCkgY29uc3QKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShhZGRyZXNzKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCJ1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoKTogbWl4IGZvciBhZGRyZXNzICVzIG5vdCByZWdpc3RlcmVkIiwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHBvbGljeU1peCA9IHZhbHVlQXQoaW5kZXgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmNsb3NlT3V0cHV0KHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmZGVzYykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAocG9saWN5TWl4LT5nZXRPdXRwdXQoKSA9PSBkZXNjKSB7CisgICAgICAgICAgICBwb2xpY3lNaXgtPmNsZWFyT3V0cHV0KCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0T3V0cHV0Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJmRlc2MpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gdmFsdWVBdChpKTsKKyAgICAgICAgQXVkaW9NaXggKm1peCA9IHBvbGljeU1peC0+Z2V0TWl4KCk7CisKKyAgICAgICAgaWYgKG1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtaXgtPm1Dcml0ZXJpYS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGlmICgoUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0UgPT0gbWl4LT5tQ3JpdGVyaWFbal0ubVJ1bGUgJiYKKyAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1BdHRyLm1Vc2FnZSA9PSBhdHRyaWJ1dGVzLnVzYWdlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfVVNBR0UgPT0gbWl4LT5tQ3JpdGVyaWFbal0ubVJ1bGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tQXR0ci5tVXNhZ2UgIT0gYXR0cmlidXRlcy51c2FnZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzYyA9IHBvbGljeU1peC0+Z2V0T3V0cHV0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MgKyBzdHJsZW4oImFkZHI9IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bVJlZ2lzdHJhdGlvbklkLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSBzdHJsZW4oImFkZHI9IikgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBwb2xpY3lNaXgtPmdldE91dHB1dCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFICYmCisgICAgICAgICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MgKyBzdHJsZW4oImFkZHI9IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tUmVnaXN0cmF0aW9uSWQuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gc3RybGVuKCJhZGRyPSIpIC0gMSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGRlc2MgPSBwb2xpY3lNaXgtPmdldE91dHB1dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkZXNjICE9IDApIHsKKyAgICAgICAgICAgIGRlc2MtPm1Qb2xpY3lNaXggPSBtaXg7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXgpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBBdWRpb01peCAqbWl4ID0gdmFsdWVBdChpKS0+Z2V0TWl4KCk7CisKKyAgICAgICAgaWYgKG1peC0+bU1peFR5cGUgIT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1peC0+bUNyaXRlcmlhLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBpZiAoKFJVTEVfTUFUQ0hfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUID09IG1peC0+bUNyaXRlcmlhW2pdLm1SdWxlICYmCisgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1BdHRyLm1Tb3VyY2UgPT0gaW5wdXRTb3VyY2UpIHx8CisgICAgICAgICAgICAgICAoUlVMRV9FWENMVURFX0FUVFJJQlVURV9DQVBUVVJFX1BSRVNFVCA9PSBtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZSAmJgorICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tQXR0ci5tU291cmNlICE9IGlucHV0U291cmNlKSkgeworICAgICAgICAgICAgICAgIGlmIChhdmFpbERldmljZXMgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwb2xpY3lNaXggPSBtaXg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0SW5wdXRNaXhGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyLCBBdWRpb01peCAqKnBvbGljeU1peCkKK3sKKyAgICBpZiAoc3RybmNtcChhdHRyLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgIT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBTdHJpbmc4IGFkZHJlc3MoYXR0ci50YWdzICsgc3RybGVuKCJhZGRyPSIpKTsKKworICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGFkZHJlc3MpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coImdldElucHV0TWl4Rm9yQXR0cigpIG5vIHBvbGljeSBmb3IgYWRkcmVzcyAlcyIsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxBdWRpb1BvbGljeU1peD4gYXVkaW9Qb2xpY3lNaXggPSB2YWx1ZUF0KGluZGV4KTsKKyAgICBBdWRpb01peCAqbWl4ID0gYXVkaW9Qb2xpY3lNaXgtPmdldE1peCgpOworCisgICAgaWYgKG1peC0+bU1peFR5cGUgIT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICBBTE9HVygiZ2V0SW5wdXRNaXhGb3JBdHRyKCkgYmFkIHBvbGljeSBtaXggdHlwZSBmb3IgYWRkcmVzcyAlcyIsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAqcG9saWN5TWl4ID0gbWl4OworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyNGYxOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAKQEAgLTAsMCArMSw5MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb3J0IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlICJDb25maWdQYXJzaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJhdWRpb19wb2xpY3lfY29uZi5oIgorI2luY2x1ZGUgPHBvbGljeS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2ludDMyX3Qgdm9sYXRpbGUgQXVkaW9Qb3J0OjptTmV4dFVuaXF1ZUlkID0gMTsKKworLy8gLS0tIEF1ZGlvUG9ydCBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitBdWRpb1BvcnQ6OkF1ZGlvUG9ydChjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSkgOgorICAgIG1OYW1lKG5hbWUpLCBtVHlwZSh0eXBlKSwgbVJvbGUocm9sZSksIG1GbGFncygwKQoreworICAgIG1Vc2VJbkNoYW5uZWxNYXNrID0gKCh0eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpICYmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpKSB8fAorICAgICAgICAgICAgICAgICAgICAoKHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgJiYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspKTsKK30KKwordm9pZCBBdWRpb1BvcnQ6OmF0dGFjaChjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkKK3sKKyAgICBtTW9kdWxlID0gbW9kdWxlOworfQorCithdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCkKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9fcG9ydF9oYW5kbGVfdD4oYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dFVuaXF1ZUlkKSk7Cit9CisKK2F1ZGlvX21vZHVsZV9oYW5kbGVfdCBBdWRpb1BvcnQ6OmdldE1vZHVsZUhhbmRsZSgpIGNvbnN0Cit7CisgICAgaWYgKG1Nb2R1bGUgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG1Nb2R1bGUtPm1IYW5kbGU7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9ydDo6Z2V0TW9kdWxlVmVyc2lvbigpIGNvbnN0Cit7CisgICAgaWYgKG1Nb2R1bGUgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG1Nb2R1bGUtPm1IYWxWZXJzaW9uOworfQorCitjb25zdCBjaGFyICpBdWRpb1BvcnQ6OmdldE1vZHVsZU5hbWUoKSBjb25zdAoreworICAgIGlmIChtTW9kdWxlID09IDApIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICByZXR1cm4gbU1vZHVsZS0+bU5hbWU7Cit9CisKK3ZvaWQgQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKK3sKKyAgICBwb3J0LT5yb2xlID0gbVJvbGU7CisgICAgcG9ydC0+dHlwZSA9IG1UeXBlOworICAgIHN0cmxjcHkocG9ydC0+bmFtZSwgbU5hbWUsIEFVRElPX1BPUlRfTUFYX05BTUVfTEVOKTsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpICYmIGkgPCBBVURJT19QT1JUX01BWF9TQU1QTElOR19SQVRFUzsgaSsrKSB7CisgICAgICAgIGlmIChtU2FtcGxpbmdSYXRlc1tpXSAhPSAwKSB7CisgICAgICAgICAgICBwb3J0LT5zYW1wbGVfcmF0ZXNbaV0gPSBtU2FtcGxpbmdSYXRlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwb3J0LT5udW1fc2FtcGxlX3JhdGVzID0gaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCkgJiYgaSA8IEFVRElPX1BPUlRfTUFYX0NIQU5ORUxfTUFTS1M7IGkrKykgeworICAgICAgICBpZiAobUNoYW5uZWxNYXNrc1tpXSAhPSAwKSB7CisgICAgICAgICAgICBwb3J0LT5jaGFubmVsX21hc2tzW2ldID0gbUNoYW5uZWxNYXNrc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwb3J0LT5udW1fY2hhbm5lbF9tYXNrcyA9IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKSAmJiBpIDwgQVVESU9fUE9SVF9NQVhfRk9STUFUUzsgaSsrKSB7CisgICAgICAgIGlmIChtRm9ybWF0c1tpXSAhPSAwKSB7CisgICAgICAgICAgICBwb3J0LT5mb3JtYXRzW2ldID0gbUZvcm1hdHNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcG9ydC0+bnVtX2Zvcm1hdHMgPSBpOworCisgICAgQUxPR1YoIkF1ZGlvUG9ydDo6dG9BdWRpb1BvcnQoKSBudW0gZ2FpbnMgJXp1IiwgbUdhaW5zLnNpemUoKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbUdhaW5zLnNpemUoKSAmJiBpIDwgQVVESU9fUE9SVF9NQVhfR0FJTlM7IGkrKykgeworICAgICAgICBwb3J0LT5nYWluc1tpXSA9IG1HYWluc1tpXS0+bUdhaW47CisgICAgfQorICAgIHBvcnQtPm51bV9nYWlucyA9IGk7Cit9CisKK3ZvaWQgQXVkaW9Qb3J0OjppbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiBwb3J0KSB7CisgICAgZm9yIChzaXplX3QgayA9IDAgOyBrIDwgcG9ydC0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDsgaysrKSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHJhdGUgPSBwb3J0LT5tU2FtcGxpbmdSYXRlcy5pdGVtQXQoayk7CisgICAgICAgIGlmIChyYXRlICE9IDApIHsgLy8gc2tpcCAiZHluYW1pYyIgcmF0ZXMKKyAgICAgICAgICAgIGJvb2wgaGFzUmF0ZSA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDsgbCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHJhdGUgPT0gbVNhbXBsaW5nUmF0ZXMuaXRlbUF0KGwpKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc1JhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWhhc1JhdGUpIHsgLy8gbmV2ZXIgaW1wb3J0IGEgc2FtcGxpbmcgcmF0ZSB0d2ljZQorICAgICAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzLmFkZChyYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHNpemVfdCBrID0gMCA7IGsgPCBwb3J0LT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA7IGsrKykgeworICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrID0gcG9ydC0+bUNoYW5uZWxNYXNrcy5pdGVtQXQoayk7CisgICAgICAgIGlmIChtYXNrICE9IDApIHsgLy8gc2tpcCAiZHluYW1pYyIgbWFza3MKKyAgICAgICAgICAgIGJvb2wgaGFzTWFzayA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbUNoYW5uZWxNYXNrcy5zaXplKCkgOyBsKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobWFzayA9PSBtQ2hhbm5lbE1hc2tzLml0ZW1BdChsKSkgeworICAgICAgICAgICAgICAgICAgICBoYXNNYXNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFoYXNNYXNrKSB7IC8vIG5ldmVyIGltcG9ydCBhIGNoYW5uZWwgbWFzayB0d2ljZQorICAgICAgICAgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKG1hc2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoc2l6ZV90IGsgPSAwIDsgayA8IHBvcnQtPm1Gb3JtYXRzLnNpemUoKSA7IGsrKykgeworICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBwb3J0LT5tRm9ybWF0cy5pdGVtQXQoayk7CisgICAgICAgIGlmIChmb3JtYXQgIT0gMCkgeyAvLyBza2lwICJkeW5hbWljIiBmb3JtYXRzCisgICAgICAgICAgICBib29sIGhhc0Zvcm1hdCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbUZvcm1hdHMuc2l6ZSgpIDsgbCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBtRm9ybWF0cy5pdGVtQXQobCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzRm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFoYXNGb3JtYXQpIHsgLy8gbmV2ZXIgaW1wb3J0IGEgZm9ybWF0IHR3aWNlCisgICAgICAgICAgICAgICAgbUZvcm1hdHMuYWRkKGZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb3J0OjpjbGVhckNhcGFiaWxpdGllcygpIHsKKyAgICBtQ2hhbm5lbE1hc2tzLmNsZWFyKCk7CisgICAgbUZvcm1hdHMuY2xlYXIoKTsKKyAgICBtU2FtcGxpbmdSYXRlcy5jbGVhcigpOworfQorCit2b2lkIEF1ZGlvUG9ydDo6bG9hZFNhbXBsaW5nUmF0ZXMoY2hhciAqbmFtZSkKK3sKKyAgICBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKKworICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbVNhbXBsaW5nUmF0ZXMgaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgc2FtcGxpbmcKKyAgICAvLyByYXRlcyBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBvdXRwdXQgc3RyZWFtIGFmdGVyIGl0IGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyY21wKHN0ciwgRFlOQU1JQ19WQUxVRV9UQUcpID09IDApIHsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZXMuYWRkKDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIHVpbnQzMl90IHJhdGUgPSBhdG9pKHN0cik7CisgICAgICAgIGlmIChyYXRlICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkU2FtcGxpbmdSYXRlcygpIGFkZGluZyByYXRlICVkIiwgcmF0ZSk7CisgICAgICAgICAgICBtU2FtcGxpbmdSYXRlcy5hZGQocmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9ydDo6bG9hZEZvcm1hdHMoY2hhciAqbmFtZSkKK3sKKyAgICBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKKworICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbUZvcm1hdHMgaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgZm9ybWF0cworICAgIC8vIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQorICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgeworICAgICAgICBtRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdClDb25maWdQYXJzaW5nVXRpbHM6OnN0cmluZ1RvRW51bShzRm9ybWF0TmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0Zvcm1hdE5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgbUZvcm1hdHMuYWRkKGZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorICAgIC8vIHdlIHNvcnQgZnJvbSB3b3JzdCB0byBiZXN0LCBzbyB0aGF0IEFVRElPX0ZPUk1BVF9ERUZBVUxUIGlzIGFsd2F5cyB0aGUgZmlyc3QgZW50cnkuCisgICAgLy8gVE9ETzogY29tcGFyZUZvcm1hdHMgY291bGQgYmUgYSBsYW1iZGEgdG8gY29udmVydCBiZXR3ZWVuIHBvaW50ZXItdG8tZm9ybWF0IHRvIGZvcm1hdDoKKyAgICAvLyBbXShjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MSwgY29uc3QgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdDIpIHsKKyAgICAvLyAgICAgcmV0dXJuIGNvbXBhcmVGb3JtYXRzKCpmb3JtYXQxLCAqZm9ybWF0Mik7CisgICAgLy8gfQorICAgIG1Gb3JtYXRzLnNvcnQoY29tcGFyZUZvcm1hdHMpOworfQorCit2b2lkIEF1ZGlvUG9ydDo6bG9hZEluQ2hhbm5lbHMoY2hhciAqbmFtZSkKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKKworICAgIEFMT0dWKCJsb2FkSW5DaGFubmVscygpICVzIiwgbmFtZSk7CisKKyAgICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyY21wKHN0ciwgRFlOQU1JQ19WQUxVRV9UQUcpID09IDApIHsKKyAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClDb25maWdQYXJzaW5nVXRpbHM6OnN0cmluZ1RvRW51bShzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgICAgaWYgKGNoYW5uZWxNYXNrID09IDApIHsgLy8gaWYgbm90IGZvdW5kLCBjaGVjayB0aGUgY2hhbm5lbCBpbmRleCB0YWJsZQorICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpCisgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnUGFyc2luZ1V0aWxzOjpzdHJpbmdUb0VudW0oc0luZGV4Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNJbmRleENoYW5uZWxzTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoYW5uZWxNYXNrICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkSW5DaGFubmVscygpIGFkZGluZyBjaGFubmVsTWFzayAlI3giLCBjaGFubmVsTWFzayk7CisgICAgICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZChjaGFubmVsTWFzayk7CisgICAgICAgIH0KKyAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9ydDo6bG9hZE91dENoYW5uZWxzKGNoYXIgKm5hbWUpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gc3RydG9rKG5hbWUsICJ8Iik7CisKKyAgICBBTE9HVigibG9hZE91dENoYW5uZWxzKCkgJXMiLCBuYW1lKTsKKworICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbUNoYW5uZWxNYXNrcyBpbmRpY2F0ZXMgdGhlIHN1cHBvcnRlZCBjaGFubmVsCisgICAgLy8gbWFza3Mgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbSBhZnRlciBpdCBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCisgICAgaWYgKHN0ciAhPSBOVUxMICYmIHN0cmNtcChzdHIsIERZTkFNSUNfVkFMVUVfVEFHKSA9PSAwKSB7CisgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpQ29uZmlnUGFyc2luZ1V0aWxzOjpzdHJpbmdUb0VudW0oc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgICAgaWYgKGNoYW5uZWxNYXNrID09IDApIHsgLy8gaWYgbm90IGZvdW5kLCBjaGVjayB0aGUgY2hhbm5lbCBpbmRleCB0YWJsZQorICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpCisgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnUGFyc2luZ1V0aWxzOjpzdHJpbmdUb0VudW0oc0luZGV4Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNJbmRleENoYW5uZWxzTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoYW5uZWxNYXNrICE9IDApIHsKKyAgICAgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgfQorICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCithdWRpb19nYWluX21vZGVfdCBBdWRpb1BvcnQ6OmxvYWRHYWluTW9kZShjaGFyICpuYW1lKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOworCisgICAgQUxPR1YoImxvYWRHYWluTW9kZSgpICVzIiwgbmFtZSk7CisgICAgYXVkaW9fZ2Fpbl9tb2RlX3QgbW9kZSA9IDA7CisgICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIG1vZGUgfD0gKGF1ZGlvX2dhaW5fbW9kZV90KUNvbmZpZ1BhcnNpbmdVdGlsczo6c3RyaW5nVG9FbnVtKHNHYWluTW9kZU5hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0dhaW5Nb2RlTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7CisgICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KKyAgICByZXR1cm4gbW9kZTsKK30KKwordm9pZCBBdWRpb1BvcnQ6OmxvYWRHYWluKGNub2RlICpyb290LCBpbnQgaW5kZXgpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKworICAgIHNwPEF1ZGlvR2Fpbj4gZ2FpbiA9IG5ldyBBdWRpb0dhaW4oaW5kZXgsIG1Vc2VJbkNoYW5uZWxNYXNrKTsKKworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NT0RFKSA9PSAwKSB7CisgICAgICAgICAgICBnYWluLT5tR2Fpbi5tb2RlID0gbG9hZEdhaW5Nb2RlKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX0NIQU5ORUxTKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgICAgICBnYWluLT5tR2Fpbi5jaGFubmVsX21hc2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KUNvbmZpZ1BhcnNpbmdVdGlsczo6c3RyaW5nVG9FbnVtKHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdhaW4tPm1HYWluLmNoYW5uZWxfbWFzayA9CisgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpQ29uZmlnUGFyc2luZ1V0aWxzOjpzdHJpbmdUb0VudW0oc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01JTl9WQUxVRSkgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWluX3ZhbHVlID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NQVhfVkFMVUUpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLm1heF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fREVGQVVMVF9WQUxVRSkgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uZGVmYXVsdF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fU1RFUF9WQUxVRSkgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uc3RlcF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUlOX1JBTVBfTVMpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLm1pbl9yYW1wX21zID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NQVhfUkFNUF9NUykgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWF4X3JhbXBfbXMgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKworICAgIEFMT0dWKCJsb2FkR2FpbigpIGFkZGluZyBuZXcgZ2FpbiBtb2RlICUwOHggY2hhbm5lbCBtYXNrICUwOHggbWluIG1CICVkIG1heCBtQiAlZCIsCisgICAgICAgICAgZ2Fpbi0+bUdhaW4ubW9kZSwgZ2Fpbi0+bUdhaW4uY2hhbm5lbF9tYXNrLCBnYWluLT5tR2Fpbi5taW5fdmFsdWUsIGdhaW4tPm1HYWluLm1heF92YWx1ZSk7CisKKyAgICBpZiAoZ2Fpbi0+bUdhaW4ubW9kZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUdhaW5zLmFkZChnYWluKTsKK30KKwordm9pZCBBdWRpb1BvcnQ6OmxvYWRHYWlucyhjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgQUxPR1YoImxvYWRHYWlucygpIGxvYWRpbmcgZ2FpbiAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICBsb2FkR2Fpbihub2RlLCBpbmRleCsrKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvcnQ6OmNoZWNrRXhhY3RTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlKSBjb25zdAoreworICAgIGlmIChtU2FtcGxpbmdSYXRlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGlmIChtU2FtcGxpbmdSYXRlc1tpXSA9PSBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBBdWRpb1BvcnQ6OmNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlKSBjb25zdAoreworICAgIGlmIChtU2FtcGxpbmdSYXRlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgeworICAgICAgICAgICAgKnVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIC8vIFNlYXJjaCBmb3IgdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGUgdGhhdCBpcyBhYm92ZSAocHJlZmVycmVkKQorICAgIC8vIG9yIGJlbG93IChhY2NlcHRhYmxlKSB0aGUgZGVzaXJlZCBzYW1wbGluZyByYXRlLCB3aXRoaW4gYSBwZXJtaXR0ZWQgcmF0aW8uCisgICAgLy8gVGhlIHNhbXBsaW5nIHJhdGVzIGRvIG5vdCBuZWVkIHRvIGJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuCisgICAgc3NpemVfdCBtYXhCZWxvdyA9IC0xOworICAgIHNzaXplX3QgbWluQWJvdmUgPSAtMTsKKyAgICB1aW50MzJfdCBjYW5kaWRhdGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgeworICAgICAgICBjYW5kaWRhdGUgPSBtU2FtcGxpbmdSYXRlc1tpXTsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZSA9PSBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgIGlmICh1cGRhdGVkU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IGNhbmRpZGF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvLyBjYW5kaWRhdGUgPCBkZXNpcmVkCisgICAgICAgIGlmIChjYW5kaWRhdGUgPCBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgIGlmIChtYXhCZWxvdyA8IDAgfHwgY2FuZGlkYXRlID4gbVNhbXBsaW5nUmF0ZXNbbWF4QmVsb3ddKSB7CisgICAgICAgICAgICAgICAgbWF4QmVsb3cgPSBpOworICAgICAgICAgICAgfQorICAgICAgICAvLyBjYW5kaWRhdGUgPiBkZXNpcmVkCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobWluQWJvdmUgPCAwIHx8IGNhbmRpZGF0ZSA8IG1TYW1wbGluZ1JhdGVzW21pbkFib3ZlXSkgeworICAgICAgICAgICAgICAgIG1pbkFib3ZlID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFByZWZlciB0byBkb3duLXNhbXBsZSBmcm9tIGEgaGlnaGVyIHNhbXBsaW5nIHJhdGUsIGFzIHdlIGdldCB0aGUgZGVzaXJlZCBmcmVxdWVuY3kgc3BlY3RydW0uCisgICAgaWYgKG1pbkFib3ZlID49IDApIHsKKyAgICAgICAgY2FuZGlkYXRlID0gbVNhbXBsaW5nUmF0ZXNbbWluQWJvdmVdOworICAgICAgICBpZiAoY2FuZGlkYXRlIC8gQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYIDw9IHNhbXBsaW5nUmF0ZSkgeworICAgICAgICAgICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICp1cGRhdGVkU2FtcGxpbmdSYXRlID0gY2FuZGlkYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIC8vIEJ1dCBpZiB3ZSBoYXZlIHRvIHVwLXNhbXBsZSBmcm9tIGEgbG93ZXIgc2FtcGxpbmcgcmF0ZSwgdGhhdCdzIE9LLgorICAgIGlmIChtYXhCZWxvdyA+PSAwKSB7CisgICAgICAgIGNhbmRpZGF0ZSA9IG1TYW1wbGluZ1JhdGVzW21heEJlbG93XTsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZSAqIEFVRElPX1JFU0FNUExFUl9VUF9SQVRJT19NQVggPj0gc2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICBpZiAodXBkYXRlZFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKnVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBjYW5kaWRhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gbGVhdmUgdXBkYXRlZFNhbXBsaW5nUmF0ZSB1bm1vZGlmaWVkCisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb3J0OjpjaGVja0V4YWN0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIGNvbnN0Cit7CisgICAgaWYgKG1DaGFubmVsTWFza3MuaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1DaGFubmVsTWFza3NbaV0gPT0gY2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBBdWRpb1BvcnQ6OmNoZWNrQ29tcGF0aWJsZUNoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqdXBkYXRlZENoYW5uZWxNYXNrKSBjb25zdAoreworICAgIGlmIChtQ2hhbm5lbE1hc2tzLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAodXBkYXRlZENoYW5uZWxNYXNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICp1cGRhdGVkQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgY29uc3QgYm9vbCBpc1JlY29yZFRocmVhZCA9IG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVggJiYgbVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTks7CisgICAgY29uc3QgYm9vbCBpc0luZGV4ID0gYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihjaGFubmVsTWFzaykKKyAgICAgICAgICAgID09IEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVg7CisgICAgaW50IGJlc3RNYXRjaCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSArKykgeworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBzdXBwb3J0ZWQgPSBtQ2hhbm5lbE1hc2tzW2ldOworICAgICAgICBpZiAoc3VwcG9ydGVkID09IGNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICAvLyBFeGFjdCBtYXRjaGVzIGFsd2F5cyB0YWtlbi4KKyAgICAgICAgICAgIGlmICh1cGRhdGVkQ2hhbm5lbE1hc2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICp1cGRhdGVkQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFVRElPX0NIQU5ORUxfTk9ORSAodmFsdWU6IDApIGlzIHVzZWQgZm9yIGR5bmFtaWMgY2hhbm5lbCBzdXBwb3J0CisgICAgICAgIGlmIChpc1JlY29yZFRocmVhZCAmJiBzdXBwb3J0ZWQgIT0gQVVESU9fQ0hBTk5FTF9OT05FKSB7CisgICAgICAgICAgICAvLyBBcHByb3hpbWF0ZSAoYmVzdCkgbWF0Y2g6CisgICAgICAgICAgICAvLyBUaGUgbWF0Y2ggc2NvcmUgbWVhc3VyZXMgaG93IHdlbGwgdGhlIHN1cHBvcnRlZCBjaGFubmVsIG1hc2sgbWF0Y2hlcyB0aGUKKyAgICAgICAgICAgIC8vIGRlc2lyZWQgbWFzaywgd2hlcmUgaW5jcmVhc2luZy1pcy1iZXR0ZXIuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVE9ETzogU29tZSB0d2Vha3MgbWF5IGJlIG5lZWRlZC4KKyAgICAgICAgICAgIC8vIFNob3VsZCBiZSBhIHN0YXRpYyBmdW5jdGlvbiBvZiB0aGUgZGF0YSBwcm9jZXNzaW5nIGxpYnJhcnkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSW4gcHJpb3JpdHk6CisgICAgICAgICAgICAvLyBtYXRjaCBzY29yZSA9IDEwMDAgaWYgbGVnYWN5IGNoYW5uZWwgY29udmVyc2lvbiBlcXVpdmFsZW50IChhbHdheXMgcHJlZmVyIHRoaXMpCisgICAgICAgICAgICAvLyBPUgorICAgICAgICAgICAgLy8gbWF0Y2ggc2NvcmUgKz0gMTAwIGlmIHRoZSBjaGFubmVsIG1hc2sgcmVwcmVzZW50YXRpb25zIG1hdGNoCisgICAgICAgICAgICAvLyBtYXRjaCBzY29yZSArPSBudW1iZXIgb2YgY2hhbm5lbHMgbWF0Y2hlZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbWF0Y2hlZCBjaGFubmVscywgdGhlIG1hc2sgbWF5IHN0aWxsIGJlIGFjY2VwdGVkCisgICAgICAgICAgICAvLyBidXQgdGhlIHBsYXliYWNrIG9yIHJlY29yZCB3aWxsIGJlIHNpbGVudC4KKyAgICAgICAgICAgIGNvbnN0IGJvb2wgaXNTdXBwb3J0ZWRJbmRleCA9IChhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKHN1cHBvcnRlZCkKKyAgICAgICAgICAgICAgICAgICAgPT0gQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWCk7CisgICAgICAgICAgICBpbnQgbWF0Y2g7CisgICAgICAgICAgICBpZiAoaXNJbmRleCAmJiBpc1N1cHBvcnRlZEluZGV4KSB7CisgICAgICAgICAgICAgICAgLy8gaW5kZXggZXF1aXZhbGVuY2UKKyAgICAgICAgICAgICAgICBtYXRjaCA9IDEwMCArIF9fYnVpbHRpbl9wb3Bjb3VudCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhzdXBwb3J0ZWQpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNJbmRleCAmJiAhaXNTdXBwb3J0ZWRJbmRleCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGVxdWl2YWxlbnRCaXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKHN1cHBvcnRlZCkpIC0gMSA7CisgICAgICAgICAgICAgICAgbWF0Y2ggPSBfX2J1aWx0aW5fcG9wY291bnQoCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spICYgZXF1aXZhbGVudEJpdHMpOworICAgICAgICAgICAgfSBlbHNlIGlmICghaXNJbmRleCAmJiBpc1N1cHBvcnRlZEluZGV4KSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZXF1aXZhbGVudEJpdHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spKSAtIDE7CisgICAgICAgICAgICAgICAgbWF0Y2ggPSBfX2J1aWx0aW5fcG9wY291bnQoCisgICAgICAgICAgICAgICAgICAgICAgICBlcXVpdmFsZW50Qml0cyAmIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhzdXBwb3J0ZWQpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gcG9zaXRpb25hbCBlcXVpdmFsZW5jZQorICAgICAgICAgICAgICAgIG1hdGNoID0gMTAwICsgX19idWlsdGluX3BvcGNvdW50KAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKHN1cHBvcnRlZCkpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoc3VwcG9ydGVkKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0s6CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX0lOX1NURVJFTzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fTU9OTykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSAxMDAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9JTl9NT05POgorICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWF0Y2ggPiBiZXN0TWF0Y2gpIHsKKyAgICAgICAgICAgICAgICBiZXN0TWF0Y2ggPSBtYXRjaDsKKyAgICAgICAgICAgICAgICBpZiAodXBkYXRlZENoYW5uZWxNYXNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgKnVwZGF0ZWRDaGFubmVsTWFzayA9IHN1cHBvcnRlZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7IC8vIGFueSBtYXRjaCB3aWxsIGRvIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJlc3RNYXRjaCA+IDAgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb3J0OjpjaGVja0V4YWN0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKK3sKKyAgICBpZiAobUZvcm1hdHMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSArKykgeworICAgICAgICBpZiAobUZvcm1hdHNbaV0gPT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb3J0OjpjaGVja0NvbXBhdGlibGVGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBhdWRpb19mb3JtYXRfdCAqdXBkYXRlZEZvcm1hdCkKKyAgICAgICAgY29uc3QKK3sKKyAgICBpZiAobUZvcm1hdHMuaXNFbXB0eSgpKSB7CisgICAgICAgIGlmICh1cGRhdGVkRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICp1cGRhdGVkRm9ybWF0ID0gZm9ybWF0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBjb25zdCBib29sIGNoZWNrSW5leGFjdCA9IC8vIHdoZW4gcG9ydCBpcyBpbnB1dCBhbmQgZm9ybWF0IGlzIGxpbmVhciBwY20KKyAgICAgICAgICAgIG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVggJiYgbVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTksKKyAgICAgICAgICAgICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KTsKKworICAgIC8vIGl0ZXJhdGUgZnJvbSBiZXN0IGZvcm1hdCB0byB3b3JzdCBmb3JtYXQgKHJldmVyc2Ugb3JkZXIpCisgICAgZm9yIChzc2l6ZV90IGkgPSBtRm9ybWF0cy5zaXplKCkgLSAxOyBpID49IDAgOyAtLWkpIHsKKyAgICAgICAgaWYgKG1Gb3JtYXRzW2ldID09IGZvcm1hdCB8fAorICAgICAgICAgICAgICAgIChjaGVja0luZXhhY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG1Gb3JtYXRzW2ldICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXRzW2ldKSkpIHsKKyAgICAgICAgICAgIC8vIGZvciBpbmV4YWN0IGNoZWNrcyB3ZSB0YWtlIHRoZSBmaXJzdCBsaW5lYXIgcGNtIGZvcm1hdCBkdWUgdG8gc29ydGluZy4KKyAgICAgICAgICAgIGlmICh1cGRhdGVkRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqdXBkYXRlZEZvcm1hdCA9IG1Gb3JtYXRzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9ydDo6cGlja1NhbXBsaW5nUmF0ZSgpIGNvbnN0Cit7CisgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB1bmluaXRpYWxpemVkIGR5bmFtaWMgcHJvZmlsZQorICAgIGlmIChtU2FtcGxpbmdSYXRlcy5zaXplKCkgPT0gMSAmJiBtU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIEZvciBkaXJlY3Qgb3V0cHV0cywgcGljayBtaW5pbXVtIHNhbXBsaW5nIHJhdGU6IHRoaXMgaGVscHMgZW5zdXJpbmcgdGhhdCB0aGUKKyAgICAvLyBjaGFubmVsIGNvdW50IC8gc2FtcGxpbmcgcmF0ZSBjb21iaW5hdGlvbiBjaG9zZW4gd2lsbCBiZSBzdXBwb3J0ZWQgYnkgdGhlIGNvbm5lY3RlZAorICAgIC8vIHNpbmsKKyAgICBpZiAoKG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpICYmIChtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSAmJgorICAgICAgICAgICAgKG1GbGFncyAmIChBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSkpIHsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gVUlOVF9NQVg7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICAgICBpZiAoKG1TYW1wbGluZ1JhdGVzW2ldIDwgc2FtcGxpbmdSYXRlKSAmJiAobVNhbXBsaW5nUmF0ZXNbaV0gPiAwKSkgeworICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IG1TYW1wbGluZ1JhdGVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoc2FtcGxpbmdSYXRlID09IFVJTlRfTUFYKSA/IDAgOiBzYW1wbGluZ1JhdGU7CisgICAgfQorCisgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMDsKKyAgICB1aW50MzJfdCBtYXhSYXRlID0gTUFYX01JWEVSX1NBTVBMSU5HX1JBVEU7CisKKyAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBtYXggbWl4ZXIgc2FtcGxpbmcgcmF0ZXMuIERvIG5vdAorICAgIC8vIGxpbWl0IHNhbXBsaW5nIHJhdGUgb3RoZXJ3aXNlCisgICAgLy8gRm9yIGlucHV0cywgYWxzbyBzZWUgY2hlY2tDb21wYXRpYmxlU2FtcGxpbmdSYXRlKCkuCisgICAgaWYgKG1UeXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgbWF4UmF0ZSA9IFVJTlRfTUFYOworICAgIH0KKyAgICAvLyBUT0RPOiBzaG91bGQgbVNhbXBsaW5nUmF0ZXNbXSBiZSBvcmRlcmVkIGluIHRlcm1zIG9mIG91ciBwcmVmZXJlbmNlCisgICAgLy8gYW5kIHdlIHJldHVybiB0aGUgZmlyc3QgKGFuZCBoZW5jZSBtb3N0IHByZWZlcnJlZCkgbWF0Y2g/ICBUaGlzIGlzIG9mIGNvbmNlcm4gaWYKKyAgICAvLyB3ZSB3YW50IHRvIGNob29zZSA5NmtIeiBvdmVyIDE5MmtIeiBmb3IgVVNCIGRyaXZlciBzdGFiaWxpdHkgb3IgcmVzb3VyY2UgY29uc3RyYWludHMuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgaWYgKChtU2FtcGxpbmdSYXRlc1tpXSA+IHNhbXBsaW5nUmF0ZSkgJiYgKG1TYW1wbGluZ1JhdGVzW2ldIDw9IG1heFJhdGUpKSB7CisgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtU2FtcGxpbmdSYXRlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2FtcGxpbmdSYXRlOworfQorCithdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb1BvcnQ6OnBpY2tDaGFubmVsTWFzaygpIGNvbnN0Cit7CisgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB1bmluaXRpYWxpemVkIGR5bmFtaWMgcHJvZmlsZQorICAgIGlmIChtQ2hhbm5lbE1hc2tzLnNpemUoKSA9PSAxICYmIG1DaGFubmVsTWFza3NbMF0gPT0gMCkgeworICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIH0KKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKworICAgIC8vIEZvciBkaXJlY3Qgb3V0cHV0cywgcGljayBtaW5pbXVtIGNoYW5uZWwgY291bnQ6IHRoaXMgaGVscHMgZW5zdXJpbmcgdGhhdCB0aGUKKyAgICAvLyBjaGFubmVsIGNvdW50IC8gc2FtcGxpbmcgcmF0ZSBjb21iaW5hdGlvbiBjaG9zZW4gd2lsbCBiZSBzdXBwb3J0ZWQgYnkgdGhlIGNvbm5lY3RlZAorICAgIC8vIHNpbmsKKyAgICBpZiAoKG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpICYmIChtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSAmJgorICAgICAgICAgICAgKG1GbGFncyAmIChBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSkpIHsKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gVUlOVF9NQVg7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGNubENvdW50OworICAgICAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICAgICAgY25sQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY25sQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUNoYW5uZWxNYXNrc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNubENvdW50IDwgY2hhbm5lbENvdW50KSAmJiAoY25sQ291bnQgPiAwKSkgeworICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrc1tpXTsKKyAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBjbmxDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hhbm5lbE1hc2s7CisgICAgfQorCisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gMDsKKyAgICB1aW50MzJfdCBtYXhDb3VudCA9IE1BWF9NSVhFUl9DSEFOTkVMX0NPVU5UOworCisgICAgLy8gRm9yIG1peGVkIG91dHB1dCBhbmQgaW5wdXRzLCB1c2UgbWF4IG1peGVyIGNoYW5uZWwgY291bnQuIERvIG5vdAorICAgIC8vIGxpbWl0IGNoYW5uZWwgY291bnQgb3RoZXJ3aXNlCisgICAgaWYgKG1UeXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgbWF4Q291bnQgPSBVSU5UX01BWDsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSArKykgeworICAgICAgICB1aW50MzJfdCBjbmxDb3VudDsKKyAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFza3NbaV0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY25sQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUNoYW5uZWxNYXNrc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjbmxDb3VudCA+IGNoYW5uZWxDb3VudCkgJiYgKGNubENvdW50IDw9IG1heENvdW50KSkgeworICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2tzW2ldOworICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gY25sQ291bnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNoYW5uZWxNYXNrOworfQorCisvKiBmb3JtYXQgaW4gb3JkZXIgb2YgaW5jcmVhc2luZyBwcmVmZXJlbmNlICovCitjb25zdCBhdWRpb19mb3JtYXRfdCBBdWRpb1BvcnQ6OnNQY21Gb3JtYXRDb21wYXJlVGFibGVbXSA9IHsKKyAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQsCisgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICBBVURJT19GT1JNQVRfUENNXzhfMjRfQklULAorICAgICAgICBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQsCisgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklULAorICAgICAgICBBVURJT19GT1JNQVRfUENNX0ZMT0FULAorfTsKKworaW50IEF1ZGlvUG9ydDo6Y29tcGFyZUZvcm1hdHMoYXVkaW9fZm9ybWF0X3QgZm9ybWF0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0MikKK3sKKyAgICAvLyBOT1RFOiBBVURJT19GT1JNQVRfSU5WQUxJRCBpcyBhbHNvIGNvbnNpZGVyZWQgbm90IFBDTSBhbmQgd2lsbCBiZSBjb21wYXJlZCBlcXVhbCB0byBhbnkKKyAgICAvLyBjb21wcmVzc2VkIGZvcm1hdCBhbmQgYmV0dGVyIHRoYW4gYW55IFBDTSBmb3JtYXQuIFRoaXMgaXMgYnkgZGVzaWduIG9mIHBpY2tGb3JtYXQoKQorICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQxKSkgeworICAgICAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0MikpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0MikpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGludCBpbmRleDEgPSAtMSwgaW5kZXgyID0gLTE7CisgICAgZm9yIChzaXplX3QgaSA9IDA7CisgICAgICAgICAgICAoaSA8IEFSUkFZX1NJWkUoc1BjbUZvcm1hdENvbXBhcmVUYWJsZSkpICYmICgoaW5kZXgxID09IC0xKSB8fCAoaW5kZXgyID09IC0xKSk7CisgICAgICAgICAgICBpICsrKSB7CisgICAgICAgIGlmIChzUGNtRm9ybWF0Q29tcGFyZVRhYmxlW2ldID09IGZvcm1hdDEpIHsKKyAgICAgICAgICAgIGluZGV4MSA9IGk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNQY21Gb3JtYXRDb21wYXJlVGFibGVbaV0gPT0gZm9ybWF0MikgeworICAgICAgICAgICAgaW5kZXgyID0gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBmb3JtYXQxIG5vdCBmb3VuZCA9PiBpbmRleDEgPCAwID0+IGZvcm1hdDIgPiBmb3JtYXQxCisgICAgLy8gZm9ybWF0MiBub3QgZm91bmQgPT4gaW5kZXgyIDwgMCA9PiBmb3JtYXQyIDwgZm9ybWF0MQorICAgIHJldHVybiBpbmRleDEgLSBpbmRleDI7Cit9CisKK2F1ZGlvX2Zvcm1hdF90IEF1ZGlvUG9ydDo6cGlja0Zvcm1hdCgpIGNvbnN0Cit7CisgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB1bmluaXRpYWxpemVkIGR5bmFtaWMgcHJvZmlsZQorICAgIGlmIChtRm9ybWF0cy5zaXplKCkgPT0gMSAmJiBtRm9ybWF0c1swXSA9PSAwKSB7CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICB9CisKKyAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICBhdWRpb19mb3JtYXRfdCBiZXN0Rm9ybWF0ID0KKyAgICAgICAgICAgIEF1ZGlvUG9ydDo6c1BjbUZvcm1hdENvbXBhcmVUYWJsZVsKKyAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKEF1ZGlvUG9ydDo6c1BjbUZvcm1hdENvbXBhcmVUYWJsZSkgLSAxXTsKKyAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBiZXN0IG1peGVyIG91dHB1dCBmb3JtYXQuIERvIG5vdAorICAgIC8vIGxpbWl0IGZvcm1hdCBvdGhlcndpc2UKKyAgICBpZiAoKG1UeXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHx8CisgICAgICAgICAgICAoKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpICYmCisgICAgICAgICAgICAgKCgobUZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpKSAhPSAwKSkpKSB7CisgICAgICAgIGJlc3RGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSArKykgeworICAgICAgICBpZiAoKGNvbXBhcmVGb3JtYXRzKG1Gb3JtYXRzW2ldLCBmb3JtYXQpID4gMCkgJiYKKyAgICAgICAgICAgICAgICAoY29tcGFyZUZvcm1hdHMobUZvcm1hdHNbaV0sIGJlc3RGb3JtYXQpIDw9IDApKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBtRm9ybWF0c1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZm9ybWF0OworfQorCitzdGF0dXNfdCBBdWRpb1BvcnQ6OmNoZWNrR2Fpbihjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmdhaW5Db25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBpZiAoaW5kZXggPCAwIHx8IChzaXplX3QpaW5kZXggPj0gbUdhaW5zLnNpemUoKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gbUdhaW5zW2luZGV4XS0+Y2hlY2tDb25maWcoZ2FpbkNvbmZpZyk7Cit9CisKK3ZvaWQgQXVkaW9Qb3J0OjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIGlmIChtTmFtZS5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKworICAgIGlmIChtU2FtcGxpbmdSYXRlcy5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNhbXBsaW5nIHJhdGVzOiAiLCBzcGFjZXMsICIiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA9PSAwICYmIG1TYW1wbGluZ1JhdGVzW2ldID09IDApIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJEeW5hbWljIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVkIiwgbVNhbXBsaW5nUmF0ZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtU2FtcGxpbmdSYXRlcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICB9CisKKyAgICBpZiAobUNoYW5uZWxNYXNrcy5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWwgbWFza3M6ICIsIHNwYWNlcywgIiIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQUxPR1YoIkF1ZGlvUG9ydDo6ZHVtcCBtQ2hhbm5lbE1hc2tzICV6dSAlMDh4IiwgaSwgbUNoYW5uZWxNYXNrc1tpXSk7CisKKyAgICAgICAgICAgIGlmIChpID09IDAgJiYgbUNoYW5uZWxNYXNrc1tpXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRHluYW1pYyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIweCUwNHgiLCBtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobUNoYW5uZWxNYXNrcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICB9CisKKyAgICBpZiAobUZvcm1hdHMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBmb3JtYXRzOiAiLCBzcGFjZXMsICIiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXRTdHIgPSBDb25maWdQYXJzaW5nVXRpbHM6OmVudW1Ub1N0cmluZyhzRm9ybWF0TmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0Zvcm1hdE5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdHNbaV0pOworICAgICAgICAgICAgY29uc3QgYm9vbCBpc0VtcHR5U3RyID0gZm9ybWF0U3RyWzBdID09IDA7CisgICAgICAgICAgICBpZiAoaSA9PSAwICYmIGlzRW1wdHlTdHIpIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJEeW5hbWljIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpc0VtcHR5U3RyKSB7CisgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUjeCIsIG1Gb3JtYXRzW2ldKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlcyIsIGZvcm1hdFN0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtRm9ybWF0cy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICB9CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgaWYgKG1HYWlucy5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGdhaW5zOlxuIiwgc3BhY2VzLCAiIik7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpICsgMSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUdhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtR2FpbnNbaV0tPmR1bXAoZmQsIHNwYWNlcyArIDIsIGkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9ydDo6bG9nKGNvbnN0IGNoYXIqIGluZGVudCkgY29uc3QKK3sKKyAgICBBTE9HSSgiJXMgUG9ydFtubTolcywgdHlwZTolZCwgcm9sZTolZF0iLCBpbmRlbnQsIG1OYW1lLnN0cmluZygpLCBtVHlwZSwgbVJvbGUpOworfQorCisvLyAtLS0gQXVkaW9Qb3J0Q29uZmlnIGNsYXNzIGltcGxlbWVudGF0aW9uCisKK0F1ZGlvUG9ydENvbmZpZzo6QXVkaW9Qb3J0Q29uZmlnKCkKK3sKKyAgICBtU2FtcGxpbmdSYXRlID0gMDsKKyAgICBtQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgbUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIG1HYWluLmluZGV4ID0gLTE7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6YXBwbHlBdWRpb1BvcnRDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmJhY2t1cENvbmZpZykKK3sKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbG9jYWxCYWNrdXBDb25maWc7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBsb2NhbEJhY2t1cENvbmZpZy5jb25maWdfbWFzayA9IGNvbmZpZy0+Y29uZmlnX21hc2s7CisgICAgdG9BdWRpb1BvcnRDb25maWcoJmxvY2FsQmFja3VwQ29uZmlnKTsKKworICAgIHNwPEF1ZGlvUG9ydD4gYXVkaW9wb3J0ID0gZ2V0QXVkaW9Qb3J0KCk7CisgICAgaWYgKGF1ZGlvcG9ydCA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgeworICAgICAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrRXhhY3RTYW1wbGluZ1JhdGUoY29uZmlnLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBtU2FtcGxpbmdSYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spIHsKKyAgICAgICAgc3RhdHVzID0gYXVkaW9wb3J0LT5jaGVja0V4YWN0Q2hhbm5lbE1hc2soY29uZmlnLT5jaGFubmVsX21hc2spOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgbUNoYW5uZWxNYXNrID0gY29uZmlnLT5jaGFubmVsX21hc2s7CisgICAgfQorICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7CisgICAgICAgIHN0YXR1cyA9IGF1ZGlvcG9ydC0+Y2hlY2tFeGFjdEZvcm1hdChjb25maWctPmZvcm1hdCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBtRm9ybWF0ID0gY29uZmlnLT5mb3JtYXQ7CisgICAgfQorICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikgeworICAgICAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrR2FpbigmY29uZmlnLT5nYWluLCBjb25maWctPmdhaW4uaW5kZXgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgbUdhaW4gPSBjb25maWctPmdhaW47CisgICAgfQorCitleGl0OgorICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgYXBwbHlBdWRpb1BvcnRDb25maWcoJmxvY2FsQmFja3VwQ29uZmlnKTsKKyAgICB9CisgICAgaWYgKGJhY2t1cENvbmZpZyAhPSBOVUxMKSB7CisgICAgICAgICpiYWNrdXBDb25maWcgPSBsb2NhbEJhY2t1cENvbmZpZzsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAoreworICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKKyAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IG1TYW1wbGluZ1JhdGU7CisgICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpKSB7CisgICAgICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gc3JjQ29uZmlnLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSAwOworICAgIH0KKyAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgeworICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKKyAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spKSB7CisgICAgICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IHNyY0NvbmZpZy0+Y2hhbm5lbF9tYXNrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgfQorICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7CisgICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gbUZvcm1hdDsKKyAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpKSB7CisgICAgICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IHNyY0NvbmZpZy0+Zm9ybWF0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICB9CisgICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7CisgICAgICAgIGRzdENvbmZpZy0+Z2FpbiA9IG1HYWluOworICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pKSB7CisgICAgICAgICAgICBkc3RDb25maWctPmdhaW4gPSBzcmNDb25maWctPmdhaW47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkc3RDb25maWctPmdhaW4uaW5kZXggPSAtMTsKKyAgICB9CisgICAgaWYgKGRzdENvbmZpZy0+Z2Fpbi5pbmRleCAhPSAtMSkgeworICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayAmPSB+QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWVmMDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcApAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpDb25maWdQYXJzaW5nVXRpbHMiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJDb25maWdQYXJzaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy9zdGF0aWMKK3VpbnQzMl90IENvbmZpZ1BhcnNpbmdVdGlsczo6c3RyaW5nVG9FbnVtKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcCh0YWJsZVtpXS5uYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigic3RyaW5nVG9FbnVtKCkgZm91bmQgJXMiLCB0YWJsZVtpXS5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiB0YWJsZVtpXS52YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLy9zdGF0aWMKK2NvbnN0IGNoYXIgKkNvbmZpZ1BhcnNpbmdVdGlsczo6ZW51bVRvU3RyaW5nKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmICh0YWJsZVtpXS52YWx1ZSA9PSB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHRhYmxlW2ldLm5hbWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICIiOworfQorCisvL3N0YXRpYworYm9vbCBDb25maWdQYXJzaW5nVXRpbHM6OnN0cmluZ1RvQm9vbChjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgICByZXR1cm4gKChzdHJjYXNlY21wKCJ0cnVlIiwgdmFsdWUpID09IDApIHx8IChzdHJjbXAoIjEiLCB2YWx1ZSkgPT0gMCkpOworfQorCisKKy8vIC0tLSBhdWRpb19wb2xpY3kuY29uZiBmaWxlIHBhcnNpbmcKKy8vc3RhdGljCit1aW50MzJfdCBDb25maWdQYXJzaW5nVXRpbHM6OnBhcnNlT3V0cHV0RmxhZ05hbWVzKGNoYXIgKm5hbWUpCit7CisgICAgdWludDMyX3QgZmxhZyA9IDA7CisKKyAgICAvLyBpdCBpcyBPSyB0byBjYXN0IG5hbWUgdG8gbm9uIGNvbnN0IGhlcmUgYXMgd2UgYXJlIG5vdCBnb2luZyB0byB1c2UgaXQgYWZ0ZXIKKyAgICAvLyBzdHJ0b2soKSBtb2RpZmllcyBpdAorICAgIGNoYXIgKmZsYWdOYW1lID0gc3RydG9rKG5hbWUsICJ8Iik7CisgICAgd2hpbGUgKGZsYWdOYW1lICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmxlbihmbGFnTmFtZSkgIT0gMCkgeworICAgICAgICAgICAgZmxhZyB8PSBDb25maWdQYXJzaW5nVXRpbHM6OnN0cmluZ1RvRW51bShzT3V0cHV0RmxhZ05hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNPdXRwdXRGbGFnTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ05hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9CisgICAgLy9mb3JjZSBkaXJlY3QgZmxhZyBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0OiBvZmZsb2FkaW5nIGltcGxpZXMgYSBkaXJlY3Qgb3V0cHV0IHN0cmVhbQorICAgIC8vIGFuZCBhbGwgY29tbW9uIGJlaGF2aW9ycyBhcmUgZHJpdmVuIGJ5IGNoZWNraW5nIG9ubHkgdGhlIGRpcmVjdCBmbGFnCisgICAgLy8gdGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgc2V0IGFwcHJvcHJpYXRlbHkgaW4gdGhlIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICBpZiAoKGZsYWcgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7CisgICAgICAgIGZsYWcgfD0gQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUOworICAgIH0KKworICAgIHJldHVybiBmbGFnOworfQorCisvL3N0YXRpYwordWludDMyX3QgQ29uZmlnUGFyc2luZ1V0aWxzOjpwYXJzZUlucHV0RmxhZ05hbWVzKGNoYXIgKm5hbWUpCit7CisgICAgdWludDMyX3QgZmxhZyA9IDA7CisKKyAgICAvLyBpdCBpcyBPSyB0byBjYXN0IG5hbWUgdG8gbm9uIGNvbnN0IGhlcmUgYXMgd2UgYXJlIG5vdCBnb2luZyB0byB1c2UgaXQgYWZ0ZXIKKyAgICAvLyBzdHJ0b2soKSBtb2RpZmllcyBpdAorICAgIGNoYXIgKmZsYWdOYW1lID0gc3RydG9rKG5hbWUsICJ8Iik7CisgICAgd2hpbGUgKGZsYWdOYW1lICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmxlbihmbGFnTmFtZSkgIT0gMCkgeworICAgICAgICAgICAgZmxhZyB8PSBzdHJpbmdUb0VudW0oc0lucHV0RmxhZ05hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNJbnB1dEZsYWdOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBmbGFnTmFtZSA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KKyAgICByZXR1cm4gZmxhZzsKK30KKworLy9zdGF0aWMKK2F1ZGlvX2RldmljZXNfdCBDb25maWdQYXJzaW5nVXRpbHM6OnBhcnNlRGV2aWNlTmFtZXMoY2hhciAqbmFtZSkKK3sKKyAgICB1aW50MzJfdCBkZXZpY2UgPSAwOworCisgICAgY2hhciAqZGV2TmFtZSA9IHN0cnRvayhuYW1lLCAifCIpOworICAgIHdoaWxlIChkZXZOYW1lICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmxlbihkZXZOYW1lKSAhPSAwKSB7CisgICAgICAgICAgICBkZXZpY2UgfD0gc3RyaW5nVG9FbnVtKHNEZXZpY2VUeXBlVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VUeXBlVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2TmFtZSk7CisgICAgICAgICB9CisgICAgICAgIGRldk5hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKKy8vc3RhdGljCit2b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEh3TW9kdWxlKGNub2RlICpyb290LCBId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc1NwZWFrZXJEcmNFbmFibGUpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgY25vZGUgKm5vZGU7CisgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG5ldyBId01vZHVsZShyb290LT5uYW1lKTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBERVZJQ0VTX1RBRyk7CisgICAgaWYgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBkZXZpY2UgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgICAgIHN0YXR1c190IHRtcFN0YXR1cyA9IG1vZHVsZS0+bG9hZERldmljZShub2RlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTkFNRV9OT1RfRk9VTkQgfHwgc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdG1wU3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIE9VVFBVVFNfVEFHKTsKKyAgICBpZiAobm9kZSAhPSBOVUxMKSB7CisgICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICAgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIG91dHB1dCAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbW9kdWxlLT5sb2FkT3V0cHV0KG5vZGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgSU5QVVRTX1RBRyk7CisgICAgaWYgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBpbnB1dCAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbW9kdWxlLT5sb2FkSW5wdXQobm9kZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICB9CisgICAgfQorICAgIGxvYWRHbG9iYWxDb25maWcocm9vdCwgbW9kdWxlLCBhdmFpbGFibGVJbnB1dERldmljZXMsIGF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0T3V0cHV0RGV2aWNlcywgaXNTcGVha2VyRHJjRW5hYmxlKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaHdNb2R1bGVzLmFkZChtb2R1bGUpOworICAgIH0KK30KKworLy9zdGF0aWMKK3ZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkSHdNb2R1bGVzKGNub2RlICpyb290LCBId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlSW5wdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNTcGVha2VyRHJjRW5hYmxlZCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEFVRElPX0hXX01PRFVMRV9UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlcygpIGxvYWRpbmcgbW9kdWxlICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgIGxvYWRId01vZHVsZShub2RlLCBod01vZHVsZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRPdXRwdXREZXZpY2VzLCBpc1NwZWFrZXJEcmNFbmFibGVkKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorfQorCisvL3N0YXRpYwordm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRHbG9iYWxDb25maWcoY25vZGUgKnJvb3QsIGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGVmYXVsdE91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJnNwZWFrZXJEcmNFbmFibGVkKQoreworICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgR0xPQkFMX0NPTkZJR19UQUcpOworCisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXM7CisgICAgaWYgKG1vZHVsZSAhPSBOVUxMKSB7CisgICAgICAgIGRlY2xhcmVkRGV2aWNlcyA9IG1vZHVsZS0+bURlY2xhcmVkRGV2aWNlczsKKyAgICB9CisKKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChBVFRBQ0hFRF9PVVRQVVRfREVWSUNFU19UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMubG9hZERldmljZXNGcm9tVGFnKChjaGFyICopbm9kZS0+dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcyk7CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIEF0dGFjaGVkIE91dHB1dCBEZXZpY2VzICUwOHgiLAorICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoREVGQVVMVF9PVVRQVVRfREVWSUNFX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3Qpc3RyaW5nVG9FbnVtKAorICAgICAgICAgICAgICAgICAgICBzRGV2aWNlVHlwZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VUeXBlVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImxvYWRHbG9iYWxDb25maWcoKSBkZWZhdWx0IGRldmljZSBub3Qgc3BlY2lmaWVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1EZWZhdWx0T3V0cHV0RGV2aWNlICUwOHgiLCBkZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCkpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChBVFRBQ0hFRF9JTlBVVF9ERVZJQ0VTX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmxvYWREZXZpY2VzRnJvbVRhZygoY2hhciAqKW5vZGUtPnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcyk7CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIEF2YWlsYWJsZSBJbnB1dERldmljZXMgJTA4eCIsIGF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoU1BFQUtFUl9EUkNfRU5BQkxFRF9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgIHNwZWFrZXJEcmNFbmFibGVkID0gc3RyaW5nVG9Cb29sKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtU3BlYWtlckRyY0VuYWJsZWQgPSAlZCIsIHNwZWFrZXJEcmNFbmFibGVkKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoQVVESU9fSEFMX1ZFUlNJT05fVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICB1aW50MzJfdCBtYWpvciwgbWlub3I7CisgICAgICAgICAgICBzc2NhbmYoKGNoYXIgKilub2RlLT52YWx1ZSwgIiV1LiV1IiwgJm1ham9yLCAmbWlub3IpOworICAgICAgICAgICAgbW9kdWxlLT5tSGFsVmVyc2lvbiA9IEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTihtYWpvciwgbWlub3IpOworICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtSGFsVmVyc2lvbiA9ICUwNHggbWFqb3IgJXUgbWlub3IgJXUiLAorICAgICAgICAgICAgICAgICAgbW9kdWxlLT5tSGFsVmVyc2lvbiwgbWFqb3IsIG1pbm9yKTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9Cit9CisKKy8vc3RhdGljCitzdGF0dXNfdCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRBdWRpb1BvbGljeUNvbmZpZyhjb25zdCBjaGFyICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJmlzU3BlYWtlckRyY0VuYWJsZWQpCit7CisgICAgY25vZGUgKnJvb3Q7CisgICAgY2hhciAqZGF0YTsKKworICAgIGRhdGEgPSAoY2hhciAqKWxvYWRfZmlsZShwYXRoLCBOVUxMKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyAgICByb290ID0gY29uZmlnX25vZGUoIiIsICIiKTsKKyAgICBjb25maWdfbG9hZChyb290LCBkYXRhKTsKKworICAgIGxvYWRId01vZHVsZXMocm9vdCwgaHdNb2R1bGVzLAorICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgZGVmYXVsdE91dHB1dERldmljZXMsIGlzU3BlYWtlckRyY0VuYWJsZWQpOworICAgIC8vIGxlZ2FjeSBhdWRpb19wb2xpY3kuY29uZiBmaWxlcyBoYXZlIG9uZSBnbG9iYWxfY29uZmlndXJhdGlvbiBzZWN0aW9uCisgICAgbG9hZEdsb2JhbENvbmZpZyhyb290LCBod01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpLAorICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdE91dHB1dERldmljZXMsIGlzU3BlYWtlckRyY0VuYWJsZWQpOworICAgIGNvbmZpZ19mcmVlKHJvb3QpOworICAgIGZyZWUocm9vdCk7CisgICAgZnJlZShkYXRhKTsKKworICAgIEFMT0dJKCJsb2FkQXVkaW9Qb2xpY3lDb25maWcoKSBsb2FkZWQgJXNcbiIsIHBhdGgpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjFmY2EzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKQEAgLTAsMCArMSwzNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6RGV2aWNlcyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlICJId01vZHVsZS5oIgorI2luY2x1ZGUgIkNvbmZpZ1BhcnNpbmdVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0RldmljZURlc2NyaXB0b3I6OkRldmljZURlc2NyaXB0b3IoYXVkaW9fZGV2aWNlc190IHR5cGUpIDoKKyAgICBBdWRpb1BvcnQoU3RyaW5nOCgiIiksIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsCisgICAgICAgICAgICAgIGF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkgPyBBVURJT19QT1JUX1JPTEVfU0lOSyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU09VUkNFKSwKKyAgICBtVGFnKCIiKSwgbUFkZHJlc3MoIiIpLCBtRGV2aWNlVHlwZSh0eXBlKSwgbUlkKDApCit7CisKK30KKworYXVkaW9fcG9ydF9oYW5kbGVfdCBEZXZpY2VEZXNjcmlwdG9yOjpnZXRJZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1JZDsKK30KKwordm9pZCBEZXZpY2VEZXNjcmlwdG9yOjphdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpCit7CisgICAgQXVkaW9Qb3J0OjphdHRhY2gobW9kdWxlKTsKKyAgICBtSWQgPSBnZXROZXh0VW5pcXVlSWQoKTsKK30KKworYm9vbCBEZXZpY2VEZXNjcmlwdG9yOjplcXVhbHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIG90aGVyKSBjb25zdAoreworICAgIC8vIERldmljZXMgYXJlIGNvbnNpZGVyZWQgZXF1YWwgaWYgdGhleToKKyAgICAvLyAtIGFyZSBvZiB0aGUgc2FtZSB0eXBlIChhIGRldmljZSB0eXBlIGNhbm5vdCBiZSBBVURJT19ERVZJQ0VfTk9ORSkKKyAgICAvLyAtIGhhdmUgdGhlIHNhbWUgYWRkcmVzcyBvciBvbmUgZGV2aWNlIGRvZXMgbm90IHNwZWNpZnkgdGhlIGFkZHJlc3MKKyAgICAvLyAtIGhhdmUgdGhlIHNhbWUgY2hhbm5lbCBtYXNrIG9yIG9uZSBkZXZpY2UgZG9lcyBub3Qgc3BlY2lmeSB0aGUgY2hhbm5lbCBtYXNrCisgICAgaWYgKG90aGVyID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKG1EZXZpY2VUeXBlID09IG90aGVyLT5tRGV2aWNlVHlwZSkgJiYKKyAgICAgICAgICAgKG1BZGRyZXNzID09ICIiIHx8IG90aGVyLT5tQWRkcmVzcyA9PSAiIiB8fCBtQWRkcmVzcyA9PSBvdGhlci0+bUFkZHJlc3MpICYmCisgICAgICAgICAgIChtQ2hhbm5lbE1hc2sgPT0gMCB8fCBvdGhlci0+bUNoYW5uZWxNYXNrID09IDAgfHwKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgPT0gb3RoZXItPm1DaGFubmVsTWFzayk7Cit9CisKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6bG9hZEdhaW5zKGNub2RlICpyb290KQoreworICAgIEF1ZGlvUG9ydDo6bG9hZEdhaW5zKHJvb3QpOworICAgIGlmIChtR2FpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICBtR2FpbnNbMF0tPmdldERlZmF1bHRDb25maWcoJm1HYWluKTsKKyAgICB9Cit9CisKK3ZvaWQgRGV2aWNlVmVjdG9yOjpyZWZyZXNoVHlwZXMoKQoreworICAgIG1EZXZpY2VUeXBlcyA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBtRGV2aWNlVHlwZXMgfD0gaXRlbUF0KGkpLT50eXBlKCk7CisgICAgfQorICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OnJlZnJlc2hUeXBlcygpIG1EZXZpY2VUeXBlcyAlMDh4IiwgbURldmljZVR5cGVzKTsKK30KKworc3NpemVfdCBEZXZpY2VWZWN0b3I6OmluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0Cit7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtLT5lcXVhbHMoaXRlbUF0KGkpKSkgeworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzc2l6ZV90IERldmljZVZlY3Rvcjo6YWRkKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKQoreworICAgIHNzaXplX3QgcmV0ID0gaW5kZXhPZihpdGVtKTsKKworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldCA9IFNvcnRlZFZlY3Rvcjo6YWRkKGl0ZW0pOworICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgIHJlZnJlc2hUeXBlcygpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coIkRldmljZVZlY3Rvcjo6YWRkIGRldmljZSAlMDh4IGFscmVhZHkgaW4iLCBpdGVtLT50eXBlKCkpOworICAgICAgICByZXQgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3NpemVfdCBEZXZpY2VWZWN0b3I6OnJlbW92ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkKK3sKKyAgICBzaXplX3QgaTsKKyAgICBzc2l6ZV90IHJldCA9IGluZGV4T2YoaXRlbSk7CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBBTE9HVygiRGV2aWNlVmVjdG9yOjpyZW1vdmUgZGV2aWNlICUwOHggbm90IGluIiwgaXRlbS0+dHlwZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBTb3J0ZWRWZWN0b3I6OnJlbW92ZUF0KHJldCk7CisgICAgICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICAgICAgcmVmcmVzaFR5cGVzKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYXVkaW9fZGV2aWNlc190IERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdAoreworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBtb2R1bGVIYW5kbGUpIHsKKyAgICAgICAgICAgIGRldmljZXMgfD0gaXRlbUF0KGkpLT50eXBlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZXM7Cit9CisKK3ZvaWQgRGV2aWNlVmVjdG9yOjpsb2FkRGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcykKK3sKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdDsKKworICAgIHVpbnQzMl90IHJvbGVfYml0ID0gQVVESU9fREVWSUNFX0JJVF9JTiAmIHR5cGVzOworICAgIHR5cGVzICY9IH5yb2xlX2JpdDsKKworICAgIHdoaWxlICh0eXBlcykgeworICAgICAgICB1aW50MzJfdCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KHR5cGVzKTsKKyAgICAgICAgdWludDMyX3QgdHlwZSA9IDEgPDwgaTsKKyAgICAgICAgdHlwZXMgJj0gfnR5cGU7CisgICAgICAgIGFkZChuZXcgRGV2aWNlRGVzY3JpcHRvcih0eXBlIHwgcm9sZV9iaXQpKTsKKyAgICB9Cit9CisKK3ZvaWQgRGV2aWNlVmVjdG9yOjpsb2FkRGV2aWNlc0Zyb21UYWcoY2hhciAqdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZWNsYXJlZERldmljZXMpCit7CisgICAgY2hhciAqZGV2VGFnID0gc3RydG9rKHRhZywgInwiKTsKKyAgICB3aGlsZSAoZGV2VGFnICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmxlbihkZXZUYWcpICE9IDApIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQ29uZmlnUGFyc2luZ1V0aWxzOjpzdHJpbmdUb0VudW0oc0RldmljZVR5cGVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZVR5cGVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZUYWcpOworICAgICAgICAgICAgaWYgKHR5cGUgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXYgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcih0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVggKSB7CisgICAgICAgICAgICAgICAgICAgIGRldi0+bUFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZChkZXYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VGcm9tVGFnKFN0cmluZzgoZGV2VGFnKSk7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZURlc2MgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGQoZGV2aWNlRGVzYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZGV2VGFnID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgIH0KK30KKworc3A8RGV2aWNlRGVzY3JpcHRvcj4gRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgY29uc3QKK3sKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT50eXBlKCkgPT0gdHlwZSkgeworICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gIiIgfHwgaXRlbUF0KGkpLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gaXRlbUF0KGkpOworICAgICAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OmdldERldmljZSgpIGZvciB0eXBlICUwOHggYWRkcmVzcyAlcyBmb3VuZCAlcCIsCisgICAgICAgICAgdHlwZSwgYWRkcmVzcy5zdHJpbmcoKSwgZGV2aWNlLmdldCgpKTsKKyAgICByZXR1cm4gZGV2aWNlOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAoreworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmdldElkKCkgPT0gaWQpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK0RldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZSkgY29uc3QKK3sKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICBib29sIGlzT3V0cHV0ID0gYXVkaW9faXNfb3V0cHV0X2RldmljZXModHlwZSk7CisgICAgdHlwZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgKGkgPCBzaXplKCkpICYmICh0eXBlICE9IEFVRElPX0RFVklDRV9OT05FKTsgaSsrKSB7CisgICAgICAgIGJvb2wgY3VySXNPdXRwdXQgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlcyhpdGVtQXQoaSktPm1EZXZpY2VUeXBlKTsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1clR5cGUgPSBpdGVtQXQoaSktPm1EZXZpY2VUeXBlICYgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgICAgIGlmICgoaXNPdXRwdXQgPT0gY3VySXNPdXRwdXQpICYmICgodHlwZSAmIGN1clR5cGUpICE9IDApKSB7CisgICAgICAgICAgICBkZXZpY2VzLmFkZChpdGVtQXQoaSkpOworICAgICAgICAgICAgdHlwZSAmPSB+Y3VyVHlwZTsKKyAgICAgICAgICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZSgpIGZvciB0eXBlICV4IGZvdW5kICVwIiwKKyAgICAgICAgICAgICAgICAgIGl0ZW1BdChpKS0+dHlwZSgpLCBpdGVtQXQoaSkuZ2V0KCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2VzOworfQorCitEZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGVBZGRyKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSBjb25zdAoreworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+dHlwZSgpID09IHR5cGUpIHsKKyAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChpdGVtQXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2VzOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21UYWcoY29uc3QgU3RyaW5nOCYgdGFnKSBjb25zdAoreworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPm1UYWcgPT0gdGFnKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCisKK3N0YXR1c190IERldmljZVZlY3Rvcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFN0cmluZzggJmRpcmVjdGlvbikgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuIEF2YWlsYWJsZSAlcyBkZXZpY2VzOlxuIiwgZGlyZWN0aW9uLnN0cmluZygpKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZmQsIDIsIGkpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBEZXZpY2VWZWN0b3I6OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2RGVzYykgY29uc3QKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZihkZXZEZXNjKTsKKyAgICByZXR1cm4gaW5kZXggPj0gMCA/IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFIDogQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKK30KKwordm9pZCBEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Cit7CisgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTS3xBVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgIGlmIChzcmNDb25maWcgIT0gTlVMTCkgeworICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IHNyY0NvbmZpZy0+Y29uZmlnX21hc2s7CisgICAgfQorCisgICAgQXVkaW9Qb3J0Q29uZmlnOjp0b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CisKKyAgICBkc3RDb25maWctPmlkID0gbUlkOworICAgIGRzdENvbmZpZy0+cm9sZSA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UobURldmljZVR5cGUpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TSU5LIDogQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKKyAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFOworICAgIGRzdENvbmZpZy0+ZXh0LmRldmljZS50eXBlID0gbURldmljZVR5cGU7CisKKyAgICAvL1RPRE8gVW5kZXJzdGFuZCB3aHkgdGhpcyB0ZXN0IGlzIG5lY2Vzc2FyeS4gaS5lLiB3aHkgYXQgYm9vdCB0aW1lIGRvZXMgaXQgY3Jhc2gKKyAgICAvLyB3aXRob3V0IHRoZSB0ZXN0PworICAgIC8vIFRoaXMgaGFzIGJlZW4gZGVtb25zdHJhdGVkIHRvIE5PVCBiZSB0cnVlIChhdCBzdGFydCB1cCkKKyAgICAvLyBBTE9HX0FTU0VSVChtTW9kdWxlICE9IE5VTEwpOworICAgIGRzdENvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBtTW9kdWxlICE9IDAgPyBtTW9kdWxlLT5tSGFuZGxlIDogQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgc3RybmNweShkc3RDb25maWctPmV4dC5kZXZpY2UuYWRkcmVzcywgbUFkZHJlc3Muc3RyaW5nKCksIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pOworfQorCit2b2lkIERldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAoreworICAgIEFMT0dWKCJEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgpIGhhbmRsZSAlZCB0eXBlICV4IiwgbUlkLCBtRGV2aWNlVHlwZSk7CisgICAgQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChwb3J0KTsKKyAgICBwb3J0LT5pZCA9IG1JZDsKKyAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7CisgICAgcG9ydC0+ZXh0LmRldmljZS50eXBlID0gbURldmljZVR5cGU7CisgICAgcG9ydC0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBtTW9kdWxlLT5tSGFuZGxlOworICAgIHN0cm5jcHkocG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSwgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTik7Cit9CisKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6aW1wb3J0QXVkaW9Qb3J0KGNvbnN0IHNwPEF1ZGlvUG9ydD4gcG9ydCkgeworICAgIEF1ZGlvUG9ydDo6aW1wb3J0QXVkaW9Qb3J0KHBvcnQpOworICAgIG1TYW1wbGluZ1JhdGUgPSBwb3J0LT5waWNrU2FtcGxpbmdSYXRlKCk7CisgICAgbUZvcm1hdCA9IHBvcnQtPnBpY2tGb3JtYXQoKTsKKyAgICBtQ2hhbm5lbE1hc2sgPSBwb3J0LT5waWNrQ2hhbm5lbE1hc2soKTsKK30KKworc3RhdHVzX3QgRGV2aWNlRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0RldmljZSAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBpZiAobUlkICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtSWQpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gdHlwZTogJS00OHNcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICBDb25maWdQYXJzaW5nVXRpbHM6OmVudW1Ub1N0cmluZyhzRGV2aWNlVHlwZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VUeXBlVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICBtRGV2aWNlVHlwZSkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBpZiAobUFkZHJlc3Muc2l6ZSgpICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBhZGRyZXNzOiAlLTMyc1xuIiwgc3BhY2VzLCAiIiwgbUFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIEF1ZGlvUG9ydDo6ZHVtcChmZCwgc3BhY2VzKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBEZXZpY2VEZXNjcmlwdG9yOjpsb2coKSBjb25zdAoreworICAgIEFMT0dJKCJEZXZpY2UgaWQ6JWQgdHlwZToweCVYOiVzLCBhZGRyOiVzIiwKKyAgICAgICAgICBtSWQsCisgICAgICAgICAgbURldmljZVR5cGUsCisgICAgICAgICAgQ29uZmlnUGFyc2luZ1V0aWxzOjplbnVtVG9TdHJpbmcoCisgICAgICAgICAgICAgc0RldmljZU5hbWVUb0VudW1UYWJsZSwgQVJSQVlfU0laRShzRGV2aWNlTmFtZVRvRW51bVRhYmxlKSwgbURldmljZVR5cGUpLAorICAgICAgICAgIG1BZGRyZXNzLnN0cmluZygpKTsKKworICAgIEF1ZGlvUG9ydDo6bG9nKCIgICIpOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2Q4MzhkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6RWZmZWN0RGVzY3JpcHRvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkVmZmVjdERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3QgRWZmZWN0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSS9POiAlZFxuIiwgbUlvKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFN0cmF0ZWd5OiAlZFxuIiwgbVN0cmF0ZWd5KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNlc3Npb246ICVkXG4iLCBtU2Vzc2lvbik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBOYW1lOiAlc1xuIiwgIG1EZXNjLm5hbWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJXNcbiIsICBtRW5hYmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OkVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uKCkgOgorICAgIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKDApLAorICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnkoMCkKK3sKKworfQorCitzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6cmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCit7CisgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgKyBkZXNjLT5tZW1vcnlVc2FnZSA+IGdldE1heEVmZmVjdHNNZW1vcnkoKSkgeworICAgICAgICBBTE9HVygicmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgbGltaXQgZXhjZWVkZWQgZm9yIEZ4ICVzLCBNZW1vcnkgJWQgS0IiLAorICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIGRlc2MtPm1lbW9yeVVzYWdlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBtVG90YWxFZmZlY3RzTWVtb3J5ICs9IGRlc2MtPm1lbW9yeVVzYWdlOworICAgIEFMT0dWKCJyZWdpc3RlckVmZmVjdCgpIGVmZmVjdCAlcywgaW8gJWQsIHN0cmF0ZWd5ICVkIHNlc3Npb24gJWQgaWQgJWQiLAorICAgICAgICAgICAgZGVzYy0+bmFtZSwgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CisgICAgQUxPR1YoInJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5ICVkLCB0b3RhbCBtZW1vcnkgJWQiLCBkZXNjLT5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CisKKyAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbmV3IEVmZmVjdERlc2NyaXB0b3IoKTsKKyAgICBtZW1jcHkgKCZlZmZlY3REZXNjLT5tRGVzYywgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICBlZmZlY3REZXNjLT5tSW8gPSBpbzsKKyAgICBlZmZlY3REZXNjLT5tU3RyYXRlZ3kgPSBzdGF0aWNfY2FzdDxyb3V0aW5nX3N0cmF0ZWd5PihzdHJhdGVneSk7CisgICAgZWZmZWN0RGVzYy0+bVNlc3Npb24gPSBzZXNzaW9uOworICAgIGVmZmVjdERlc2MtPm1FbmFibGVkID0gZmFsc2U7CisKKyAgICBhZGQoaWQsIGVmZmVjdERlc2MpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCit7CisgICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoaWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInVucmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIGVmZmVjdCBJRCAlZCIsIGlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSB2YWx1ZUF0KGluZGV4KTsKKworICAgIHNldEVmZmVjdEVuYWJsZWQoZWZmZWN0RGVzYywgZmFsc2UpOworCisgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgPCBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSkgeworICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCB0b28gYmlnIGZvciB0b3RhbCAlZCIsCisgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOworICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSA9IG1Ub3RhbEVmZmVjdHNNZW1vcnk7CisgICAgfQorICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnkgLT0gZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2U7CisgICAgQUxPR1YoInVucmVnaXN0ZXJFZmZlY3QoKSBlZmZlY3QgJXMsIElEICVkLCBtZW1vcnkgJWQgdG90YWwgbWVtb3J5ICVkIiwKKyAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm5hbWUsIGlkLCBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CisKKyAgICByZW1vdmVJdGVtKGlkKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OnNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpCit7CisgICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoaWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInVucmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIGVmZmVjdCBJRCAlZCIsIGlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBzZXRFZmZlY3RFbmFibGVkKHZhbHVlQXQoaW5kZXgpLCBlbmFibGVkKTsKK30KKworCitzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0RWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoZW5hYmxlZCA9PSBlZmZlY3REZXNjLT5tRW5hYmxlZCkgeworICAgICAgICBBTE9HVigic2V0RWZmZWN0RW5hYmxlZCglcykgZWZmZWN0IGFscmVhZHkgJXMiLAorICAgICAgICAgICAgIGVuYWJsZWQ/InRydWUiOiJmYWxzZSIsIGVuYWJsZWQ/ImVuYWJsZWQiOiJkaXNhYmxlZCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgaWYgKG1Ub3RhbEVmZmVjdHNDcHVMb2FkICsgZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZCA+IGdldE1heEVmZmVjdHNDcHVMb2FkKCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRFZmZlY3RFbmFibGVkKHRydWUpIENQVSBMb2FkIGxpbWl0IGV4Y2VlZGVkIGZvciBGeCAlcywgQ1BVICVmIE1JUFMiLAorICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5uYW1lLCAoZmxvYXQpZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZC8xMCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgbVRvdGFsRWZmZWN0c0NwdUxvYWQgKz0gZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZDsKKyAgICAgICAgQUxPR1YoInNldEVmZmVjdEVuYWJsZWQodHJ1ZSkgdG90YWwgQ1BVICVkIiwgbVRvdGFsRWZmZWN0c0NwdUxvYWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtVG90YWxFZmZlY3RzQ3B1TG9hZCA8IGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRFZmZlY3RFbmFibGVkKGZhbHNlKSBDUFUgbG9hZCAlZCB0b28gaGlnaCBmb3IgdG90YWwgJWQiLAorICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCk7CisgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkID0gbVRvdGFsRWZmZWN0c0NwdUxvYWQ7CisgICAgICAgIH0KKyAgICAgICAgbVRvdGFsRWZmZWN0c0NwdUxvYWQgLT0gZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZDsKKyAgICAgICAgQUxPR1YoInNldEVmZmVjdEVuYWJsZWQoZmFsc2UpIHRvdGFsIENQVSAlZCIsIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKTsKKyAgICB9CisgICAgZWZmZWN0RGVzYy0+bUVuYWJsZWQgPSBlbmFibGVkOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYm9vbCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6aXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChlZmZlY3REZXNjLT5tRW5hYmxlZCAmJiAoZWZmZWN0RGVzYy0+bVN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSAmJgorICAgICAgICAgICAgICAgICgoZWZmZWN0RGVzYy0+bURlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19PRkZMT0FEX1NVUFBPUlRFRCkgPT0gMCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgJXMgZW5hYmxlZCBvbiBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm5hbWUsIGVmZmVjdERlc2MtPm1TZXNzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordWludDMyX3QgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmdldE1heEVmZmVjdHNDcHVMb2FkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gTUFYX0VGRkVDVFNfQ1BVX0xPQUQ7Cit9CisKK3VpbnQzMl90IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpnZXRNYXhFZmZlY3RzTWVtb3J5KCkgY29uc3QKK3sKKyAgICByZXR1cm4gTUFYX0VGRkVDVFNfTUVNT1JZOworfQorCitzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblRvdGFsIEVmZmVjdHMgQ1BVOiAlZiBNSVBTLCBUb3RhbCBFZmZlY3RzIG1lbW9yeTogJWQgS0JcbiIsCisgICAgICAgICAgICAgKGZsb2F0KW1Ub3RhbEVmZmVjdHNDcHVMb2FkLzEwLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJSZWdpc3RlcmVkIGVmZmVjdHM6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIEVmZmVjdCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTIwNTBiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06Okh3TW9kdWxlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlICJDb25maWdQYXJzaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJhdWRpb19wb2xpY3lfY29uZi5oIgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8cG9saWN5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworSHdNb2R1bGU6Okh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCisgICAgOiBtTmFtZShzdHJuZHVwKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NQVhfTEVOKSksCisgICAgICBtSGFsVmVyc2lvbihBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fTUlOKSwgbUhhbmRsZSgwKQoreworfQorCitId01vZHVsZTo6fkh3TW9kdWxlKCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtT3V0cHV0UHJvZmlsZXNbaV0tPm1TdXBwb3J0ZWREZXZpY2VzLmNsZWFyKCk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUlucHV0UHJvZmlsZXNbaV0tPm1TdXBwb3J0ZWREZXZpY2VzLmNsZWFyKCk7CisgICAgfQorICAgIGZyZWUoKHZvaWQgKiltTmFtZSk7Cit9CisKK3N0YXR1c190IEh3TW9kdWxlOjpsb2FkSW5wdXQoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOChyb290LT5uYW1lKSwgQVVESU9fUE9SVF9ST0xFX1NJTkspOworCisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBTQU1QTElOR19SQVRFU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRTYW1wbGluZ1JhdGVzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBGT1JNQVRTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEZvcm1hdHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEluQ2hhbm5lbHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIERFVklDRVNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21UYWcoKGNoYXIgKilub2RlLT52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZMQUdTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bUZsYWdzID0gQ29uZmlnUGFyc2luZ1V0aWxzOjpwYXJzZUlucHV0RmxhZ05hbWVzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRHYWlucyhub2RlKTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpLAorICAgICAgICAgICAgImxvYWRJbnB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGRldmljZXMiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA9PSAwLAorICAgICAgICAgICAgImxvYWRJbnB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkSW5wdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSA9PSAwLAorICAgICAgICAgICAgImxvYWRJbnB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGZvcm1hdHMiKTsKKyAgICBpZiAoIXByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSAmJgorICAgICAgICAgICAgKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpICE9IDApICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpICE9IDApICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpICE9IDApKSB7CisKKyAgICAgICAgQUxPR1YoImxvYWRJbnB1dCgpIGFkZGluZyBpbnB1dCBTdXBwb3J0ZWQgRGV2aWNlcyAlMDR4IiwKKyAgICAgICAgICAgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSk7CisKKyAgICAgICAgcHJvZmlsZS0+YXR0YWNoKHRoaXMpOworICAgICAgICBtSW5wdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworc3RhdHVzX3QgSHdNb2R1bGU6OmxvYWRPdXRwdXQoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOChyb290LT5uYW1lKSwgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSk7CisKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIFNBTVBMSU5HX1JBVEVTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZFNhbXBsaW5nUmF0ZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZPUk1BVFNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkRm9ybWF0cygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkT3V0Q2hhbm5lbHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIERFVklDRVNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21UYWcoKGNoYXIgKilub2RlLT52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZMQUdTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bUZsYWdzID0gQ29uZmlnUGFyc2luZ1V0aWxzOjpwYXJzZU91dHB1dEZsYWdOYW1lcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkR2FpbnMobm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSwKKyAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZGV2aWNlcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZm9ybWF0cyIpOworICAgIGlmICghcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgIT0gMCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgIT0gMCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgIT0gMCkpIHsKKworICAgICAgICBBTE9HVigibG9hZE91dHB1dCgpIGFkZGluZyBvdXRwdXQgU3VwcG9ydGVkIERldmljZXMgJTA0eCwgbUZsYWdzICUwNHgiLAorICAgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpLCBwcm9maWxlLT5tRmxhZ3MpOworICAgICAgICBwcm9maWxlLT5hdHRhY2godGhpcyk7CisgICAgICAgIG1PdXRwdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworc3RhdHVzX3QgSHdNb2R1bGU6OmxvYWREZXZpY2UoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKworICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBBUE1fREVWSUNFX1RZUEUpID09IDApIHsKKyAgICAgICAgICAgIHR5cGUgPSBDb25maWdQYXJzaW5nVXRpbHM6OnBhcnNlRGV2aWNlTmFtZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgaWYgKHR5cGUgPT0gQVVESU9fREVWSUNFX05PTkUgfHwKKyAgICAgICAgICAgICghYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpICYmICFhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpKSkgeworICAgICAgICBBTE9HVygibG9hZERldmljZSgpIGJhZCB0eXBlICUwOHgiLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKHR5cGUpOworICAgIGRldmljZURlc2MtPm1UYWcgPSBTdHJpbmc4KHJvb3QtPm5hbWUpOworCisgICAgbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQVBNX0RFVklDRV9BRERSRVNTKSA9PSAwKSB7CisgICAgICAgICAgICBkZXZpY2VEZXNjLT5tQWRkcmVzcyA9IFN0cmluZzgoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZSh0eXBlKSkgeworICAgICAgICAgICAgICAgIGRldmljZURlc2MtPmxvYWRJbkNoYW5uZWxzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VEZXNjLT5sb2FkT3V0Q2hhbm5lbHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgeworICAgICAgICAgICAgZGV2aWNlRGVzYy0+bG9hZEdhaW5zKG5vZGUpOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKworICAgIEFMT0dWKCJsb2FkRGV2aWNlKCkgYWRkaW5nIGRldmljZSB0YWcgJXMgdHlwZSAlMDh4IGFkZHJlc3MgJXMiLAorICAgICAgICAgIGRldmljZURlc2MtPm1UYWcuc3RyaW5nKCksIHR5cGUsIGRldmljZURlc2MtPm1BZGRyZXNzLnN0cmluZygpKTsKKworICAgIG1EZWNsYXJlZERldmljZXMuYWRkKGRldmljZURlc2MpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBId01vZHVsZTo6YWRkT3V0cHV0UHJvZmlsZShTdHJpbmc4IG5hbWUsIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIFN0cmluZzggYWRkcmVzcykKK3sKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKG5hbWUsIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpOworCisgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKGNvbmZpZy0+c2FtcGxlX3JhdGUpOworICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKKyAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoY29uZmlnLT5mb3JtYXQpOworCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSk7CisgICAgZGV2RGVzYy0+bUFkZHJlc3MgPSBhZGRyZXNzOworICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmFkZChkZXZEZXNjKTsKKworICAgIHByb2ZpbGUtPmF0dGFjaCh0aGlzKTsKKyAgICBtT3V0cHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBId01vZHVsZTo6cmVtb3ZlT3V0cHV0UHJvZmlsZShTdHJpbmc4IG5hbWUpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1PdXRwdXRQcm9maWxlc1tpXS0+bU5hbWUgPT0gbmFtZSkgeworICAgICAgICAgICAgbU91dHB1dFByb2ZpbGVzLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEh3TW9kdWxlOjphZGRJbnB1dFByb2ZpbGUoU3RyaW5nOCBuYW1lLCBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBTdHJpbmc4IGFkZHJlc3MpCit7CisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbmV3IElPUHJvZmlsZShuYW1lLCBBVURJT19QT1JUX1JPTEVfU0lOSyk7CisKKyAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoY29uZmlnLT5zYW1wbGVfcmF0ZSk7CisgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoY29uZmlnLT5jaGFubmVsX21hc2spOworICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChjb25maWctPmZvcm1hdCk7CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlKTsKKyAgICBkZXZEZXNjLT5tQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuYWRkKGRldkRlc2MpOworCisgICAgQUxPR1YoImFkZElucHV0UHJvZmlsZSgpIG5hbWUgJXMgcmF0ZSAlZCBtYXNrIDB4MDgiLCBuYW1lLnN0cmluZygpLCBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmNoYW5uZWxfbWFzayk7CisKKyAgICBwcm9maWxlLT5hdHRhY2godGhpcyk7CisgICAgbUlucHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBId01vZHVsZTo6cmVtb3ZlSW5wdXRQcm9maWxlKFN0cmluZzggbmFtZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtSW5wdXRQcm9maWxlc1tpXS0+bU5hbWUgPT0gbmFtZSkgeworICAgICAgICAgICAgbUlucHV0UHJvZmlsZXMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCit2b2lkIEh3TW9kdWxlOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSBuYW1lOiAlc1xuIiwgbU5hbWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIC0gaGFuZGxlOiAlZFxuIiwgbUhhbmRsZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSB2ZXJzaW9uOiAldS4ldVxuIiwgbUhhbFZlcnNpb24gPj4gOCwgbUhhbFZlcnNpb24gJiAweEZGKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgaWYgKG1PdXRwdXRQcm9maWxlcy5zaXplKCkpIHsKKyAgICAgICAgd3JpdGUoZmQsICIgIC0gb3V0cHV0czpcbiIsIHN0cmxlbigiICAtIG91dHB1dHM6XG4iKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgb3V0cHV0ICV6dTpcbiIsIGkpOworICAgICAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICAgICAgbU91dHB1dFByb2ZpbGVzW2ldLT5kdW1wKGZkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUlucHV0UHJvZmlsZXMuc2l6ZSgpKSB7CisgICAgICAgIHdyaXRlKGZkLCAiICAtIGlucHV0czpcbiIsIHN0cmxlbigiICAtIGlucHV0czpcbiIpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRQcm9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIGlucHV0ICV6dTpcbiIsIGkpOworICAgICAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICAgICAgbUlucHV0UHJvZmlsZXNbaV0tPmR1bXAoZmQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtRGVjbGFyZWREZXZpY2VzLnNpemUoKSkgeworICAgICAgICB3cml0ZShmZCwgIiAgLSBkZXZpY2VzOlxuIiwgc3RybGVuKCIgIC0gZGV2aWNlczpcbiIpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGVjbGFyZWREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtRGVjbGFyZWREZXZpY2VzW2ldLT5kdW1wKGZkLCA0LCBpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3AgPEh3TW9kdWxlPiBId01vZHVsZUNvbGxlY3Rpb246OmdldE1vZHVsZUZyb21OYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0Cit7CisgICAgc3AgPEh3TW9kdWxlPiBtb2R1bGU7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHN0cmNtcChpdGVtQXQoaSktPm1OYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtb2R1bGU7Cit9CisKKworc3AgPEh3TW9kdWxlPiBId01vZHVsZUNvbGxlY3Rpb246OmdldE1vZHVsZUZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAoreworICAgIHNwIDxId01vZHVsZT4gbW9kdWxlOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaXRlbUF0KGkpLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+bU91dHB1dFByb2ZpbGVzW2pdLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpdGVtQXQoaSktPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+bUlucHV0UHJvZmlsZXNbal0tPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJgorICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1vZHVsZTsKK30KKworc3A8RGV2aWNlRGVzY3JpcHRvcj4gIEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0RGV2aWNlRGVzY3JpcHRvcihjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpIGNvbnN0Cit7CisgICAgU3RyaW5nOCBhZGRyZXNzID0gKGRldmljZV9hZGRyZXNzID09IE5VTEwpID8gU3RyaW5nOCgiIikgOiBTdHJpbmc4KGRldmljZV9hZGRyZXNzKTsKKyAgICAvLyBoYW5kbGUgbGVnYWN5IHJlbW90ZSBzdWJtaXggY2FzZSB3aGVyZSB0aGUgYWRkcmVzcyB3YXMgbm90IGFsd2F5cyBzcGVjaWZpZWQKKyAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpICYmIChhZGRyZXNzLmxlbmd0aCgpID09IDApKSB7CisgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxId01vZHVsZT4gaHdNb2R1bGUgPSBpdGVtQXQoaSk7CisgICAgICAgIGlmIChod01vZHVsZS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9CisgICAgICAgICAgICAgICAgaHdNb2R1bGUtPm1EZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlQWRkcihkZXZpY2UsIGFkZHJlc3MpOworICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CisgICAgICAgIH0KKyAgICAgICAgZGV2aWNlTGlzdCA9IGh3TW9kdWxlLT5tRGVjbGFyZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOworICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KKyAgICAgICAgICAgIG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSk7CisgICAgZGV2RGVzYy0+bU5hbWUgPSBkZXZpY2VfbmFtZTsKKyAgICBkZXZEZXNjLT5tQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgcmV0dXJuIGRldkRlc2M7Cit9CisKK3N0YXR1c190IEh3TW9kdWxlQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkhXIE1vZHVsZXMgZHVtcDpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gSFcgTW9kdWxlICV6dTpcbiIsIGkgKyAxKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZmQpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK30gLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2ZDUxZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6SU9Qcm9maWxlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiSU9Qcm9maWxlLmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitJT1Byb2ZpbGU6OklPUHJvZmlsZShjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKQorICAgIDogQXVkaW9Qb3J0KG5hbWUsIEFVRElPX1BPUlRfVFlQRV9NSVgsIHJvbGUpCit7Cit9CisKK0lPUHJvZmlsZTo6fklPUHJvZmlsZSgpCit7Cit9CisKKy8vIGNoZWNrcyBpZiB0aGUgSU8gcHJvZmlsZSBpcyBjb21wYXRpYmxlIHdpdGggc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisvLyBTYW1wbGluZyByYXRlLCBmb3JtYXQgYW5kIGNoYW5uZWwgbWFzayBtdXN0IGJlIHNwZWNpZmllZCBpbiBvcmRlciB0bworLy8gZ2V0IGEgdmFsaWQgYSBtYXRjaAorYm9vbCBJT1Byb2ZpbGU6OmlzQ29tcGF0aWJsZVByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnVwZGF0ZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICp1cGRhdGVkQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykgY29uc3QKK3sKKyAgICBjb25zdCBib29sIGlzUGxheWJhY2tUaHJlYWQgPSBtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYICYmIG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CisgICAgY29uc3QgYm9vbCBpc1JlY29yZFRocmVhZCA9IG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVggJiYgbVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTks7CisgICAgQUxPR19BU1NFUlQoaXNQbGF5YmFja1RocmVhZCAhPSBpc1JlY29yZFRocmVhZCk7CisKKworICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgLy8ganVzdCBjaGVjayB0eXBlcyBpZiBtdWx0aXBsZSBkZXZpY2VzIGFyZSBzZWxlY3RlZAorICAgICAgICBpZiAocG9wY291bnQoZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pID4gMSkgeworICAgICAgICAgICAgaWYgKChtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSAhPSBkZXZpY2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobVN1cHBvcnRlZERldmljZXMuZ2V0RGV2aWNlKGRldmljZSwgYWRkcmVzcykgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNhbXBsaW5nUmF0ZSA9PSAwKSB7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHVpbnQzMl90IG15VXBkYXRlZFNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICBpZiAoaXNQbGF5YmFja1RocmVhZCAmJiBjaGVja0V4YWN0U2FtcGxpbmdSYXRlKHNhbXBsaW5nUmF0ZSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzUmVjb3JkVGhyZWFkICYmIGNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZShzYW1wbGluZ1JhdGUsICZteVVwZGF0ZWRTYW1wbGluZ1JhdGUpICE9CisgICAgICAgICAgICBOT19FUlJPUikgeworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNQbGF5YmFja1RocmVhZCAmJiBjaGVja0V4YWN0Rm9ybWF0KGZvcm1hdCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdWRpb19mb3JtYXRfdCBteVVwZGF0ZWRGb3JtYXQgPSBmb3JtYXQ7CisgICAgaWYgKGlzUmVjb3JkVGhyZWFkICYmIGNoZWNrQ29tcGF0aWJsZUZvcm1hdChmb3JtYXQsICZteVVwZGF0ZWRGb3JtYXQpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoaXNQbGF5YmFja1RocmVhZCAmJiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSB8fAorICAgICAgICAgICAgY2hlY2tFeGFjdENoYW5uZWxNYXNrKGNoYW5uZWxNYXNrKSAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBteVVwZGF0ZWRDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOworICAgIGlmIChpc1JlY29yZFRocmVhZCAmJiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spIHx8CisgICAgICAgICAgICBjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhjaGFubmVsTWFzaywgJm15VXBkYXRlZENoYW5uZWxNYXNrKSAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChpc1BsYXliYWNrVGhyZWFkICYmIChtRmxhZ3MgJiBmbGFncykgIT0gZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBUaGUgb25seSBpbnB1dCBmbGFnIHRoYXQgaXMgYWxsb3dlZCB0byBiZSBkaWZmZXJlbnQgaXMgdGhlIGZhc3QgZmxhZy4KKyAgICAvLyBBbiBleGlzdGluZyBmYXN0IHN0cmVhbSBpcyBjb21wYXRpYmxlIHdpdGggYSBub3JtYWwgdHJhY2sgcmVxdWVzdC4KKyAgICAvLyBBbiBleGlzdGluZyBub3JtYWwgc3RyZWFtIGlzIGNvbXBhdGlibGUgd2l0aCBhIGZhc3QgdHJhY2sgcmVxdWVzdCwKKyAgICAvLyBidXQgdGhlIGZhc3QgcmVxdWVzdCB3aWxsIGJlIGRlbmllZCBieSBBdWRpb0ZsaW5nZXIgYW5kIGNvbnZlcnRlZCB0byBub3JtYWwgdHJhY2suCisgICAgaWYgKGlzUmVjb3JkVGhyZWFkICYmICgobUZsYWdzIF4gZmxhZ3MpICYKKyAgICAgICAgICAgIH5BVURJT19JTlBVVF9GTEFHX0ZBU1QpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAodXBkYXRlZFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7CisgICAgICAgICp1cGRhdGVkU2FtcGxpbmdSYXRlID0gbXlVcGRhdGVkU2FtcGxpbmdSYXRlOworICAgIH0KKyAgICBpZiAodXBkYXRlZEZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgICp1cGRhdGVkRm9ybWF0ID0gbXlVcGRhdGVkRm9ybWF0OworICAgIH0KKyAgICBpZiAodXBkYXRlZENoYW5uZWxNYXNrICE9IE5VTEwpIHsKKyAgICAgICAgKnVwZGF0ZWRDaGFubmVsTWFzayA9IG15VXBkYXRlZENoYW5uZWxNYXNrOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJT1Byb2ZpbGU6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgQXVkaW9Qb3J0OjpkdW1wKGZkLCA0KTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIGZsYWdzOiAweCUwNHhcbiIsIG1GbGFncyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIGRldmljZXM6XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtU3VwcG9ydGVkRGV2aWNlc1tpXS0+ZHVtcChmZCwgNiwgaSk7CisgICAgfQorfQorCit2b2lkIElPUHJvZmlsZTo6bG9nKCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIEFMT0dWKCIgICAgLSBzYW1wbGluZyByYXRlczogIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgeworICAgICAgICBBTE9HVigiICAlZCIsIG1TYW1wbGluZ1JhdGVzW2ldKTsKKyAgICB9CisKKyAgICBBTE9HVigiICAgIC0gY2hhbm5lbCBtYXNrczogIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFMT0dWKCIgIDB4JTA0eCIsIG1DaGFubmVsTWFza3NbaV0pOworICAgIH0KKworICAgIEFMT0dWKCIgICAgLSBmb3JtYXRzOiAiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFMT0dWKCIgIDB4JTA4eCIsIG1Gb3JtYXRzW2ldKTsKKyAgICB9CisKKyAgICBBTE9HVigiICAgIC0gZGV2aWNlczogMHglMDR4XG4iLCBtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKTsKKyAgICBBTE9HVigiICAgIC0gZmxhZ3M6IDB4JTA0eFxuIiwgbUZsYWdzKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1Nlc3Npb25Sb3V0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXNzaW9uUm91dGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlY2ZhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXNzaW9uUm91dGUuY3BwCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OlNlc3Npb25Sb3V0ZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIlNlc3Npb25Sb3V0ZS5oIgorI2luY2x1ZGUgIkh3TW9kdWxlLmgiCisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLSBTZXNzaW9uUm91dGUgY2xhc3MgaW1wbGVtZW50YXRpb24KK3ZvaWQgU2Vzc2lvblJvdXRlOjpsb2coY29uc3QgY2hhciogcHJlZml4KQoreworICAgIEFMT0dJKCIlc1tTZXNzaW9uUm91dGUgc3RybToweCVYLCBzcmM6JWQsIHNlc3M6MHglWCwgZGV2OjB4JVggcmVmczolZCBhY3Q6JWQiLAorICAgICAgICAgIHByZWZpeCwgbVN0cmVhbVR5cGUsIG1Tb3VyY2UsIG1TZXNzaW9uLAorICAgICAgICAgIG1EZXZpY2VEZXNjcmlwdG9yICE9IDAgPyBtRGV2aWNlRGVzY3JpcHRvci0+dHlwZSgpIDogQVVESU9fREVWSUNFX05PTkUsCisgICAgICAgICAgbVJlZkNvdW50LCBtQWN0aXZpdHlDb3VudCk7Cit9CisKKy8vIC0tLSBTZXNzaW9uUm91dGVNYXAgY2xhc3MgaW1wbGVtZW50YXRpb24KK2Jvb2wgU2Vzc2lvblJvdXRlTWFwOjpoYXNSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICByZXR1cm4gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwICYmIHZhbHVlRm9yKHNlc3Npb24pLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwOworfQorCitib29sIFNlc3Npb25Sb3V0ZU1hcDo6aGFzUm91dGVDaGFuZ2VkKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIGlmIChpbmRleE9mS2V5KHNlc3Npb24pID49IDApIHsKKyAgICAgICAgaWYgKHZhbHVlRm9yKHNlc3Npb24pLT5tQ2hhbmdlZCkgeworICAgICAgICAgICAgdmFsdWVGb3Ioc2Vzc2lvbiktPm1DaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU2Vzc2lvblJvdXRlTWFwOjpyZW1vdmVSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwID8gdmFsdWVGb3Ioc2Vzc2lvbikgOiAwOworICAgIGlmIChyb3V0ZSAhPSAwKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKHJvdXRlLT5tUmVmQ291bnQgPiAwKTsKKyAgICAgICAgLS1yb3V0ZS0+bVJlZkNvdW50OworICAgICAgICBpZiAocm91dGUtPm1SZWZDb3VudCA8PSAwKSB7CisgICAgICAgICAgICByZW1vdmVJdGVtKHNlc3Npb24pOworICAgICAgICB9CisgICAgfQorfQorCitpbnQgU2Vzc2lvblJvdXRlTWFwOjppbmNSb3V0ZUFjdGl2aXR5KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgPyB2YWx1ZUZvcihzZXNzaW9uKSA6IDA7CisgICAgcmV0dXJuIHJvdXRlICE9IDAgPyArKyhyb3V0ZS0+bUFjdGl2aXR5Q291bnQpIDogLTE7Cit9CisKK2ludCBTZXNzaW9uUm91dGVNYXA6OmRlY1JvdXRlQWN0aXZpdHkoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKKyAgICBpZiAocm91dGUgIT0gMCAmJiByb3V0ZS0+bUFjdGl2aXR5Q291bnQgPiAwKSB7CisgICAgICAgIHJldHVybiAtLShyb3V0ZS0+bUFjdGl2aXR5Q291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK3ZvaWQgU2Vzc2lvblJvdXRlTWFwOjpsb2coY29uc3QgY2hhciogY2FwdGlvbikKK3sKKyAgICBBTE9HSSgiJXMgLS0tLSIsIGNhcHRpb24pOworICAgIGZvcihzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHNpemUoKTsgaW5kZXgrKykgeworICAgICAgICB2YWx1ZUF0KGluZGV4KS0+bG9nKCIgICIpOworICAgIH0KK30KKwordm9pZCBTZXNzaW9uUm91dGVNYXA6OmFkZFJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCit7CisgICAgaWYgKG1NYXBUeXBlID09IE1BUFRZUEVfSU5QVVQgJiYgc3RyZWFtVHlwZSAhPSBTZXNzaW9uUm91dGU6OlNUUkVBTV9UWVBFX05BKSB7CisgICAgICAgIEFMT0dFKCJBZGRpbmcgT3V0cHV0IFJvdXRlIHRvIElucHV0Um91dGVNYXAiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAobU1hcFR5cGUgPT0gTUFQVFlQRV9PVVRQVVQgJiYgc291cmNlICE9IFNlc3Npb25Sb3V0ZTo6U09VUkNFX1RZUEVfTkEpIHsKKyAgICAgICAgQUxPR0UoIkFkZGluZyBJbnB1dCBSb3V0ZSB0byBPdXRwdXRSb3V0ZU1hcCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKKworICAgIGlmIChyb3V0ZSAhPSAwKSB7CisgICAgICAgIGlmICgoKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciA9PSAwKSAmJiAoZGVzY3JpcHRvciAhPSAwKSkgfHwKKyAgICAgICAgICAgICAgICAoKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAoKGRlc2NyaXB0b3IgPT0gMCkgfHwgKCFyb3V0ZS0+bURldmljZURlc2NyaXB0b3ItPmVxdWFscyhkZXNjcmlwdG9yKSkpKSkgeworICAgICAgICAgICAgcm91dGUtPm1DaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByb3V0ZS0+bVJlZkNvdW50Kys7CisgICAgICAgIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcm91dGUgPSBuZXcgU2Vzc2lvblJvdXRlKHNlc3Npb24sIHN0cmVhbVR5cGUsIHNvdXJjZSwgZGVzY3JpcHRvciwgdWlkKTsKKyAgICAgICAgcm91dGUtPm1SZWZDb3VudCsrOworICAgICAgICBhZGQoc2Vzc2lvbiwgcm91dGUpOworICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSAwKSB7CisgICAgICAgICAgICByb3V0ZS0+bUNoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Tb3VuZFRyaWdnZXJTZXNzaW9uLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NvdW5kVHJpZ2dlclNlc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTNhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Tb3VuZFRyaWdnZXJTZXNzaW9uLmNwcApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OlNvdW5kVHJpZ2dlclNlc3Npb24iCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJTb3VuZFRyaWdnZXJTZXNzaW9uLmgiCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJTZXNzaW9uQ29sbGVjdGlvbjo6YWNxdWlyZVNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpCit7CisgICAgYWRkKHNlc3Npb24sIGlvSGFuZGxlKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VyU2Vzc2lvbkNvbGxlY3Rpb246OnJlbGVhc2VTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KHNlc3Npb24pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coImFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKCkgc2Vzc2lvbiAlZCBub3QgcmVnaXN0ZXJlZCIsIHNlc3Npb24pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJlbW92ZUl0ZW0oc2Vzc2lvbik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TdHJlYW1EZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ODJlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TdHJlYW1EZXNjcmlwdG9yLmNwcApAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpWb2x1bWVzIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisvLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisjaW5jbHVkZSAiU3RyZWFtRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0gU3RyZWFtRGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitTdHJlYW1EZXNjcmlwdG9yOjpTdHJlYW1EZXNjcmlwdG9yKCkKKyAgICA6ICAgbUluZGV4TWluKDApLCBtSW5kZXhNYXgoMSksIG1DYW5CZU11dGVkKHRydWUpCit7CisgICAgbUluZGV4Q3VyLmFkZChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQsIDApOworfQorCitpbnQgU3RyZWFtRGVzY3JpcHRvcjo6Z2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKK3sKKyAgICBkZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOworICAgIC8vIHRoZXJlIGlzIGFsd2F5cyBhIHZhbGlkIGVudHJ5IGZvciBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQKKyAgICBpZiAobUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA8IDApIHsKKyAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUOworICAgIH0KKyAgICByZXR1cm4gbUluZGV4Q3VyLnZhbHVlRm9yKGRldmljZSk7Cit9CisKK3ZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6Y2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKQoreworICAgIG1JbmRleEN1ci5jbGVhcigpOworfQorCit2b2lkIFN0cmVhbURlc2NyaXB0b3I6OmFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpCit7CisgICAgbUluZGV4Q3VyLmFkZChkZXZpY2UsIGluZGV4KTsKK30KKwordm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpzZXRWb2x1bWVJbmRleE1pbihpbnQgdm9sSW5kZXhNaW4pCit7CisgICAgbUluZGV4TWluID0gdm9sSW5kZXhNaW47Cit9CisKK3ZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6c2V0Vm9sdW1lSW5kZXhNYXgoaW50IHZvbEluZGV4TWF4KQoreworICAgIG1JbmRleE1heCA9IHZvbEluZGV4TWF4OworfQorCit2b2lkIFN0cmVhbURlc2NyaXB0b3I6OnNldFZvbHVtZUN1cnZlUG9pbnQoVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpCit7CisgICAgbVZvbHVtZUN1cnZlW2RldmljZUNhdGVnb3J5XSA9IHBvaW50OworfQorCit2b2lkIFN0cmVhbURlc2NyaXB0b3I6OmR1bXAoaW50IGZkKSBjb25zdAoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCisgICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleEN1ci5zaXplKCk7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlMDR4IDogJTAyZCwgIiwKKyAgICAgICAgICAgICAgICAgbUluZGV4Q3VyLmtleUF0KGkpLAorICAgICAgICAgICAgICAgICBtSW5kZXhDdXIudmFsdWVBdChpKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworfQorCitTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6U3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24oKQoreworICAgIGZvciAoc2l6ZV90IHN0cmVhbSA9IDAgOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgeworICAgICAgICBhZGQoc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtKSwgU3RyZWFtRGVzY3JpcHRvcigpKTsKKyAgICB9Cit9CisKK2Jvb2wgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmNhbkJlTXV0ZWQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgcmV0dXJuIHZhbHVlQXQoc3RyZWFtKS5jYW5CZU11dGVkKCk7Cit9CisKK3ZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmNsZWFyQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIGVkaXRWYWx1ZUF0KHN0cmVhbSkuY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKTsKK30KKwordm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6YWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkKK3sKKyAgICBlZGl0VmFsdWVBdChzdHJlYW0pLmFkZEN1cnJlbnRWb2x1bWVJbmRleChkZXZpY2UsIGluZGV4KTsKK30KKwordm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lQ3VydmVQb2ludChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnBvaW50KQoreworICAgIGVkaXRWYWx1ZUF0KHN0cmVhbSkuc2V0Vm9sdW1lQ3VydmVQb2ludChkZXZpY2VDYXRlZ29yeSwgcG9pbnQpOworfQorCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6Z2V0Vm9sdW1lQ3VydmVQb2ludChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdAoreworICAgIHJldHVybiB2YWx1ZUF0KHN0cmVhbSkuZ2V0Vm9sdW1lQ3VydmVQb2ludChkZXZpY2VDYXRlZ29yeSk7Cit9CisKK3ZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OnNldFZvbHVtZUluZGV4TWluKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLGludCB2b2xJbmRleE1pbikKK3sKKyAgICByZXR1cm4gZWRpdFZhbHVlQXQoc3RyZWFtKS5zZXRWb2x1bWVJbmRleE1pbih2b2xJbmRleE1pbik7Cit9CisKK3ZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OnNldFZvbHVtZUluZGV4TWF4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLGludCB2b2xJbmRleE1heCkKK3sKKyAgICByZXR1cm4gZWRpdFZhbHVlQXQoc3RyZWFtKS5zZXRWb2x1bWVJbmRleE1heCh2b2xJbmRleE1heCk7Cit9CisKK3N0YXR1c190IFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuU3RyZWFtcyBkdW1wOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKKyAgICAgICAgICAgICAiIFN0cmVhbSAgQ2FuIGJlIG11dGVkICBJbmRleCBNaW4gIEluZGV4IE1heCAgSW5kZXggQ3VyIFtkZXZpY2UgOiBpbmRleF0uLi5cbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlMDJ6dSAgICAgICIsIGkpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIHZhbHVlQXQoaSkuZHVtcChmZCk7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTczZTU0MwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmg+CisjaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8Vm9sdW1lLmg+CisjaW5jbHVkZSA8SHdNb2R1bGUuaD4KKyNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgZGVkaWNhdGVkIHRvIHRoZSBwb2xpY3kgbWFuYWdlciB0aGF0IGEgUG9saWN5IEVuZ2luZSBzaGFsbCBpbXBsZW1lbnQuCisgKi8KK2NsYXNzIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZQoreworcHVibGljOgorICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgZW5naW5lIHdhcyBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIGRvbmUgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBNYW5hZ2VyIG9ic2VydmVyIHRoYXQgYWxsb3dzIHRoZSBlbmdpbmUgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gb24gY29sbGVjdGlvbgorICAgICAqIG9mIGRldmljZXMsIHN0cmVhbXMsIEh3TW9kdWxlcywgLi4uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG9ic2VydmVyIGhhbmRsZSBvbiB0aGUgbWFuYWdlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGlucHV0IGRldmljZSBzZWxlY3RlZCBmb3IgYSBnaXZlbiBpbnB1dCBzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGlucHV0U291cmNlIHRvIGdldCB0aGUgc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIGFzc29jaWF0ZWQgdG8KKyAgICAgKgorICAgICAqIEByZXR1cm4gc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIGZvciB0aGUgZ2l2ZW4gaW5wdXQgc291cmNlLCBtYXkgYmUgbm9uZSBpZiBlcnJvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBvdXRwdXQgZGV2aWNlIGFzc29jaWF0ZWQgdG8gYSBnaXZlbiBzdHJhdGVneS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gc3RyZWFtIHR5cGUgZm9yIHdoaWNoIHRoZSBzZWxlY3RlZCBvdXB1dCBkZXZpY2UgaXMgcmVxdWVzdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBzZWxlY3RlZCBvdXB1dCBkZXZpY2UgZm9yIHRoZSBnaXZlbiBzdHJhdGVneSwgbWF5IGJlIG5vbmUgaWYgZXJyb3IuCisgICAgICovCisgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdGF0ZWd5KSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN0cmF0ZWd5IHNlbGVjdGVkIGZvciBhIGdpdmVuIHN0cmVhbSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBzdHJlYW06IGZvciB3aGljaCB0aGUgc2VsZWN0ZWQgc3RyYXRlZ3kgZm9sbG93ZWQgYnkgaXMgcmVxdWVzdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBzdHJhdGVneSB0byBiZSBmb2xsb3dlZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc3RyYXRlZ3kgc2VsZWN0ZWQgZm9yIGEgZ2l2ZW4gdXNhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVzYWdlIHRvIGdldCB0aGUgc2VsZWN0ZWQgc3RyYXRlZ3kgZm9sbG93ZWQgYnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkLgorICAgICAqLworICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgVGVsZXBob255IE1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG1vZGU6IEFuZHJvaWQgUGhvbmUgc3RhdGUgKG5vcm1hbCwgcmluZ3RvbmUsIGNzdiwgaW4gY29tbXVuaWNhdGlvbikKKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgVGVsZXBob255IE1vZGUgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHRlbGVwaG9ueSBNb2RlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHRlbGVwaG9ueSBtb2RlCisgICAgICovCisgICAgdmlydHVhbCBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCBGb3JjZSBVc2UgY29uZmlnIGZvciBhIGdpdmVuIHVzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1c2FnZSBmb3Igd2hpY2ggYSBjb25maWd1cmF0aW9uIHNoYWxsIGJlIGZvcmNlZC4KKyAgICAgKiBAcGFyYW1baW5dIGNvbmZpZyB3aXNoZWQgdG8gYmUgZm9yY2VkIGZvciB0aGUgZ2l2ZW4gdXNhZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBGb3JjZSBVc2UgY29uZmlnIHdhcyBzZXQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZSAoZS5nLiBjb25maWcKKyAgICAgKiBub3QgYWxsb3dlZCBhIGdpdmVuIHVzYWdlLi4uKQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCBGb3JjZSBVc2UgY29uZmlnIGZvciBhIGdpdmVuIHVzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1c2FnZSBmb3Igd2hpY2ggYSBjb25maWd1cmF0aW9uIHNoYWxsIGJlIGZvcmNlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29uZmlnIHdpc2hlZCB0byBiZSBmb3JjZWQgZm9yIHRoZSBnaXZlbiB1c2FnZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgZGV2aWNlKHMpLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkZXZEZXNjIGZvciB3aGljaCB0aGUgc3RhdGUgaGFzIGNoYW5nZWQuCisgICAgICogQHBhcmFtW2luXSBzdGF0ZSBvZiBhdmFpbGFiaWxpdHkgb2YgdGhpcyh0aGVzZSkgZGV2aWNlKHMpLgorICAgICAqCisgICAgICogQHJldHVybiBOT19FUlJPUiBpZiBkZXZpY2VzIGNyaXRlcmlvbiB1cGRhdGVkIGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpID0gMDsKKworICAgIC8qKgorICAgICAqIFRyYW5zbGF0ZSBhIHZvbHVtZSBpbmRleCBnaXZlbiBieSB0aGUgVUkgdG8gYW4gYW1wbGlmaWNhdGlvbiB2YWx1ZSBpbiBkQiBmb3IgYSBzdHJlYW0gdHlwZQorICAgICAqIGFuZCBhIGRldmljZSBjYXRlZ29yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZGV2aWNlQ2F0ZWdvcnkgZm9yIHdoaWNoIHRoZSBjb252ZXJzaW9uIGlzIHJlcXVlc3RlZC4KKyAgICAgKiBAcGFyYW1baW5dIHN0cmVhbSB0eXBlIGZvciB3aGljaCB0aGUgY29udmVyc2lvbiBpcyByZXF1ZXN0ZWQuCisgICAgICogQHBhcmFtW2luXSBpbmRleEluVWkgaW5kZXggcmVjZWl2ZWQgZnJvbSB0aGUgVUkgdG8gYmUgdHJhbnNsYXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW1wbGlmaWNhdGlvbiB2YWx1ZSBpbiBkQiBtYXRjaGluZyB0aGUgVUkgaW5kZXggZm9yIHRoaXMgZ2l2ZW4gZGV2aWNlIGFuZCBzdHJlYW0uCisgICAgICovCisgICAgdmlydHVhbCBmbG9hdCB2b2xJbmRleFRvRGIoVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4SW5VaSkgPSAwOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgbWluIC8gbWF4IGluZGV4IG9mIHZvbHVtZSBhcHBsaWNhYmxlIGZvciBhIGdpdmVuIHN0cmVhbSB0eXBlLiBUaGVzZSBpbmRleGVzCisgICAgICogd2lsbCBiZSB1c2VkIHVwb24gY29udmVyc2lvbiBvZiBVSSBpbmRleCB0byB2b2x1bWUgYW1wbGlmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gc3RyZWFtIHR5cGUgZm9yIHdoaWNoIHRoZSBpbmRleGVzIG5lZWQgdG8gYmUgc2V0CisgICAgICogQHBhcmFtW2luXSBpbmRleE1pbiBNaW5pbXVtIGluZGV4IGFsbG93ZWQgZm9yIHRoaXMgc3RyZWFtLgorICAgICAqIEBwYXJhbVtpbl0gaW5kZXhNYXggTWF4aW11bSBpbmRleCBhbGxvd2VkIGZvciB0aGlzIHN0cmVhbS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHZvbHVtZSBjdXJ2ZXMgZm9yIGVhY2ggc3RyYXRlZ3kgYW5kIGRldmljZSBjYXRlZ29yeQorICAgICAqCisgICAgICogQHBhcmFtW2luXSBpc1NwZWFrZXJEcmNFbmFibGVkIHRydWUgb24gZGV2aWNlcyB0aGF0IHVzZSBEUkMgb24gdGhlIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgICAgICAgICAgICBwYXRoIHRvIGJvb3N0IHNvZnQgc291bmRzLCB1c2VkIHRvIGFkanVzdCB2b2x1bWUgY3VydmVzIGFjY29yZGluZ2x5CisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoYm9vbCBpc1NwZWFrZXJEcmNFbmFibGVkKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UoKSB7fQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZDQzZGYyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPEF1ZGlvR2Fpbi5oPgorI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgorI2luY2x1ZGUgPEF1ZGlvUGF0Y2guaD4KKyNpbmNsdWRlIDxJT1Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8QXVkaW9JbnB1dERlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxBdWRpb091dHB1dERlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1peC5oPgorI2luY2x1ZGUgPFNvdW5kVHJpZ2dlclNlc3Npb24uaD4KKyNpbmNsdWRlIDxTdHJlYW1EZXNjcmlwdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBhbiBvYnNlcnZlciB0aGF0IHRoZSBtYW5hZ2VyIHNoYWxsIGltcGxlbWVudCB0byBhbGxvd3MgZS5nLiB0aGUgZW5naW5lCisgKiB0byBhY2Nlc3MgdG8gcG9saWN5IHBpbGxhcnMgZWxlbWVudHMgKGxpa2Ugb3V0cHV0IC8gaW5wdXQgZGVzY3JpdG9ycyBjb2xsZWN0aW9ucywKKyAqIEh3TW9kdWxlIGNvbGxlY3Rpb25zLCBBdWRpb01peCwgLi4uCisgKi8KK2NsYXNzIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyCit7CitwdWJsaWM6CisgICAgdmlydHVhbCBjb25zdCBBdWRpb1BhdGNoQ29sbGVjdGlvbiAmZ2V0QXVkaW9QYXRjaGVzKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBjb25zdCBTb3VuZFRyaWdnZXJTZXNzaW9uQ29sbGVjdGlvbiAmZ2V0U291bmRUcmlnZ2VyU2Vzc2lvbkNvbGxlY3Rpb24oKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGNvbnN0IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbiAmZ2V0QXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmZ2V0T3V0cHV0cygpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgY29uc3QgQXVkaW9JbnB1dENvbGxlY3Rpb24gJmdldElucHV0cygpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgY29uc3QgRGV2aWNlVmVjdG9yICZnZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBjb25zdCBEZXZpY2VWZWN0b3IgJmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24gJmdldFN0cmVhbURlc2NyaXB0b3JzKCkgPSAwOworCisgICAgdmlydHVhbCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZ2V0RGVmYXVsdE91dHB1dERldmljZSgpIGNvbnN0ID0gMDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyKCkge30KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIxOGM1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDU5IEBACitpZmVxICgkKFVTRV9DT05GSUdVUkFCTEVfQVVESU9fUE9MSUNZKSwgMSkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjIENvbXBvbmVudCBidWlsZAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgc3JjL0VuZ2luZS5jcHAgXAorICAgIHNyYy9FbmdpbmVJbnN0YW5jZS5jcHAgXAorICAgIHNyYy9TdHJlYW0uY3BwIFwKKyAgICBzcmMvU3RyYXRlZ3kuY3BwIFwKKyAgICBzcmMvVXNhZ2UuY3BwIFwKKyAgICBzcmMvSW5wdXRTb3VyY2UuY3BwIFwKKworYXVkaW9fcG9saWN5X2VuZ2luZV9pbmNsdWRlc19jb21tb24gOj0gXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUgXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlCisKK0xPQ0FMX0NGTEFHUyArPSBcCisgICAgLVdhbGwgXAorICAgIC1XZXJyb3IgXAorICAgIC1XZXh0cmEgXAorCitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gXAorICAgICQoYXVkaW9fcG9saWN5X2VuZ2luZV9pbmNsdWRlc19jb21tb24pCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoYXVkaW9fcG9saWN5X2VuZ2luZV9pbmNsdWRlc19jb21tb24pIFwKKyAgICAkKFRBUkdFVF9PVVRfSEVBREVSUykvaHcgXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBmcmFtZXdvcmtzLWF2KSBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZQorCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYm1lZGlhX2hlbHBlciBcCisgICAgbGliYXVkaW9wb2xpY3lwZnd3cmFwcGVyIFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGliYXVkaW91dGlscyBcCisgICAgbGlicGFyYW1ldGVyCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUmVjdXJzaXZlIGNhbGwgc3ViLWZvbGRlciBBbmRyb2lkLm1rCisjCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmM0YmUyYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlL0F1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKK2NsYXNzIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZTsKK2NsYXNzIEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlOworCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworCitjbGFzcyBFbmdpbmU7CisKK2NsYXNzIEVuZ2luZUluc3RhbmNlCit7Citwcm90ZWN0ZWQ6CisgICAgRW5naW5lSW5zdGFuY2UoKTsKKworcHVibGljOgorICAgIHZpcnR1YWwgfkVuZ2luZUluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgQXVkaW8gUG9saWN5IEVuZ2luZSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcG9pbnRlciB0byBSb3V0ZSBNYW5hZ2VyIEluc3RhbmNlIG9iamVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgRW5naW5lSW5zdGFuY2UgKmdldEluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgcXVlcnkuCisgICAgICogVGhlIGZpcnN0IGNsaWVudCBvZiBhbiBpbnRlcmZhY2Ugb2YgdGhlIHBvbGljeSBlbmdpbmUgd2lsbCBzdGFydCB0aGUgc2luZ2xldG9uLgorICAgICAqCisgICAgICogQHRwYXJhbSBSZXF1ZXN0ZWRJbnRlcmZhY2U6IGludGVyZmFjZSB0aGF0IHRoZSBjbGllbnQgaXMgd2lzaGluZyB0byByZXRyaWV2ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW50ZXJmYWNlIGhhbmRsZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVxdWVzdGVkSW50ZXJmYWNlPgorICAgIFJlcXVlc3RlZEludGVyZmFjZSAqcXVlcnlJbnRlcmZhY2UoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIC8qKgorICAgICAqIEdldCBBdWRpbyBQb2xpY3kgRW5naW5lIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHJldHVybiBBdWRpbyBQb2xpY3kgRW5naW5lIHNpbmdsZXRvbi4KKyAgICAgKi8KKyAgICBFbmdpbmUgKmdldEVuZ2luZSgpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLworICAgIEVuZ2luZUluc3RhbmNlKGNvbnN0IEVuZ2luZUluc3RhbmNlICZvYmplY3QpOworICAgIEVuZ2luZUluc3RhbmNlICZvcGVyYXRvcj0oY29uc3QgRW5naW5lSW5zdGFuY2UgJm9iamVjdCk7Cit9OworCisvKioKKyAqIExpbWl0IHRlbXBsYXRlIGluc3RhbnRhdGlvbiB0byBzdXBwb3J0ZWQgdHlwZSBpbnRlcmZhY2VzLgorICogQ29tcGlsZSB0aW1lIGVycm9yIHdpbGwgY2xhaW0gaWYgaW52YWxpZCBpbnRlcmZhY2UgaXMgcmVxdWVzdGVkLgorICovCit0ZW1wbGF0ZSA8PgorQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlICpFbmdpbmVJbnN0YW5jZTo6cXVlcnlJbnRlcmZhY2UoKSBjb25zdDsKKwordGVtcGxhdGUgPD4KK0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICpFbmdpbmVJbnN0YW5jZTo6cXVlcnlJbnRlcmZhY2UoKSBjb25zdDsKKworfTsgLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9yb3VuZHVwLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9FbmdpbmVEZWZpbml0aW9uLmgKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpzaW1pbGFyaXR5IGluZGV4IDY4JQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL25iYWlvL3JvdW5kdXAuaApyZW5hbWUgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUvRW5naW5lRGVmaW5pdGlvbi5oCmluZGV4IDRjM2NjMjUuLjU0ZDhkYjUKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9yb3VuZHVwLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUvRW5naW5lRGVmaW5pdGlvbi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTggKzE0LDkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgUk9VTkRVUF9ICi0jZGVmaW5lIFJPVU5EVVBfSAorI3ByYWdtYSBvbmNlCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKKyNpbmNsdWRlIDxWb2x1bWUuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKLS8vIFJvdW5kIHVwIHRvIHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMgotdW5zaWduZWQgcm91bmR1cCh1bnNpZ25lZCB2KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmICAvLyBST1VORFVQX0gKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8Vm9sdW1lQ3VydmVQb2ludD4gVm9sdW1lQ3VydmVQb2ludHM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzRkYWJhNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaApAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8RW5naW5lRGVmaW5pdGlvbi5oPgorI2luY2x1ZGUgPFZvbHVtZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgdGhlIHBhcmFtZXRlciBwbHVnaW4gdG86CisgKiAgLSBpbnN0YW50aWF0ZSBhbGwgdGhlIG1lbWJlcnMgb2YgdGhlIHBvbGljeSBlbmdpbmUgKHN0cmF0ZWdpZXMsIGlucHV0IHNvdXJjZXMsIHVzYWdlcywgcHJvZmlsZXMpCisgKiAgLSBrZWVwIHVwIHRvIGRhdGUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlc2UgcG9saWN5IG1lbWJlcnMgKCBpLmUuIGRldmljZXMgdG8gYmUgdXNlZCBmb3IgYQorICogICAgc3RyYXRlZ3ksIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkIGJ5IGEgdXNhZ2Ugb3IgYSBzdHJlYW0sIC4uLikKKyAqLworY2xhc3MgQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzdHJhdGVneSB0byB0aGUgZW5naW5lCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIHN0cmF0ZWd5IHRvIGFkZAorICAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllcjogdGhlIG51bWVyaWNhbCB2YWx1ZSBhc3NvY2lhdGVkIHRvIHRoaXMgbWVtYmVyLiBJdCBNVVNUIG1hdGNoIGVpdGhlcgorICAgICAqICAgICAgICAgICAgc3lzdGVtL2F1ZGlvLmggb3Igc3lzdGVtL2F1ZGlvX3BvbGljeS5oIGVudW1yYXRpb24gdmFsdWUgaW4gb3JkZXIgdG8gbGluayB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBjb250cm9sZWQgYnkgdGhlIFBGVyBhbmQgdGhlIHBvbGljeSBtYW5hZ2VyIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIHN0cmF0ZWd5IGhhcyBiZWVuIGFkZGVkIHN1Y2Nlc3NmdWxseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGFkZFN0cmF0ZWd5KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCByb3V0aW5nX3N0cmF0ZWd5IGlkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzdHJlYW1zIHRvIHRoZSBlbmdpbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIHN0cmVhbSB0byBhZGQKKyAgICAgKiBAcGFyYW1baW5dIGlkZW50aWZpZXI6IHRoZSBudW1lcmljYWwgdmFsdWUgYXNzb2NpYXRlZCB0byB0aGlzIG1lbWJlci4gSXQgTVVTVCBtYXRjaCBlaXRoZXIKKyAgICAgKiAgICAgICAgICAgIHN5c3RlbS9hdWRpby5oIG9yIHN5c3RlbS9hdWRpb19wb2xpY3kuaCBlbnVtcmF0aW9uIHZhbHVlIGluIG9yZGVyIHRvIGxpbmsgdGhlCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgY29udHJvbGVkIGJ5IHRoZSBQRlcgYW5kIHRoZSBwb2xpY3kgbWFuYWdlciBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBzdHJlYW0gaGFzIGJlZW4gYWRkZWQgc3VjY2Vzc2Z1bGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqLworICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgYWRkU3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zdHJlYW1fdHlwZV90IGlkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSB1c2FnZSB0byB0aGUgZW5naW5lCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIHVzYWdlIHRvIGFkZAorICAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllcjogdGhlIG51bWVyaWNhbCB2YWx1ZSBhc3NvY2lhdGVkIHRvIHRoaXMgbWVtYmVyLiBJdCBNVVNUIG1hdGNoIGVpdGhlcgorICAgICAqICAgICAgICAgICAgc3lzdGVtL2F1ZGlvLmggb3Igc3lzdGVtL2F1ZGlvX3BvbGljeS5oIGVudW1yYXRpb24gdmFsdWUgaW4gb3JkZXIgdG8gbGluayB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBjb250cm9sZWQgYnkgdGhlIFBGVyBhbmQgdGhlIHBvbGljeSBtYW5hZ2VyIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIHVzYWdlIGhhcyBiZWVuIGFkZGVkIHN1Y2Nlc3NmdWxseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGFkZFVzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb191c2FnZV90IGlkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gaW5wdXQgc291cmNlIHRvIHRoZSBlbmdpbmUKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gbmFtZSBvZiB0aGUgaW5wdXQgc291cmNlIHRvIGFkZAorICAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllcjogdGhlIG51bWVyaWNhbCB2YWx1ZSBhc3NvY2lhdGVkIHRvIHRoaXMgbWVtYmVyLiBJdCBNVVNUIG1hdGNoIGVpdGhlcgorICAgICAqICAgICAgICAgICAgc3lzdGVtL2F1ZGlvLmggb3Igc3lzdGVtL2F1ZGlvX3BvbGljeS5oIGVudW1yYXRpb24gdmFsdWUgaW4gb3JkZXIgdG8gbGluayB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBjb250cm9sZWQgYnkgdGhlIFBGVyBhbmQgdGhlIHBvbGljeSBtYW5hZ2VyIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIGlucHV0IHNvdXJjZSBoYXMgYmVlbiBhZGRlZCBzdWNjZXNzZnVsbHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICAqCisgICAgICovCisgICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBhZGRJbnB1dFNvdXJjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYXVkaW9fc291cmNlX3QgaWQpID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGV2aWNlIHRvIGJlIHVzZWQgYnkgYSBzdHJhdGVneS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gc3RyYXRlZ3k6IG5hbWUgb2YgdGhlIHN0cmF0ZWd5IGZvciB3aGljaCB0aGUgZGV2aWNlIHRvIHVzZSBoYXMgdG8gYmUgc2V0CisgICAgICogQHBhcmFtW2luXSBkZXZpY2VzOyBtYXNrIG9mIGRldmljZXMgdG8gYmUgdXNlZCBmb3IgdGhlIGdpdmVuIHN0cmF0ZWd5LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2VzIHdlcmUgc2V0IGNvcnJlY2x0eSBmb3IgdGhpcyBzdHJhdGVneSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBzZXREZXZpY2VGb3JTdHJhdGVneShjb25zdCByb3V0aW5nX3N0cmF0ZWd5ICZzdHJhdGVneSwgYXVkaW9fZGV2aWNlc190IGRldmljZXMpID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQgYnkgYSBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHN0cmVhbTogbmFtZSBvZiB0aGUgc3RyZWFtIGZvciB3aGljaCB0aGUgc3RyYXRlZ3kgdG8gdXNlIGhhcyB0byBiZSBzZXQKKyAgICAgKiBAcGFyYW1baW5dIHN0cmF0ZWd5IHRvIGZvbGxvdyBmb3IgdGhlIGdpdmVuIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyYXRlZ3kgd2VyZSBzZXQgY29ycmVjbHR5IGZvciB0aGlzIHN0cmVhbSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBzZXRTdHJhdGVneUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQgYnkgYSBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHN0cmVhbTogbmFtZSBvZiB0aGUgc3RyZWFtIGZvciB3aGljaCB0aGUgc3RyYXRlZ3kgdG8gdXNlIGhhcyB0byBiZSBzZXQKKyAgICAgKiBAcGFyYW1baW5dIHN0cmF0ZWd5IHRvIGZvbGxvdyBmb3IgdGhlIGdpdmVuIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyYXRlZ3kgd2VyZSBzZXQgY29ycmVjbHR5IGZvciB0aGlzIHN0cmVhbSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBjYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50cyAmcG9pbnRzKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkIGJ5IGEgdXNhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVzYWdlOiBuYW1lIG9mIHRoZSB1c2FnZSBmb3Igd2hpY2ggdGhlIHN0cmF0ZWd5IHRvIHVzZSBoYXMgdG8gYmUgc2V0CisgICAgICogQHBhcmFtW2luXSBzdHJhdGVneSB0byBmb2xsb3cgZm9yIHRoZSBnaXZlbiB1c2FnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyYXRlZ3kgd2VyZSBzZXQgY29ycmVjbHR5IGZvciB0aGlzIHVzYWdlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHNldFN0cmF0ZWd5Rm9yVXNhZ2UoY29uc3QgYXVkaW9fdXNhZ2VfdCAmdXNhZ2UsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaW5wdXQgZGV2aWNlIHRvIGJlIHVzZWQgYnkgYW4gaW5wdXQgc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBpbnB1dFNvdXJjZTogbmFtZSBvZiB0aGUgaW5wdXQgc291cmNlIGZvciB3aGljaCB0aGUgZGV2aWNlIHRvIHVzZSBoYXMgdG8gYmUgc2V0CisgICAgICogQHBhcmFtW2luXSBkZXZpY2VzOyBtYXNrIG9mIGRldmljZXMgdG8gYmUgdXNlZCBmb3IgdGhlIGdpdmVuIGlucHV0IHNvdXJjZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlcyB3ZXJlIHNldCBjb3JyZWNsdHkgZm9yIHRoaXMgaW5wdXQgc291cmNlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHNldERldmljZUZvcklucHV0U291cmNlKGNvbnN0IGF1ZGlvX3NvdXJjZV90ICZpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSB7fQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MDJmZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNyBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSZWN1cnNpdmUgY2FsbCBzdWItZm9sZGVyIEFuZHJvaWQubWsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWIxOTAyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTA1IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQE5PVEU6CisjIEF1ZGlvIFBvbGljeSBFbmdpbmUgY29uZmlndXJhYmxlIGV4YW1wbGUgZm9yIGdlbmVyaWMgZGV2aWNlIGJ1aWxkCisjCisjIEFueSB2ZW5kb3Igc2hhbGwgaGF2ZSBpdHMgb3duIGNvbmZpZ3VyYXRpb24gd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIGRldmljZSBmb2xkZXIKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworUEZXX0NPUkUgOj0gZXh0ZXJuYWwvcGFyYW1ldGVyLWZyYW1ld29yaworQlVJTERfUEZXX1NFVFRJTkdTIDo9ICQoUEZXX0NPUkUpL3N1cHBvcnQvYW5kcm9pZC9idWlsZF9wZndfc2V0dGluZ3MubWsKK1BGV19ERUZBVUxUX1NDSEVNQVNfRElSIDo9ICQoUEZXX0NPUkUpL1NjaGVtYXMKK1BGV19TQ0hFTUFTX0RJUiA6PSAkKFBGV19ERUZBVUxUX1NDSEVNQVNfRElSKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ09ORklHVVJBVElPTiBGSUxFUworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMgUG9saWN5IFBGVyB0b3AgbGV2ZWwgZmlsZSAjIyMjIyMjIyMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrCitMT0NBTF9TUkNfRklMRVMgOj0gJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKKworIyMjIyMjIyMjIyBQb2xpY3kgUEZXIFN0cnVjdHVyZXMgIyMjIyMjIyMjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IFBvbGljeUNsYXNzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorTE9DQUxfU1JDX0ZJTEVTIDo9IFN0cnVjdHVyZS8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gUG9saWN5U3Vic3lzdGVtLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAorICAgIFBvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwgXAorICAgIFBvbGljeVN1YnN5c3RlbS1Wb2x1bWUueG1sIFwKKyAgICBsaWJwb2xpY3ktc3Vic3lzdGVtIFwKKworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5CitMT0NBTF9TUkNfRklMRVMgOj0gU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5CitMT0NBTF9TUkNfRklMRVMgOj0gU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBQb2xpY3lTdWJzeXN0ZW0tVm9sdW1lLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorTE9DQUxfU1JDX0ZJTEVTIDo9IFN0cnVjdHVyZS8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworIyMjIyMjIyMjIFBvbGljeSBQRlcgU2V0dGluZ3MgIyMjIyMjIyMjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrLnBvbGljeQorTE9DQUxfTU9EVUxFX1NURU0gOj0gUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU2V0dGluZ3MvUG9saWN5CitMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSBcCisgICAgICAgIFBvbGljeUNsYXNzLnhtbCBcCisgICAgICAgIFBvbGljeVN1YnN5c3RlbS54bWwgXAorICAgICAgICBQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorCitpZmVxICgkKHBmd19yZWJ1aWxkX3NldHRpbmdzKSx0cnVlKQorUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorUEZXX0NSSVRFUklBX0ZJTEUgOj0gJChMT0NBTF9QQVRIKS9wb2xpY3lfY3JpdGVyaWEudHh0CitQRldfRUREX0ZJTEVTIDo9IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X21lZGlhLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9waG9uZS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZHRtZi5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9yZXJvdXRpbmcucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy92b2x1bWVzLnBmdworCitpbmNsdWRlICQoQlVJTERfUEZXX1NFVFRJTkdTKQorZWxzZQorIyBVc2UgdGhlIGV4aXN0aW5nIGZpbGUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBTZXR0aW5ncy8kKExPQ0FMX01PRFVMRV9TVEVNKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorZW5kaWYgIyBwZndfcmVidWlsZF9zZXR0aW5ncwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjkwNTIwMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKQEAgLTAsMCArMSwxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvbi54c2QiCisgICAgU3lzdGVtQ2xhc3NOYW1lPSJQb2xpY3kiIFNlcnZlclBvcnQ9IjUwMTkiIFR1bmluZ0FsbG93ZWQ9InRydWUiPgorCisgICAgPFN1YnN5c3RlbVBsdWdpbnM+CisgICAgICAgIDxMb2NhdGlvbiBGb2xkZXI9IiI+CisgICAgICAgICAgICA8UGx1Z2luIE5hbWU9ImxpYnBvbGljeS1zdWJzeXN0ZW0uc28iLz4KKyAgICAgICAgPC9Mb2NhdGlvbj4KKyAgICA8L1N1YnN5c3RlbVBsdWdpbnM+CisgICAgPFN0cnVjdHVyZURlc2NyaXB0aW9uRmlsZUxvY2F0aW9uIFBhdGg9IlN0cnVjdHVyZS9Qb2xpY3kvUG9saWN5Q2xhc3MueG1sIi8+CisgICAgPFNldHRpbmdzQ29uZmlndXJhdGlvbj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZURvbWFpbnNGaWxlTG9jYXRpb24gUGF0aD0iU2V0dGluZ3MvUG9saWN5L1BvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sIi8+CisgICAgPC9TZXR0aW5nc0NvbmZpZ3VyYXRpb24+Cis8L1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1JFQURNRS5tZCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNjY4ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1JFQURNRS5tZApAQCAtMCwwICsxLDExIEBACitDb25maWd1cmFibGUgUG9saWN5IEVuZ2luZSBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGZvbGRlciBleHBvc2VzIGEgZ2VuZXJpYyBmdW5jdGlvbmFsIGNvbmZpZ3VyYWJsZSBwb2xpY3kgZW5naW5lIGNvbmZpZ3VyYXRpb24gZmlsZXMKK3RvIHByb3ZpZGUgdG8gaGF2ZSBhIHByb2R1Y3QgZm9sbG93aW5nIHRoZSBuZXh1cyBleHBlcmllbmNlLgorCitBIHZlbmRvciB3aXNoaW5nIHRvIGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3Igc2hhbGwgcHJvdmlkZXMgaXRzIG93biBzZXQgb2YgY29uZmlndXJhdGlvbiBmaWxlcword2l0aGluIHRoZSBkZXZpY2UgZm9sZGVyIGZvciB0aGUgcHJvZHVjdCB0byBjdXN0b21pemUuCisKK0ZvciBhbnkgcXVlc3Rpb24gYWJvdXQgdGhlIHBhcmFtZXRlciBmcmFtZXdvcmsgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMsCitTZWUgW3RoZSB3aWtpIG9uIGdpdGh1Yl0oaHR0cHM6Ly9naXRodWIuY29tLzAxb3JnL3BhcmFtZXRlci1mcmFtZXdvcmsvd2lraSkuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL1BvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9Qb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2IwNzIzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9Qb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbApAQCAtMCwwICsxLDExMjk4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAjIyMjIERPIE5PVCBFRElUIFRISVMgRklMRSAjIyMjIC0tPgorPENvbmZpZ3VyYWJsZURvbWFpbnMgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvQ29uZmlndXJhYmxlRG9tYWlucy54c2QiIFN5c3RlbUNsYXNzTmFtZT0iUG9saWN5Ij4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5NZWRpYS5VbnJlYWNoYWJsZURldmljZXMiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5NZWRpYS5EZXZpY2UyIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUmVtb3RlU3VibWl4Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iUmVtb3RlU3VibWl4Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHAiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwSGVhZHBob25lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHBTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRm9yY2VTcGVha2VyIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHBob25lIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkxpbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJXaXJlZEhlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JBY2Nlc3NvcnkiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JBY2Nlc3NvcnkiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JEZXZpY2UiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZ3RsRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJEZ3RsRG9ja0hlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBdXhEaWdpdGFsIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iSGRtaSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkFubGdEb2NrSGVhZHNldCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JEb2NrIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUFuYWxvZ0RvY2siLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTcGVha2VyIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVmYXVsdCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZW1vdGVTdWJtaXgiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBTcGVha2VyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRm9yY2VTcGVha2VyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkcGhvbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiQWNjZXNzb3J5Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQXV4RGlnaXRhbCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNwZWFrZXIiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5Lk1lZGlhLkFyYyIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iSGRtaUFyYyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vdFNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5Lk1lZGlhLlNwZGlmIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2VsZWN0ZWQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJTcGRpZiIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vdFNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5Lk1lZGlhLkF1eExpbmUiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkF1eExpbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb3RTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImF1eF9saW5lIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vdFNlbGVjdGVkIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImF1eF9saW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5QaG9uZS5VbnJlYWNoYWJsZURldmljZXMiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuUGhvbmUuRGV2aWNlIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvQ2Fya2l0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoU2NvQ2Fya2l0Ii8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY29IZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoU2NvSGVhZHNldCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUJ0U2NvIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoU2NvIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoU2NvIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VCdFNjbyIvPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlTm9uZSIvPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZU5vbmUiLz4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHBTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHBob25lIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHNldCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JEZXZpY2UiLz4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VCdFNjbyIvPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlTm9uZSIvPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iVXNiQWNjZXNzb3J5Ii8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JBY2Nlc3NvcnkiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JBY2Nlc3NvcnkiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iRGd0bERvY2tIZWFkc2V0Ii8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkhkbWkiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJIZG1pIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkFubGdEb2NrSGVhZHNldCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJFYXJwaWVjZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkVhcnBpZWNlIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkxpbmUiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJMaW5lIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNwZWFrZXIiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNjb0NhcmtpdCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY29IZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aFNjbyI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBTcGVha2VyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHBob25lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiQWNjZXNzb3J5Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRndGxEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJIZG1pIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJFYXJwaWVjZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNwZWFrZXIiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVmYXVsdCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuU29uaWZpY2F0aW9uLlVucmVhY2hhYmxlRGV2aWNlcyIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuU29uaWZpY2F0aW9uLlNwZWFrZXIiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZWFrZXIiLz4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iRXhjbHVkZXMiIFZhbHVlPSJMaW5lIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb3RTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuU29uaWZpY2F0aW9uLkRldmljZTIiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwSGVhZHBob25lcyI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBTcGVha2VyIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvQ2Fya2l0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUJ0U2NvIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhTY29DYXJraXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTY29IZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUJ0U2NvIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhTY29IZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUJ0U2NvIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhTY28iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHBob25lIi8+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iTGluZSIvPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkc2V0Ii8+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JEZXZpY2UiLz4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iVXNiQWNjZXNzb3J5Ii8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkFjY2Vzc29yeSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkFjY2Vzc29yeSIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRndGxEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkRndGxEb2NrSGVhZHNldCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkFubGdEb2NrSGVhZHNldCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JEb2NrIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUFuYWxvZ0RvY2siLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJFYXJwaWVjZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJFYXJwaWVjZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vbmUiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwSGVhZHBob25lcyI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNjb0NhcmtpdCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkFjY2Vzc29yeSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBbmxnRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkVhcnBpZWNlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb25lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuU29uaWZpY2F0aW9uUmVzcGVjdGZ1bC5VbnJlYWNoYWJsZURldmljZXMiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ii8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuU29uaWZpY2F0aW9uUmVzcGVjdGZ1bC5TcGVha2VycyIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNwZWFrZXJTYWZlIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iU3BlYWtlclNhZmUiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU3BlYWtlciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZWFrZXIiLz4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iRXhjbHVkZXMiIFZhbHVlPSJMaW5lIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb25lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTcGVha2VyU2FmZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTcGVha2VyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5LlNvbmlmaWNhdGlvblJlc3BlY3RmdWwuRGV2aWNlMiIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHAiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY29DYXJraXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aFNjb0NhcmtpdCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aFNjb0hlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aFNjb0hlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY28iPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aFNjbyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHBob25lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJXaXJlZEhlYWRwaG9uZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkxpbmVXaGVuRm9sbG93TWVkaWFTdHJhdGVneSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJXaXJlZEhlYWRwaG9uZSIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJXaXJlZEhlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iVXNiQWNjZXNzb3J5Ii8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkRldmljZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkFjY2Vzc29yeSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkFjY2Vzc29yeSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRndGxEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkRndGxEb2NrSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkF1eERpZ2l0YWwiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJIZG1pIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQW5sZ0RvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JEb2NrIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUFuYWxvZ0RvY2siLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkFubGdEb2NrSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkVhcnBpZWNlIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkVhcnBpZWNlIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJMaW5lIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwSGVhZHBob25lcyI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY29DYXJraXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoU2NvSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY28iPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkcGhvbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZVdoZW5Gb2xsb3dNZWRpYVN0cmF0ZWd5Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiQWNjZXNzb3J5Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRndGxEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBdXhEaWdpdGFsIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJFYXJwaWVjZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5EdG1mLlVucmVhY2hhYmxlRGV2aWNlcyIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ii8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5EdG1mLkRldmljZTIiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZW1vdGVTdWJtaXgiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iUmVtb3RlU3VibWl4Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkZvcmNlU3BlYWtlcldoZW5Ob3RJbkNhbGwiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY29IZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoU2NvSGVhZHNldCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUJ0U2NvIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoU2NvIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoU2NvIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkcGhvbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lV2hlbkZvbGxvd2luZ01lZGlhIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkxpbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iRXhjbHVkZXMiIFZhbHVlPSJVc2JBY2Nlc3NvcnkiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JEZXZpY2UiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JBY2Nlc3NvcnkiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiQWNjZXNzb3J5Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkRndGxEb2NrSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkhkbWkiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iSGRtaSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckRvY2siIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQW5hbG9nRG9jayIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQW5sZ0RvY2tIZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRWFycGllY2UiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJFYXJwaWVjZSIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lV2hlbkZhbGxUaHJvdWdoUGhvbmUiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJMaW5lIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNwZWFrZXIiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZW1vdGVTdWJtaXgiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkZvcmNlU3BlYWtlcldoZW5Ob3RJbkNhbGwiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY29IZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoU2NvIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkcGhvbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lV2hlbkZvbGxvd2luZ01lZGlhIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiQWNjZXNzb3J5Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iSGRtaSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkVhcnBpZWNlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZVdoZW5GYWxsVGhyb3VnaFBob25lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuRHRtZi5BcmMiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJIZG1pQXJjIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pX2FyYyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb3RTZWxlY3RlZCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pX2FyYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuRHRtZi5TcGRpZiIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZGlmIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb3RTZWxlY3RlZCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuRHRtZi5BdXhMaW5lIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2VsZWN0ZWQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQXV4TGluZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vdFNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5LkVuZm9yY2VkQXVkaWJsZS5VbnJlYWNoYWJsZURldmljZXMiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImF1eF9saW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuRW5mb3JjZWRBdWRpYmxlLlNwZWFrZXIiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZWFrZXIiLz4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yU3lzdGVtIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZVN5c3RlbUVuZm9yY2VkIi8+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iUmVtb3RlU3VibWl4Ii8+CisgICAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHAiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIi8+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iRXhjbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwU3BlYWtlciIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IlJlbW90ZVN1Ym1peCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHBob25lIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iTGluZSIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHNldCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IlVzYkFjY2Vzc29yeSIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IlVzYkRldmljZSIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IkRndGxEb2NrSGVhZHNldCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IkhkbWkiLz4KKyAgICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iQW5sZ0RvY2tIZWFkc2V0Ii8+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckRvY2siIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlQW5hbG9nRG9jayIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vdFNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vdFNlbGVjdGVkIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5FbmZvcmNlZEF1ZGlibGUuRGV2aWNlMiIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlJlbW90ZVN1Ym1peCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlJlbW90ZVN1Ym1peCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHAiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwSGVhZHBob25lcyIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBTcGVha2VyIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkcGhvbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJMaW5lIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJXaXJlZEhlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JBY2Nlc3NvcnkiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkFjY2Vzc29yeSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiRGV2aWNlIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJEZ3RsRG9ja0hlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJIZG1pIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJIZG1pIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQW5sZ0RvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckRvY2siIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQW5hbG9nRG9jayIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQW5sZ0RvY2tIZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZW1vdGVTdWJtaXgiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHAiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkcGhvbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkxpbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiQWNjZXNzb3J5Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRndGxEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iSGRtaSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQW5sZ0RvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuVHJhbnNtaXR0ZWRUaHJvdWdoU3BlYWtlci5VbnJlYWNoZWFibGVEZXZpY2VzIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWlfYXJjIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5UcmFuc21pdHRlZFRocm91Z2hTcGVha2VyLlNwZWFrZXIiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb3RTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuQWNjZXNzaWJpbGl0eS5VbnJlYWNoYWJsZURldmljZXMiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ii8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWlfYXJjIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhdXhfbGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuQWNjZXNzaWJpbGl0eS5EZXZpY2UyIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUmVtb3RlU3VibWl4Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iUmVtb3RlU3VibWl4Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHAiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwSGVhZHBob25lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHBTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRm9yY2VTcGVha2VyIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkcGhvbmUiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJXaXJlZEhlYWRwaG9uZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkxpbmUiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJMaW5lIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiQWNjZXNzb3J5Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiQWNjZXNzb3J5Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiRGV2aWNlIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iRGd0bERvY2tIZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQXV4RGlnaXRhbCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkhkbWkiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBbmxnRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJBbmxnRG9ja0hlYWRzZXQiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yRG9jayIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VBbmFsb2dEb2NrIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU3BlYWtlciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUmVtb3RlU3VibWl4Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwSGVhZHBob25lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRm9yY2VTcGVha2VyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JBY2Nlc3NvcnkiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBdXhEaWdpdGFsIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBbmxnRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNwZWFrZXIiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5SZXJvdXRpbmcuVW5yZWFjaGFibGVEZXZpY2VzIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ii8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhdXhfbGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5SZXJvdXRpbmcuRGV2aWNlMiIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlJlbW90ZVN1Ym1peCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlJlbW90ZVN1Ym1peCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHAiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkZvcmNlU3BlYWtlciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHBob25lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkcGhvbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iTGluZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkFjY2Vzc29yeSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkFjY2Vzc29yeSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkRldmljZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRndGxEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkRndGxEb2NrSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkF1eERpZ2l0YWwiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJIZG1pIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQW5sZ0RvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQW5sZ0RvY2tIZWFkc2V0Ii8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckRvY2siIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQW5hbG9nRG9jayIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNwZWFrZXIiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVmYXVsdCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUmVtb3RlU3VibWl4Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHAiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJGb3JjZVNwZWFrZXIiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkcGhvbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiQWNjZXNzb3J5Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZ3RsRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQXV4RGlnaXRhbCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBbmxnRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJTdHJhdGVneUZvclN0cmVhbSIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3JpbmcvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+cGhvbmU8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPm1lZGlhPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+c29uaWZpY2F0aW9uPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPm1lZGlhPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPnNvbmlmaWNhdGlvbjwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+c29uaWZpY2F0aW9uX3Jlc3BlY3RmdWw8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5waG9uZTwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPmVuZm9yY2VkX2F1ZGlibGU8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5kdG1mPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij50cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXI8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5hY2Nlc3NpYmlsaXR5PC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5yZXJvdXRpbmc8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJTZWxlY3RlZFN0cmF0ZWd5Rm9yVXNhZ2VzLkNhbGlicmF0aW9uIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL3Vua25vd24vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL21lZGlhL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy92b2ljZV9jb21tdW5pY2F0aW9uX3NpZ25hbGxpbmcvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2FsYXJtL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9ub3RpZmljYXRpb24vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl90ZWxlcGhvbnlfcmluZ3RvbmUvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX3JlcXVlc3QvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX2luc3RhbnQvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX2RlbGF5ZWQvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl9ldmVudC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9uYXZpZ2F0aW9uX2d1aWRhbmNlL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9hc3Npc3RhbmNlX3NvbmlmaWNhdGlvbi9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvZ2FtZS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy91bmtub3duL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5tZWRpYTwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvbWVkaWEvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPm1lZGlhPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5waG9uZTwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvdm9pY2VfY29tbXVuaWNhdGlvbl9zaWduYWxsaW5nL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5kdG1mPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9hbGFybS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+c29uaWZpY2F0aW9uPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9ub3RpZmljYXRpb24vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPnNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9ub3RpZmljYXRpb25fdGVsZXBob255X3Jpbmd0b25lL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5zb25pZmljYXRpb248L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX3JlcXVlc3QvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPnNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9ub3RpZmljYXRpb25fY29tbXVuaWNhdGlvbl9pbnN0YW50L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5zb25pZmljYXRpb25fcmVzcGVjdGZ1bDwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvbm90aWZpY2F0aW9uX2NvbW11bmljYXRpb25fZGVsYXllZC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+c29uaWZpY2F0aW9uX3Jlc3BlY3RmdWw8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl9ldmVudC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+c29uaWZpY2F0aW9uX3Jlc3BlY3RmdWw8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2Fzc2lzdGFuY2VfbmF2aWdhdGlvbl9ndWlkYW5jZS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+bWVkaWE8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2Fzc2lzdGFuY2Vfc29uaWZpY2F0aW9uL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5tZWRpYTwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvZ2FtZS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+bWVkaWE8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJTZWxlY3RlZFN0cmF0ZWd5Rm9yVXNhZ2VzLkFzc2lzdGFuY2VBY2Nlc3NpYmlsaXR5IiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU29uaWZpY2F0aW9uIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iUmluZ1RvbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJQaG9uZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQWNjZXNzaWJpbGl0eSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNvbmlmaWNhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9hc3Npc3RhbmNlX2FjY2Vzc2liaWxpdHkvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPnNvbmlmaWNhdGlvbjwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUGhvbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5waG9uZTwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQWNjZXNzaWJpbGl0eSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9hc3Npc3RhbmNlX2FjY2Vzc2liaWxpdHkvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPmFjY2Vzc2liaWxpdHk8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JJbnB1dFNvdXJjZS5DYWxpYnJhdGlvbiIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9jb21tdW5pY2F0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbG9vcGJhY2siLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9jb21tdW5pY2F0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbG9vcGJhY2siLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9pbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9jb21tdW5pY2F0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbG9vcGJhY2siLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9jb21tdW5pY2F0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9jb21tdW5pY2F0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9pbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpbiI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW1iaWVudCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InR2X3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsb29wYmFjayI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaW4iPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbWJpZW50Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idHZfdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImluIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFtYmllbnQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InR2X3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsb29wYmFjayI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImluIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbWJpZW50Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm1fdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dl90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsb29wYmFjayI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaW4iPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbWJpZW50Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dl90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9pbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpbiI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFtYmllbnQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3J4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dl90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImluIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFtYmllbnQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dl90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbG9vcGJhY2siPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibG9vcGJhY2siPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9pbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpbiI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW1iaWVudCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm1fdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dl90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsb29wYmFjayI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImluIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbWJpZW50Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV9yeCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idHZfdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbG9vcGJhY2siPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibG9vcGJhY2siPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9pbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpbiI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW1iaWVudCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InR2X3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImluIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFtYmllbnQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV9yeCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm1fdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idHZfdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JJbnB1dFNvdXJjZS5EZWZhdWx0QW5kTWljIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQTJkcCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNjbyI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoU2NvSGVhZHNldCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JSZWNvcmQiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVJbnB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiRGV2aWNlIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQnVpbHRpbk1pYyI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQnVpbHRpbk1pYyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQTJkcCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNjbyI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJ1aWx0aW5NaWMiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvcklucHV0U291cmNlLlZvaWNlVXBsaW5rQW5kVm9pY2VEb3dubGlua0FuZFZvaWNlQ2FsbCIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlZvaWNlQ2FsbCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVGVsZXBob255UngiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlZvaWNlQ2FsbCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3J4Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV9yeCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV9yeCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3J4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3J4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JJbnB1dFNvdXJjZS5DYW1jb3JkZXIiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCYWNrTWljIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCYWNrTWljIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQnVpbHRpbk1pYyI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQnVpbHRpbk1pYyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmFja01pYyI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJ1aWx0aW5NaWMiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvcklucHV0U291cmNlLlZvaWNlUmVjb2duaXRpb25BbmRIb3R3b3JkIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yUmVjb3JkIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUJ0U2NvIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVJbnB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aFNjb0hlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVJbnB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiRGV2aWNlIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQnVpbHRpbk1pYyI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQnVpbHRpbk1pYyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNjb0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCdWlsdGluTWljIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9ySW5wdXRTb3VyY2UuVm9pY2VDb21tdW5pY2F0aW9uIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VCdFNjbyIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhTY29IZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZU5vbmUiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZU5vbmUiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiRGV2aWNlIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQnVpbHRpbk1pYyI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQnVpbHRpbk1pYyIvPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZU5vbmUiLz4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iQmFja01pYyIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmFja01pYyI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVJbnB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJhY2tNaWMiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTY29IZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQnVpbHRpbk1pYyI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJhY2tNaWMiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvcklucHV0U291cmNlLlJlbW90ZVN1Ym1peCIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlJlbW90ZVN1Ym1peCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iUmVtb3RlU3VibWl4Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVmYXVsdCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZW1vdGVTdWJtaXgiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVmYXVsdCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9ySW5wdXRTb3VyY2UuRm1UdW5lciIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkZtVHVuZXIiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVJbnB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkZtVHVuZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRm1UdW5lciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJWb2x1bWVQcm9maWxlc0ZvclN0cmVhbS5DYWxpYnJhdGlvbiIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjQuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi04LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi02LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi01OC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTQwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTMwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xOC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEyLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEyLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi02LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjEuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDkuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMzMuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTM1LjY5OTIxODc1PC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI2LjEwMTU2MjUwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEzLjE5OTIxODc1PC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTQ5LjUwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMzMuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTU4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0zNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTExLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi01OC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTU4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTQ5LjUwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMzMuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTM1LjY5OTIxODc1PC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjYuMTAxNTYyNTA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMy4xOTkyMTg3NTwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDkuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTMzLjUwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi01OC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDkuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTMzLjUwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0zNS42OTkyMTg3NTwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjYuMTAxNTYyNTA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEzLjE5OTIxODc1PC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDkuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMzMuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTU4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTQwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEyLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi02LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjQuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTMwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTIyLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xOC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEyLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi02LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTk2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTk2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjI8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTk2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTY4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0zNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTk2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjI8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi05Ni4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi05Ni4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTk2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4yPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTk2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTU2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTM0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTExLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTU4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTU4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4yPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4yPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjI8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjI8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4yPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4yPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4yPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJWb2x1bWVQcm9maWxlc0ZvclN0cmVhbS5EdG1mIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iSW5DYWxsIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJPdXRPZkNhbGwiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkluQ2FsbCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMzAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjQuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi02LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi01OC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTQwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik91dE9mQ2FsbCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjQuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi04LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi02LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi01OC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTQwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+Cis8L0NvbmZpZ3VyYWJsZURvbWFpbnM+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3JfaW5wdXRfc291cmNlLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YmMzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3JfaW5wdXRfc291cmNlLnBmdwpAQCAtMCwwICsxLDUxNSBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JJbnB1dFNvdXJjZQorCWRvbWFpbjogQ2FsaWJyYXRpb24KKwkJY29uZjogQ2FsaWJyYXRpb24KKwkJCSMKKwkJCSMgTm90ZSB0aGF0IEFMTCBpbnB1dCBkZXZpY2VzIG11c3QgaGF2ZSB0aGUgc2lnbiBiaXQgc2V0IHRvIDEuCisJCQkjIEFzIHRoZSBkZXZpY2VzIGlzIGEgbWFzaywgdXNlIHRoZSAiaW4iIGJpdCBhcyBhIGRpcmVjdGlvbiBpbmRpY2F0b3IuCisJCQkjCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJaW4gPSAxCisJCQkJY29tbXVuaWNhdGlvbiA9IDAKKwkJCQlhbWJpZW50ID0gMAorCQkJCWhkbWkgPSAwCisJCQkJdGVsZXBob255X3J4ID0gMAorCQkJCWJhY2tfbWljID0gMAorCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQlmbV90dW5lciA9IDAKKwkJCQl0dl90dW5lciA9IDAKKwkJCQlsaW5lID0gMAorCQkJCXNwZGlmID0gMAorCQkJCWxvb3BiYWNrID0gMAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJaW4gPSAxCisJCQkJY29tbXVuaWNhdGlvbiA9IDAKKwkJCQlhbWJpZW50ID0gMAorCQkJCWhkbWkgPSAwCisJCQkJdGVsZXBob255X3J4ID0gMAorCQkJCWJhY2tfbWljID0gMAorCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQlmbV90dW5lciA9IDAKKwkJCQl0dl90dW5lciA9IDAKKwkJCQlsaW5lID0gMAorCQkJCXNwZGlmID0gMAorCQkJCWxvb3BiYWNrID0gMAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQlpbiA9IDEKKwkJCQljb21tdW5pY2F0aW9uID0gMAorCQkJCWFtYmllbnQgPSAwCisJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJaGRtaSA9IDAKKwkJCQliYWNrX21pYyA9IDAKKwkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJdXNiX2RldmljZSA9IDAKKwkJCQlmbV90dW5lciA9IDAKKwkJCQl0dl90dW5lciA9IDAKKwkJCQlsaW5lID0gMAorCQkJCXNwZGlmID0gMAorCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCWxvb3BiYWNrID0gMAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWluID0gMQorCQkJCWNvbW11bmljYXRpb24gPSAwCisJCQkJYW1iaWVudCA9IDAKKwkJCQlidWlsdGluX21pYyA9IDAKKwkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQloZG1pID0gMAorCQkJCWJhY2tfbWljID0gMAorCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQl1c2JfZGV2aWNlID0gMAorCQkJCWZtX3R1bmVyID0gMAorCQkJCXR2X3R1bmVyID0gMAorCQkJCWxpbmUgPSAwCisJCQkJc3BkaWYgPSAwCisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJbG9vcGJhY2sgPSAwCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQlpbiA9IDEKKwkJCQljb21tdW5pY2F0aW9uID0gMAorCQkJCWFtYmllbnQgPSAwCisJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJaGRtaSA9IDAKKwkJCQliYWNrX21pYyA9IDAKKwkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJdXNiX2RldmljZSA9IDAKKwkJCQlmbV90dW5lciA9IDAKKwkJCQl0dl90dW5lciA9IDAKKwkJCQlsaW5lID0gMAorCQkJCXNwZGlmID0gMAorCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCWxvb3BiYWNrID0gMAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJaW4gPSAxCisJCQkJY29tbXVuaWNhdGlvbiA9IDAKKwkJCQlhbWJpZW50ID0gMAorCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCWhkbWkgPSAwCisJCQkJdGVsZXBob255X3J4ID0gMAorCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQl1c2JfZGV2aWNlID0gMAorCQkJCWZtX3R1bmVyID0gMAorCQkJCXR2X3R1bmVyID0gMAorCQkJCWxpbmUgPSAwCisJCQkJc3BkaWYgPSAwCisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJbG9vcGJhY2sgPSAwCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWluID0gMQorCQkJCWNvbW11bmljYXRpb24gPSAwCisJCQkJYW1iaWVudCA9IDAKKwkJCQloZG1pID0gMAorCQkJCXRlbGVwaG9ueV9yeCA9IDAKKwkJCQliYWNrX21pYyA9IDAKKwkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJZm1fdHVuZXIgPSAwCisJCQkJdHZfdHVuZXIgPSAwCisJCQkJbGluZSA9IDAKKwkJCQlzcGRpZiA9IDAKKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQlsb29wYmFjayA9IDAKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQlpbiA9IDEKKwkJCQljb21tdW5pY2F0aW9uID0gMAorCQkJCWFtYmllbnQgPSAwCisJCQkJaGRtaSA9IDAKKwkJCQl0ZWxlcGhvbnlfcnggPSAwCisJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCWZtX3R1bmVyID0gMAorCQkJCXR2X3R1bmVyID0gMAorCQkJCWxpbmUgPSAwCisJCQkJc3BkaWYgPSAwCisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJbG9vcGJhY2sgPSAwCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJaW4gPSAxCisJCQkJY29tbXVuaWNhdGlvbiA9IDAKKwkJCQlhbWJpZW50ID0gMAorCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCWhkbWkgPSAwCisJCQkJdGVsZXBob255X3J4ID0gMAorCQkJCWJhY2tfbWljID0gMAorCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJdXNiX2RldmljZSA9IDAKKwkJCQlmbV90dW5lciA9IDAKKwkJCQl0dl90dW5lciA9IDAKKwkJCQlsaW5lID0gMAorCQkJCXNwZGlmID0gMAorCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCWxvb3BiYWNrID0gMAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWluID0gMQorCQkJCWNvbW11bmljYXRpb24gPSAwCisJCQkJYW1iaWVudCA9IDAKKwkJCQloZG1pID0gMAorCQkJCXRlbGVwaG9ueV9yeCA9IDAKKwkJCQliYWNrX21pYyA9IDAKKwkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJZm1fdHVuZXIgPSAwCisJCQkJdHZfdHVuZXIgPSAwCisJCQkJbGluZSA9IDAKKwkJCQlzcGRpZiA9IDAKKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQlsb29wYmFjayA9IDAKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJaW4gPSAxCisJCQkJY29tbXVuaWNhdGlvbiA9IDAKKwkJCQlhbWJpZW50ID0gMAorCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQloZG1pID0gMAorCQkJCXRlbGVwaG9ueV9yeCA9IDAKKwkJCQlidWlsdGluX21pYyA9IDAKKwkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCWJhY2tfbWljID0gMAorCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQl1c2JfZGV2aWNlID0gMAorCQkJCWZtX3R1bmVyID0gMAorCQkJCXR2X3R1bmVyID0gMAorCQkJCWxpbmUgPSAwCisJCQkJc3BkaWYgPSAwCisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJbG9vcGJhY2sgPSAwCisKKwlkb21haW46IERlZmF1bHRBbmRNaWMKKwkJY29uZjogQTJkcAorCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJY29tcG9uZW50OiBkZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCWNvbXBvbmVudDogbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCisJCWNvbmY6IFNjbworCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCUZvcmNlVXNlRm9yUmVjb3JkIElzIEZvcmNlQnRTY28KKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJY29tcG9uZW50OiBkZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCQkJCWNvbXBvbmVudDogbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCisJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMKKwkJCQljb21wb25lbnQ6IGRlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay8KKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJY29tcG9uZW50OiBtaWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay8KKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisKKwkJY29uZjogVXNiRGV2aWNlCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcworCQkJCWNvbXBvbmVudDogZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrLworCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQljb21wb25lbnQ6IG1pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrLworCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKworCQljb25mOiBCdWlsdGluTWljCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgQnVpbHRpbk1pYworCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMKKwkJCQljb21wb25lbnQ6IGRlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay8KKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJY29tcG9uZW50OiBtaWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay8KKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisKKwkJY29uZjogRGVmYXVsdAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJY29tcG9uZW50OiBkZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCWNvbXBvbmVudDogbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCisJZG9tYWluOiBWb2ljZVVwbGlua0FuZFZvaWNlRG93bmxpbmtBbmRWb2ljZUNhbGwKKwkJY29uZjogVm9pY2VDYWxsCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgVGVsZXBob255UngKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcnggPSAxCisJCQkJdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCA9IDEKKwkJCQl2b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcnggPSAxCisKKwkJY29uZjogRGVmYXVsdAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcnggPSAwCisJCQkJdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCA9IDAKKwkJCQl2b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcnggPSAwCisKKwlkb21haW46IENhbWNvcmRlcgorCQljb25mOiBCYWNrTWljCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgQmFja01pYworCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQliYWNrX21pYyA9IDEKKwkJCQlidWlsdGluX21pYyA9IDAKKworCQljb25mOiBCdWlsdGluTWljCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgQnVpbHRpbk1pYworCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQliYWNrX21pYyA9IDAKKwkJCQlidWlsdGluX21pYyA9IDEKKworCQljb25mOiBEZWZhdWx0CisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQliYWNrX21pYyA9IDAKKwkJCQlidWlsdGluX21pYyA9IDAKKworCWRvbWFpbjogVm9pY2VSZWNvZ25pdGlvbkFuZEhvdHdvcmQKKwkJY29uZjogU2NvSGVhZHNldAorCQkJRm9yY2VVc2VGb3JSZWNvcmQgSXMgRm9yY2VCdFNjbworCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJY29tcG9uZW50OiB2b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJY29tcG9uZW50OiBob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKworCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJY29tcG9uZW50OiB2b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJY29tcG9uZW50OiBob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKworCQljb25mOiBVc2JEZXZpY2UKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJY29tcG9uZW50OiB2b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJY29tcG9uZW50OiBob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQlidWlsdGluX21pYyA9IDAKKworCQljb25mOiBCdWlsdGluTWljCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgQnVpbHRpbk1pYworCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMKKwkJCQljb21wb25lbnQ6IHZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDEKKwkJCQljb21wb25lbnQ6IGhvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMQorCisJCWNvbmY6IERlZmF1bHQKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcworCQkJCWNvbXBvbmVudDogdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCWNvbXBvbmVudDogaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJYnVpbHRpbl9taWMgPSAwCisKKwlkb21haW46IFZvaWNlQ29tbXVuaWNhdGlvbgorCQljb25mOiBTY29IZWFkc2V0CisJCQkjCisJCQkjIFNDTyBkZXZpY2UgbWF5IGJlIHJlcXVlc3RlZCBidXQgbm8gU0NPIGRldmljZSBpcyBhdmFpbGFibGUKKwkJCSMKKwkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAorCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJdXNiX2RldmljZSA9IDAKKwkJCQlidWlsdGluX21pYyA9IDAKKwkJCQliYWNrX21pYyA9IDAKKworCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJYmFja19taWMgPSAwCisKKwkJY29uZjogVXNiRGV2aWNlCisJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQl1c2JfZGV2aWNlID0gMQorCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCWJhY2tfbWljID0gMAorCisJCWNvbmY6IEJ1aWx0aW5NaWMKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBCdWlsdGluTWljCisJCQlBTlkKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCisJCQkJQUxMCisJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEV4Y2x1ZGVzIEJhY2tNaWMKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJYnVpbHRpbl9taWMgPSAxCisJCQkJYmFja19taWMgPSAwCisKKwkJY29uZjogQmFja01pYworCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIEJhY2tNaWMKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJYmFja19taWMgPSAxCisKKwkJY29uZjogRGVmYXVsdAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJYmFja19taWMgPSAwCisKKwlkb21haW46IFJlbW90ZVN1Ym1peAorCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCXJlbW90ZV9zdWJtaXggPSAxCisKKwkJY29uZjogRGVmYXVsdAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCXJlbW90ZV9zdWJtaXggPSAwCisKKwlkb21haW46IEZtVHVuZXIKKwkJY29uZjogRm1UdW5lcgorCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIEZtVHVuZXIKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQlmbV90dW5lciA9IDEKKworCQljb25mOiBEZWZhdWx0CisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWZtX3R1bmVyID0gMAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThhYjMzYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdwpAQCAtMCwwICsxLDMwMiBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JTdHJhdGVneQorCisJc3VwRG9tYWluOiBBY2Nlc3NpYmlsaXR5CisJCSMKKwkJIyBARklYTUU6IFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgZm9sbG93cyBTVFJBVEVHWV9NRURJQSBmb3Igbm93CisJCSMKKwkJIyBARklYTUU6IEhvdyB0byBkaXNhYmxlIEhETUkgaWYgIWF1ZGlvX2lzX2xpbmVhcl9wY20gb3RoZXIgdGhhbiBwcm9ncmFtbWF0aWNhbGx5Pz8/CisJCSMKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IENhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCQkJY29uZjogUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzIEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEF1eERpZ2l0YWwKKwkJCQkjCisJCQkJIyBEbyBub3Qgcm91dGUgYWNjZXNzaWJpbGl0eSBwcm9tcHRzIHRvIGEgZGlnaXRhbCBvdXRwdXQgY3VycmVudGx5IGNvbmZpZ3VyZWQgd2l0aCBhCisJCQkJIyBjb21wcmVzc2VkIGZvcm1hdCBhcyB0aGV5IHdvdWxkIGxpa2VseSBub3QgYmUgbWl4ZWQgYW5kIGRyb3BwZWQuCisJCQkJIworCQkJCSMgQFRPRE8gSG93IHRvIHRyYW5zbGF0ZSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbig/Pz8pCisJCQkJIyBkZXNjLT5pc0FjdGl2ZSgpICYmICFhdWRpb19pc19saW5lYXJfcGNtKGRlc2MtPm1Gb3JtYXQpICYmIGRldmljZXMgIT0gQVVESU9fREVWSUNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDEKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9kdG1mLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9kdG1mLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTI3M2IyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2R0bWYucGZ3CkBAIC0wLDAgKzEsNjM3IEBACitzdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5CisKKwlzdXBEb21haW46IER0bWYKKworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCQkJY29uZjogUmVtb3RlU3VibWl4CisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMQorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEZvcmNlU3BlYWtlcldoZW5Ob3RJbkNhbGwKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gSXNOb3QgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvCisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IExpbmVXaGVuRm9sbG93aW5nTWVkaWEKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBVU0IgYWNjZXNzb3J5IG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBIZG1pCisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBIZG1pIG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5CisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEVhcnBpZWNlCisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IExpbmVXaGVuRmFsbFRocm91Z2hQaG9uZQorCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAxCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gSXNOb3QgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCWRvbWFpbjogQXJjCisJCQkjCisJCQkjIERUTUYgc3RyYXRlZ3kgZm9sbG93cyBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKKwkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQorCQkJIworCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pQXJjCisKKwkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMAorCisJCWRvbWFpbjogU3BkaWYKKwkJCSMKKwkJCSMgRFRNRiBzdHJhdGVneSBmb2xsb3dzIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycworCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCisJCQkjCisJCQljb25mOiBTZWxlY3RlZAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZGlmCisKKwkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMAorCisJCWRvbWFpbjogQXV4TGluZQorCQkJIworCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCisJCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKKwkJCSMKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQXV4TGluZQorCisJCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzE0NzQzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3CkBAIC0wLDAgKzEsMzU4IEBACitzdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5CisKKwlzdXBEb21haW46IEVuZm9yY2VkQXVkaWJsZQorCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBDYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJIyBubyBlbmZvcmNlZF9hdWRpYmxlIG9uIHJlbW90ZSBzdWJtaXggKGUuZy4gV0ZEKQorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisKKwkJZG9tYWluOiBTcGVha2VyCisJCQljb25mOiBTZWxlY3RlZAorCQkJCSMKKwkJCQkjIHN0cmF0ZWd5IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUgdXNlcyBzYW1lIHJvdXRpbmcgcG9saWN5IGFzIFNUUkFURUdZX1NPTklGSUNBVElPTgorCQkJCSMgZXhjZXB0OgorCQkJCSMgICAgLSB3aGVuIGluIGNhbGwgd2hlcmUgaXQgZG9lc24ndCBkZWZhdWx0IHRvIFNUUkFURUdZX1BIT05FIGJlaGF2aW9yCisJCQkJIyAgICAtIGluIGNvdW50cmllcyB3aGVyZSBub3QgZW5mb3JjZWQgaW4gd2hpY2ggY2FzZSBpdCBmb2xsb3dzIFNUUkFURUdZX01FRElBCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCUFOWQorCQkJCQlGb3JjZVVzZUZvclN5c3RlbSBJcyBGb3JjZVN5c3RlbUVuZm9yY2VkCisJCQkJCUFMTAorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgUmVtb3RlU3VibWl4CisJCQkJCQlBTlkKKwkJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEJsdWV0b290aEEyZHAKKwkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgU3BlYWtlciBpcyBhbHNvIHRoZSBmYWxsYmFjayBkZXZpY2UgaWYgYW55IG9mIHRoZSBkZXZpY2UgZnJvbSBEZXZpY2UyIGRvbWFpbgorCQkJCQkjIGlzIHNlbGVjdGVkLgorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBSZW1vdGVTdWJtaXgKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkcGhvbmUKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgTGluZQorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkRldmljZQorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgSGRtaQorCQkJCQkJQU5ZCisJCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKwkJCQkJCQlGb3JjZVVzZUZvckRvY2sgSXNOb3QgRm9yY2VBbmFsb2dEb2NrCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCQkJY29uZjogUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMQorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKworCQkJY29uZjogSGRtaQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfbWVkaWEucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X21lZGlhLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGJlZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X21lZGlhLnBmdwpAQCAtMCwwICsxLDMzMSBAQAorZG9tYWluR3JvdXA6IERldmljZUZvclN0cmF0ZWd5CisKKwlkb21haW5Hcm91cDogTWVkaWEKKworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCQkJY29uZjogUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogRm9yY2VTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQkjCisJCQkJIyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCisJCQkJIworCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAxCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEF1eERpZ2l0YWwKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQkjCisJCQkJIyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCisJCQkJIworCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJZG9tYWluOiBBcmMKKwkJCSMKKwkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCisJCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKKwkJCSMKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pQXJjCisKKwkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMAorCisJCWRvbWFpbjogU3BkaWYKKwkJCSMKKwkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCisJCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKKwkJCSMKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGRpZgorCisJCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDAKKworCQlkb21haW46IEF1eExpbmUKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBdXhMaW5lCisKKwkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Bob25lLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9waG9uZS5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwMTQ5MQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9waG9uZS5wZncKQEAgLTAsMCArMSw0ODUgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKKworCXN1cERvbWFpbjogUGhvbmUKKworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQkjIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKworCQlkb21haW46IERldmljZQorCQkJY29uZjogU2NvQ2Fya2l0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUFOWQorCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBTlkKKwkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlTm9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCQkJCUFOWQorCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCisJCQkJCUFMTAorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCQkJCQkJIworCQkJCQkJIyBJbiBjYXNlIG9mIEZvcmNlIFNwZWFrZXIsIHByaW9yaXR5IGJldHdlZW4gZGV2aWNlIGFuZCBhY2Nlc3NvcnkgYXJlCisJCQkJCQkjIGludmVydGVkIGNvbXBhcmVkIHRvIEZvcmNlIE5vbmUgb3IgQnQgU2NvCisJCQkJCQkjCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogSGRtaQorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEVhcnBpZWNlCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogTGluZQorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogU3BlYWtlcgorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9yZXJvdXRpbmcucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTBhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdwpAQCAtMCwwICsxLDI5NyBAQAorZG9tYWluR3JvdXA6IERldmljZUZvclN0cmF0ZWd5CisKKwlkb21haW5Hcm91cDogUmVyb3V0aW5nCisJCSMKKwkJIyBGYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5CisJCSMKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IENhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRm9yY2VTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogTGluZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRGd0bERvY2tIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEF1eERpZ2l0YWwKKwkJCQkjCisJCQkJIyBSZXJvdXRpbmcgaXMgc2ltaWxhciB0byBtZWRpYSBhbmQgc29uaWZpY2F0aW9uIChleGVwdCBoZXJlOiBzb25pZmljYXRpb24gaXMgbm90IGFsbG93ZWQgb24gSERNSSkKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMQorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMTAxZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdwpAQCAtMCwwICsxLDQ4NSBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JTdHJhdGVneQorCisJc3VwRG9tYWluOiBTb25pZmljYXRpb24KKworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJIyBubyBzb25pZmljYXRpb24gb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsIGJ1dCBIRE1JIGlzIG5vdCByZWFjaGFibGUKKwkJCQkJIworCQkJCQloZG1pID0gMAorCisJCWRvbWFpbjogU3BlYWtlcgorCisJCQljb25mOiBTZWxlY3RlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggRU5GT1JDRURfQVVESUJMRSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCQkjCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogU2NvQ2Fya2l0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvQ2Fya2l0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBTY29IZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogU2NvCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDEKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IFVTQiBBY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEVhcnBpZWNlCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogTm9uZQorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjY2NzRjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdwpAQCAtMCwwICsxLDU0NSBAQAorZG9tYWluR3JvdXA6IERldmljZUZvclN0cmF0ZWd5CisKKwlkb21haW5Hcm91cDogU29uaWZpY2F0aW9uUmVzcGVjdGZ1bAorCQkjCisJCSMgU29uaWZpY2lhdGlvbiBSZXNwZWN0ZnVsIGZvbGxvd3M6CisJCSMJLSBJZiBpbiBjYWxsOiBTdHJhdGVneSBzb25pZmljYXRpb24gKHRoYXQgZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpbiBjYWxsIGFsc28uLi4pCisJCSMJLSBJZiBub3QgaW4gY2FsbCBBTkQgYSBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlIHJlbW90ZWx5OiBTdHJhdGVneSBzb25pZmljYXRpb24gKHRoYXQKKwkJIyAgICAgZm9sbG93cyBlbmZvcmNlZCBhdWRpYmxlLCB3aGljaCBmb2xsb3dzIG1lZGlhKQorCQkjCS0gaWYgbm90IGluIGNhbGwgYW5kIG5vIG11c2ljIHN0cmVhbSBhY3RpdmUgcmVtb3RlbHkgYW5kIG11c2ljIHN0cmVhbSBhY3RpdmUpOiBzdHJhdGVneQorCQkjICAgICBtZWRpYQorCQkjICAgLSBPdGhlcndpc2UgZm9sbG93cyBzb25pZmljYXRpb24gYnkgcmVwbGFjaW5nIHNwZWFrZXIgd2l0aCBzcGVha2VyIHNhZmUgaWYgc3BlYWtlciBpcworCQkjCSAgc2VsZWN0ZWQuCisJCSMKKwkJIyBDYXNlIG9mIHN0cmVhbSBhY3RpdmUgaGFuZGxlZCBwcm9ncmFtbWF0aWNhbGx5CisKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IENhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKworCQlkb21haW46IFNwZWFrZXJzCisKKwkJCWNvbmY6IFNwZWFrZXJTYWZlCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyU2FmZQorCQkJCSMKKwkJCQkjIEZvbGxvd3Mgc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsIGFuZCByZXBsYWNlIHNwZWFrZXIgYnkgc3BlYWtlciBzYWZlCisJCQkJIyBpZiBhbmQgb25seSBpZiBzcGVha2VyIG9ubHkgc2VsZWN0ZWQKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlcl9zYWZlID0gMQorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBGb2xsb3dzIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGNhbGwKKwkJCQkJCSMKKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBOb25lCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0NhcmtpdAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAxCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQlBTlkKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCQkJIworCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IExpbmVXaGVuRm9sbG93TWVkaWFTdHJhdGVneQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlBTlkKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCQkJIworCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlBTlkKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCQkJIworCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBVc2JBY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRGd0bERvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQXV4RGlnaXRhbAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgSERNSSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDEKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEVhcnBpZWNlCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWFlOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncKQEAgLTAsMCArMSw0MCBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JTdHJhdGVneQorCisJc3VwRG9tYWluOiBUcmFuc21pdHRlZFRocm91Z2hTcGVha2VyCisJCWRvbWFpbjogVW5yZWFjaGVhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCWRvbWFpbjogU3BlYWtlcgorCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOTQwYjlkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdwpAQCAtMCwwICsxLDIwIEBACitkb21haW46IFN0cmF0ZWd5Rm9yU3RyZWFtCisKKwljb25mOiBDYWxpYnJhdGlvbgorCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHBob25lCisJCSMKKwkJIyBOT1RFOiBTWVNURU0gc3RyZWFtIHVzZXMgTUVESUEgc3RyYXRlZ3kgYmVjYXVzZSBtdXRpbmcgbXVzaWMgYW5kIHN3aXRjaGluZyBvdXRwdXRzCisJCSMgd2hpbGUga2V5IGNsaWNrcyBhcmUgcGxheWVkIHByb2R1Y2VzIGEgcG9vciByZXN1bHQKKwkJIworCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gbWVkaWEKKwkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb24KKwkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gbWVkaWEKKwkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uCisJCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb25fcmVzcGVjdGZ1bAorCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHBob25lCisJCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gZW5mb3JjZWRfYXVkaWJsZQorCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IGR0bWYKKwkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHRyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlcgorCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IGFjY2Vzc2liaWxpdHkKKwkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHJlcm91dGluZworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl91c2FnZS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl91c2FnZS5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y1ZGExMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdwpAQCAtMCwwICsxLDM5IEBACitzdXBEb21haW46IFNlbGVjdGVkU3RyYXRlZ3lGb3JVc2FnZXMKKworCWRvbWFpbjogQ2FsaWJyYXRpb24KKwkJY29uZjogQ2FsaWJyYXRpb24KKwkJCS9Qb2xpY3kvcG9saWN5L3VzYWdlcy91bmtub3duL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBtZWRpYQorCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL21lZGlhL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBtZWRpYQorCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHBob25lCisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvdm9pY2VfY29tbXVuaWNhdGlvbl9zaWduYWxsaW5nL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBkdG1mCisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvYWxhcm0vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHNvbmlmaWNhdGlvbgorCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbi9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwKKwkJCS9Qb2xpY3kvcG9saWN5L3VzYWdlcy9ub3RpZmljYXRpb25fdGVsZXBob255X3Jpbmd0b25lL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb24KKwkJCS9Qb2xpY3kvcG9saWN5L3VzYWdlcy9ub3RpZmljYXRpb25fY29tbXVuaWNhdGlvbl9yZXF1ZXN0L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb25fcmVzcGVjdGZ1bAorCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX2luc3RhbnQvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsCisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvbm90aWZpY2F0aW9uX2NvbW11bmljYXRpb25fZGVsYXllZC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwKKwkJCS9Qb2xpY3kvcG9saWN5L3VzYWdlcy9ub3RpZmljYXRpb25fZXZlbnQvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsCisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9uYXZpZ2F0aW9uX2d1aWRhbmNlL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBtZWRpYQorCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2Fzc2lzdGFuY2Vfc29uaWZpY2F0aW9uL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBtZWRpYQorCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2dhbWUvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IG1lZGlhCisKKwlkb21haW46IEFzc2lzdGFuY2VBY2Nlc3NpYmlsaXR5CisJCWNvbmY6IFNvbmlmaWNhdGlvbgorCQkJIworCQkJIyBJbiBjYXNlIG9mIFJpbmcgb3IgQWxhcm0gc3RyZWFtIHR5cGUgYWN0aXZlLCBzd2l0Y2hpbmcgdG8gc29uaWZpY2F0aW9uCisJCQkjIEB0b2RvOiBoYW5kbGUgdGhpcyBkeW5hbWljIGNhc2UuIEFzIGEgV0EsIHVzaW5nIFJpbmd0b25lIG1vZGUuLi4KKwkJCSMKKwkJCVRlbGVwaG9ueU1vZGUgSXMgUmluZ1RvbmUKKworCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2Fzc2lzdGFuY2VfYWNjZXNzaWJpbGl0eS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uCisKKwkJY29uZjogUGhvbmUKKwkJCUFOWQorCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKworCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2Fzc2lzdGFuY2VfYWNjZXNzaWJpbGl0eS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gcGhvbmUKKworCQljb25mOiBBY2Nlc3NpYmlsaXR5CisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBhY2Nlc3NpYmlsaXR5CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3Mvdm9sdW1lcy5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL3ZvbHVtZXMucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNDk1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL3ZvbHVtZXMucGZ3CkBAIC0wLDAgKzEsNTQ1IEBACitzdXBEb21haW46IFZvbHVtZVByb2ZpbGVzRm9yU3RyZWFtCisJZG9tYWluOiBDYWxpYnJhdGlvbgorCQljb25mOiBDYWxpYnJhdGlvbgorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJlYW1zCisJCQkJY29tcG9uZW50OiB2b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcworCQkJCQljb21wb25lbnQ6IGhlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE4LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMi4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTYuMAorCQkJCQljb21wb25lbnQ6IHNwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE2LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC04LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0yNC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMTguMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTEyLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtNi4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisKKwkJCQljb21wb25lbnQ6IHN5c3RlbS92b2x1bWVfcHJvZmlsZXMKKwkJCQkJY29tcG9uZW50OiBoZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTMwLjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0yNi4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMjIuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC0xOC4wCisJCQkJCWNvbXBvbmVudDogc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0yNC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMTguMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTEyLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtNi4wCisJCQkJCWNvbXBvbmVudDogZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE4LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMi4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTYuMAorCQkJCQljb21wb25lbnQ6IGV4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTU4LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC00MC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMjEuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC0xMC4wCisKKwkJCQljb21wb25lbnQ6IHJpbmcvdm9sdW1lX3Byb2ZpbGVzCisJCQkJCWNvbXBvbmVudDogaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC00OS41CisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMzMuNQorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTE3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBzcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTM1LjcKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0yNi4xCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTMuMgorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IGVhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTQ5LjUKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0zMy41CisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IGV4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTU4LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC00MC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMjcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC0xMC4wCisKKwkJCQljb21wb25lbnQ6IG11c2ljL3ZvbHVtZV9wcm9maWxlcworCQkJCQljb21wb25lbnQ6IGhlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC01Ni4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMzQuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTExLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC01OC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtNDAuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTE3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBleHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC01OC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtNDAuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTE3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKworCQkJCWNvbXBvbmVudDogYWxhcm0vdm9sdW1lX3Byb2ZpbGVzCisJCQkJCWNvbXBvbmVudDogaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC00OS41CisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMzMuNQorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTE3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBzcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTM1LjcKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0yNi4xCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTMuMgorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IGVhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTQ5LjUKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0zMy41CisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IGV4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTU4LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC00MC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMjcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC0xMC4wCisKKwkJCQljb21wb25lbnQ6IG5vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMKKwkJCQkJY29tcG9uZW50OiBoZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTQ5LjUKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0zMy41CisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IHNwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMzUuNworCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTI2LjEKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMy4yCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNDkuNQorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTMzLjUKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0yNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTEwLjAKKworCQkJCWNvbXBvbmVudDogYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMKKwkJCQkJY29tcG9uZW50OiBoZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTI0LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0xOC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTIuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC02LjAKKwkJCQkJY29tcG9uZW50OiBzcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTI0LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0xNi4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtOC4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE4LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMi4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTYuMAorCQkJCQljb21wb25lbnQ6IGV4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTU4LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC00MC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCisJCQkJY29tcG9uZW50OiBlbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcworCQkJCQljb21wb25lbnQ6IGhlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMzAuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTI2LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0yMi4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTE4LjAKKwkJCQkJY29tcG9uZW50OiBzcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTI0LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0xOC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTIuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC02LjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0yNC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMTguMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTEyLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtNi4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0yNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTEwLjAKKworCQkJCWNvbXBvbmVudDogdHRzL3ZvbHVtZV9wcm9maWxlcworCQkJCQljb21wb25lbnQ6IGhlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtOTYuMAorCQkJCQkJMS9pbmRleCA9IDEKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtOTYuMAorCQkJCQkJMi9pbmRleCA9IDIKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtOTYuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCWNvbXBvbmVudDogc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtNjguMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTM0LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCQkxL2luZGV4ID0gMQorCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCQkyL2luZGV4ID0gMgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTk2LjAKKwkJCQkJY29tcG9uZW50OiBleHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCQkxL2luZGV4ID0gMQorCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCQkyL2luZGV4ID0gMgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTk2LjAKKworCQkJCWNvbXBvbmVudDogYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMKKwkJCQkJY29tcG9uZW50OiBoZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTU4LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC00MC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IHNwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTYuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTM0LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMS4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisKKwkJCQljb21wb25lbnQ6IHJlcm91dGluZy92b2x1bWVfcHJvZmlsZXMKKwkJCQkJY29tcG9uZW50OiBoZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkxL2luZGV4ID0gMQorCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMi9pbmRleCA9IDIKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBzcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkxL2luZGV4ID0gMQorCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMi9pbmRleCA9IDIKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMS9pbmRleCA9IDEKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTIvaW5kZXggPSAyCisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTEvaW5kZXggPSAxCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkyL2luZGV4ID0gMgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCisJCQkJY29tcG9uZW50OiBwYXRjaC92b2x1bWVfcHJvZmlsZXMKKwkJCQkJY29tcG9uZW50OiBoZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkxL2luZGV4ID0gMQorCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMi9pbmRleCA9IDIKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBzcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkxL2luZGV4ID0gMQorCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMi9pbmRleCA9IDIKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMS9pbmRleCA9IDEKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTIvaW5kZXggPSAyCisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTEvaW5kZXggPSAxCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkyL2luZGV4ID0gMgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCisJZG9tYWluOiBEdG1mCisJCWNvbmY6IEluQ2FsbAorCQkJQU5ZCisJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmVhbXMKKwkJCQljb21wb25lbnQ6IGR0bWYvdm9sdW1lX3Byb2ZpbGVzCisJCQkJCWNvbXBvbmVudDogaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0zMC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMjYuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTIyLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtMTguMAorCQkJCQljb21wb25lbnQ6IHNwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE4LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMi4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTYuMAorCQkJCQljb21wb25lbnQ6IGVhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTI0LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0xOC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTIuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC02LjAKKwkJCQkJY29tcG9uZW50OiBleHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC01OC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtNDAuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTI3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtMTAuMAorCisJCWNvbmY6IE91dE9mQ2FsbAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJlYW1zCisJCQkJY29tcG9uZW50OiBkdG1mL3ZvbHVtZV9wcm9maWxlcworCQkJCQljb21wb25lbnQ6IGhlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE4LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMi4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTYuMAorCQkJCQljb21wb25lbnQ6IHNwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE2LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC04LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0yNC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMTguMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTEyLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtNi4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU3RydWN0dXJlL1BvbGljeUNsYXNzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU3RydWN0dXJlL1BvbGljeUNsYXNzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOTY4NzlmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TdHJ1Y3R1cmUvUG9saWN5Q2xhc3MueG1sCkBAIC0wLDAgKzEsNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxTeXN0ZW1DbGFzcyB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSIuLi8uLi9TY2hlbWFzL1N5c3RlbUNsYXNzLnhzZCIgTmFtZT0iUG9saWN5Ij4KKyAgICA8U3Vic3lzdGVtSW5jbHVkZSBQYXRoPSJQb2xpY3lTdWJzeXN0ZW0ueG1sIi8+Cis8L1N5c3RlbUNsYXNzPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODIxZDZhZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwKQEAgLTAsMCArMSwxNzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Q29tcG9uZW50VHlwZVNldCB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgICAgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvQ29tcG9uZW50VHlwZVNldC54c2QiPgorICAgIDwhLS0gT3V0cHV0IGRldmljZXMgZGVmaW5pdGlvbiBhcyBhIGJpdGZpZWxkIGZvciB0aGUgc3VwcG9ydGVkIGRldmljZXMgcGVyIG91dHB1dAorICAgIHByb2ZpbGUuIEl0IG11c3QgbWF0Y2ggd2l0aCB0aGUgb3V0cHV0IGRldmljZSBlbnVtIHBhcmFtZXRlci4KKyAgICAtLT4KKyAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisgICAgIDwhLS0gQ29tbW9uIFR5cGVzIGRlZmludGlvbiAtLT4KKyAgICAgPHhpOmluY2x1ZGUgaHJlZj0iUG9saWN5U3Vic3lzdGVtLVZvbHVtZS54bWwiLz4KKworICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJPdXRwdXREZXZpY2VzTWFzayIgRGVzY3JpcHRpb249IjMydGggYml0IGlzIG5vdCBhbGxvd2VkIGFzIGRlZGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaW5wdXQgZGV2aWNlcyBkZXRlY3Rpb24iPgorICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSIgU2l6ZT0iMSIgUG9zPSIwIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiIFNpemU9IjEiIFBvcz0iMSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIiBTaXplPSIxIiBQb3M9IjMiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyIgU2l6ZT0iMSIgUG9zPSI0Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCIgU2l6ZT0iMSIgUG9zPSI1Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0IiBTaXplPSIxIiBQb3M9IjYiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiIFNpemU9IjEiIFBvcz0iNyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIiBTaXplPSIxIiBQb3M9IjgiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciIgU2l6ZT0iMSIgUG9zPSI5Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiIFNpemU9IjEiIFBvcz0iMTAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMTEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMTIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSIgU2l6ZT0iMSIgUG9zPSIxMyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIiBTaXplPSIxIiBQb3M9IjE0Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiIFNpemU9IjEiIFBvcz0iMTUiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4IiBTaXplPSIxIiBQb3M9IjI2Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiIFNpemU9IjEiIFBvcz0iMTciLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiIFNpemU9IjEiIFBvcz0iMTgiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiIFNpemU9IjEiIFBvcz0iMTkiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iIFNpemU9IjEiIFBvcz0iMjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiIFNpemU9IjEiIFBvcz0iMjEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIiBTaXplPSIxIiBQb3M9IjIyIi8+CisgICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPCEtLSBJbnB1dCBkZXZpY2VzIGRlZmluaXRpb24gYXMgYSBiaXRmaWVsZCBmb3IgdGhlIHN1cHBvcnRlZCBkZXZpY2VzIHBlciBJbnB1dAorICAgIHByb2ZpbGUuIEl0IG11c3QgbWF0Y2ggd2l0aCB0aGUgSW5wdXQgZGV2aWNlIGVudW0gcGFyYW1ldGVyLgorICAgIC0tPgorICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0RGV2aWNlc01hc2siPgorICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIiBTaXplPSIxIiBQb3M9IjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW1iaWVudCIgU2l6ZT0iMSIgUG9zPSIxIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIiBTaXplPSIxIiBQb3M9IjIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjMiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSI0Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiIFNpemU9IjEiIFBvcz0iNSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiIFNpemU9IjEiIFBvcz0iNiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyIgU2l6ZT0iMSIgUG9zPSI3Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiIFNpemU9IjEiIFBvcz0iOCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSI5Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjEwIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiIFNpemU9IjEiIFBvcz0iMTEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSIgU2l6ZT0iMSIgUG9zPSIxMiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciIgU2l6ZT0iMSIgUG9zPSIxMyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dl90dW5lciIgU2l6ZT0iMSIgUG9zPSIxNCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIiBTaXplPSIxIiBQb3M9IjE1Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIiBTaXplPSIxIiBQb3M9IjE2Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIiBTaXplPSIxIiBQb3M9IjE3Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIiBTaXplPSIxIiBQb3M9IjE4Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImluIiBTaXplPSIxIiBQb3M9IjMxIi8+CisgICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iT3V0cHV0RmxhZ3MiCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249InRoZSBhdWRpbyBvdXRwdXQgZmxhZ3Mgc2VydmUgdHdvIHB1cnBvc2VzOgorICAgICAgICAgICAgICAgICAgICAtIHdoZW4gYW4gQXVkaW9UcmFjayBpcyBjcmVhdGVkIHRoZXkgaW5kaWNhdGUgYSB3aXNoIHRvIGJlIGNvbm5lY3RlZCB0byBhbgorICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBzdHJlYW0gd2l0aCBhdHRyaWJ1dGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmbGFncy4KKyAgICAgICAgICAgICAgICAgICAgLSB3aGVuIHByZXNlbnQgaW4gYW4gb3V0cHV0IHByb2ZpbGUgZGVzY3JpcHRvciBsaXN0ZWQgZm9yIGEgcGFydGljdWxhciBhdWRpbworICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlIG1vZHVsZSwgdGhleSBpbmRpY2F0ZSB0aGF0IGFuIG91dHB1dCBzdHJlYW0gY2FuIGJlIG9wZW5lZCB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgdGhlIGF0dHJpYnV0ZXMgaW5kaWNhdGVkIGJ5IHRoZSBmbGFncy4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHdpbGwgdHJ5IHRvIG1hdGNoIHRoZSBmbGFncyBpbiB0aGUgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAod2hlbiBnZXRPdXB1dCgpIGlzIGNhbGxlZCkgdG8gYW4gYXZhaWxhYmxlIG91dHB1dCBzdHJlYW0uIj4KKyAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGlyZWN0IiBTaXplPSIxIiBQb3M9IjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icHJpbWFyeSIgU2l6ZT0iMSIgUG9zPSIxIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZhc3QiIFNpemU9IjEiIFBvcz0iMiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZWVwX2J1ZmZlciIgU2l6ZT0iMSIgUG9zPSIzIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImNvbXByZXNzX29mZmxvYWQiIFNpemU9IjEiIFBvcz0iNCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJub25fYmxvY2tpbmciIFNpemU9IjEiIFBvcz0iNSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJod19hdl9zeW5jIiBTaXplPSIxIiBQb3M9IjYiLz4KKyAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dEZsYWdzIgorICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJUaGUgYXVkaW8gaW5wdXQgZmxhZ3MgYXJlIGFuYWxvZ291cyB0byBhdWRpbyBvdXRwdXQgZmxhZ3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSB0aGV5IGFyZSB1c2VkIG9ubHkgd2hlbiBhbiBBdWRpb1JlY29yZCBpcyBjcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbmRpY2F0ZSBhIHByZWZlcmVuY2UgdG8gYmUgY29ubmVjdGVkIHRvIGFuIGlucHV0IHN0cmVhbSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGZsYWdzLiI+CisgICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZhc3QiIFNpemU9IjEiIFBvcz0iMCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJod19ob3R3b3JkIiBTaXplPSIxIiBQb3M9IjIiLz4KKyAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dFNvdXJjZXNNYXNrIiBEZXNjcmlwdGlvbj0iVGhlIGF1ZGlvIGlucHV0IHNvdXJjZSBpcyBhbHNvIGtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHRoZSB1c2UgY2FzZS4iPgorICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZWZhdWx0IiBTaXplPSIxIiBQb3M9IjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibWljIiBTaXplPSIxIiBQb3M9IjEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfdXBsaW5rIiBTaXplPSIxIiBQb3M9IjIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfZG93bmxpbmsiIFNpemU9IjEiIFBvcz0iMyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ2b2ljZV9jYWxsIiBTaXplPSIxIiBQb3M9IjQiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY2FtY29yZGVyIiBTaXplPSIxIiBQb3M9IjUiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfcmVjb2duaXRpb24iIFNpemU9IjEiIFBvcz0iNiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ2b2ljZV9jb21tdW5pY2F0aW9uIiBTaXplPSIxIiBQb3M9IjciLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCIgU2l6ZT0iMSIgUG9zPSI4Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIiBTaXplPSIxIiBQb3M9IjkiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaG90d29yZCIgU2l6ZT0iMSIgUG9zPSIxMCIvPgorICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDwhLS0gUm91dGluZyBTdHJhdGVneSBkZWZpbml0aW9uIGFzIGFuIGVudW1lcmF0aW9uLiBOdW1lcmljYWwgdmFsdWUgbXVzdCBtYXRjaCB0aGUgdmFsdWUKKyAgICAgICAgIG9mIHRoZSByb3V0aW5nIHN0cmF0ZWd5IGluIHBvbGljeSBoZWFkZXIgZmlsZS4gLS0+CisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyYXRlZ3kiPgorICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSIgU2l6ZT0iMzIiPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJtZWRpYSIgTnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InBob25lIiBOdW1lcmljYWw9IjEiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ic29uaWZpY2F0aW9uIiBOdW1lcmljYWw9IjIiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ic29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwiIE51bWVyaWNhbD0iMyIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJkdG1mIiBOdW1lcmljYWw9IjQiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iZW5mb3JjZWRfYXVkaWJsZSIgTnVtZXJpY2FsPSI1Ii8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InRyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlciIgTnVtZXJpY2FsPSI2Ii8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImFjY2Vzc2liaWxpdHkiIE51bWVyaWNhbD0iNyIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJyZXJvdXRpbmciIE51bWVyaWNhbD0iOCIvPgorICAgICAgICA8L0VudW1QYXJhbWV0ZXI+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkFURUdZIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyYXRlZ3lDb25maWciIE1hcHBpbmc9IlN0cmF0ZWd5OiclMSciPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9InNlbGVjdGVkX291dHB1dF9kZXZpY2VzIiBUeXBlPSJPdXRwdXREZXZpY2VzTWFzayIvPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJBVEVHWSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyZWFtIj4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhcHBsaWNhYmxlX3N0cmF0ZWd5IiBUeXBlPSJTdHJhdGVneSIgTWFwcGluZz0iU3RyZWFtOiclMSciLz4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2x1bWVfcHJvZmlsZXMiIFR5cGU9IlZvbHVtZUN1cnZlc0NhdGVnb3JpZXMiCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkEgdm9sdW1lIHByb2ZpbGUgaXMgcmVmZXJlZCBieSB0aGUgc3RyZWFtIHR5cGUuIi8+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgVVNBR0UgQ09NTU9OIFRZUEVTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJVc2FnZSI+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXBwbGljYWJsZV9zdHJhdGVneSIgVHlwZT0iU3RyYXRlZ3kiIE1hcHBpbmc9IlVzYWdlOiclMSciLz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgVVNBR0UgQ09NTU9OIFRZUEVTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBDT01NT04gVFlQRVMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0U291cmNlIj4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhcHBsaWNhYmxlX2lucHV0X2RldmljZSIgVHlwZT0iSW5wdXREZXZpY2VzTWFzayIKKyAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJJbnB1dFNvdXJjZTonJTEnIiBEZXNjcmlwdGlvbj0iU2VsZWN0ZWQgSW5wdXQgZGV2aWNlIi8+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKzwvQ29tcG9uZW50VHlwZVNldD4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Wb2x1bWUueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLVZvbHVtZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2YzOWNjMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Wb2x1bWUueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Q29tcG9uZW50VHlwZVNldCB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9Db21wb25lbnRUeXBlU2V0LnhzZCI+CisgIDxDb21wb25lbnRUeXBlIE5hbWU9IlZvbHVtZUN1cnZlUG9pbnRzIj4KKyAgICA8UGFyYW1ldGVyQmxvY2sgTmFtZT0iY3VydmVfcG9pbnRzIiBBcnJheUxlbmd0aD0iNCIgTWFwcGluZz0iVm9sdW1lUHJvZmlsZTonJTEnIgorICAgICAgICBEZXNjcmlwdGlvbj0iNCBwb2ludHMgdG8gZGVmaW5lIHRoZSB2b2x1bWUgYXR0ZW51YXRpb24gY3VydmUsIGVhY2gKKyAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3Rlcml6ZWQgYnkgdGhlIHZvbHVtZSBpbmRleCAoZnJvbSAwIHRvIDEwMCkgYXQgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgIHRoZXkgYXBwbHksIGFuZCB0aGUgYXR0ZW51YXRpb24gaW4gZEIgYXQgdGhhdCBpbmRleC4KKyAgICAgICAgICAgICAgICAgICAgIFdlIHVzZSAxMDAgc3RlcHMgdG8gYXZvaWQgcm91bmRpbmcgZXJyb3JzIHdoZW4gY29tcHV0aW5nCisgICAgICAgICAgICAgICAgICAgICB0aGUgdm9sdW1lIj4KKyAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiIFNpemU9IjMyIi8+CisgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIiBTaXplPSIxNiIgSW50ZWdyYWw9IjciIEZyYWN0aW9uYWw9IjgiLz4KKyAgICAgPC9QYXJhbWV0ZXJCbG9jaz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJWb2x1bWVDdXJ2ZXNDYXRlZ29yaWVzIj4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJoZWFkc2V0X2RldmljZV9jYXRlZ29yeSIgVHlwZT0iVm9sdW1lQ3VydmVQb2ludHMiIE1hcHBpbmc9IkNhdGVnb3J5OjAiLz4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzcGVha2VyX2RldmljZV9jYXRlZ29yeSIgVHlwZT0iVm9sdW1lQ3VydmVQb2ludHMiIE1hcHBpbmc9IkNhdGVnb3J5OjEiLz4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkiIFR5cGU9IlZvbHVtZUN1cnZlUG9pbnRzIiBNYXBwaW5nPSJDYXRlZ29yeToyIi8+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5IiBUeXBlPSJWb2x1bWVDdXJ2ZVBvaW50cyIgTWFwcGluZz0iQ2F0ZWdvcnk6MyIvPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworPC9Db21wb25lbnRUeXBlU2V0PgorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIyMWY2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sCkBAIC0wLDAgKzEsMTM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFN1YnN5c3RlbSB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvU3Vic3lzdGVtLnhzZCIKKyAgICAgICAgICAgTmFtZT0icG9saWN5IiBUeXBlPSJQb2xpY3kiIEVuZGlhbm5lc3M9IkxpdHRsZSI+CisKKyAgICA8Q29tcG9uZW50TGlicmFyeT4KKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisgICAgICAgIDwhLS0gQ29tbW9uIFR5cGVzIGRlZmludGlvbiAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCIvPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSQVRFR1kgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJhdGVnaWVzIiBEZXNjcmlwdGlvbj0iSWRlbnRpZmllciBtdXN0IG1hdGNoIHRoZSBlbnVtIHZhbHVlIHRvIG1ha2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpbmsgYmV0d2VlbiB0aGUgUG9saWN5TWFuYWdlciBhbmQgUEZXIj4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWVkaWEiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIiBNYXBwaW5nPSJBbWVuZDE6TWVkaWEsSWRlbnRpZmllcjowIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InBob25lIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIgTWFwcGluZz0iQW1lbmQxOlBob25lLElkZW50aWZpZXI6MSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzb25pZmljYXRpb24iIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpTb25pZmljYXRpb24sSWRlbnRpZmllcjoyIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKKyAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlNvbmlmaWNhdGlvblJlc3BlY3RmdWwsSWRlbnRpZmllcjozIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImR0bWYiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIiBNYXBwaW5nPSJBbWVuZDE6RHRtZixJZGVudGlmaWVyOjQiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZW5mb3JjZWRfYXVkaWJsZSIgVHlwZT0iU3RyYXRlZ3lDb25maWciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpFbmZvcmNlZEF1ZGlibGUsSWRlbnRpZmllcjo1Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InRyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlciIgVHlwZT0iU3RyYXRlZ3lDb25maWciCisgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpUcmFuc21pdHRlZFRocm91Z2hTcGVha2VyLElkZW50aWZpZXI6NiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhY2Nlc3NpYmlsaXR5IiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFjY2Vzc2liaWxpdHksSWRlbnRpZmllcjo3Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlcm91dGluZyIgVHlwZT0iU3RyYXRlZ3lDb25maWciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlJlcm91dGluZyxJZGVudGlmaWVyOjgiLz4KKyAgICAgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJBVEVHWSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyZWFtcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc3RyZWFtX3R5cGVfdCBkZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG1hcHBpbmcgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIGVudW0iPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jYWxsIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IkFtZW5kMTpWb2ljZUNhbGwsSWRlbnRpZmllcjowIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN5c3RlbSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJBbWVuZDE6U3lzdGVtLElkZW50aWZpZXI6MSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyaW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IkFtZW5kMTpSaW5nLElkZW50aWZpZXI6MiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtdXNpYyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJBbWVuZDE6TXVzaWMsSWRlbnRpZmllcjozIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFsYXJtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IkFtZW5kMTpBbGFybSxJZGVudGlmaWVyOjQiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uIiBUeXBlPSJTdHJlYW0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOk5vdGlmaWNhdGlvbixJZGVudGlmaWVyOjUiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYmx1ZXRvb3RoX3NjbyIgVHlwZT0iU3RyZWFtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Qmx1ZXRvb3RoU2NvLElkZW50aWZpZXI6NiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJlbmZvcmNlZF9hdWRpYmxlIiBUeXBlPSJTdHJlYW0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpFbmZvcmNlQXVkaWJsZSxJZGVudGlmaWVyOjciCisgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJTb3VuZHMgdGhhdCBjYW5ub3QgYmUgbXV0ZWQgYnkgdXNlciBhbmQgbXVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcm91dGVkIHRvIHNwZWFrZXIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZHRtZiIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJBbWVuZDE6RHRtZixJZGVudGlmaWVyOjgiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idHRzIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IkFtZW5kMTpUdHMsSWRlbnRpZmllcjo5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxheXMgb3ZlciBzcGVha2VyIG9ubHksIHNpbGVudCBvbiBvdGhlciBkZXZpY2VzIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFjY2Vzc2liaWxpdHkiIFR5cGU9IlN0cmVhbSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFjY2Vzc2liaWxpdHksSWRlbnRpZmllcjoxMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBhY2Nlc3NpYmlsaXR5IHRhbGsgYmFjayBwcm9tcHRzIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlcm91dGluZyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJBbWVuZDE6UmVyb3V0aW5nLElkZW50aWZpZXI6MTEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgZHluYW1pYyBwb2xpY3kgb3V0cHV0IG1peGVzIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InBhdGNoIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IkFtZW5kMTpQYXRjaCxJZGVudGlmaWVyOjEyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGludGVybmFsIGF1ZGlvIGZsaW5nZXIgdHJhY2tzLiBGaXhlZCB2b2x1bWUiLz4KKyAgICAgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFVTQUdFIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iVXNhZ2VzIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb19zdHJlYW1fdHlwZV90IGRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgbWFwcGluZyBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZiB0aGUgZW51bSI+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVua25vd24iIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6VW5rbm93bixJZGVudGlmaWVyOjAiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWVkaWEiIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6TWVkaWEsSWRlbnRpZmllcjoxIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NvbW11bmljYXRpb24iIFR5cGU9IlVzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDb21tdW5pY2F0aW9uLElkZW50aWZpZXI6MiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jb21tdW5pY2F0aW9uX3NpZ25hbGxpbmciIFR5cGU9IlVzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDb21tdW5pY2F0aW9uU2lnbmFsbGluZyxJZGVudGlmaWVyOjMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWxhcm0iIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6QWxhcm0sSWRlbnRpZmllcjo0Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbiIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpOb3RpZmljYXRpb24sSWRlbnRpZmllcjo1Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl90ZWxlcGhvbnlfcmluZ3RvbmUiIFR5cGU9IlVzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uVGVsZXBob255UmluZ3RvbmUsSWRlbnRpZmllcjo2Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX3JlcXVlc3QiIFR5cGU9IlVzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uQ29tbXVuaWNhdGlvblJlcXVlc3QsSWRlbnRpZmllcjo3Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX2luc3RhbnQiIFR5cGU9IlVzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uQ29tbXVuaWNhdGlvbkluc3RhbnQsSWRlbnRpZmllcjo4Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX2RlbGF5ZWQiIFR5cGU9IlVzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uQ29tbXVuaWNhdGlvbkRlbGF0ZWQsSWRlbnRpZmllcjo5Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9ldmVudCIgVHlwZT0iVXNhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOk5vdGlmaWNhdGlvbkV2ZW50LElkZW50aWZpZXI6MTAiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXNzaXN0YW5jZV9hY2Nlc3NpYmlsaXR5IiBUeXBlPSJVc2FnZSIKKyAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFzc2lzdGFuY2VBY2Nlc3NpYmlsaXR5LElkZW50aWZpZXI6MTEiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXNzaXN0YW5jZV9uYXZpZ2F0aW9uX2d1aWRhbmNlIiBUeXBlPSJVc2FnZSIKKyAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFzc2lzdGFuY2VOYXZpZ2F0aW9uR3VpZGFuY2UsSWRlbnRpZmllcjoxMiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhc3Npc3RhbmNlX3NvbmlmaWNhdGlvbiIgVHlwZT0iVXNhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpBc3Npc3RhbmNlU29uaWZpY2F0aW9uLElkZW50aWZpZXI6MTMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZ2FtZSIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpCbHVldG9vdGhTY28sSWRlbnRpZmllcjoxNCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2aXJ0dWFsX3NvdXJjZSIgVHlwZT0iVXNhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6VmlydHVhbFNvdXJjZSxJZGVudGlmaWVyOjE1Ii8+CisgICAgICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgVVNBR0UgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0U291cmNlcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc291cmNlX3QgZGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBtYXBwaW5nIG11c3QgbWF0Y2ggdGhlIHZhbHVlIG9mIHRoZSBlbnVtIj4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZGVmYXVsdCIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9IkFtZW5kMTpEZWZhdWx0LElkZW50aWZpZXI6MCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtaWMiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJBbWVuZDE6TWljLElkZW50aWZpZXI6MSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV91cGxpbmsiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWb2ljZVVwbGluayxJZGVudGlmaWVyOjIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfZG93bmxpbmsiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZvaWNlRG93bmxpbmssSWRlbnRpZmllcjozIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NhbGwiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDYWxsLElkZW50aWZpZXI6NCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJjYW1jb3JkZXIiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJBbWVuZDE6Q2FtY29yZGVyLElkZW50aWZpZXI6NSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9yZWNvZ25pdGlvbiIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VSZWNvZ25pdGlvbixJZGVudGlmaWVyOjYiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY29tbXVuaWNhdGlvbiIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWb2ljZUNvbW11bmljYXRpb24sSWRlbnRpZmllcjo3Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlbW90ZV9zdWJtaXgiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6UmVtb3RlU3VibWl4LElkZW50aWZpZXI6OCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJmbV90dW5lciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9IkFtZW5kMTpGbVR1bmVyLElkZW50aWZpZXI6MTk5OCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJob3R3b3JkIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iQW1lbmQxOkhvdHdvcmQsSWRlbnRpZmllcjoxOTk5Ii8+CisgICAgICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPC9Db21wb25lbnRMaWJyYXJ5PgorCisgICAgPEluc3RhbmNlRGVmaW5pdGlvbj4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzdHJlYW1zIiBUeXBlPSJTdHJlYW1zIi8+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3RyYXRlZ2llcyIgVHlwZT0iU3RyYXRlZ2llcyIvPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImlucHV0X3NvdXJjZXMiIFR5cGU9IklucHV0U291cmNlcyIvPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVzYWdlcyIgVHlwZT0iVXNhZ2VzIi8+CisgICAgPC9JbnN0YW5jZURlZmluaXRpb24+Cis8L1N1YnN5c3RlbT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvcG9saWN5X2NyaXRlcmlhLnR4dCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvcG9saWN5X2NyaXRlcmlhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZjA2NDk4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9wb2xpY3lfY3JpdGVyaWEudHh0CkBAIC0wLDAgKzEsOSBAQAorRXhjbHVzaXZlQ3JpdGVyaW9uIFRlbGVwaG9ueU1vZGUgICAgICAgICAgICAgICAgOiAgIE5vcm1hbCAgICAgICAgICBSaW5nVG9uZSAgICAgICAgICAgICAgICBJbkNhbGwgICAgICAgICAgICAgIEluQ29tbXVuaWNhdGlvbgorSW5jbHVzaXZlQ3JpdGVyaW9uIEF2YWlsYWJsZUlucHV0RGV2aWNlcyAgICAgICAgOiAgIENvbW11bmljYXRpb24gQW1iaWVudCBCdWlsdGluTWljIEJsdWV0b290aFNjb0hlYWRzZXQgV2lyZWRIZWFkc2V0IEhkbWkgVGVsZXBob255UnggQmFja01pYyBSZW1vdGVTdWJtaXggQW5sZ0RvY2tIZWFkc2V0IERndGxEb2NrSGVhZHNldCBVc2JBY2Nlc3NvcnkgVXNiRGV2aWNlIEZtVHVuZXIgVHZUdW5lciBMaW5lIFNwZGlmIEJsdWV0b290aEEyZHAgTG9vcGJhY2sKK0luY2x1c2l2ZUNyaXRlcmlvbiBBdmFpbGFibGVPdXRwdXREZXZpY2VzICAgICAgIDogICBFYXJwaWVjZSBTcGVha2VyIFdpcmVkU3BlYWtlciBXaXJlZEhlYWRzZXQgV2lyZWRIZWFkcGhvbmUgQmx1ZXRvb3RoU2NvIEJsdWV0b290aFNjb0hlYWRzZXQgQmx1ZXRvb3RoU2NvQ2Fya2l0IEJsdWV0b290aEEyZHAgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIgSGRtaSBBbmxnRG9ja0hlYWRzZXQgRGd0bERvY2tIZWFkc2V0IFVzYkFjY2Vzc29yeSBVc2JEZXZpY2UgUmVtb3RlU3VibWl4IFRlbGVwaG9ueVR4IExpbmUgSGRtaUFyYyBTcGRpZiBGbSBBdXhMaW5lIFNwZWFrZXJTYWZlCitFeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uICAgICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlU3BlYWtlciAgICAgICAgICAgIEZvcmNlQnRTY28KK0V4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvck1lZGlhICAgICAgICAgICAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VTcGVha2VyCQkJRm9yY2VIZWFkcGhvbmVzICAgICAgICAgRm9yY2VCdEEyZHAgICAgICAgICBGb3JjZVdpcmVkQWNjZXNzb3J5IEZvcmNlQW5hbG9nRG9jayBGb3JjZURpZ2l0YWxEb2NrICAgIEZvcmNlTm9CdEEyZHAgICAgICAgRm9yY2VTeXN0ZW1FbmZvcmNlZAorRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9yUmVjb3JkICAgICAgICAgICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZUJ0U2NvICAgICAgICAgICAgICBGb3JjZVdpcmVkQWNjZXNzb3J5CitFeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JEb2NrICAgICAgICAgICAgICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlV2lyZWRBY2Nlc3NvcnkgICAgIEZvcmNlQnRDYXJEb2NrICAgICAgRm9yY2VCdERlc2tEb2NrICAgICBGb3JjZUFuYWxvZ0RvY2sgRm9yY2VEaWdpdGFsRG9jaworRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9yU3lzdGVtICAgICAgICAgICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZVN5c3RlbUVuZm9yY2VkCitFeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE1MjM2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vQW5kcm9pZC5tawpAQCAtMCwwICsxLDM2IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBQb2xpY3lTdWJzeXN0ZW1CdWlsZGVyLmNwcCBcCisgICAgUG9saWN5U3Vic3lzdGVtLmNwcCBcCisgICAgU3RyYXRlZ3kuY3BwIFwKKyAgICBJbnB1dFNvdXJjZS5jcHAgXAorICAgIFZvbHVtZVByb2ZpbGUuY3BwIFwKKyAgICBTdHJlYW0uY3BwIFwKKyAgICBVc2FnZS5jcHAKKworTE9DQUxfQ0ZMQUdTICs9IFwKKyAgICAtV2FsbCBcCisgICAgLVdlcnJvciBcCisgICAgLVdleHRyYSBcCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoVE9QRElSKWV4dGVybmFsL3BhcmFtZXRlci1mcmFtZXdvcmsvcGFyYW1ldGVyIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZSAgXAorICAgIGxpYnBhcmFtZXRlciBcCisgICAgbGlieG1sc2VyaWFsaXplciBcCisgICAgbGlibG9nIFwKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRSA6PSBsaWJwb2xpY3ktc3Vic3lzdGVtCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDk3ZDU1NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJJbnB1dFNvdXJjZS5oIgorI2luY2x1ZGUgIlBvbGljeU1hcHBpbmdLZXlzLmgiCisjaW5jbHVkZSAiUG9saWN5U3Vic3lzdGVtLmgiCisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCitJbnB1dFNvdXJjZTo6SW5wdXRTb3VyY2UoY29uc3Qgc3RyaW5nICZtYXBwaW5nVmFsdWUsCisgICAgICAgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCkKKyAgICA6IENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QoaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmdLZXlBbWVuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNYXBwaW5nS2V5QW1lbmRFbmQgLSBNYXBwaW5nS2V5QW1lbmQxICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpLAorICAgICAgbVBvbGljeVN1YnN5c3RlbShzdGF0aWNfY2FzdDxjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldEJlbG9uZ2luZ1N1YnN5c3RlbSgpKSksCisgICAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlKG1Qb2xpY3lTdWJzeXN0ZW0tPmdldFBvbGljeVBsdWdpbkludGVyZmFjZSgpKSwKKyAgICAgIG1BcHBsaWNhYmxlSW5wdXREZXZpY2UobURlZmF1bHRBcHBsaWNhYmxlSW5wdXREZXZpY2UpCit7CisgICAgbUlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fc291cmNlX3Q+KGNvbnRleHQuZ2V0SXRlbUFzSW50ZWdlcihNYXBwaW5nS2V5SWRlbnRpZmllcikpOworICAgIC8vIERlY2xhcmVzIHRoZSBzdHJhdGVneSB0byBhdWRpbyBwb2xpY3kgZW5naW5lCisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+YWRkSW5wdXRTb3VyY2UoZ2V0Rm9ybWF0dGVkTWFwcGluZ1ZhbHVlKCksIG1JZCk7Cit9CisKK2Jvb2wgSW5wdXRTb3VyY2U6OnJlY2VpdmVGcm9tSFcoc3RyaW5nICYgLyplcnJvciovKQoreworICAgIGJsYWNrYm9hcmRXcml0ZSgmbUFwcGxpY2FibGVJbnB1dERldmljZSwgc2l6ZW9mKG1BcHBsaWNhYmxlSW5wdXREZXZpY2UpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBJbnB1dFNvdXJjZTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQoreworICAgIHVpbnQzMl90IGFwcGxpY2FibGVJbnB1dERldmljZTsKKyAgICBibGFja2JvYXJkUmVhZCgmYXBwbGljYWJsZUlucHV0RGV2aWNlLCBzaXplb2YoYXBwbGljYWJsZUlucHV0RGV2aWNlKSk7CisgICAgbUFwcGxpY2FibGVJbnB1dERldmljZSA9IGFwcGxpY2FibGVJbnB1dERldmljZTsKKyAgICByZXR1cm4gbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UobUlkLCBtQXBwbGljYWJsZUlucHV0RGV2aWNlKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjdjNWI1MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkZvcm1hdHRlZFN1YnN5c3RlbU9iamVjdC5oIgorI2luY2x1ZGUgIkluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC5oIgorI2luY2x1ZGUgIk1hcHBpbmdDb250ZXh0LmgiCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK2NsYXNzIFBvbGljeVN1YnN5c3RlbTsKKworY2xhc3MgSW5wdXRTb3VyY2UgOiBwdWJsaWMgQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdAoreworcHVibGljOgorICAgIElucHV0U291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nICZtYXBwaW5nVmFsdWUsCisgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGJvb2wgcmVjZWl2ZUZyb21IVyhzdGQ6OnN0cmluZyAmZXJyb3IpOworICAgIHZpcnR1YWwgYm9vbCBzZW5kVG9IVyhzdGQ6OnN0cmluZyAmZXJyb3IpOworCitwcml2YXRlOgorICAgIGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqbVBvbGljeVN1YnN5c3RlbTsgLyoqPCBSb3V0ZSBzdWJzeXRlbSBwbHVnaW4uICovCisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdG8gY29tbXVuaWNhdGUgd2l0aCBBdWRpbyBQb2xpY3kgRW5naW5lLgorICAgICAqLworICAgIGFuZHJvaWQ6OkF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICptUG9saWN5UGx1Z2luSW50ZXJmYWNlOworCisgICAgYXVkaW9fc291cmNlX3QgbUlkOyAvKio8IGlucHV0IHNvdXJjZSBpZGVudGlmaWVyIHRvIGxpbmsgd2l0aCBhdWRpby5oLiAqLworICAgIHVpbnQzMl90IG1BcHBsaWNhYmxlSW5wdXREZXZpY2U7IC8qKjwgYXBwbGljYWJsZSBpbnB1dCBkZXZpY2UgZm9yIHRoaXMgc3RyYXRlZ3kuICovCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG1EZWZhdWx0QXBwbGljYWJsZUlucHV0RGV2aWNlID0gMDsgLyoqPCBkZWZhdWx0IGlucHV0IGRldmljZS4gKi8KK307CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL3JvdW5kdXAuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lNYXBwaW5nS2V5cy5oCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKc2ltaWxhcml0eSBpbmRleCA2MyUKY29weSBmcm9tIGluY2x1ZGUvbWVkaWEvbmJhaW8vcm91bmR1cC5oCmNvcHkgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeU1hcHBpbmdLZXlzLmgKaW5kZXggNGMzY2MyNS4uNTM5NDRlOQotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL3JvdW5kdXAuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5TWFwcGluZ0tleXMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDE4ICsxNCwxOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBST1VORFVQX0gKLSNkZWZpbmUgUk9VTkRVUF9ICisjcHJhZ21hIG9uY2UKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgorLyoqCisgKiBNYXBwaW5nIGl0ZW0gdHlwZXMKKyAqLworZW51bSBQb2xpY3lJdGVtVHlwZQoreworICAgIE1hcHBpbmdLZXlOYW1lLAorICAgIE1hcHBpbmdLZXlDYXRlZ29yeSwKKyAgICBNYXBwaW5nS2V5SWRlbnRpZmllciwKKyAgICBNYXBwaW5nS2V5QW1lbmQxLAorICAgIE1hcHBpbmdLZXlBbWVuZDIsCisgICAgTWFwcGluZ0tleUFtZW5kMworfTsKIAotLy8gUm91bmQgdXAgdG8gdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyCi11bnNpZ25lZCByb3VuZHVwKHVuc2lnbmVkIHYpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgIC8vIFJPVU5EVVBfSAorc3RhdGljIGNvbnN0IHVpbnQ4X3QgTWFwcGluZ0tleUFtZW5kRW5kID0gTWFwcGluZ0tleUFtZW5kMzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmYzOTA2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uY3BwCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiUG9saWN5U3Vic3lzdGVtLmgiCisjaW5jbHVkZSAiU3Vic3lzdGVtT2JqZWN0RmFjdG9yeS5oIgorI2luY2x1ZGUgIlBvbGljeU1hcHBpbmdLZXlzLmgiCisjaW5jbHVkZSAiU3RyYXRlZ3kuaCIKKyNpbmNsdWRlICJTdHJlYW0uaCIKKyNpbmNsdWRlICJJbnB1dFNvdXJjZS5oIgorI2luY2x1ZGUgIlZvbHVtZVByb2ZpbGUuaCIKKyNpbmNsdWRlICJVc2FnZS5oIgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit1c2luZyBhbmRyb2lkOjphdWRpb19wb2xpY3k6OkVuZ2luZUluc3RhbmNlOworCitjb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1LZXlOYW1lID0gIk5hbWUiOworY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptS2V5SWRlbnRpZmllciA9ICJJZGVudGlmaWVyIjsKK2NvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bUtleUNhdGVnb3J5ID0gIkNhdGVnb3J5IjsKK2NvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bUtleUFtZW5kMSA9ICJBbWVuZDEiOworY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptS2V5QW1lbmQyID0gIkFtZW5kMiI7Citjb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1LZXlBbWVuZDMgPSAiQW1lbmQzIjsKKworCitjb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1TdHJlYW1Db21wb25lbnROYW1lID0gIlN0cmVhbSI7Citjb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1TdHJhdGVneUNvbXBvbmVudE5hbWUgPSAiU3RyYXRlZ3kiOworY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptSW5wdXRTb3VyY2VDb21wb25lbnROYW1lID0gIklucHV0U291cmNlIjsKK2NvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bVVzYWdlQ29tcG9uZW50TmFtZSA9ICJVc2FnZSI7Citjb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1Wb2x1bWVQcm9maWxlQ29tcG9uZW50TmFtZSA9ICJWb2x1bWVQcm9maWxlIjsKKworUG9saWN5U3Vic3lzdGVtOjpQb2xpY3lTdWJzeXN0ZW0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgOiBDU3Vic3lzdGVtKG5hbWUpLAorICAgICAgbVBsdWdpbkludGVyZmFjZShOVUxMKQoreworICAgIC8vIFRyeSB0byBjb25uZWN0IGEgUGx1Z2luIEludGVyZmFjZSBmcm9tIEF1ZGlvIFBvbGljeSBFbmdpbmUKKyAgICBFbmdpbmVJbnN0YW5jZSAqZW5naW5lSW5zdGFuY2UgPSBFbmdpbmVJbnN0YW5jZTo6Z2V0SW5zdGFuY2UoKTsKKworICAgIEFMT0dfQVNTRVJUKGVuZ2luZUluc3RhbmNlICE9IE5VTEwsICJOVUxMIFBsdWdpbiBJbnRlcmZhY2UiKTsKKworICAgIC8vIFJldHJpZXZlIHRoZSBSb3V0ZSBJbnRlcmZhY2UKKyAgICBtUGx1Z2luSW50ZXJmYWNlID0gZW5naW5lSW5zdGFuY2UtPnF1ZXJ5SW50ZXJmYWNlPGFuZHJvaWQ6OkF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlPigpOworICAgIEFMT0dfQVNTRVJUKG1QbHVnaW5JbnRlcmZhY2UgIT0gTlVMTCwgIk5VTEwgUGx1Z2luIEludGVyZmFjZSIpOworCisgICAgLy8gUHJvdmlkZSBtYXBwaW5nIGtleXMgdG8gdGhlIGNvcmUsIG5lY2Vzc2FyeSB3aGVuIHBhcnNpbmcgdGhlIFhNTCBTdHJ1Y3R1cmUgZmlsZXMuCisgICAgYWRkQ29udGV4dE1hcHBpbmdLZXkobUtleU5hbWUpOworICAgIGFkZENvbnRleHRNYXBwaW5nS2V5KG1LZXlDYXRlZ29yeSk7CisgICAgYWRkQ29udGV4dE1hcHBpbmdLZXkobUtleUlkZW50aWZpZXIpOworICAgIGFkZENvbnRleHRNYXBwaW5nS2V5KG1LZXlBbWVuZDEpOworICAgIGFkZENvbnRleHRNYXBwaW5nS2V5KG1LZXlBbWVuZDIpOworICAgIGFkZENvbnRleHRNYXBwaW5nS2V5KG1LZXlBbWVuZDMpOworCisgICAgLy8gUHJvdmlkZSBjcmVhdG9ycyB0byB1cHBlciBsYXllcgorICAgIGFkZFN1YnN5c3RlbU9iamVjdEZhY3RvcnkoCisgICAgICAgIG5ldyBUU3Vic3lzdGVtT2JqZWN0RmFjdG9yeTxTdHJlYW0+KAorICAgICAgICAgICAgbVN0cmVhbUNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5QW1lbmQxKSB8ICgxIDw8IE1hcHBpbmdLZXlJZGVudGlmaWVyKSkKKyAgICAgICAgKTsKKyAgICBhZGRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5KAorICAgICAgICBuZXcgVFN1YnN5c3RlbU9iamVjdEZhY3Rvcnk8U3RyYXRlZ3k+KAorICAgICAgICAgICAgbVN0cmF0ZWd5Q29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICgxIDw8IE1hcHBpbmdLZXlBbWVuZDEpIHwgKDEgPDwgTWFwcGluZ0tleUlkZW50aWZpZXIpKQorICAgICAgICApOworICAgIGFkZFN1YnN5c3RlbU9iamVjdEZhY3RvcnkoCisgICAgICAgIG5ldyBUU3Vic3lzdGVtT2JqZWN0RmFjdG9yeTxVc2FnZT4oCisgICAgICAgICAgICBtVXNhZ2VDb21wb25lbnROYW1lLAorICAgICAgICAgICAgKDEgPDwgTWFwcGluZ0tleUFtZW5kMSkgfCAoMSA8PCBNYXBwaW5nS2V5SWRlbnRpZmllcikpCisgICAgICAgICk7CisgICAgYWRkU3Vic3lzdGVtT2JqZWN0RmFjdG9yeSgKKyAgICAgICAgbmV3IFRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5PElucHV0U291cmNlPigKKyAgICAgICAgICAgIG1JbnB1dFNvdXJjZUNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5QW1lbmQxKSB8ICgxIDw8IE1hcHBpbmdLZXlJZGVudGlmaWVyKSkKKyAgICAgICAgKTsKKyAgICBhZGRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5KAorICAgICAgICBuZXcgVFN1YnN5c3RlbU9iamVjdEZhY3Rvcnk8Vm9sdW1lUHJvZmlsZT4oCisgICAgICAgICAgICBtVm9sdW1lUHJvZmlsZUNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5QW1lbmQxKSB8ICgxIDw8IE1hcHBpbmdLZXlJZGVudGlmaWVyKSB8ICgxIDw8IE1hcHBpbmdLZXlJZGVudGlmaWVyKSkKKyAgICAgICAgKTsKK30KKworLy8gUmV0cmlldmUgUm91dGUgaW50ZXJmYWNlCithbmRyb2lkOjpBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZSAqUG9saWN5U3Vic3lzdGVtOjpnZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSBjb25zdAoreworICAgIEFMT0dfQVNTRVJUKG1QbHVnaW5JbnRlcmZhY2UgIT0gTlVMTCwgIk5VTEwgUGx1Z2luIEludGVyZmFjZSIpOworICAgIHJldHVybiBtUGx1Z2luSW50ZXJmYWNlOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNjMjZmZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU3Vic3lzdGVtLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlOworCit9CisKK2NsYXNzIFBvbGljeVN1YnN5c3RlbSA6IHB1YmxpYyBDU3Vic3lzdGVtCit7CitwdWJsaWM6CisgICAgUG9saWN5U3Vic3lzdGVtKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHJOYW1lKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIFJvdXRlIE1hbmFnZXIgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogQHJldHVybiBSb3V0ZU1hbmFnZXIgaW50ZXJmYWNlIGZvciB0aGUgcm91dGUgcGx1Z2luLgorICAgICAqLworICAgIGFuZHJvaWQ6OkF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICpnZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvKiBDb3B5IGZhY2lsaXRpZXMgYXJlIHB1dCBwcml2YXRlIHRvIGRpc2FibGUgY29weS4gKi8KKyAgICBQb2xpY3lTdWJzeXN0ZW0oY29uc3QgUG9saWN5U3Vic3lzdGVtICZvYmplY3QpOworICAgIFBvbGljeVN1YnN5c3RlbSAmb3BlcmF0b3I9KGNvbnN0IFBvbGljeVN1YnN5c3RlbSAmb2JqZWN0KTsKKworICAgIGFuZHJvaWQ6OkF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICptUGx1Z2luSW50ZXJmYWNlOyAvKio8IEF1ZGlvIFBvbGljeSBQbHVnaW4gSW50ZXJmYWNlLiAqLworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1LZXlOYW1lOyAvKio8IG5hbWUga2V5IG1hcHBpbmcgc3RyaW5nLiAqLworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtS2V5SWRlbnRpZmllcjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbUtleUNhdGVnb3J5OworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1LZXlBbWVuZDE7IC8qKjwgYW1lbmQxIGtleSBtYXBwaW5nIHN0cmluZy4gKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbUtleUFtZW5kMjsgLyoqPCBhbWVuZDIga2V5IG1hcHBpbmcgc3RyaW5nLiAqLworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtS2V5QW1lbmQzOyAvKio8IGFtZW5kMyBrZXkgbWFwcGluZyBzdHJpbmcuICovCisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVN0cmVhbUNvbXBvbmVudE5hbWU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1TdHJhdGVneUNvbXBvbmVudE5hbWU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1JbnB1dFNvdXJjZUNvbXBvbmVudE5hbWU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1Vc2FnZUNvbXBvbmVudE5hbWU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1Wb2x1bWVQcm9maWxlQ29tcG9uZW50TmFtZTsKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtQnVpbGRlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtQnVpbGRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjE0ZDQ0NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW1CdWlsZGVyLmNwcApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlN1YnN5c3RlbUxpYnJhcnkuaCIKKyNpbmNsdWRlICJOYW1lZEVsZW1lbnRCdWlsZGVyVGVtcGxhdGUuaCIKKyNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IFBPTElDWV9TVUJTWVNURU1fTkFNRSA9ICJQb2xpY3kiOworZXh0ZXJuICJDIgorewordm9pZCBnZXRQT0xJQ1lTdWJzeXN0ZW1CdWlsZGVyKENTdWJzeXN0ZW1MaWJyYXJ5ICpzdWJzeXN0ZW1MaWJyYXJ5KQoreworICAgIHN1YnN5c3RlbUxpYnJhcnktPmFkZEVsZW1lbnRCdWlsZGVyKFBPTElDWV9TVUJTWVNURU1fTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVE5hbWVkRWxlbWVudEJ1aWxkZXJUZW1wbGF0ZTxQb2xpY3lTdWJzeXN0ZW0+KCkpOworfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmF0ZWd5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTg0ODgxMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJTdHJhdGVneS5oIgorI2luY2x1ZGUgIlBvbGljeU1hcHBpbmdLZXlzLmgiCisjaW5jbHVkZSAiUG9saWN5U3Vic3lzdGVtLmgiCisKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgYW5kcm9pZDo6cm91dGluZ19zdHJhdGVneTsKKworU3RyYXRlZ3k6OlN0cmF0ZWd5KGNvbnN0IHN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQpCisgICAgOiBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0KGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nS2V5QW1lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWFwcGluZ0tleUFtZW5kRW5kIC0gTWFwcGluZ0tleUFtZW5kMSArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KSwKKyAgICAgIG1Qb2xpY3lTdWJzeXN0ZW0oc3RhdGljX2Nhc3Q8Y29uc3QgUG9saWN5U3Vic3lzdGVtICo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LT5nZXRCZWxvbmdpbmdTdWJzeXN0ZW0oKSkpLAorICAgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZShtUG9saWN5U3Vic3lzdGVtLT5nZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSksCisgICAgICBtQXBwbGljYWJsZU91dHB1dERldmljZShtRGVmYXVsdEFwcGxpY2FibGVPdXRwdXREZXZpY2UpCit7CisgICAgbUlkID0gc3RhdGljX2Nhc3Q8cm91dGluZ19zdHJhdGVneT4oY29udGV4dC5nZXRJdGVtQXNJbnRlZ2VyKE1hcHBpbmdLZXlJZGVudGlmaWVyKSk7CisKKyAgICAvLyBEZWNsYXJlcyB0aGUgc3RyYXRlZ3kgdG8gYXVkaW8gcG9saWN5IGVuZ2luZQorICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmFkZFN0cmF0ZWd5KGdldEZvcm1hdHRlZE1hcHBpbmdWYWx1ZSgpLCBtSWQpOworfQorCitib29sIFN0cmF0ZWd5OjpyZWNlaXZlRnJvbUhXKHN0cmluZyAmIC8qZXJyb3IqLykKK3sKKyAgICBibGFja2JvYXJkV3JpdGUoJm1BcHBsaWNhYmxlT3V0cHV0RGV2aWNlLCBzaXplb2YobUFwcGxpY2FibGVPdXRwdXREZXZpY2UpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTdHJhdGVneTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQoreworICAgIHVpbnQzMl90IGFwcGxpY2FibGVPdXRwdXREZXZpY2U7CisgICAgYmxhY2tib2FyZFJlYWQoJmFwcGxpY2FibGVPdXRwdXREZXZpY2UsIHNpemVvZihhcHBsaWNhYmxlT3V0cHV0RGV2aWNlKSk7CisgICAgcmV0dXJuIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldERldmljZUZvclN0cmF0ZWd5KG1JZCwgYXBwbGljYWJsZU91dHB1dERldmljZSk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlhOWIzZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyYXRlZ3kuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QuaCIKKyNpbmNsdWRlICJJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJNYXBwaW5nQ29udGV4dC5oIgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCitjbGFzcyBQb2xpY3lTdWJzeXN0ZW07CisKK2NsYXNzIFN0cmF0ZWd5IDogcHVibGljIENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QKK3sKK3B1YmxpYzoKKyAgICBTdHJhdGVneShjb25zdCBzdGQ6OnN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBib29sIHJlY2VpdmVGcm9tSFcoc3RkOjpzdHJpbmcgJmVycm9yKTsKKyAgICB2aXJ0dWFsIGJvb2wgc2VuZFRvSFcoc3RkOjpzdHJpbmcgJmVycm9yKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKm1Qb2xpY3lTdWJzeXN0ZW07IC8qKjwgUm91dGUgc3Vic3l0ZW0gcGx1Z2luLiAqLworCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHRvIGNvbW11bmljYXRlIHdpdGggQXVkaW8gUG9saWN5IEVuZ2luZS4KKyAgICAgKi8KKyAgICBhbmRyb2lkOjpBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZSAqbVBvbGljeVBsdWdpbkludGVyZmFjZTsKKworICAgIGFuZHJvaWQ6OnJvdXRpbmdfc3RyYXRlZ3kgbUlkOyAvKio8IHN0cmF0ZWd5IGlkZW50aWZpZXIgdG8gbGluayB3aXRoIGF1ZGlvLmguKi8KKyAgICB1aW50MzJfdCBtQXBwbGljYWJsZU91dHB1dERldmljZTsgLyoqPCBhcHBsaWNhYmxlIG91dHB1dCBkZXZpY2UgZm9yIHRoaXMgc3RyYXRlZ3kuICovCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG1EZWZhdWx0QXBwbGljYWJsZU91dHB1dERldmljZSA9IDA7IC8qKjwgZGVmYXVsdCBvdXRwdXQgZGV2aWNlLiAqLworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTc1YjBiYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiU3RyZWFtLmgiCisjaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKKyNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKKwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBhbmRyb2lkOjpyb3V0aW5nX3N0cmF0ZWd5OworCitTdHJlYW06OlN0cmVhbShjb25zdCBzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0KQorICAgIDogQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdChpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0tleUFtZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1hcHBpbmdLZXlBbWVuZEVuZCAtIE1hcHBpbmdLZXlBbWVuZDEgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCksCisgICAgICBtUG9saWN5U3Vic3lzdGVtKHN0YXRpY19jYXN0PGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC0+Z2V0QmVsb25naW5nU3Vic3lzdGVtKCkpKSwKKyAgICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UobVBvbGljeVN1YnN5c3RlbS0+Z2V0UG9saWN5UGx1Z2luSW50ZXJmYWNlKCkpLAorICAgICAgbUFwcGxpY2FibGVTdHJhdGVneShtRGVmYXVsdEFwcGxpY2FibGVTdHJhdGVneSkKK3sKKyAgICBtSWQgPSBzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90Pihjb250ZXh0LmdldEl0ZW1Bc0ludGVnZXIoTWFwcGluZ0tleUlkZW50aWZpZXIpKTsKKworICAgIC8vIERlY2xhcmVzIHRoZSBzdHJhdGVneSB0byBhdWRpbyBwb2xpY3kgZW5naW5lCisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+YWRkU3RyZWFtKGdldEZvcm1hdHRlZE1hcHBpbmdWYWx1ZSgpLCBtSWQpOworfQorCitib29sIFN0cmVhbTo6cmVjZWl2ZUZyb21IVyhzdHJpbmcgJiAvKmVycm9yKi8pCit7CisgICAgYmxhY2tib2FyZFdyaXRlKCZtQXBwbGljYWJsZVN0cmF0ZWd5LCBzaXplb2YobUFwcGxpY2FibGVTdHJhdGVneSkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFN0cmVhbTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQoreworICAgIHVpbnQzMl90IGFwcGxpY2FibGVTdHJhdGVneTsKKyAgICBibGFja2JvYXJkUmVhZCgmYXBwbGljYWJsZVN0cmF0ZWd5LCBzaXplb2YoYXBwbGljYWJsZVN0cmF0ZWd5KSk7CisgICAgbUFwcGxpY2FibGVTdHJhdGVneSA9IGFwcGxpY2FibGVTdHJhdGVneTsKKyAgICByZXR1cm4gbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0U3RyYXRlZ3lGb3JTdHJlYW0obUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHJvdXRpbmdfc3RyYXRlZ3k+KG1BcHBsaWNhYmxlU3RyYXRlZ3kpKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZDkwYzM2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkZvcm1hdHRlZFN1YnN5c3RlbU9iamVjdC5oIgorI2luY2x1ZGUgIkluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC5oIgorI2luY2x1ZGUgIk1hcHBpbmdDb250ZXh0LmgiCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK2NsYXNzIFBvbGljeVN1YnN5c3RlbTsKKworY2xhc3MgU3RyZWFtIDogcHVibGljIENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QKK3sKK3B1YmxpYzoKKyAgICBTdHJlYW0oY29uc3Qgc3RkOjpzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYm9vbCByZWNlaXZlRnJvbUhXKHN0ZDo6c3RyaW5nICZlcnJvcik7CisgICAgdmlydHVhbCBib29sIHNlbmRUb0hXKHN0ZDo6c3RyaW5nICZlcnJvcik7CisKK3ByaXZhdGU6CisgICAgY29uc3QgUG9saWN5U3Vic3lzdGVtICptUG9saWN5U3Vic3lzdGVtOyAvKio8IFJvdXRlIHN1YnN5dGVtIHBsdWdpbi4gKi8KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIEF1ZGlvIFBvbGljeSBFbmdpbmUuCisgICAgICovCisgICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKm1Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7CisKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1JZDsgLyoqPCBzdHJlYW0gdHlwZSBpZGVudGlmaWVyIHRvIGxpbmsgd2l0aCBhdWRpby5oLiAqLworICAgIHVpbnQzMl90IG1BcHBsaWNhYmxlU3RyYXRlZ3k7IC8qKjwgYXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyBzdHJlYW0uICovCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG1EZWZhdWx0QXBwbGljYWJsZVN0cmF0ZWd5ID0gMDsgLyoqPCBkZWZhdWx0IHN0cmF0ZWd5LiAqLworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE5MTZiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVXNhZ2UuaCIKKyNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgorI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgorCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIGFuZHJvaWQ6OnJvdXRpbmdfc3RyYXRlZ3k7CisKK1VzYWdlOjpVc2FnZShjb25zdCBzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0KQorICAgIDogQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdChpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0tleUFtZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1hcHBpbmdLZXlBbWVuZEVuZCAtIE1hcHBpbmdLZXlBbWVuZDEgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCksCisgICAgICBtUG9saWN5U3Vic3lzdGVtKHN0YXRpY19jYXN0PGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC0+Z2V0QmVsb25naW5nU3Vic3lzdGVtKCkpKSwKKyAgICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UobVBvbGljeVN1YnN5c3RlbS0+Z2V0UG9saWN5UGx1Z2luSW50ZXJmYWNlKCkpLAorICAgICAgbUFwcGxpY2FibGVTdHJhdGVneShtRGVmYXVsdEFwcGxpY2FibGVTdHJhdGVneSkKK3sKKyAgICBtSWQgPSBzdGF0aWNfY2FzdDxhdWRpb191c2FnZV90Pihjb250ZXh0LmdldEl0ZW1Bc0ludGVnZXIoTWFwcGluZ0tleUlkZW50aWZpZXIpKTsKKworICAgIC8vIERlY2xhcmVzIHRoZSBzdHJhdGVneSB0byBhdWRpbyBwb2xpY3kgZW5naW5lCisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+YWRkVXNhZ2UoZ2V0Rm9ybWF0dGVkTWFwcGluZ1ZhbHVlKCksIG1JZCk7Cit9CisKK2Jvb2wgVXNhZ2U6OnJlY2VpdmVGcm9tSFcoc3RyaW5nICYgLyplcnJvciovKQoreworICAgIGJsYWNrYm9hcmRXcml0ZSgmbUFwcGxpY2FibGVTdHJhdGVneSwgc2l6ZW9mKG1BcHBsaWNhYmxlU3RyYXRlZ3kpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBVc2FnZTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQoreworICAgIHVpbnQzMl90IGFwcGxpY2FibGVTdHJhdGVneTsKKyAgICBibGFja2JvYXJkUmVhZCgmYXBwbGljYWJsZVN0cmF0ZWd5LCBzaXplb2YoYXBwbGljYWJsZVN0cmF0ZWd5KSk7CisgICAgbUFwcGxpY2FibGVTdHJhdGVneSA9IGFwcGxpY2FibGVTdHJhdGVneTsKKyAgICByZXR1cm4gbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0U3RyYXRlZ3lGb3JVc2FnZShtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8cm91dGluZ19zdHJhdGVneT4obUFwcGxpY2FibGVTdHJhdGVneSkpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1VzYWdlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZTliNjM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1VzYWdlLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0LmgiCisjaW5jbHVkZSAiSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LmgiCisjaW5jbHVkZSAiTWFwcGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlIDxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworY2xhc3MgUG9saWN5U3Vic3lzdGVtOworCitjbGFzcyBVc2FnZSA6IHB1YmxpYyBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0Cit7CitwdWJsaWM6CisgICAgVXNhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYm9vbCByZWNlaXZlRnJvbUhXKHN0ZDo6c3RyaW5nICZlcnJvcik7CisgICAgdmlydHVhbCBib29sIHNlbmRUb0hXKHN0ZDo6c3RyaW5nICZlcnJvcik7CisKK3ByaXZhdGU6CisgICAgY29uc3QgUG9saWN5U3Vic3lzdGVtICptUG9saWN5U3Vic3lzdGVtOyAvKio8IFJvdXRlIHN1YnN5dGVtIHBsdWdpbi4gKi8KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIEF1ZGlvIFBvbGljeSBFbmdpbmUuCisgICAgICovCisgICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKm1Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7CisKKyAgICBhdWRpb191c2FnZV90IG1JZDsgLyoqPCB1c2FnZSBpZGVudGlmaWVyIHRvIGxpbmsgd2l0aCBhdWRpby5oLiAqLworICAgIHVpbnQzMl90IG1BcHBsaWNhYmxlU3RyYXRlZ3k7IC8qKjwgYXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyB1c2FnZS4gKi8KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgbURlZmF1bHRBcHBsaWNhYmxlU3RyYXRlZ3kgPSAwOyAvKio8IGRlZmF1bHQgc3RyYXRlZ3kuICovCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1ZvbHVtZVByb2ZpbGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1ZvbHVtZVByb2ZpbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVjMTU1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVm9sdW1lUHJvZmlsZS5jcHAKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJWb2x1bWVQcm9maWxlLmgiCisjaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKKyNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKKyNpbmNsdWRlICJQYXJhbWV0ZXJCbG9ja1R5cGUuaCIKKyNpbmNsdWRlIDxWb2x1bWUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCitWb2x1bWVQcm9maWxlOjpWb2x1bWVQcm9maWxlKGNvbnN0IHN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCkKKyAgICA6IENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QoaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmdLZXlBbWVuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNYXBwaW5nS2V5QW1lbmRFbmQgLSBNYXBwaW5nS2V5QW1lbmQxICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpLAorICAgICAgbVBvbGljeVN1YnN5c3RlbShzdGF0aWNfY2FzdDxjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldEJlbG9uZ2luZ1N1YnN5c3RlbSgpKSksCisgICAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlKG1Qb2xpY3lTdWJzeXN0ZW0tPmdldFBvbGljeVBsdWdpbkludGVyZmFjZSgpKQoreworICAgIHVpbnQzMl90IGNhdGVnb3J5S2V5ID0gY29udGV4dC5nZXRJdGVtQXNJbnRlZ2VyKE1hcHBpbmdLZXlDYXRlZ29yeSk7CisgICAgaWYgKGNhdGVnb3J5S2V5ID49IFZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX0NOVCkgeworICAgICAgICBtQ2F0ZWdvcnkgPSBWb2x1bWU6OkRFVklDRV9DQVRFR09SWV9TUEVBS0VSOworICAgIH0gZWxzZSB7CisgICAgICAgIG1DYXRlZ29yeSA9IHN0YXRpY19jYXN0PFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5PihjYXRlZ29yeUtleSk7CisgICAgfQorICAgIG1JZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGNvbnRleHQuZ2V0SXRlbUFzSW50ZWdlcihNYXBwaW5nS2V5SWRlbnRpZmllcikpOworCisgICAgLy8gKG5vIGV4Y2VwdGlvbiBzdXBwb3J0LCBkZWZlciB0aGUgZXJyb3IpCisgICAgaWYgKGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC0+Z2V0VHlwZSgpICE9IENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQ6OkVQYXJhbWV0ZXJCbG9jaykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEdldCBhY3R1YWwgZWxlbWVudCB0eXBlCisgICAgY29uc3QgQ1BhcmFtZXRlckJsb2NrVHlwZSAqcGFyYW1ldGVyVHlwZSA9IHN0YXRpY19jYXN0PGNvbnN0IENQYXJhbWV0ZXJCbG9ja1R5cGUgKj4oCisgICAgICAgICAgICAgICAgaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LT5nZXRUeXBlRWxlbWVudCgpKTsKKyAgICBtUG9pbnRzID0gcGFyYW1ldGVyVHlwZS0+Z2V0QXJyYXlMZW5ndGgoKTsKK30KKworYm9vbCBWb2x1bWVQcm9maWxlOjpyZWNlaXZlRnJvbUhXKHN0cmluZyAmIC8qZXJyb3IqLykKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBWb2x1bWVQcm9maWxlOjpzZW5kVG9IVyhzdHJpbmcgJiAvKmVycm9yKi8pCit7CisgICAgUG9pbnQgcG9pbnRzW21Qb2ludHNdOworICAgIGJsYWNrYm9hcmRSZWFkKCZwb2ludHMsIHNpemVvZihQb2ludCkgKiBtUG9pbnRzKTsKKworICAgIFZvbHVtZUN1cnZlUG9pbnRzIHBvaW50c1ZlY3RvcjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Qb2ludHM7IGkrKykgeworICAgICAgICBWb2x1bWVDdXJ2ZVBvaW50IGN1cnZlUG9pbnQ7CisgICAgICAgIGN1cnZlUG9pbnQubUluZGV4ID0gcG9pbnRzW2ldLmluZGV4OworICAgICAgICBjdXJ2ZVBvaW50Lm1EQkF0dGVudWF0aW9uID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBvaW50c1tpXS5kYkF0dGVudWF0aW9uKSAvCisgICAgICAgICAgICAgICAgKDFVTCA8PCBnRnJhY3Rpb25hbCk7CisgICAgICAgIHBvaW50c1ZlY3Rvci5wdXNoX2JhY2soY3VydmVQb2ludCk7CisgICAgfQorICAgIHJldHVybiBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKG1JZCwgbUNhdGVnb3J5LCBwb2ludHNWZWN0b3IpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1ZvbHVtZVByb2ZpbGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Wb2x1bWVQcm9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTAwYWU4NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Wb2x1bWVQcm9maWxlLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0LmgiCisjaW5jbHVkZSAiSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LmgiCisjaW5jbHVkZSAiTWFwcGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlIDxWb2x1bWUuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworY2xhc3MgUG9saWN5U3Vic3lzdGVtOworCitjbGFzcyBWb2x1bWVQcm9maWxlIDogcHVibGljIENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QKK3sKK3ByaXZhdGU6CisgICAgc3RydWN0IFBvaW50CisgICAgeworICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgIC8qKiBWb2x1bWUgaXMgdXNpbmcgRml4ZWRQb2ludFBhcmFtZXRlciB1bnRpbCBmbG9hdCBwYXJhbWV0ZXJzIGFyZSBhdmFpbGFibGUuICovCisgICAgICAgIGludDE2X3QgZGJBdHRlbnVhdGlvbjsKKyAgICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitwdWJsaWM6CisgICAgVm9sdW1lUHJvZmlsZShjb25zdCBzdGQ6OnN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYm9vbCByZWNlaXZlRnJvbUhXKHN0ZDo6c3RyaW5nICZlcnJvcik7CisgICAgdmlydHVhbCBib29sIHNlbmRUb0hXKHN0ZDo6c3RyaW5nICZlcnJvcik7CisKK3ByaXZhdGU6CisgICAgY29uc3QgUG9saWN5U3Vic3lzdGVtICptUG9saWN5U3Vic3lzdGVtOyAvKio8IFJvdXRlIHN1YnN5dGVtIHBsdWdpbi4gKi8KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIEF1ZGlvIFBvbGljeSBFbmdpbmUuCisgICAgICovCisgICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKm1Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7CisKKyAgICAvKioKKyAgICAgKiB2b2x1bWUgcHJvZmlsZSBpZGVudGlmaWVyLCAgd2hpY2ggaXMgaW4gZmFjdCBhIHN0cmVhbSB0eXBlIHRvIGxpbmsgd2l0aCBhdWRpby5oLgorICAgICAqLworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbUlkOworCisgICAgc2l6ZV90IG1Qb2ludHM7CisgICAgVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgbUNhdGVnb3J5OworCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGdGcmFjdGlvbmFsID0gODsgLyoqPCBCZXdhcmUgdG8gYWxpZ24gd2l0aCB0aGUgc3RydWN0dXJlLiAqLworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvQ29sbGVjdGlvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Db2xsZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGYxN2IxNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvQ29sbGVjdGlvbi5oCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJFbGVtZW50LmgiCisjaW5jbHVkZSAiU3RyZWFtLmgiCisjaW5jbHVkZSAiU3RyYXRlZ3kuaCIKKyNpbmNsdWRlICJVc2FnZS5oIgorI2luY2x1ZGUgIklucHV0U291cmNlLmgiCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKKworLyoqCisgKiBDb2xsZWN0aW9uIG9mIHBvbGljeSBlbGVtZW50IGFzIGEgbWFwIGluZGV4ZWQgd2l0aCBhIHRoZWlyIFVJRCB0eXBlLgorICoKKyAqIEB0cGFyYW0gS2V5IHR5cGUgb2YgdGhlIHBvbGljeSBlbGVtZW50IGluZGV4aW5nIHRoZSBjb2xsZWN0aW9uLgorICogICAgICAgICBQb2xpY3kgRWxlbWVudCBzdXBwb3J0ZWQgYXJlOgorICogICAgICAgICAgICAgICAgICAgICAgLSBTdHJhdGVneQorICogICAgICAgICAgICAgICAgICAgICAgLSBTdHJlYW0KKyAqICAgICAgICAgICAgICAgICAgICAgIC0gSW5wdXRTb3VyY2UKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gVXNhZ2UuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CitjbGFzcyBDb2xsZWN0aW9uIDogcHVibGljIHN0ZDo6bWFwPEtleSwgRWxlbWVudDxLZXk+ICo+Cit7Citwcml2YXRlOgorICAgIHR5cGVkZWYgRWxlbWVudDxLZXk+IFQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Om1hcDxLZXksIFQgKj46Oml0ZXJhdG9yIENvbGxlY3Rpb25JdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6bWFwPEtleSwgVCAqPjo6Y29uc3RfaXRlcmF0b3IgQ29sbGVjdGlvbkNvbnN0SXRlcmF0b3I7CisKK3B1YmxpYzoKKyAgICBDb2xsZWN0aW9uKCkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rpb25TdXBwb3J0ZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwb2xpY3kgZWxlbWVudCB0byB0aGUgY29sbGVjdGlvbi4gUG9saWN5IGVsZW1lbnRzIGFyZSBzdHJlYW1zLCBzdHJhdGVnaWVzLCBpbnB1dAorICAgICAqIHNvdXJjZXMsIC4uLiBDb21waWxlIHRpbWUgZXJyb3IgZ2VuZXJhdGVkIGlmIGNhbGxlZCB3aXRoIG5vdCBzdXBwb3J0ZWQgY29sbGVjdGlvbi4KKyAgICAgKiBJdCBhbHNvIHNldCB0aGUga2V5IGFzIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcG9saWN5IGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAdHBhcmFtIEtleSBpbmRleGluZyB0aGUgY29sbGVjdGlvbiBvZiBwb2xpY3kgZWxlbWVudC4KKyAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIHBvbGljeSBlbGVtZW50IHRvIGZpbmQuCisgICAgICogQHBhcmFtW2luXSBrZXkgdG8gYmUgdXNlZCB0byBpbmRleCB0aGlzIG5ldyBwb2xpY3kgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIHBvbGljeSBlbGVtZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBhZGRlZCB0byB0aGUgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBhZGQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIEtleSBrZXkpCisgICAgeworICAgICAgICBpZiAoKCp0aGlzKS5maW5kKGtleSkgIT0gKCp0aGlzKS5lbmQoKSkgeworICAgICAgICAgICAgQUxPR1coIiVzOiBlbGVtZW50ICVzIGFscmVhZHkgYWRkZWQiLCBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgICgqdGhpcylba2V5XSA9IG5ldyBUKG5hbWUpOworICAgICAgICBBTE9HRCgiJXM6IGFkZGluZyBlbGVtZW50ICVzIHRvIGNvbGxlY3Rpb24iLCBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAoKnRoaXMpW2tleV0tPnNldElkZW50aWZpZXIoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBwb2xpY3kgZWxlbWVudCBmcm9tIHRoZSBjb2xsZWN0aW9uIGJ5IGl0cyBrZXkuIFBvbGljeSBlbGVtZW50cyBhcmUgc3RyZWFtcywgc3RyYXRlZ2llcywKKyAgICAgKiBpbnB1dCBzb3VyY2VzLCAuLi4gQ29tcGlsZSB0aW1lIGVycm9yIGdlbmVyYXRlZCBpZiBjYWxsZWQgd2l0aCBub3Qgc3VwcG9ydGVkIGNvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAdHBhcmFtIEtleSBpbmRleGluZyB0aGUgY29sbGVjdGlvbiBvZiBwb2xpY3kgZWxlbWVudC4KKyAgICAgKiBAcGFyYW1baW5dIGtleSBvZiB0aGUgcG9saWN5IGVsZW1lbnQgdG8gZmluZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdmFsaWQgcG9pbnRlciBvbiBwb2xpY3kgZWxlbWVudCBpZiBmb3VuZCwgTlVMTCBvdGhlcndpc2UuCisgICAgICovCisgICAgVCAqZ2V0KEtleSBrZXkpIGNvbnN0CisgICAgeworICAgICAgICBDb2xsZWN0aW9uQ29uc3RJdGVyYXRvciBpdCA9ICgqdGhpcykuZmluZChrZXkpOworICAgICAgICByZXR1cm4gKGl0ID09ICgqdGhpcykuZW5kKCkpID8gTlVMTCA6IGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBhIHBvbGljeSBlbGVtZW50IGZyb20gdGhlIGNvbGxlY3Rpb24gYnkgaXRzIG5hbWUuIFBvbGljeSBlbGVtZW50cyBhcmUgc3RyZWFtcywKKyAgICAgKiBzdHJhdGVnaWVzLCBpbnB1dCBzb3VyY2VzLCAuLi4KKyAgICAgKiBDb21waWxlIHRpbWUgZXJyb3IgZ2VuZXJhdGVkIGlmIGNhbGxlZCB3aXRoIG5vdCBzdXBwb3J0ZWQgY29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEB0cGFyYW0gS2V5IGluZGV4aW5nIHRoZSBjb2xsZWN0aW9uIG9mIHBvbGljeSBlbGVtZW50LgorICAgICAqIEBwYXJhbVtpbl0gbmFtZSBvZiB0aGUgcG9saWN5IGVsZW1lbnQgdG8gZmluZC4KKyAgICAgKiBAcGFyYW1baW5dIGVsZW1lbnRzTWFwIG1hcHMgb2YgcG9saWN5IGVsZW1lbnRzIHRvIHNlYXJjaCBpbnRvLgorICAgICAqCisgICAgICogQHJldHVybiB2YWxpZCBwb2ludGVyIG9uIGVsZW1lbnQgaWYgZm91bmQsIE5VTEwgb3RoZXJ3aXNlLgorICAgICAqLworICAgIFQgKmZpbmRCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0CisgICAgeworCisgICAgICAgIENvbGxlY3Rpb25Db25zdEl0ZXJhdG9yIGl0OworICAgICAgICBmb3IgKGl0ID0gKCp0aGlzKS5iZWdpbigpOyBpdCAhPSAoKnRoaXMpLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBUICplbGVtZW50ID0gaXQtPnNlY29uZDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50LT5nZXROYW1lKCkgPT0gbmFtZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0IGFuZCBkZXN0cm95IHRoZW0uCisgICAgICovCisgICAgdm9pZCBjbGVhcigpCisgICAgeworICAgICAgICBDb2xsZWN0aW9uSXRlcmF0b3IgaXQ7CisgICAgICAgIGZvciAoaXQgPSAoKnRoaXMpLmJlZ2luKCk7IGl0ICE9ICgqdGhpcykuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgICAgICgqdGhpcykuY2xlYXIoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogcHJvdmlkZSBhIGNvbXBpbGUgdGltZSBlcnJvciBpZiBubyBzcGVjaWFsaXphdGlvbiBpcyBwcm92aWRlZCBmb3IgYSBnaXZlbiB0eXBlLgorICAgICAqCisgICAgICogQHRwYXJhbSBUOiB0eXBlIG9mIHRoZSBwb2xpY3lFbGVtZW50LiBQb2xpY3kgRWxlbWVudCBzdXBwb3J0ZWQgYXJlOgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIC0gU3RyYXRlZ3kKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAtIFN0cmVhbQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIC0gSW5wdXRTb3VyY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAtIFVzYWdlLgorICAgICAqLworICAgIHN0cnVjdCBjb2xsZWN0aW9uU3VwcG9ydGVkOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb2xsZWN0aW9uPGF1ZGlvX3N0cmVhbV90eXBlX3Q+Ojpjb2xsZWN0aW9uU3VwcG9ydGVkIHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb2xsZWN0aW9uPHN0ZDo6c3RyaW5nPjo6Y29sbGVjdGlvblN1cHBvcnRlZCB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29sbGVjdGlvbjxhdWRpb191c2FnZV90Pjo6Y29sbGVjdGlvblN1cHBvcnRlZCB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29sbGVjdGlvbjxhdWRpb19zb3VyY2VfdD46OmNvbGxlY3Rpb25TdXBwb3J0ZWQge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbGxlY3Rpb248cm91dGluZ19zdHJhdGVneT46OmNvbGxlY3Rpb25TdXBwb3J0ZWQge307CisKK3R5cGVkZWYgQ29sbGVjdGlvbjxyb3V0aW5nX3N0cmF0ZWd5PiBTdHJhdGVneUNvbGxlY3Rpb247Cit0eXBlZGVmIENvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4gU3RyZWFtQ29sbGVjdGlvbjsKK3R5cGVkZWYgQ29sbGVjdGlvbjxhdWRpb191c2FnZV90PiBVc2FnZUNvbGxlY3Rpb247Cit0eXBlZGVmIENvbGxlY3Rpb248YXVkaW9fc291cmNlX3Q+IElucHV0U291cmNlQ29sbGVjdGlvbjsKKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VsZW1lbnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRWxlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUyZTc3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VsZW1lbnQuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CitjbGFzcyBFbGVtZW50Cit7CitwdWJsaWM6CisgICAgRWxlbWVudChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBtTmFtZShuYW1lKQorICAgIHt9CisgICAgfkVsZW1lbnQoKSB7fQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBpZGVudGlmaWVyIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKKyAgICAgKgorICAgICAqIEByZXR1cm5zIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAorICAgICAqLworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKworICAgIC8qKgorICAgICogU2V0IHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwb2xpY3kgZWxlbWVudC4KKyAgICAqCisgICAgKiBAdHBhcmFtIEtleSB0eXBlIG9mIHRoZSB1bmlxdWUgaWRlbnRpZmllci4KKyAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllciB0byBiZSBzZXQuCisgICAgKgorICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgaWRlbnRpZmllciBpcyB2YWxpZCBhbmQgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRJZGVudGlmaWVyKEtleSBpZGVudGlmaWVyKQorICAgIHsKKyAgICAgICAgbUlkZW50aWZpZXIgPSBpZGVudGlmaWVyOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudC4KKyAgICAgKi8KKyAgICBjb25zdCBLZXkgJmdldElkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBtSWRlbnRpZmllcjsgfQorCisgICAgLyoqCisgICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCisgICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CisgICAgICogb3IgYSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAdHBhcmFtIFByb3BlcnR5IGZvciB3aGljaCB0aGlzIHBvbGljeSBlbGVtZW50IGhhcyBzZXR0ZXIgLyBnZXR0ZXIuCisgICAgICogQHJldHVybiB0aGUgcHJvcGVydHkga2VwdCB0cmFjayBieSB0aGlzIHBvbGljeSBiYXNlIGVsZW1lbnQuCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgorICAgIFByb3BlcnR5IGdldCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCisgICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CisgICAgICogb3IgYSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAdHBhcmFtIFByb3BlcnR5IGZvciB3aGljaCB0aGlzIHBvbGljeSBlbGVtZW50IGhhcyBzZXR0ZXIgLyBnZXR0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHByb3BlcnR5IHZhbHVlIHRvIGJlIGFzc2lnbmVkIGZvciB0aGlzIHBvbGljeSBiYXNlIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBrZXB0IHRyYWNrIGJ5IHRoaXMgcG9saWN5IGJhc2UgZWxlbWVudC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+CisgICAgc3RhdHVzX3Qgc2V0KFByb3BlcnR5IHByb3BlcnR5KTsKKworcHJpdmF0ZToKKyAgICAvKiBDb3B5IGZhY2lsaXRpZXMgYXJlIHB1dCBwcml2YXRlIHRvIGRpc2FibGUgY29weS4gKi8KKyAgICBFbGVtZW50KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7CisgICAgRWxlbWVudCAmb3BlcmF0b3I9KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7CisKKyAgICBzdGQ6OnN0cmluZyBtTmFtZTsgLyoqPCBVbmlxdWUgbGl0ZXJhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCisgICAgS2V5IG1JZGVudGlmaWVyOyAvKio8IFVuaXF1ZSBudW1lcmljYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLworfTsKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjczM2NkZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lFbmdpbmUiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKy8vI2RlZmluZSBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2lmZGVmIFZFUllfVkVSQk9TRV9MT0dHSU5HCisjZGVmaW5lIEFMT0dWViBBTE9HVgorI2Vsc2UKKyNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpbmNsdWRlICJFbmdpbmUuaCIKKyNpbmNsdWRlICJTdHJhdGVneS5oIgorI2luY2x1ZGUgIlN0cmVhbS5oIgorI2luY2x1ZGUgIklucHV0U291cmNlLmgiCisjaW5jbHVkZSAiVXNhZ2UuaCIKKyNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oPgorCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6bWFwOworCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorewordGVtcGxhdGUgPD4KK1N0cmF0ZWd5Q29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPHJvdXRpbmdfc3RyYXRlZ3k+KCkKK3sKKyAgICByZXR1cm4gbVN0cmF0ZWd5Q29sbGVjdGlvbjsKK30KK3RlbXBsYXRlIDw+CitTdHJlYW1Db2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4oKQoreworICAgIHJldHVybiBtU3RyZWFtQ29sbGVjdGlvbjsKK30KK3RlbXBsYXRlIDw+CitVc2FnZUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb191c2FnZV90PigpCit7CisgICAgcmV0dXJuIG1Vc2FnZUNvbGxlY3Rpb247Cit9Cit0ZW1wbGF0ZSA8PgorSW5wdXRTb3VyY2VDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc291cmNlX3Q+KCkKK3sKKyAgICByZXR1cm4gbUlucHV0U291cmNlQ29sbGVjdGlvbjsKK30KKwordGVtcGxhdGUgPD4KK2NvbnN0IFN0cmF0ZWd5Q29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPHJvdXRpbmdfc3RyYXRlZ3k+KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN0cmF0ZWd5Q29sbGVjdGlvbjsKK30KK3RlbXBsYXRlIDw+Citjb25zdCBTdHJlYW1Db2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4oKSBjb25zdAoreworICAgIHJldHVybiBtU3RyZWFtQ29sbGVjdGlvbjsKK30KK3RlbXBsYXRlIDw+Citjb25zdCBVc2FnZUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb191c2FnZV90PigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Vc2FnZUNvbGxlY3Rpb247Cit9Cit0ZW1wbGF0ZSA8PgorY29uc3QgSW5wdXRTb3VyY2VDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc291cmNlX3Q+KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUlucHV0U291cmNlQ29sbGVjdGlvbjsKK30KKworRW5naW5lOjpFbmdpbmUoKQorICAgIDogbU1hbmFnZXJJbnRlcmZhY2UodGhpcyksCisgICAgICBtUGx1Z2luSW50ZXJmYWNlKHRoaXMpLAorICAgICAgbVBvbGljeVBhcmFtZXRlck1ncihuZXcgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIoKSksCisgICAgICBtQXBtT2JzZXJ2ZXIoTlVMTCkKK3sKK30KKworRW5naW5lOjp+RW5naW5lKCkKK3sKKyAgICBtU3RyYXRlZ3lDb2xsZWN0aW9uLmNsZWFyKCk7CisgICAgbVN0cmVhbUNvbGxlY3Rpb24uY2xlYXIoKTsKKyAgICBtSW5wdXRTb3VyY2VDb2xsZWN0aW9uLmNsZWFyKCk7CisgICAgbVVzYWdlQ29sbGVjdGlvbi5jbGVhcigpOworfQorCisKK3ZvaWQgRW5naW5lOjpzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpCit7CisgICAgQUxPR19BU1NFUlQob2JzZXJ2ZXIgIT0gTlVMTCwgIkludmFsaWQgQXVkaW8gUG9saWN5IE1hbmFnZXIgb2JzZXJ2ZXIiKTsKKyAgICBtQXBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKK30KKworc3RhdHVzX3QgRW5naW5lOjppbml0Q2hlY2soKQoreworICAgIGlmIChtUG9saWN5UGFyYW1ldGVyTWdyICE9IE5VTEwgJiYgbVBvbGljeVBhcmFtZXRlck1nci0+c3RhcnQoKSAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBzdGFydCBQb2xpY3kgUEZXIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGVsZXRlIG1Qb2xpY3lQYXJhbWV0ZXJNZ3I7CisgICAgICAgIG1Qb2xpY3lQYXJhbWV0ZXJNZ3IgPSBOVUxMOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIChtQXBtT2JzZXJ2ZXIgIT0gTlVMTCk/IE5PX0VSUk9SIDogTk9fSU5JVDsKK30KKworYm9vbCBFbmdpbmU6OnNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludHMgJnBvaW50cykKK3sKKyAgICBTdHJlYW0gKnN0cmVhbSA9IGdldEZyb21Db2xsZWN0aW9uPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHN0cmVhbVR5cGUpOworICAgIGlmIChzdHJlYW0gPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHN0cmVhbSAlZCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbVR5cGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBzdHJlYW0tPnNldFZvbHVtZVByb2ZpbGUoZGV2aWNlQ2F0ZWdvcnksIHBvaW50cykgPT0gTk9fRVJST1I7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CitFbGVtZW50PEtleT4gKkVuZ2luZTo6Z2V0RnJvbUNvbGxlY3Rpb24oY29uc3QgS2V5ICZrZXkpIGNvbnN0Cit7CisgICAgY29uc3QgQ29sbGVjdGlvbjxLZXk+IGNvbGxlY3Rpb24gPSBnZXRDb2xsZWN0aW9uPEtleT4oKTsKKyAgICByZXR1cm4gY29sbGVjdGlvbi5nZXQoa2V5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KK3N0YXR1c190IEVuZ2luZTo6YWRkKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBLZXkgJmtleSkKK3sKKyAgICBDb2xsZWN0aW9uPEtleT4gJmNvbGxlY3Rpb24gPSBnZXRDb2xsZWN0aW9uPEtleT4oKTsKKyAgICByZXR1cm4gY29sbGVjdGlvbi5hZGQobmFtZSwga2V5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5LCB0eXBlbmFtZSBLZXk+CitQcm9wZXJ0eSBFbmdpbmU6OmdldFByb3BlcnR5Rm9yS2V5KEtleSBrZXkpIGNvbnN0Cit7CisgICAgRWxlbWVudDxLZXk+ICplbGVtZW50ID0gZ2V0RnJvbUNvbGxlY3Rpb248S2V5PihrZXkpOworICAgIGlmIChlbGVtZW50ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFbGVtZW50IG5vdCBmb3VuZCB3aXRoaW4gY29sbGVjdGlvbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm9wZXJ0eT4oMCk7CisgICAgfQorICAgIHJldHVybiBlbGVtZW50LT50ZW1wbGF0ZSBnZXQ8UHJvcGVydHk+KCk7Cit9CisKK3JvdXRpbmdfc3RyYXRlZ3kgRW5naW5lOjpNYW5hZ2VySW50ZXJmYWNlSW1wbDo6Z2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKQoreworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gbVBvbGljeUVuZ2luZS0+bUFwbU9ic2VydmVyLT5nZXRPdXRwdXRzKCk7CisKKyAgICBpZiAodXNhZ2UgPT0gQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZICYmCisgICAgICAgICAgICAob3V0cHV0cy5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fUklORykgfHwKKyAgICAgICAgICAgICBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9BTEFSTSkpKSB7CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT047CisgICAgfQorICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxyb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb191c2FnZV90Pih1c2FnZSk7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBFbmdpbmU6Ok1hbmFnZXJJbnRlcmZhY2VJbXBsOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSBjb25zdAoreworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gbVBvbGljeUVuZ2luZS0+bUFwbU9ic2VydmVyLT5nZXRPdXRwdXRzKCk7CisKKyAgICAvKiogVGhpcyBpcyB0aGUgb25seSBjYXNlIGhhbmRsZWQgcHJvZ3JhbW1hdGljYWxseSBiZWNhdXNlIHRoZSBQRlcgaXMgdW5hYmxlIHRvIGtub3cgdGhlCisgICAgICogYWN0aXZpdHkgb2Ygc3RyZWFtcy4KKyAgICAgKgorICAgICAqIC1XaGlsZSBtZWRpYSBpcyBwbGF5aW5nIG9uIGEgcmVtb3RlIGRldmljZSwgdXNlIHRoZSB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yLgorICAgICAqIE5vdGUgdGhhdCB3ZSB0ZXN0IHRoaXMgdXNlY2FzZSBiZWZvcmUgdGVzdGluZyBpZiBtZWRpYSBpcyBwbGF5aW5nIGJlY2F1c2UKKyAgICAgKiB0aGUgaXNTdHJlYW1BY3RpdmUoKSBtZXRob2Qgb25seSBpbmZvcm1zIGFib3V0IHRoZSBhY3Rpdml0eSBvZiBhIHN0cmVhbSwgbm90CisgICAgICogaWYgaXQncyBmb3IgbG9jYWwgcGxheWJhY2suIE5vdGUgYWxzbyB0aGF0IHdlIHVzZSB0aGUgc2FtZSBkZWxheSBiZXR3ZWVuIGJvdGggdGVzdHMKKyAgICAgKgorICAgICAqIC1XaGVuIG1lZGlhIGlzIG5vdCBwbGF5aW5nIGFueW1vcmUsIGZhbGwgYmFjayBvbiB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yCisgICAgICovCisgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMICYmCisgICAgICAgICAgICAhaXNfc3RhdGVfaW5fY2FsbChnZXRQaG9uZVN0YXRlKCkpICYmCisgICAgICAgICAgICAhb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KEFVRElPX1NUUkVBTV9NVVNJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSAmJgorICAgICAgICAgICAgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSkgeworICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCByb3V0aW5nX3N0cmF0ZWd5PihTVFJBVEVHWV9NRURJQSk7CisgICAgfQorICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIHJvdXRpbmdfc3RyYXRlZ3k+KHN0cmF0ZWd5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5LCB0eXBlbmFtZSBLZXk+Citib29sIEVuZ2luZTo6c2V0UHJvcGVydHlGb3JLZXkoY29uc3QgUHJvcGVydHkgJnByb3BlcnR5LCBjb25zdCBLZXkgJmtleSkKK3sKKyAgICBFbGVtZW50PEtleT4gKmVsZW1lbnQgPSBnZXRGcm9tQ29sbGVjdGlvbjxLZXk+KGtleSk7CisgICAgaWYgKGVsZW1lbnQgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IEVsZW1lbnQgbm90IGZvdW5kIHdpdGhpbiBjb2xsZWN0aW9uIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnQtPnRlbXBsYXRlIHNldDxQcm9wZXJ0eT4ocHJvcGVydHkpID09IE5PX0VSUk9SOworfQorCitmbG9hdCBFbmdpbmU6OnZvbEluZGV4VG9EYihWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBjYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKQoreworICAgIFN0cmVhbSAqc3RyZWFtID0gZ2V0RnJvbUNvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtVHlwZSk7CisgICAgaWYgKHN0cmVhbSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogRWxlbWVudCBpbmRleGVkIGJ5IGtleT0lZCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbVR5cGUpOworICAgICAgICByZXR1cm4gMS4wZjsKKyAgICB9CisgICAgcmV0dXJuIHN0cmVhbS0+dm9sSW5kZXhUb0RiKGNhdGVnb3J5LCBpbmRleEluVWkpOworfQorCitzdGF0dXNfdCBFbmdpbmU6OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQoreworICAgIFN0cmVhbSAqc3RyZWFtID0gZ2V0RnJvbUNvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtVHlwZSk7CisgICAgaWYgKHN0cmVhbSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtIFR5cGUgJWQgbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBzdHJlYW1UeXBlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKyAgICBtQXBtT2JzZXJ2ZXItPmdldFN0cmVhbURlc2NyaXB0b3JzKCkuc2V0Vm9sdW1lSW5kZXhNaW4oc3RyZWFtVHlwZSwgaW5kZXhNaW4pOworICAgIG1BcG1PYnNlcnZlci0+Z2V0U3RyZWFtRGVzY3JpcHRvcnMoKS5zZXRWb2x1bWVJbmRleE1heChzdHJlYW1UeXBlLCBpbmRleE1heCk7CisKKyAgICByZXR1cm4gc3RyZWFtLT5pbml0Vm9sdW1lKGluZGV4TWluLCBpbmRleE1heCk7Cit9CisKK3N0YXR1c190IEVuZ2luZTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSkKK3sKKyAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0UGhvbmVTdGF0ZShtb2RlKTsKK30KKworYXVkaW9fbW9kZV90IEVuZ2luZTo6Z2V0UGhvbmVTdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPmdldFBob25lU3RhdGUoKTsKK30KKworc3RhdHVzX3QgRW5naW5lOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQoreworICAgIHJldHVybiBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKK30KKworYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBFbmdpbmU6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3QKK3sKKyAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+Z2V0Rm9yY2VVc2UodXNhZ2UpOworfQorCitzdGF0dXNfdCBFbmdpbmU6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlQWRkcmVzcykKK3sKKyAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZXMsIHN0YXRlLCBkZXZpY2VBZGRyZXNzKTsKK30KKwordGVtcGxhdGUgPD4KK0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqRW5naW5lOjpxdWVyeUludGVyZmFjZSgpCit7CisgICAgcmV0dXJuICZtTWFuYWdlckludGVyZmFjZTsKK30KKwordGVtcGxhdGUgPD4KK0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICpFbmdpbmU6OnF1ZXJ5SW50ZXJmYWNlKCkKK3sKKyAgICByZXR1cm4gJm1QbHVnaW5JbnRlcmZhY2U7Cit9CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZmYTdhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKworI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oPgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiQ29sbGVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZAoreworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXI7CisKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKKworY2xhc3MgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI7CitjbGFzcyBWb2x1bWVQcm9maWxlOworCitjbGFzcyBFbmdpbmUKK3sKK3B1YmxpYzoKKyAgICBFbmdpbmUoKTsKKyAgICB2aXJ0dWFsIH5FbmdpbmUoKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBSZXF1ZXN0ZWRJbnRlcmZhY2U+CisgICAgUmVxdWVzdGVkSW50ZXJmYWNlICpxdWVyeUludGVyZmFjZSgpOworCitwcml2YXRlOgorICAgIC8vLyBJbnRlcmZhY2UgbWVtYmVycworICAgIGNsYXNzIE1hbmFnZXJJbnRlcmZhY2VJbXBsIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIE1hbmFnZXJJbnRlcmZhY2VJbXBsKEVuZ2luZSAqcG9saWN5RW5naW5lKQorICAgICAgICAgICAgOiBtUG9saWN5RW5naW5lKHBvbGljeUVuZ2luZSkge30KKworICAgICAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGluaXRDaGVjaygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5pbml0Q2hlY2soKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKQorICAgICAgICB7CisgICAgICAgICAgICBtUG9saWN5RW5naW5lLT5zZXRPYnNlcnZlcihvYnNlcnZlcik7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIGF1ZGlvX3NvdXJjZV90PihpbnB1dFNvdXJjZSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdGF0ZWd5KSBjb25zdDsKKyAgICAgICAgdmlydHVhbCByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UHJvcGVydHlGb3JLZXk8cm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UGhvbmVTdGF0ZShtb2RlKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFBob25lU3RhdGUoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRGb3JjZVVzZSh1c2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MtPnR5cGUoKSwgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmluaXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoYm9vbCAvKmlzU3BlYWtlckRyY0VuYWJsZWQqLykge30KKworICAgICAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+dm9sSW5kZXhUb0RiKGRldmljZUNhdGVnb3J5LCBzdHJlYW0sIGluZGV4SW5VaSk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIEVuZ2luZSAqbVBvbGljeUVuZ2luZTsKKyAgICB9IG1NYW5hZ2VySW50ZXJmYWNlOworCisgICAgY2xhc3MgUGx1Z2luSW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFBsdWdpbkludGVyZmFjZUltcGwoRW5naW5lICpwb2xpY3lFbmdpbmUpCisgICAgICAgICAgICA6IG1Qb2xpY3lFbmdpbmUocG9saWN5RW5naW5lKSB7fQorCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyYXRlZ3koY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5hZGQ8cm91dGluZ19zdHJhdGVneT4obmFtZSwgc3RyYXRlZ3kpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmFkZDxhdWRpb19zdHJlYW1fdHlwZV90PihuYW1lLCBzdHJlYW0pOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkVXNhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5hZGQ8YXVkaW9fdXNhZ2VfdD4obmFtZSwgdXNhZ2UpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkSW5wdXRTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmFkZDxhdWRpb19zb3VyY2VfdD4obmFtZSwgc291cmNlKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlRm9yU3RyYXRlZ3koY29uc3Qgcm91dGluZ19zdHJhdGVneSAmc3RyYXRlZ3ksIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCByb3V0aW5nX3N0cmF0ZWd5PihkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3kpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBzZXRTdHJhdGVneUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UHJvcGVydHlGb3JLZXk8cm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50cyAmcG9pbnRzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShzdHJlYW0sIGRldmljZUNhdGVnb3J5LCBwb2ludHMpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBib29sIHNldFN0cmF0ZWd5Rm9yVXNhZ2UoY29uc3QgYXVkaW9fdXNhZ2VfdCAmdXNhZ2UsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQcm9wZXJ0eUZvcktleTxyb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb191c2FnZV90PihzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIHNldERldmljZUZvcklucHV0U291cmNlKGNvbnN0IGF1ZGlvX3NvdXJjZV90ICZpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIGF1ZGlvX3NvdXJjZV90PihkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBFbmdpbmUgKm1Qb2xpY3lFbmdpbmU7CisgICAgfSBtUGx1Z2luSW50ZXJmYWNlOworCitwcml2YXRlOgorICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLworICAgIEVuZ2luZShjb25zdCBFbmdpbmUgJm9iamVjdCk7CisgICAgRW5naW5lICZvcGVyYXRvcj0oY29uc3QgRW5naW5lICZvYmplY3QpOworCisgICAgdm9pZCBzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpOworCisgICAgYm9vbCBzZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnRzICZwb2ludHMpOworCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisgICAgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSk7CisgICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdDsKKyAgICBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKKyAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3Q7CisgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZUFkZHJlc3MpOworCisgICAgZmxvYXQgdm9sSW5kZXhUb0RiKFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4SW5VaSk7CisgICAgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpOworCisgICAgU3RyYXRlZ3lDb2xsZWN0aW9uIG1TdHJhdGVneUNvbGxlY3Rpb247IC8qKjwgU3RyYXRlZ2llcyBpbmRleGVkIGJ5IHRoZWlyIGVudW0gaWQuICovCisgICAgU3RyZWFtQ29sbGVjdGlvbiBtU3RyZWFtQ29sbGVjdGlvbjsgLyoqPCBTdHJlYW1zIGluZGV4ZWQgYnkgdGhlaXIgZW51bSBpZC4gICovCisgICAgVXNhZ2VDb2xsZWN0aW9uIG1Vc2FnZUNvbGxlY3Rpb247IC8qKjwgVXNhZ2VzIGluZGV4ZWQgYnkgdGhlaXIgZW51bSBpZC4gKi8KKyAgICBJbnB1dFNvdXJjZUNvbGxlY3Rpb24gbUlucHV0U291cmNlQ29sbGVjdGlvbjsgLyoqPCBJbnB1dCBzb3VyY2VzIGluZGV4ZWQgYnkgdGhlaXIgZW51bSBpZC4gKi8KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CisgICAgc3RhdHVzX3QgYWRkKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBLZXkgJmtleSk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5PgorICAgIEVsZW1lbnQ8S2V5PiAqZ2V0RnJvbUNvbGxlY3Rpb24oY29uc3QgS2V5ICZrZXkpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KKyAgICBjb25zdCBDb2xsZWN0aW9uPEtleT4gJmdldENvbGxlY3Rpb24oKSBjb25zdDsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CisgICAgQ29sbGVjdGlvbjxLZXk+ICZnZXRDb2xsZWN0aW9uKCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHksIHR5cGVuYW1lIEtleT4KKyAgICBQcm9wZXJ0eSBnZXRQcm9wZXJ0eUZvcktleShLZXkga2V5KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eSwgdHlwZW5hbWUgS2V5PgorICAgIGJvb2wgc2V0UHJvcGVydHlGb3JLZXkoY29uc3QgUHJvcGVydHkgJnByb3BlcnR5LCBjb25zdCBLZXkgJmtleSk7CisKKyAgICAvKioKKyAgICAgKiBQb2xpY3kgUGFyYW1ldGVyIE1hbmFnZXIgaGlkZGVuIHRocm91Z2ggYSB3cmFwcGVyLgorICAgICAqLworICAgIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyICptUG9saWN5UGFyYW1ldGVyTWdyOworCisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm1BcG1PYnNlcnZlcjsKK307CisKK307IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmVJbnN0YW5jZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZUluc3RhbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YWE4OWIyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmVJbnN0YW5jZS5jcHAKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaCIKKyNpbmNsdWRlICJFbmdpbmUuaCIKKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CisKK0VuZ2luZUluc3RhbmNlOjpFbmdpbmVJbnN0YW5jZSgpCit7Cit9CisKK0VuZ2luZUluc3RhbmNlICpFbmdpbmVJbnN0YW5jZTo6Z2V0SW5zdGFuY2UoKQoreworICAgIHN0YXRpYyBFbmdpbmVJbnN0YW5jZSBpbnN0YW5jZTsKKyAgICByZXR1cm4gJmluc3RhbmNlOworfQorCitFbmdpbmVJbnN0YW5jZTo6fkVuZ2luZUluc3RhbmNlKCkKK3sKK30KKworRW5naW5lICpFbmdpbmVJbnN0YW5jZTo6Z2V0RW5naW5lKCkgY29uc3QKK3sKKyAgICBzdGF0aWMgRW5naW5lIGVuZ2luZTsKKyAgICByZXR1cm4gJmVuZ2luZTsKK30KKwordGVtcGxhdGUgPD4KK0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqRW5naW5lSW5zdGFuY2U6OnF1ZXJ5SW50ZXJmYWNlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZ2V0RW5naW5lKCktPnF1ZXJ5SW50ZXJmYWNlPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZT4oKTsKK30KKwordGVtcGxhdGUgPD4KK0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICpFbmdpbmVJbnN0YW5jZTo6cXVlcnlJbnRlcmZhY2UoKSBjb25zdAoreworICAgIHJldHVybiBnZXRFbmdpbmUoKS0+cXVlcnlJbnRlcmZhY2U8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2U+KCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlmZjE1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lL0lucHV0U291cmNlIgorCisjaW5jbHVkZSAiSW5wdXRTb3VyY2UuaCIKKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CitzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3NvdXJjZV90Pjo6c2V0SWRlbnRpZmllcihhdWRpb19zb3VyY2VfdCBpZGVudGlmaWVyKQoreworICAgIGlmIChpZGVudGlmaWVyID4gQVVESU9fU09VUkNFX01BWCAmJiBpZGVudGlmaWVyICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1JZGVudGlmaWVyID0gaWRlbnRpZmllcjsKKyAgICBBTE9HRCgiJXM6IElucHV0U291cmNlICVzIGlkZW50aWZpZXIgMHglWCIsIF9fRlVOQ1RJT05fXywgZ2V0TmFtZSgpLmNfc3RyKCksIGlkZW50aWZpZXIpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyoqCisqIFNldCB0aGUgZGV2aWNlIGFzc29jaWF0ZWQgdG8gdGhpcyBzb3VyY2UuCisqIEl0IGNoZWNrcyBpZiB0aGUgaW5wdXQgZGV2aWNlIGlzIHZhbGlkIGJ1dCBhbGxvd3MgdG8gc2V0IGEgTk9ORSBkZXZpY2UKKyogKGkuZS4gb25seSB0aGUgSU4gQklUIGlzIHNldCkuCisqCisqIEBwYXJhbVtpbl0gZGV2aWNlcyBzZWxlY3RlZCBmb3IgdGhlIGdpdmVuIGlucHV0IHNvdXJjZS4KKyogQHRwYXJhbSBhdWRpb19kZXZpY2VzX3Q6IEFwcGxpY2FibGUgaW5wdXQgZGV2aWNlIGZvciB0aGlzIGlucHV0IHNvdXJjZS4KKyoKKyogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgZGV2aWNlIGlzIGVpdGhlciB2YWxpZCBvciBub25lLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyovCit0ZW1wbGF0ZSA8Pgorc3RhdHVzX3QgRWxlbWVudDxhdWRpb19zb3VyY2VfdD46OnNldChhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKK3sKKyAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2VzKSAmJiBkZXZpY2VzICE9IEFVRElPX0RFVklDRV9CSVRfSU4pIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0cnlpbmcgdG8gc2V0IGFuIGludmFsaWQgZGV2aWNlIDB4JVggZm9yIGlucHV0IHNvdXJjZSAlcyIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HRCgiJXM6IDB4JVggZm9yIGlucHV0IHNvdXJjZSAlcyIsIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgIG1BcHBsaWNhYmxlRGV2aWNlcyA9IGRldmljZXM7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit0ZW1wbGF0ZSA8PgorYXVkaW9fZGV2aWNlc190IEVsZW1lbnQ8YXVkaW9fc291cmNlX3Q+OjpnZXQ8YXVkaW9fZGV2aWNlc190PigpIGNvbnN0Cit7CisgICAgQUxPR1YoIiVzOiAweCVYIGZvciBpbnB1dFNvdXJjZSAlcyIsIF9fRlVOQ1RJT05fXywgbUFwcGxpY2FibGVEZXZpY2VzLCBnZXROYW1lKCkuY19zdHIoKSk7CisgICAgcmV0dXJuIG1BcHBsaWNhYmxlRGV2aWNlczsKK30KK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YzQ5OGRjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkVsZW1lbnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKKworLyoqCisgKiBTcGVjaWFsaXphdGlvbiBvZiBwb2xpY3kgYmFzZSBjbGFzcyBlbGVtZW50IGZvciBhdWRpb19zb3VyY2VfdAorICogQHRwYXJhbSBhdWRpb19zb3VyY2VfdCBQb2xpY3kgQmFzZSBFbGVtZW50IGlkZW50aWZpZWQgYnkgdGhlIGF1ZGlvX3NvdXJjZV90IGRlZmluaXRpb24uCisgKi8KK3RlbXBsYXRlIDw+CitjbGFzcyBFbGVtZW50PGF1ZGlvX3NvdXJjZV90PgoreworcHVibGljOgorICAgIEVsZW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgICAgIDogbU5hbWUobmFtZSksCisgICAgICAgICAgbUFwcGxpY2FibGVEZXZpY2VzKEFVRElPX0RFVklDRV9OT05FKQorICAgIHt9CisgICAgfkVsZW1lbnQoKSB7fQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBpZGVudGlmaWVyIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKKyAgICAgKgorICAgICAqIEByZXR1cm5zIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAorICAgICAqLworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKworICAgIC8qKgorICAgICogU2V0IHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwb2xpY3kgZWxlbWVudC4KKyAgICAqCisgICAgKiBAdHBhcmFtIEtleSB0eXBlIG9mIHRoZSB1bmlxdWUgaWRlbnRpZmllci4KKyAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllciB0byBiZSBzZXQuCisgICAgKgorICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgaWRlbnRpZmllciBpcyB2YWxpZCBhbmQgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRJZGVudGlmaWVyKGF1ZGlvX3NvdXJjZV90IGlkZW50aWZpZXIpOworCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudC4KKyAgICAgKi8KKyAgICBhdWRpb19zb3VyY2VfdCBnZXRJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gbUlkZW50aWZpZXI7IH0KKworICAgIC8qKgorICAgICAqIEEgUG9saWN5IGVsZW1lbnQgbWF5IGltcGxlbWVudCBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uIGZvciBhIGdpdmVuIHByb3BlcnR5LgorICAgICAqIFByb3BlcnR5IG1heSBiZSByb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAorICAgICAqIG9yIGEgc3RyaW5nLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KKyAgICBQcm9wZXJ0eSBnZXQoKSBjb25zdDsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KKyAgICBzdGF0dXNfdCBzZXQoUHJvcGVydHkgcHJvcGVydHkpOworCitwcml2YXRlOgorICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLworICAgIEVsZW1lbnQoY29uc3QgRWxlbWVudCAmb2JqZWN0KTsKKyAgICBFbGVtZW50ICZvcGVyYXRvcj0oY29uc3QgRWxlbWVudCAmb2JqZWN0KTsKKworICAgIHN0ZDo6c3RyaW5nIG1OYW1lOyAvKio8IFVuaXF1ZSBsaXRlcmFsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KKyAgICBhdWRpb19zb3VyY2VfdCBtSWRlbnRpZmllcjsgLyoqPCBVbmlxdWUgbnVtZXJpY2FsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KKworICAgIGF1ZGlvX2RldmljZXNfdCBtQXBwbGljYWJsZURldmljZXM7IC8qKjwgQXBwbGljYWJsZSBpbnB1dCBkZXZpY2UgZm9yIHRoaXMgaW5wdXQgc291cmNlLiAqLworfTsKKwordHlwZWRlZiBFbGVtZW50PGF1ZGlvX3NvdXJjZV90PiBJbnB1dFNvdXJjZTsKKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODQ3NDQzYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuY3BwCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lFbmdpbmUvU3RyYXRlZ3kiCisKKyNpbmNsdWRlICJTdHJhdGVneS5oIgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKKworc3RhdHVzX3QgRWxlbWVudDxyb3V0aW5nX3N0cmF0ZWd5Pjo6c2V0SWRlbnRpZmllcihyb3V0aW5nX3N0cmF0ZWd5IGlkZW50aWZpZXIpCit7CisgICAgaWYgKGlkZW50aWZpZXIgPj0gTlVNX1NUUkFURUdJRVMpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbUlkZW50aWZpZXIgPSBpZGVudGlmaWVyOworICAgIEFMT0dEKCIlczogU3RyYXRlZ3kgJXMgaWRlbnRpZmllciAweCVYIiwgX19GVU5DVElPTl9fLCBnZXROYW1lKCkuY19zdHIoKSwgaWRlbnRpZmllcik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKioKKyAqIFNldCB0aGUgZGV2aWNlIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneS4KKyAqIEl0IGNoZWNrcyBpZiB0aGUgb3V0cHV0IGRldmljZSBpcyB2YWxpZCBidXQgYWxsb3dzIHRvIHNldCBhIE5PTkUgZGV2aWNlCisgKgorICogQHBhcmFtW2luXSBkZXZpY2VzIHNlbGVjdGVkIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCisgKgorICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgZGV2aWNlIGlzIGVpdGhlciB2YWxpZCBvciBub25lLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLwordGVtcGxhdGUgPD4KK3N0YXR1c190IEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT46OnNldDxhdWRpb19kZXZpY2VzX3Q+KGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQoreworICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZXMoZGV2aWNlcykgJiYgZGV2aWNlcyAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBBTE9HRSgiJXM6IHRyeWluZyB0byBzZXQgYW4gaW52YWxpZCBkZXZpY2UgMHglWCBmb3Igc3RyYXRlZ3kgJXMiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZXMsIGdldE5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR0QoIiVzOiAweCVYIGZvciBzdHJhdGVneSAlcyIsIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgIG1BcHBsaWNhYmxlRGV2aWNlcyA9IGRldmljZXM7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit0ZW1wbGF0ZSA8PgorYXVkaW9fZGV2aWNlc190IEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT46OmdldDxhdWRpb19kZXZpY2VzX3Q+KCkgY29uc3QKK3sKKyAgICBBTE9HVigiJXM6IDB4JVggZm9yIHN0cmF0ZWd5ICVzIiwgX19GVU5DVElPTl9fLCBtQXBwbGljYWJsZURldmljZXMsIGdldE5hbWUoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gbUFwcGxpY2FibGVEZXZpY2VzOworfQorCit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjExNTdkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmF0ZWd5LmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRWxlbWVudC5oIgorI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgorCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworCisvKioKKyAqIEB0cGFyYW0gYXVkaW9fZGV2aWNlc190OiBBcHBsaWNhYmxlIG91dHB1dCBkZXZpY2UocykgZm9yIHRoaXMgc3RyYXRlZ3kuCisgKi8KK3RlbXBsYXRlIDw+CitjbGFzcyBFbGVtZW50PHJvdXRpbmdfc3RyYXRlZ3k+Cit7CitwdWJsaWM6CisgICAgRWxlbWVudChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBtTmFtZShuYW1lKSwKKyAgICAgICAgICBtQXBwbGljYWJsZURldmljZXMoQVVESU9fREVWSUNFX05PTkUpCisgICAge30KKyAgICB+RWxlbWVudCgpIHt9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAorICAgICAqCisgICAgICogQHJldHVybnMgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGlzIHBvbGljeSBlbGVtZW50CisgICAgICovCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorCisgICAgLyoqCisgICAgKiBTZXQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBvbGljeSBlbGVtZW50LgorICAgICoKKyAgICAqIEB0cGFyYW0gS2V5IHR5cGUgb2YgdGhlIHVuaXF1ZSBpZGVudGlmaWVyLgorICAgICogQHBhcmFtW2luXSBpZGVudGlmaWVyIHRvIGJlIHNldC4KKyAgICAqCisgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBpZGVudGlmaWVyIGlzIHZhbGlkIGFuZCBzZXQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAqLworICAgIHN0YXR1c190IHNldElkZW50aWZpZXIocm91dGluZ19zdHJhdGVneSBpZGVudGlmaWVyKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQuCisgICAgICovCisgICAgcm91dGluZ19zdHJhdGVneSBnZXRJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gbUlkZW50aWZpZXI7IH0KKworICAgIC8qKgorICAgICAqIEEgUG9saWN5IGVsZW1lbnQgbWF5IGltcGxlbWVudCBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uIGZvciBhIGdpdmVuIHByb3BlcnR5LgorICAgICAqIFByb3BlcnR5IG1heSBiZSByb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAorICAgICAqIG9yIGEgc3RyaW5nLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KKyAgICBQcm9wZXJ0eSBnZXQoKSBjb25zdDsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KKyAgICBzdGF0dXNfdCBzZXQoUHJvcGVydHkgcHJvcGVydHkpOworCitwcml2YXRlOgorICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLworICAgIEVsZW1lbnQoY29uc3QgRWxlbWVudCAmb2JqZWN0KTsKKyAgICBFbGVtZW50ICZvcGVyYXRvcj0oY29uc3QgRWxlbWVudCAmb2JqZWN0KTsKKworICAgIHN0ZDo6c3RyaW5nIG1OYW1lOyAvKio8IFVuaXF1ZSBsaXRlcmFsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KKyAgICByb3V0aW5nX3N0cmF0ZWd5IG1JZGVudGlmaWVyOyAvKio8IFVuaXF1ZSBudW1lcmljYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLworCisgICAgYXVkaW9fZGV2aWNlc190IG1BcHBsaWNhYmxlRGV2aWNlczsgLyoqPCBBcHBsaWNhYmxlIG91dHB1dCBkZXZpY2UocykgZm9yIHRoaXMgc3RyYXRlZ3kuICovCit9OworCit0eXBlZGVmIEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT4gU3RyYXRlZ3k7CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZWEyYzE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uY3BwCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lL1N0cmVhbSIKKworI2luY2x1ZGUgIlN0cmVhbS5oIgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKKworc3RhdHVzX3QgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90Pjo6c2V0SWRlbnRpZmllcihhdWRpb19zdHJlYW1fdHlwZV90IGlkZW50aWZpZXIpCit7CisgICAgaWYgKGlkZW50aWZpZXIgPiBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1JZGVudGlmaWVyID0gaWRlbnRpZmllcjsKKyAgICBBTE9HRCgiJXM6IFN0cmVhbSAlcyBpZGVudGlmaWVyIDB4JVgiLCBfX0ZVTkNUSU9OX18sIGdldE5hbWUoKS5jX3N0cigpLCBpZGVudGlmaWVyKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qKgorKiBTZXQgdGhlIHN0cmF0ZWd5IHRvIGZvbGxvdyBmb3IgdGhpcyBzdHJlYW0uCisqIEl0IGNoZWNrcyBpZiB0aGUgc3RyYXRlZ3kgaXMgdmFsaWQuCisqCisqIEBwYXJhbVtpbl0gc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQuCisqCisqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIHN0cmF0ZWd5IGlzIHNldCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorKi8KK3RlbXBsYXRlIDw+CitzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+OjpzZXQ8cm91dGluZ19zdHJhdGVneT4ocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKK3sKKyAgICBpZiAoc3RyYXRlZ3kgPj0gTlVNX1NUUkFURUdJRVMpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbUFwcGxpY2FibGVTdHJhdGVneSA9IHN0cmF0ZWd5OworICAgIEFMT0dEKCIlczogMHglWCBmb3IgU3RyZWFtICVzIiwgX19GVU5DVElPTl9fLCBzdHJhdGVneSwgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordGVtcGxhdGUgPD4KK3JvdXRpbmdfc3RyYXRlZ3kgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90Pjo6Z2V0PHJvdXRpbmdfc3RyYXRlZ3k+KCkgY29uc3QKK3sKKyAgICBBTE9HVigiJXM6IDB4JVggZm9yIFN0cmVhbSAlcyIsIF9fRlVOQ1RJT05fXywgbUFwcGxpY2FibGVTdHJhdGVneSwgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgIHJldHVybiBtQXBwbGljYWJsZVN0cmF0ZWd5OworfQorCitzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+OjpzZXRWb2x1bWVQcm9maWxlKFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50cyAmcG9pbnRzKQoreworICAgIEFMT0dEKCIlczogYWRkaW5nIHZvbHVtZSBwcm9maWxlIGZvciAlcyBmb3IgZGV2aWNlIGNhdGVnb3J5ICVkLCBwb2ludHMgbmIgPSVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgIGdldE5hbWUoKS5jX3N0cigpLCBjYXRlZ29yeSwgcG9pbnRzLnNpemUoKSk7CisgICAgbVZvbHVtZVByb2ZpbGVzW2NhdGVnb3J5XSA9IHBvaW50czsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcG9pbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFMT0dWKCIlczogJXMgY2F0PSVkIGN1cnZlIGluZGV4ID0lZCBJbmRleD0lZCBkQkF0dGVudWF0aW9uPSVmIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBnZXROYW1lKCkuY19zdHIoKSwgY2F0ZWdvcnksIGksIHBvaW50c1tpXS5tSW5kZXgsCisgICAgICAgICAgICAgcG9pbnRzW2ldLm1EQkF0dGVudWF0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+Ojppbml0Vm9sdW1lKGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQoreworICAgIEFMT0dWKCJpbml0U3RyZWFtVm9sdW1lKCkgc3RyZWFtICVzLCBtaW4gJWQsIG1heCAlZCIsIGdldE5hbWUoKS5jX3N0cigpLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgIGlmIChpbmRleE1pbiA8IDAgfHwgaW5kZXhNaW4gPj0gaW5kZXhNYXgpIHsKKyAgICAgICAgQUxPR1coImluaXRTdHJlYW1Wb2x1bWUoKSBpbnZhbGlkIGluZGV4IGxpbWl0cyBmb3Igc3RyZWFtICVzLCBtaW4gJWQsIG1heCAlZCIsCisgICAgICAgICAgICAgIGdldE5hbWUoKS5jX3N0cigpLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtSW5kZXhNaW4gPSBpbmRleE1pbjsKKyAgICBtSW5kZXhNYXggPSBpbmRleE1heDsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworZmxvYXQgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90Pjo6dm9sSW5kZXhUb0RiKFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4SW5VaSkKK3sKKyAgICBWb2x1bWVQcm9maWxlQ29uc3RJdGVyYXRvciBpdCA9IG1Wb2x1bWVQcm9maWxlcy5maW5kKGRldmljZUNhdGVnb3J5KTsKKyAgICBpZiAoaXQgPT0gbVZvbHVtZVByb2ZpbGVzLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogZGV2aWNlIGNhdGVnb3J5ICVkIG5vdCBmb3VuZCBmb3Igc3RyZWFtICVzIiwgX19GVU5DVElPTl9fLCBkZXZpY2VDYXRlZ29yeSwKKyAgICAgICAgICAgICAgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gMS4wZjsKKyAgICB9CisgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludHMgY3VydmUgPSBtVm9sdW1lUHJvZmlsZXNbZGV2aWNlQ2F0ZWdvcnldOworICAgIGlmIChjdXJ2ZS5zaXplKCkgIT0gVm9sdW1lOjpWT0xDTlQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHByb2ZpbGUgZm9yIGNhdGVnb3J5ICVkIGFuZCBmb3Igc3RyZWFtICVzIiwgX19GVU5DVElPTl9fLCBkZXZpY2VDYXRlZ29yeSwKKyAgICAgICAgICAgICAgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gMS4wZjsKKyAgICB9CisKKyAgICAvLyB0aGUgdm9sdW1lIGluZGV4IGluIHRoZSBVSSBpcyByZWxhdGl2ZSB0byB0aGUgbWluIGFuZCBtYXggdm9sdW1lIGluZGljZXMgZm9yIHRoaXMgc3RyZWFtIHR5cGUKKyAgICBpbnQgbmJTdGVwcyA9IDEgKyBjdXJ2ZVtWb2x1bWU6OlZPTE1BWF0ubUluZGV4IC0KKyAgICAgICAgICAgIGN1cnZlW1ZvbHVtZTo6Vk9MTUlOXS5tSW5kZXg7CisKKyAgICBpZiAobUluZGV4TWF4IC0gbUluZGV4TWluID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHZvbHVtZSBpbmRleGVzIE1pbj1NYXg9JWQiLCBfX0ZVTkNUSU9OX18sIG1JbmRleE1pbik7CisgICAgICAgIHJldHVybiAxLjBmOworICAgIH0KKyAgICBpbnQgdm9sSWR4ID0gKG5iU3RlcHMgKiAoaW5kZXhJblVpIC0gbUluZGV4TWluKSkgLworICAgICAgICAgICAgKG1JbmRleE1heCAtIG1JbmRleE1pbik7CisKKyAgICAvLyBmaW5kIHdoYXQgcGFydCBvZiB0aGUgY3VydmUgdGhpcyBpbmRleCB2b2x1bWUgYmVsb25ncyB0bywgb3IgaWYgaXQncyBvdXQgb2YgYm91bmRzCisgICAgaW50IHNlZ21lbnQgPSAwOworICAgIGlmICh2b2xJZHggPCBjdXJ2ZVtWb2x1bWU6OlZPTE1JTl0ubUluZGV4KSB7ICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcworICAgICAgICByZXR1cm4gMC4wZjsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZvbHVtZTo6Vk9MS05FRTFdLm1JbmRleCkgeworICAgICAgICBzZWdtZW50ID0gMDsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZvbHVtZTo6Vk9MS05FRTJdLm1JbmRleCkgeworICAgICAgICBzZWdtZW50ID0gMTsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8PSBjdXJ2ZVtWb2x1bWU6OlZPTE1BWF0ubUluZGV4KSB7CisgICAgICAgIHNlZ21lbnQgPSAyOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcworICAgICAgICByZXR1cm4gMS4wZjsKKyAgICB9CisKKyAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpbiB0aGUgYXR0ZW51YXRpb24gdGFibGUgaW4gZEIKKyAgICBmbG9hdCBkZWNpYmVscyA9IGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uICsKKyAgICAgICAgICAgICgoZmxvYXQpKHZvbElkeCAtIGN1cnZlW3NlZ21lbnRdLm1JbmRleCkpICoKKyAgICAgICAgICAgICAgICAoIChjdXJ2ZVtzZWdtZW50KzFdLm1EQkF0dGVudWF0aW9uIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uKSAvCisgICAgICAgICAgICAgICAgICAgICgoZmxvYXQpKGN1cnZlW3NlZ21lbnQrMV0ubUluZGV4IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgpKSApOworCisgICAgQUxPR1YoIlZPTFVNRSB2b2wgaW5kZXg9WyVkICVkICVkXSwgZEI9WyUuMWYgJS4xZiAlLjFmXSIsCisgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgsIHZvbElkeCwKKyAgICAgICAgICAgIGN1cnZlW3NlZ21lbnQrMV0ubUluZGV4LAorICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24sCisgICAgICAgICAgICBkZWNpYmVscywKKyAgICAgICAgICAgIGN1cnZlW3NlZ21lbnQrMV0ubURCQXR0ZW51YXRpb24pOworCisgICAgcmV0dXJuIGRlY2liZWxzOworfQorCit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGMzOWRjNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkVsZW1lbnQuaCIKKyNpbmNsdWRlICJFbmdpbmVEZWZpbml0aW9uLmgiCisjaW5jbHVkZSA8Vm9sdW1lLmg+CisjaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworLyoqCisgKiBAdHBhcmFtIHJvdXRpbmdfc3RyYXRlZ3k6IEFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgc3RyZWFtLgorICovCit0ZW1wbGF0ZSA8PgorY2xhc3MgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90PgoreworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5LCBWb2x1bWVDdXJ2ZVBvaW50cz4gVm9sdW1lUHJvZmlsZXM7CisgICAgdHlwZWRlZiBWb2x1bWVQcm9maWxlczo6aXRlcmF0b3IgVm9sdW1lUHJvZmlsZUl0ZXJhdG9yOworICAgIHR5cGVkZWYgVm9sdW1lUHJvZmlsZXM6OmNvbnN0X2l0ZXJhdG9yIFZvbHVtZVByb2ZpbGVDb25zdEl0ZXJhdG9yOworCitwdWJsaWM6CisgICAgRWxlbWVudChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBtTmFtZShuYW1lKSwKKyAgICAgICAgICBtQXBwbGljYWJsZVN0cmF0ZWd5KFNUUkFURUdZX01FRElBKSwKKyAgICAgICAgICBtSW5kZXhNaW4oMCksCisgICAgICAgICAgbUluZGV4TWF4KDEpCisgICAge30KKyAgICB+RWxlbWVudCgpIHt9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAorICAgICAqCisgICAgICogQHJldHVybnMgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGlzIHBvbGljeSBlbGVtZW50CisgICAgICovCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorCisgICAgLyoqCisgICAgKiBTZXQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBvbGljeSBlbGVtZW50LgorICAgICoKKyAgICAqIEB0cGFyYW0gS2V5IHR5cGUgb2YgdGhlIHVuaXF1ZSBpZGVudGlmaWVyLgorICAgICogQHBhcmFtW2luXSBpZGVudGlmaWVyIHRvIGJlIHNldC4KKyAgICAqCisgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBpZGVudGlmaWVyIGlzIHZhbGlkIGFuZCBzZXQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAqLworICAgIHN0YXR1c190IHNldElkZW50aWZpZXIoYXVkaW9fc3RyZWFtX3R5cGVfdCBpZGVudGlmaWVyKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQuCisgICAgICovCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gbUlkZW50aWZpZXI7IH0KKworICAgIC8qKgorICAgICAqIEEgUG9saWN5IGVsZW1lbnQgbWF5IGltcGxlbWVudCBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uIGZvciBhIGdpdmVuIHByb3BlcnR5LgorICAgICAqIFByb3BlcnR5IG1heSBiZSByb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAorICAgICAqIG9yIGEgc3RyaW5nLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KKyAgICBQcm9wZXJ0eSBnZXQoKSBjb25zdDsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KKyAgICBzdGF0dXNfdCBzZXQoUHJvcGVydHkgcHJvcGVydHkpOworCisgICAgc3RhdHVzX3Qgc2V0Vm9sdW1lUHJvZmlsZShWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBjYXRlZ29yeSwgY29uc3QgVm9sdW1lQ3VydmVQb2ludHMgJnBvaW50cyk7CisKKyAgICBmbG9hdCB2b2xJbmRleFRvRGIoVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksIGludCBpbmRleEluVWkpOworCisgICAgc3RhdHVzX3QgaW5pdFZvbHVtZShpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCk7CisKK3ByaXZhdGU6CisgICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCisgICAgRWxlbWVudChjb25zdCBFbGVtZW50ICZvYmplY3QpOworICAgIEVsZW1lbnQgJm9wZXJhdG9yPShjb25zdCBFbGVtZW50ICZvYmplY3QpOworCisgICAgc3RkOjpzdHJpbmcgbU5hbWU7IC8qKjwgVW5pcXVlIGxpdGVyYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbUlkZW50aWZpZXI7IC8qKjwgVW5pcXVlIG51bWVyaWNhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCisKKyAgICByb3V0aW5nX3N0cmF0ZWd5IG1BcHBsaWNhYmxlU3RyYXRlZ3k7IC8qKjwgQXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyBzdHJlYW0uICovCisKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0aW9uIG9mIHZvbHVtZSBwcm9maWxlcyBpbmRleGVkIGJ5IHRoZSBzdHJlYW0gdHlwZS4KKyAgICAgKiBWb2x1bWUgaXMgdGhlIG9ubHkgcmVhc29uIHdoeSB0aGUgc3RyZWFtIHByb2ZpbGUgd2FzIG5vdCByZW1vdmVkIGZyb20gcG9saWN5IHdoZW4gaW50cm9kdWNpbmcKKyAgICAgKiBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIFZvbHVtZVByb2ZpbGVzIG1Wb2x1bWVQcm9maWxlczsKKworICAgIGludCBtSW5kZXhNaW47CisKKyAgICBpbnQgbUluZGV4TWF4OworfTsKKwordHlwZWRlZiBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+IFN0cmVhbTsKKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Vc2FnZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZDIwODI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Vc2FnZS5jcHAKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9Vc2FnZSIKKworI2luY2x1ZGUgIlVzYWdlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CisKK3N0YXR1c190IEVsZW1lbnQ8YXVkaW9fdXNhZ2VfdD46OnNldElkZW50aWZpZXIoYXVkaW9fdXNhZ2VfdCBpZGVudGlmaWVyKQoreworICAgIGlmIChpZGVudGlmaWVyID4gQVVESU9fVVNBR0VfTUFYKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1JZGVudGlmaWVyID0gaWRlbnRpZmllcjsKKyAgICBBTE9HRCgiJXM6IFVzYWdlICVzIGhhcyBpZGVudGlmaWVyIDB4JVgiLCBfX0ZVTkNUSU9OX18sIGdldE5hbWUoKS5jX3N0cigpLCBpZGVudGlmaWVyKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3RlbXBsYXRlIDw+CitzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3VzYWdlX3Q+OjpzZXQ8cm91dGluZ19zdHJhdGVneT4ocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKK3sKKyAgICBpZiAoc3RyYXRlZ3kgPj0gTlVNX1NUUkFURUdJRVMpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR0QoIiVzOiAlZCBmb3IgVXNhZ2UgJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmF0ZWd5LCBnZXROYW1lKCkuY19zdHIoKSk7CisgICAgbUFwcGxpY2FibGVTdHJhdGVneSA9IHN0cmF0ZWd5OworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordGVtcGxhdGUgPD4KK3JvdXRpbmdfc3RyYXRlZ3kgRWxlbWVudDxhdWRpb191c2FnZV90Pjo6Z2V0PHJvdXRpbmdfc3RyYXRlZ3k+KCkgY29uc3QKK3sKKyAgICBBTE9HRCgiJXM6ICVkIGZvciBVc2FnZSAlcyIsIF9fRlVOQ1RJT05fXywgbUFwcGxpY2FibGVTdHJhdGVneSwgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgIHJldHVybiBtQXBwbGljYWJsZVN0cmF0ZWd5OworfQorCit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDY5ZTBlMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvVXNhZ2UuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJFbGVtZW50LmgiCisjaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CisKKy8qKgorICogQHRwYXJhbSByb3V0aW5nX3N0cmF0ZWd5OiBBcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHVzYWdlLgorICovCit0ZW1wbGF0ZSA8PgorY2xhc3MgRWxlbWVudDxhdWRpb191c2FnZV90PgoreworcHVibGljOgorICAgIEVsZW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgICAgIDogbU5hbWUobmFtZSksCisgICAgICAgICAgbUFwcGxpY2FibGVTdHJhdGVneShTVFJBVEVHWV9NRURJQSkKKyAgICB7fQorICAgIH5FbGVtZW50KCkge30KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaWRlbnRpZmllciBvZiB0aGlzIHBvbGljeSBlbGVtZW50CisgICAgICoKKyAgICAgKiBAcmV0dXJucyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisKKyAgICAvKioKKyAgICAqIFNldCB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcG9saWN5IGVsZW1lbnQuCisgICAgKgorICAgICogQHRwYXJhbSBLZXkgdHlwZSBvZiB0aGUgdW5pcXVlIGlkZW50aWZpZXIuCisgICAgKiBAcGFyYW1baW5dIGlkZW50aWZpZXIgdG8gYmUgc2V0LgorICAgICoKKyAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIGlkZW50aWZpZXIgaXMgdmFsaWQgYW5kIHNldCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICovCisgICAgc3RhdHVzX3Qgc2V0SWRlbnRpZmllcihhdWRpb191c2FnZV90IGlkZW50aWZpZXIpOworCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudC4KKyAgICAgKi8KKyAgICBhdWRpb191c2FnZV90IGdldElkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBtSWRlbnRpZmllcjsgfQorCisgICAgLyoqCisgICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCisgICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CisgICAgICogb3IgYSBzdHJpbmcuCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgorICAgIFByb3BlcnR5IGdldCgpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgorICAgIHN0YXR1c190IHNldChQcm9wZXJ0eSBwcm9wZXJ0eSk7CisKK3ByaXZhdGU6CisgICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCisgICAgRWxlbWVudChjb25zdCBFbGVtZW50ICZvYmplY3QpOworICAgIEVsZW1lbnQgJm9wZXJhdG9yPShjb25zdCBFbGVtZW50ICZvYmplY3QpOworCisgICAgc3RkOjpzdHJpbmcgbU5hbWU7IC8qKjwgVW5pcXVlIGxpdGVyYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLworICAgIGF1ZGlvX3VzYWdlX3QgbUlkZW50aWZpZXI7IC8qKjwgVW5pcXVlIG51bWVyaWNhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCisgICAgcm91dGluZ19zdHJhdGVneSBtQXBwbGljYWJsZVN0cmF0ZWd5OyAvKio8IEFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgdXNhZ2UuICovCit9OworCit0eXBlZGVmIEVsZW1lbnQ8YXVkaW9fdXNhZ2VfdD4gVXNhZ2U7CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NmY5MTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDAgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgV1JBUFBFUiBMSUJSQVJZCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCisgICAgJChUQVJHRVRfT1VUX0hFQURFUlMpL3BhcmFtZXRlciBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcy9jb252ZXJ0IFwKKworTE9DQUxfU1JDX0ZJTEVTOj0gUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYm1lZGlhX2hlbHBlciBcCisKK0xPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5cGZ3d3JhcHBlcgorTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IgLVdleHRyYQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDT05GSUdVUkFUSU9OIEZJTEUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIHNwZWNpZmljIG1hbmFnZW1lbnQgb2YgYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykKK0xPQ0FMX1NSQ19GSUxFUyA6PSBjb25maWcvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2ZlNDlkNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcApAQCAtMCwwICsxLDQzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9QRldXcmFwcGVyIgorCisjaW5jbHVkZSAiUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuaCIKKyNpbmNsdWRlICJhdWRpb19wb2xpY3lfY3JpdGVyaWFfY29uZi5oIgorI2luY2x1ZGUgPFBhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yLmg+CisjaW5jbHVkZSA8U2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZS5oPgorI2luY2x1ZGUgPFNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZS5oPgorI2luY2x1ZGUgPGNvbnZlcnQuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKKy8vLyBQRlcgcmVsYXRlZCBkZWZpbml0aW9ucworLy8gTG9nZ2VyCitjbGFzcyBQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvckxvZ2dlciA6IHB1YmxpYyBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3I6OklMb2dnZXIKK3sKK3B1YmxpYzoKKyAgICBQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvckxvZ2dlcigpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgbG9nKGJvb2wgaXNXYXJuaW5nLCBjb25zdCBzdHJpbmcgJmxvZykKKyAgICB7CisgICAgICAgIGNvbnN0IHN0YXRpYyBzdHJpbmcgZm9ybWF0KCJwb2xpY3ktcGFyYW1ldGVyLW1hbmFnZXI6ICIpOworCisgICAgICAgIGlmIChpc1dhcm5pbmcpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyAlcyIsIGZvcm1hdC5jX3N0cigpLCBsb2cuY19zdHIoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRCgiJXMgJXMiLCBmb3JtYXQuY19zdHIoKSwgbG9nLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfTsKKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKKwordXNpbmcgdXRpbGl0aWVzOjpjb252ZXJ0VG87CisKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKK2NvbnN0IGNoYXIgKmNvbnN0IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjptUG9saWN5UGZ3RGVmYXVsdENvbmZGaWxlTmFtZSA9CisgICAgIi9ldGMvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbCI7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnBhcmFtZXRlck1hbmFnZXJFbGVtZW50U3VwcG9ydGVkPElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+IHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6cGFyYW1ldGVyTWFuYWdlckVsZW1lbnRTdXBwb3J0ZWQ8SVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2U+IHt9OworCitQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6UGFyYW1ldGVyTWFuYWdlcldyYXBwZXIoKQorICAgIDogbVBmd0Nvbm5lY3RvckxvZ2dlcihuZXcgUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3JMb2dnZXIpCit7CisgICAgLy8gQ29ubmVjdG9yCisgICAgbVBmd0Nvbm5lY3RvciA9IG5ldyBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3IobVBvbGljeVBmd0RlZmF1bHRDb25mRmlsZU5hbWUpOworCisgICAgLy8gTG9nZ2VyCisgICAgbVBmd0Nvbm5lY3Rvci0+c2V0TG9nZ2VyKG1QZndDb25uZWN0b3JMb2dnZXIpOworCisgICAgLy8gTG9hZCBjcml0ZXJpYSBmaWxlCisgICAgaWYgKChsb2FkQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZpZyhnQXVkaW9Qb2xpY3lDcml0ZXJpYVZlbmRvckNvbmZGaWxlUGF0aCkgIT0gTk9fRVJST1IpICYmCisgICAgICAgIChsb2FkQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZpZyhnQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZGaWxlUGF0aCkgIT0gTk9fRVJST1IpKSB7CisgICAgICAgIEFMT0dFKCIlczogTmVpdGhlciB2ZW5kb3IgY29uZiBmaWxlICglcykgbm9yIHN5c3RlbSBjb25mIGZpbGUgKCVzKSBjb3VsZCBiZSBmb3VuZCIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZ0F1ZGlvUG9saWN5Q3JpdGVyaWFWZW5kb3JDb25mRmlsZVBhdGgsCisgICAgICAgICAgICAgIGdBdWRpb1BvbGljeUNyaXRlcmlhQ29uZkZpbGVQYXRoKTsKKyAgICB9CisgICAgQUxPR0QoIiVzOiBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlciBpbnN0YW50aWF0ZWQhIiwgX19GVU5DVElPTl9fKTsKK30KKworUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6On5QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcigpCit7CisgICAgLy8gVW5zZXQgbG9nZ2VyCisgICAgbVBmd0Nvbm5lY3Rvci0+c2V0TG9nZ2VyKE5VTEwpOworICAgIC8vIFJlbW92ZSBsb2dnZXIKKyAgICBkZWxldGUgbVBmd0Nvbm5lY3RvckxvZ2dlcjsKKyAgICAvLyBSZW1vdmUgY29ubmVjdG9yCisgICAgZGVsZXRlIG1QZndDb25uZWN0b3I7Cit9CisKK3N0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpzdGFydCgpCit7CisgICAgQUxPR0QoIiVzOiBpbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgLy8vIFN0YXJ0IFBGVworICAgIHN0ZDo6c3RyaW5nIGVycm9yOworICAgIGlmICghbVBmd0Nvbm5lY3Rvci0+c3RhcnQoZXJyb3IpKSB7CisgICAgICAgIEFMT0dFKCIlczogUG9saWN5IFBGVyBzdGFydCBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVycm9yLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQUxPR0QoIiVzOiBQb2xpY3kgUEZXIHN1Y2Nlc3NmdWxseSBzdGFydGVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK3ZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmFkZENyaXRlcmlvblR5cGUoY29uc3Qgc3RyaW5nICZ0eXBlTmFtZSwgYm9vbCBpc0luY2x1c2l2ZSkKK3sKKyAgICBBTE9HX0FTU0VSVChtUG9saWN5Q3JpdGVyaW9uVHlwZXMuZmluZCh0eXBlTmFtZSkgPT0gbVBvbGljeUNyaXRlcmlvblR5cGVzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICJDcml0ZXJpb25UeXBlICIgPDwgdHlwZU5hbWUgPDwgIiBhbHJlYWR5IGFkZGVkIik7CisgICAgQUxPR0QoIiVzOiBBZGRpbmcgbmV3IGNyaXRlcmlvblR5cGUgJXMiLCBfX0ZVTkNUSU9OX18sIHR5cGVOYW1lLmNfc3RyKCkpOworCisgICAgbVBvbGljeUNyaXRlcmlvblR5cGVzW3R5cGVOYW1lXSA9IG1QZndDb25uZWN0b3ItPmNyZWF0ZVNlbGVjdGlvbkNyaXRlcmlvblR5cGUoaXNJbmNsdXNpdmUpOworfQorCit2b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjphZGRDcml0ZXJpb25UeXBlVmFsdWVQYWlyKAorICAgIGNvbnN0IHN0cmluZyAmdHlwZU5hbWUsCisgICAgdWludDMyX3QgbnVtZXJpY1ZhbHVlLAorICAgIGNvbnN0IHN0cmluZyAmbGl0ZXJhbFZhbHVlKQoreworICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lDcml0ZXJpb25UeXBlcy5maW5kKHR5cGVOYW1lKSAhPSBtUG9saWN5Q3JpdGVyaW9uVHlwZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgIkNyaXRlcmlvblR5cGUgIiA8PCB0eXBlTmFtZS5jX3N0cigpIDw8ICJub3QgZm91bmQiKTsKKyAgICBBTE9HVigiJXM6IEFkZGluZyBuZXcgdmFsdWUgcGFpciAoJWQsJXMpIGZvciBjcml0ZXJpb25UeXBlICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgIG51bWVyaWNWYWx1ZSwgbGl0ZXJhbFZhbHVlLmNfc3RyKCksIHR5cGVOYW1lLmNfc3RyKCkpOworICAgIElTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlICpjcml0ZXJpb25UeXBlID0gbVBvbGljeUNyaXRlcmlvblR5cGVzW3R5cGVOYW1lXTsKKyAgICBjcml0ZXJpb25UeXBlLT5hZGRWYWx1ZVBhaXIobnVtZXJpY1ZhbHVlLCBsaXRlcmFsVmFsdWUuY19zdHIoKSk7Cit9CisKK3ZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRDcml0ZXJpb25UeXBlKGNub2RlICpyb290LCBib29sIGlzSW5jbHVzaXZlKQoreworICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOworICAgIGNub2RlICpub2RlOworICAgIGZvciAobm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOyBub2RlICE9IE5VTEw7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisKKyAgICAgICAgQUxPR19BU1NFUlQobm9kZSAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7CisgICAgICAgIGNvbnN0IGNoYXIgKnR5cGVOYW1lID0gbm9kZS0+bmFtZTsKKyAgICAgICAgY2hhciAqdmFsdWVOYW1lcyA9IHN0cm5kdXAobm9kZS0+dmFsdWUsIHN0cmxlbihub2RlLT52YWx1ZSkpOworCisgICAgICAgIGFkZENyaXRlcmlvblR5cGUodHlwZU5hbWUsIGlzSW5jbHVzaXZlKTsKKworICAgICAgICB1aW50MzJfdCBpbmRleCA9IDA7CisgICAgICAgIGNoYXIgKmN0eDsKKyAgICAgICAgY2hhciAqdmFsdWVOYW1lID0gc3RydG9rX3IodmFsdWVOYW1lcywgIiwiLCAmY3R4KTsKKyAgICAgICAgd2hpbGUgKHZhbHVlTmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoc3RybGVuKHZhbHVlTmFtZSkgIT0gMCkgeworCisgICAgICAgICAgICAgICAgLy8gQ29uZiBmaWxlIG1heSB1c2Ugb3Igbm90IHBhaXIsIGlmIG5vIHBhaXIsIHVzZSBpbmNyZW1lbnRhbCBpbmRleCwgZWxzZQorICAgICAgICAgICAgICAgIC8vIHVzZSBwcm92aWRlZCBpbmRleC4KKyAgICAgICAgICAgICAgICBpZiAoc3RyY2hyKHZhbHVlTmFtZSwgJzonKSAhPSBOVUxMKSB7CisKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqZmlyc3QgPSBzdHJ0b2sodmFsdWVOYW1lLCAiOiIpOworICAgICAgICAgICAgICAgICAgICBjaGFyICpzZWNvbmQgPSBzdHJ0b2soTlVMTCwgIjoiKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoKGZpcnN0ICE9IE5VTEwpICYmIChzdHJsZW4oZmlyc3QpICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWNvbmQgIT0gTlVMTCkgJiYgKHN0cmxlbihzZWNvbmQpICE9IDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCB2YWx1ZSBwYWlyIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjb252ZXJ0VG88c3RyaW5nLCB1aW50MzJfdD4oZmlyc3QsIGluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGluZGV4KCVzKSBmb3VuZCIsIF9fRlVOQ1RJT05fXywgZmlyc3QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFkZENyaXRlcmlvblR5cGVWYWx1ZVBhaXIodHlwZU5hbWUsIGluZGV4LCBzZWNvbmQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGZ3SW5kZXggPSBpc0luY2x1c2l2ZSA/IDEgPDwgaW5kZXggOiBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgYWRkQ3JpdGVyaW9uVHlwZVZhbHVlUGFpcih0eXBlTmFtZSwgcGZ3SW5kZXgsIHZhbHVlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWVOYW1lID0gc3RydG9rX3IoTlVMTCwgIiwiLCAmY3R4KTsKKyAgICAgICAgfQorICAgICAgICBmcmVlKHZhbHVlTmFtZXMpOworICAgIH0KK30KKwordm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZEluY2x1c2l2ZUNyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QpCit7CisgICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7CisgICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBnSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZVRhZy5jX3N0cigpKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbG9hZENyaXRlcmlvblR5cGUobm9kZSwgdHJ1ZSk7Cit9CisKK3ZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRFeGNsdXNpdmVDcml0ZXJpb25UeXBlKGNub2RlICpyb290KQoreworICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOworICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgZ0V4Y2x1c2l2ZUNyaXRlcmlvblR5cGVUYWcuY19zdHIoKSk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGxvYWRDcml0ZXJpb25UeXBlKG5vZGUsIGZhbHNlKTsKK30KKwordm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6cGFyc2VDaGlsZHJlbihjbm9kZSAqcm9vdCwgc3RyaW5nICZkZWZhdWx0VmFsdWUsIHN0cmluZyAmdHlwZSkKK3sKKyAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKKyAgICBjbm9kZSAqbm9kZTsKKyAgICBmb3IgKG5vZGUgPSByb290LT5maXJzdF9jaGlsZDsgbm9kZSAhPSBOVUxMOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgICAgICBBTE9HX0FTU0VSVChub2RlICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKKworICAgICAgICBpZiAoc3RyaW5nKG5vZGUtPm5hbWUpID09IGdEZWZhdWx0VGFnKSB7CisgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBub2RlLT52YWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJpbmcobm9kZS0+bmFtZSkgPT0gZ1R5cGVUYWcpIHsKKyAgICAgICAgICAgIHR5cGUgPSBub2RlLT52YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICBBTE9HRSgiJXM6IFVucmVjb2duaXplZCAlcyAlcyBub2RlIiwgX19GVU5DVElPTl9fLCBub2RlLT5uYW1lLCBub2RlLT52YWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCAqUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmdldEVsZW1lbnQoY29uc3Qgc3RyaW5nICZuYW1lLCBzdGQ6Om1hcDxzdHJpbmcsIFQgKj4gJmVsZW1lbnRzTWFwKQoreworICAgIHBhcmFtZXRlck1hbmFnZXJFbGVtZW50U3VwcG9ydGVkPFQ+KCk7CisgICAgdHlwZW5hbWUgc3RkOjptYXA8c3RyaW5nLCBUICo+OjppdGVyYXRvciBpdCA9IGVsZW1lbnRzTWFwLmZpbmQobmFtZSk7CisgICAgQUxPR19BU1NFUlQoaXQgIT0gZWxlbWVudHNNYXAuZW5kKCksICJFbGVtZW50ICIgPDwgbmFtZSA8PCAiIG5vdCBmb3VuZCIpOworICAgIHJldHVybiBpdC0+c2Vjb25kOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NvbnN0IFQgKlBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpnZXRFbGVtZW50KGNvbnN0IHN0cmluZyAmbmFtZSwgY29uc3Qgc3RkOjptYXA8c3RyaW5nLCBUICo+ICZlbGVtZW50c01hcCkgY29uc3QKK3sKKyAgICBwYXJhbWV0ZXJNYW5hZ2VyRWxlbWVudFN1cHBvcnRlZDxUPigpOworICAgIHR5cGVuYW1lIHN0ZDo6bWFwPHN0cmluZywgVCAqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBlbGVtZW50c01hcC5maW5kKG5hbWUpOworICAgIEFMT0dfQVNTRVJUKGl0ICE9IGVsZW1lbnRzTWFwLmVuZCgpLCAiRWxlbWVudCAiIDw8IG5hbWUgPDwgIiBub3QgZm91bmQiKTsKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKK30KKwordm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZENyaXRlcmlhKGNub2RlICpyb290KQoreworICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOworICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgZ0NyaXRlcmlvblRhZy5jX3N0cigpKTsKKworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coIiVzOiBubyBpbmNsdXNpdmUgY3JpdGVyaWEgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAobm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOyBub2RlICE9IE5VTEw7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgICAgIGxvYWRDcml0ZXJpb24obm9kZSk7CisgICAgfQorfQorCit2b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjphZGRDcml0ZXJpb24oY29uc3Qgc3RyaW5nICZuYW1lLCBjb25zdCBzdHJpbmcgJnR5cGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nICZkZWZhdWx0TGl0ZXJhbFZhbHVlKQoreworICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lDcml0ZXJpYS5maW5kKGNyaXRlcmlvbk5hbWUpID09IG1Qb2xpY3lDcml0ZXJpYS5lbmQoKSwKKyAgICAgICAgICAgICAgICAiUm91dGUgQ3JpdGVyaW9uICIgPDwgY3JpdGVyaW9uTmFtZSA8PCAiIGFscmVhZHkgYWRkZWQiKTsKKworICAgIElTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlICpjcml0ZXJpb25UeXBlID0KKyAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2U+KHR5cGVOYW1lLCBtUG9saWN5Q3JpdGVyaW9uVHlwZXMpOworCisgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KKyAgICAgICAgICAgIG1QZndDb25uZWN0b3ItPmNyZWF0ZVNlbGVjdGlvbkNyaXRlcmlvbihuYW1lLCBjcml0ZXJpb25UeXBlKTsKKworICAgIG1Qb2xpY3lDcml0ZXJpYVtuYW1lXSA9IGNyaXRlcmlvbjsKKyAgICBpbnQgbnVtZXJpY2FsVmFsdWUgPSAwOworICAgIGlmICghY3JpdGVyaW9uVHlwZS0+Z2V0TnVtZXJpY2FsVmFsdWUoZGVmYXVsdExpdGVyYWxWYWx1ZS5jX3N0cigpLCAgbnVtZXJpY2FsVmFsdWUpKSB7CisgICAgICAgIEFMT0dFKCIlczsgdHJ5aW5nIHRvIGFwcGx5IGludmFsaWQgZGVmYXVsdCBsaXRlcmFsIHZhbHVlICglcykiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIGRlZmF1bHRMaXRlcmFsVmFsdWUuY19zdHIoKSk7CisgICAgfQorICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUobnVtZXJpY2FsVmFsdWUpOworfQorCit2b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkQ3JpdGVyaW9uKGNub2RlICpyb290KQoreworICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOworICAgIGNvbnN0IGNoYXIgKmNyaXRlcmlvbk5hbWUgPSByb290LT5uYW1lOworCisgICAgQUxPR19BU1NFUlQobVBvbGljeUNyaXRlcmlhLmZpbmQoY3JpdGVyaW9uTmFtZSkgPT0gbVBvbGljeUNyaXRlcmlhLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICJDcml0ZXJpb24gIiA8PCBjcml0ZXJpb25OYW1lIDw8ICIgYWxyZWFkeSBhZGRlZCIpOworCisgICAgc3RyaW5nIHBhcmFtS2V5TmFtZSA9ICIiOworICAgIHN0cmluZyBwYXRoID0gIiI7CisgICAgc3RyaW5nIHR5cGVOYW1lID0gIiI7CisgICAgc3RyaW5nIGRlZmF1bHRWYWx1ZSA9ICIiOworCisgICAgcGFyc2VDaGlsZHJlbihyb290LCBkZWZhdWx0VmFsdWUsIHR5cGVOYW1lKTsKKworICAgIGFkZENyaXRlcmlvbihjcml0ZXJpb25OYW1lLCB0eXBlTmFtZSwgZGVmYXVsdFZhbHVlKTsKK30KKwordm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZENvbmZpZyhjbm9kZSAqcm9vdCkKK3sKKyAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIGdQb2xpY3lDb25mVGFnLmNfc3RyKCkpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coIiVzOiBDb3VsZCBub3QgZmluZCBub2RlIGZvciBwZnciLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dEKCIlczogTG9hZGluZyBjb25mIGZvciBwZnciLCBfX0ZVTkNUSU9OX18pOworICAgIGxvYWRJbmNsdXNpdmVDcml0ZXJpb25UeXBlKG5vZGUpOworICAgIGxvYWRFeGNsdXNpdmVDcml0ZXJpb25UeXBlKG5vZGUpOworICAgIGxvYWRDcml0ZXJpYShub2RlKTsKK30KKworCitzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZEF1ZGlvUG9saWN5Q3JpdGVyaWFDb25maWcoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBBTE9HX0FTU0VSVChwYXRoICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGU6IGVtcHR5IHBhdGgiKTsKKyAgICBjbm9kZSAqcm9vdDsKKyAgICBjaGFyICpkYXRhOworICAgIEFMT0dEKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgZGF0YSA9IChjaGFyICopbG9hZF9maWxlKHBhdGgsIE5VTEwpOworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOworICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgIlVuYWJsZSB0byBhbGxvY2F0ZSBhIGNvbmZpZ3VyYXRpb24gbm9kZSIpOworICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOworCisgICAgbG9hZENvbmZpZyhyb290KTsKKworICAgIGNvbmZpZ19mcmVlKHJvb3QpOworICAgIGZyZWUocm9vdCk7CisgICAgZnJlZShkYXRhKTsKKyAgICBBTE9HRCgiJXM6IGxvYWRlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitib29sIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjppc1N0YXJ0ZWQoKQoreworICAgIHJldHVybiBtUGZ3Q29ubmVjdG9yICYmIG1QZndDb25uZWN0b3ItPmlzU3RhcnRlZCgpOworfQorCitzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSkKK3sKKyAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPSBtUG9saWN5Q3JpdGVyaWFbZ1Bob25lU3RhdGVDcml0ZXJpb25UYWddOworICAgIGlmICghaXNWYWx1ZVZhbGlkRm9yQ3JpdGVyaW9uKGNyaXRlcmlvbiwgc3RhdGljX2Nhc3Q8aW50Pihtb2RlKSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZSgoaW50KShtb2RlKSk7CisgICAgYXBwbHlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX21vZGVfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6Z2V0UGhvbmVTdGF0ZSgpIGNvbnN0Cit7CisgICAgY29uc3QgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KKyAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ1Bob25lU3RhdGVDcml0ZXJpb25UYWcsIG1Qb2xpY3lDcml0ZXJpYSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGF1ZGlvX21vZGVfdD4oY3JpdGVyaW9uLT5nZXRDcml0ZXJpb25TdGF0ZSgpKTsKK30KKworc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKK3sKKyAgICAvLyBAdG9kbzogcmV0dXJuIGFuIGVycm9yIG9uIGEgdW5zdXBwb3J0ZWQgdmFsdWUKKyAgICBpZiAodXNhZ2UgPiBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9IG1Qb2xpY3lDcml0ZXJpYVtnRm9yY2VVc2VDcml0ZXJpb25UYWdbdXNhZ2VdXTsKKyAgICBpZiAoIWlzVmFsdWVWYWxpZEZvckNyaXRlcmlvbihjcml0ZXJpb24sIHN0YXRpY19jYXN0PGludD4oY29uZmlnKSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZSgoaW50KWNvbmZpZyk7CisgICAgYXBwbHlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3QKK3sKKyAgICAvLyBAdG9kbzogcmV0dXJuIGFuIGVycm9yIG9uIGEgdW5zdXBwb3J0ZWQgdmFsdWUKKyAgICBpZiAodXNhZ2UgPiBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CisgICAgfQorICAgIGNvbnN0IElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9CisgICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdGb3JjZVVzZUNyaXRlcmlvblRhZ1t1c2FnZV0sIG1Qb2xpY3lDcml0ZXJpYSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3Q+KGNyaXRlcmlvbi0+Z2V0Q3JpdGVyaW9uU3RhdGUoKSk7Cit9CisKK2Jvb2wgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmlzVmFsdWVWYWxpZEZvckNyaXRlcmlvbihJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlVG9DaGVjaykKK3sKKyAgICBjb25zdCBJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZSAqaW50ZXJmYWNlID0gY3JpdGVyaW9uLT5nZXRDcml0ZXJpb25UeXBlKCk7CisgICAgc3RyaW5nIGxpdGVyYWxWYWx1ZTsKKyAgICByZXR1cm4gaW50ZXJmYWNlLT5nZXRMaXRlcmFsVmFsdWUodmFsdWVUb0NoZWNrLCBsaXRlcmFsVmFsdWUpOworfQorCitzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKi8qZGV2aWNlQWRkcmVzKi8pCit7CisgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0gTlVMTDsKKworICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlcyhkZXZpY2VzKSkgeworICAgICAgICBjcml0ZXJpb24gPSBtUG9saWN5Q3JpdGVyaWFbZ091dHB1dERldmljZUNyaXRlcmlvblRhZ107CisgICAgfSBlbHNlIGlmIChkZXZpY2VzICYgQVVESU9fREVWSUNFX0JJVF9JTikgeworICAgICAgICBjcml0ZXJpb24gPSBtUG9saWN5Q3JpdGVyaWFbZ0lucHV0RGV2aWNlQ3JpdGVyaW9uVGFnXTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgfQorICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgZGV2aWNlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICBpbnQzMl90IHByZXZpb3VzRGV2aWNlcyA9IGNyaXRlcmlvbi0+Z2V0Q3JpdGVyaW9uU3RhdGUoKTsKKyAgICBzd2l0Y2ggKHN0YXRlKQorICAgIHsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOgorICAgICAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKHByZXZpb3VzRGV2aWNlcyB8PSBkZXZpY2VzKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU6CisgICAgICAgIGlmIChkZXZpY2VzICYgQVVESU9fREVWSUNFX0JJVF9JTikgeworICAgICAgICAgICAgZGV2aWNlcyAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICAgICAgfQorICAgICAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKHByZXZpb3VzRGV2aWNlcyAmPSB+ZGV2aWNlcyk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgYXBwbHlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmFwcGx5UGxhdGZvcm1Db25maWd1cmF0aW9uKCkKK3sKKyAgICBtUGZ3Q29ubmVjdG9yLT5hcHBseUNvbmZpZ3VyYXRpb25zKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvYXVkaW9fcG9saWN5X2NyaXRlcmlhX2NvbmYuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2F1ZGlvX3BvbGljeV9jcml0ZXJpYV9jb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNThlNzEzNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2F1ZGlvX3BvbGljeV9jcml0ZXJpYV9jb25mLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgRGVmaW5pdGlvbnMgZm9yIGF1ZGlvIHBvbGljeSBjcml0ZXJpYSBjb25maWd1cmF0aW9uIGZpbGUgKGF1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mKSAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICBAVE9ETzogc2NyaXB0ZWQgZnJvbSBhdWRpby5oICYgYXVkaW9fcG9saWN5LGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZGaWxlUGF0aCA9CisgICAgIi9zeXN0ZW0vZXRjL2F1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnQXVkaW9Qb2xpY3lDcml0ZXJpYVZlbmRvckNvbmZGaWxlUGF0aCA9CisgICAgIi92ZW5kb3IvZXRjL2F1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mIjsKKworLyoqCisgKiBQRlcgaW5zdGFuY2VzIHRhZ3MKKyAqLworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnUG9saWN5Q29uZlRhZyA9ICJQb2xpY3kiOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnRGVmYXVsdFRhZyA9ICJEZWZhdWx0IjsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ1R5cGVUYWcgPSAiVHlwZSI7CisKKy8qKgorICogUEZXIGVsZW1lbnRzIHRhZ3MKKyAqLworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZVRhZyA9ICJJbmNsdXNpdmVDcml0ZXJpb25UeXBlIjsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ0V4Y2x1c2l2ZUNyaXRlcmlvblR5cGVUYWcgPSAiRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZSI7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdDcml0ZXJpb25UYWcgPSAiQ3JpdGVyaW9uIjsKKworLyoqCisgKiBQRlcga25vd24gY3JpdGVyaW9uIHRhZ3MKKyAqLworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnSW5wdXREZXZpY2VDcml0ZXJpb25UYWcgPSAiQXZhaWxhYmxlSW5wdXREZXZpY2VzIjsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ091dHB1dERldmljZUNyaXRlcmlvblRhZyA9ICJBdmFpbGFibGVPdXRwdXREZXZpY2VzIjsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ1Bob25lU3RhdGVDcml0ZXJpb25UYWcgPSAiVGVsZXBob255TW9kZSI7CisKKy8qKgorICogT3JkZXIgTVVTVCBiZSBhbGlnbiB3aXRoIGRlZmludGlpb24gb2YgYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHdpdGhpbiBhdWRpb19wb2xpY3kuaAorICovCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW0FVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UXSA9Cit7CisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0gPSAgICAgICAgIkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdID0gICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yTWVkaWEiLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gPSAgICAgICAgICAgICAgICJGb3JjZVVzZUZvclJlY29yZCIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DS10gPSAgICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yRG9jayIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9ICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yU3lzdGVtIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJT10gPSAgICAiRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8iCit9OworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvY29uZmlnL2F1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvY29uZmlnL2F1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjViMDQ2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9jb25maWcvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYKQEAgLTAsMCArMSwxMzcgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBATk9URToKKyMgQXVkaW8gUG9saWN5IENyaXRlcmlhIGZpbGUgZXhhbXBsZSBmb3IgZ2VuZXJpYyBkZXZpY2UgYnVpbGQKKyMKKyMgQW55IHZlbmRvciBzaGFsbCBoYXZlIGl0cyBvd24gY29uZmlndXJhdGlvbiB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlIGZvbGRlcgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDcml0ZXJpb24gdHlwZSBFeGFtcGxlOgorIyBGb3IgZWFjaCBjcml0ZXJpb24sIGEgY291cGxlIG9mIG51bWVyaWNhbCwgbGl0ZXJhbCB2YWx1ZXMgbXVzdCBiZSBwcm92aWRlZCB0byB0aGUgUEZXLgorIyBUaGUgbnVtZXJpY2FsIHBhcnQgaXMgbm90IG1hbmRhdG9yeS4gSWYgbm90IGZpbGxlZCBieSB0aGUgdXNlciwgYSBkZWZhdWx0IG51bWVyaWNhbCB2YWx1ZSB3aWxsIGJlCisjIGF1dG9tYXRpY2FsbHkgcHJvdmlkZWQgYnkgYXVkaW8gSEFMIHVzaW5nIHRoZSBmb2xsb3dpbmcgbG9naWM6CisjICAgLSBFeGNsdXNpdmUgY3JpdGVyaW9uOgorIyAgICAgICAgICAqIDAgLT4gZmlyc3QgbGl0ZXJhbCB2YWx1ZSwKKyMgICAgICAgICAgKiAxIC0+IHNlY29uZCBsaXRlcmFsIHZhbHVlLAorIyAgICAgICAgICAgICAgIC4uLgorIyAgICAgICAgICAqIE4gLT4gKE4rMSl0aCBsaXRlcmFsIHZhbHVlLgorIyAgIC0gSW5jbHVzaXZlIGNyaXRlcmlvbjoKKyMgICAgICAgICAgKiAxIDw8IDAgLT4gZmlyc3QgbGl0ZXJhbCB2YWx1ZSwKKyMgICAgICAgICAgKiAxIDw8IDEgLT4gc2Vjb25kIGxpdGVyYWwgdmFsdWUsCisjICAgICAgICAgICAgICAgLi4uCisjICAgICAgICAgICogMSA8PCBOIC0+IChOKzEpdGggbGl0ZXJhbCB2YWx1ZSwKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQb2xpY3kgeworIyAgICBJbmNsdXNpdmVDcml0ZXJpb25UeXBlfEV4Y2x1c2l2ZUNyaXRlcmlvblR5cGUgeworIyAgICAgICAgPENyaXRlcmlvbiBOYW1lPiAgW251bWVyaWNhbCB2YWx1ZSAxOl08bGl0ZXJhbCB2YWx1ZSAxPixbbnVtZXJpY2FsIHZhbHVlIDI6XTxsaXRlcmFsIHZhbHVlIDI+LDxsaXRlcmFsIHZhbHVlIDM+LC4uLgorIyAgICB9CisjIH0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENyaXRlcmlvbjoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQb2xpY3kgeworIyAgICBDcml0ZXJpb24geworIyAgICAgICAgPENyaXRlcmlvbiBOYW1lPiB7CisjICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIDxDcml0ZXJpb24gdHlwZSBuYW1lPgorIyAgICAgICAgICAgIERlZmF1bHQgICAgICAgICA8ZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY3JpdGVyaW9uPgorIyAgICAgICAgfQorIyAgICB9CisjIH0KKworUG9saWN5IHsKKyAgICBJbmNsdXNpdmVDcml0ZXJpb25UeXBlIHsKKyAgICAgICAgIworICAgICAgICAjIERPIE5PVCBDSEFOR0UgT1JERVIuIFRoaXMgZGVmaW5pdGlvbiBtdXN0IGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZgorICAgICAgICAjIEFVRElPX0RFVklDRV9PVVRfKiB3aXRoaW4gPHN5c3RlbS9hdWRpby5oPiBmaWxlIG9mIGFuZHJvaWQuCisgICAgICAgICMKKyAgICAgICAgT3V0cHV0RGV2aWNlc01hc2tUeXBlICAgRWFycGllY2UsU3BlYWtlcixXaXJlZEhlYWRzZXQsV2lyZWRIZWFkcGhvbmUsQmx1ZXRvb3RoU2NvLEJsdWV0b290aFNjb0hlYWRzZXQsQmx1ZXRvb3RoU2NvQ2Fya2l0LEJsdWV0b290aEEyZHAsQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMsQmx1ZXRvb3RoQTJkcFNwZWFrZXIsSGRtaSxBbmxnRG9ja0hlYWRzZXQsRGd0bERvY2tIZWFkc2V0LFVzYkFjY2Vzc29yeSxVc2JEZXZpY2UsUmVtb3RlU3VibWl4LFRlbGVwaG9ueVR4LExpbmUsSGRtaUFyYyxTcGRpZixGbSxBdXhMaW5lLFNwZWFrZXJTYWZlCisgICAgICAgICMKKyAgICAgICAgIyBETyBOT1QgQ0hBTkdFIE9SREVSLiBUaGlzIGRlZmluaXRpb24gbXVzdCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YKKyAgICAgICAgIyBBVURJT19ERVZJQ0VfSU5fKiB3aXRoaW4gPHN5c3RlbS9hdWRpby5oPiBmaWxlIG9mIGFuZHJvaWQuCisgICAgICAgICMgTm90ZSBhbHNvIHRoYXQgZGlyZWN0aW9uIGJpdCB3aWxsIGJlIGRlY2ltYXRlZCBieSBBdWRpb0hBTCBpbiBvcmRlciB0byBhbGxvdyB1c2luZyBhIG1hc2sKKyAgICAgICAgIyB3aXRoIHRoZSBjYXJkaW5hbGl0eSBvZiAxIGJldHdlZW4gYSBiaXQgYW5kIGFuIGlucHV0IGRldmljZS4KKyAgICAgICAgIworICAgICAgICBJbnB1dERldmljZXNNYXNrVHlwZSAgICBDb21tdW5pY2F0aW9uLEFtYmllbnQsQnVpbHRpbk1pYyxCbHVldG9vdGhTY29IZWFkc2V0LFdpcmVkSGVhZHNldCxIZG1pLFRlbGVwaG9ueVJ4LEJhY2tNaWMsUmVtb3RlU3VibWl4LEFubGdEb2NrSGVhZHNldCxEZ3RsRG9ja0hlYWRzZXQsVXNiQWNjZXNzb3J5LFVzYkRldmljZSxGbVR1bmVyLFR2VHVuZSxMaW5lLFNwZGlmLEJsdWV0b290aEEyZHAsTG9vcGJhY2sKKyAgICB9CisgICAgRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZSB7CisgICAgICAgICMKKyAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhdWRpb19tb2RlX3QKKyAgICAgICAgIyBmcm9tIHN5c3RlbS9hdWRpby5oCisgICAgICAgICMKKyAgICAgICAgQW5kcm9pZE1vZGVUeXBlICAgICAwOk5vcm1hbCwxOlJpbmdUb25lLDI6SW5DYWxsLDM6SW5Db21tdW5pY2F0aW9uCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQorICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAorICAgICAgICAjCisgICAgICAgIEZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvblR5cGUgICAgMDpGb3JjZU5vbmUsMTpGb3JjZVNwZWFrZXIsMzpGb3JjZUJ0U2NvCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQorICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAorICAgICAgICAjCisgICAgICAgIEZvcmNlVXNlRm9yTWVkaWFUeXBlICAgICAgICAgICAgMDpGb3JjZU5vbmUsMTpGb3JjZVNwZWFrZXIsMjpGb3JjZUhlYWRwaG9uZXMsNDpGb3JjZUJ0QTJkcCw1OkZvcmNlV2lyZWRBY2Nlc3NvcnksODpGb3JjZUFuYWxvZ0RvY2ssOTpGb3JjZURpZ2l0YWxEb2NrLDEwOkZvcmNlTm9CdEEyZHAKKyAgICAgICAgIworICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCisgICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCisgICAgICAgICMKKyAgICAgICAgRm9yY2VVc2VGb3JSZWNvcmRUeXBlICAgICAgICAgICAwOkZvcmNlTm9uZSwzOkZvcmNlQnRTY28sNTpGb3JjZVdpcmVkQWNjZXNzb3J5CisgICAgICAgICMKKyAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQorICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAorICAgICAgICAjCisgICAgICAgIEZvcmNlVXNlRm9yRG9ja1R5cGUgICAgICAgICAgICAgMDpGb3JjZU5vbmUsNTpGb3JjZVdpcmVkQWNjZXNzb3J5LDY6Rm9yY2VCdENhckRvY2ssNzpGb3JjZUJ0RGVza0RvY2ssODpGb3JjZUFuYWxvZ0RvY2ssOTpGb3JjZURpZ2l0YWxEb2NrCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQorICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAorICAgICAgICAjCisgICAgICAgIEZvcmNlVXNlRm9yU3lzdGVtVHlwZSAgICAgICAgICAgMDpGb3JjZU5vbmUsMTE6Rm9yY2VTeXN0ZW1FbmZvcmNlZAorICAgICAgICAjCisgICAgICAgICMgVGhlIHZhbHVlcyBvZiB0aGUgbW9kZSBNVVNUIGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKKyAgICAgICAgIyBhdWRpb19wb2xpY3lfZm9yY2VkX2NvbmZpZ190IGZyb20gc3lzdGVtL2F1ZGlvLmgKKyAgICAgICAgIworICAgICAgICBGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpb1R5cGUgIDA6Rm9yY2VOb25lLDEyOkZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCisgICAgfQorCisgICAgQ3JpdGVyaW9uIHsKKyAgICAgICAgQXZhaWxhYmxlSW5wdXREZXZpY2VzIHsKKyAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBJbnB1dERldmljZXNNYXNrVHlwZQorICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIG5vbmUKKyAgICAgICAgfQorICAgICAgICBBdmFpbGFibGVPdXRwdXREZXZpY2VzIHsKKyAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBPdXRwdXREZXZpY2VzTWFza1R5cGUKKyAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBub25lCisgICAgICAgIH0KKyAgICAgICAgVGVsZXBob255TW9kZSB7CisgICAgICAgICAgICBUeXBlICAgICAgICAgICAgQW5kcm9pZE1vZGVUeXBlCisgICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgTm9ybWFsCisgICAgICAgIH0KKyAgICAgICAgRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIHsKKyAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvckNvbW11bmljYXRpb25UeXBlCisgICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCisgICAgICAgIH0KKyAgICAgICAgRm9yY2VVc2VGb3JNZWRpYSB7CisgICAgICAgICAgICBUeXBlICAgICAgICAgICAgRm9yY2VVc2VGb3JNZWRpYVR5cGUKKyAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKKyAgICAgICAgfQorICAgICAgICBGb3JjZVVzZUZvclJlY29yZCB7CisgICAgICAgICAgICBUeXBlICAgICAgICAgICAgRm9yY2VVc2VGb3JSZWNvcmRUeXBlCisgICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCisgICAgICAgIH0KKyAgICAgICAgRm9yY2VVc2VGb3JEb2NrIHsKKyAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvckRvY2tUeXBlCisgICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCisgICAgICAgIH0KKyAgICAgICAgRm9yY2VVc2VGb3JTeXN0ZW0geworICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9yU3lzdGVtVHlwZQorICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQorICAgICAgICB9CisgICAgICAgIEZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIHsKKyAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpb1R5cGUKKyAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvaW5jbHVkZS9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvaW5jbHVkZS9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNjNWYyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9pbmNsdWRlL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmgKQEAgLTAsMCArMSwyODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SV0xvY2suaD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCitjbGFzcyBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3I7CitjbGFzcyBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlOworY2xhc3MgSVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2U7CitzdHJ1Y3QgY25vZGU7CisKK2NsYXNzIFBhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yTG9nZ2VyOworCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworCitjbGFzcyBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcgoreworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxpbnQsIGNvbnN0IGNoYXIgKj4gQ3JpdGVyaW9uVHlwZVZhbHVlUGFpcjsKKworICAgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKj4gQ3JpdGVyaW9uQ29sbGVjdGlvbjsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZSAqPiBDcml0ZXJpb25UeXBlQ29sbGVjdGlvbjsKKyAgICB0eXBlZGVmIENyaXRlcmlvbkNvbGxlY3Rpb246Oml0ZXJhdG9yIENyaXRlcmlvbk1hcEl0ZXJhdG9yOworICAgIHR5cGVkZWYgQ3JpdGVyaW9uQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3IgQ3JpdGVyaW9uTWFwQ29uc3RJdGVyYXRvcjsKKyAgICB0eXBlZGVmIENyaXRlcmlvblR5cGVDb2xsZWN0aW9uOjppdGVyYXRvciBDcml0ZXJpb25UeXBlTWFwSXRlcmF0b3I7CisgICAgdHlwZWRlZiBDcml0ZXJpb25UeXBlQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3IgQ3JpdGVyaWFUeXBlTWFwQ29uc3RJdGVyYXRvcjsKKworcHVibGljOgorICAgIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyKCk7CisgICAgflBhcmFtZXRlck1hbmFnZXJXcmFwcGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgdGhlIHBsYXRmb3JtIHN0YXRlIHNlcnZpY2UuCisgICAgICogSXQgc3RhcnRzIHRoZSBwYXJhbWV0ZXIgZnJhbWV3b3JrIHBvbGljeSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBmb2xsb3dpbmcgQVBJIHdyYXAgcG9saWN5IGFjdGlvbiB0byBjcml0ZXJpYQorICAgICAqLworCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBwbGF0Zm9ybSBzdGF0ZSB3YXMgY29ycmVjdGx5IHN0YXJ0ZWQgKGllIHRoZSBwb2xpY3kgcGFyYW1ldGVyIG1hbmFnZXIKKyAgICAgKiBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgYW5kIHN0YXJ0ZWQgY29ycmVjdGx5KS4KKyAgICAgKgorICAgICAqIEB0b2RvOiBtYXAgb24gaW5pdENoZWNrPworICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHBsYXRmb3JtIHN0YXRlIGlzIHN0YXJ0ZWQgY29ycmVjdGx5LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBpc1N0YXJ0ZWQoKTsKKworICAgIC8qKgorICAgICAqIFNldCBUZWxlcGhvbnkgTW9kZS4KKyAgICAgKiBJdCB3aWxsIHNldCB0aGUgdGVsZXBob255IG1vZGUgY3JpdGVyaW9uIGFjY29yZGluZ2x5IGFuZCBhcHBseSB0aGUgY29uZmlndXJhdGlvbiBpbiBvcmRlcgorICAgICAqIHRvIHNlbGVjdCB0aGUgcmlnaHQgY29uZmlndXJhdGlvbiBvbiBkb21haW5zIGRlcGVuZGluZyBvbiB0aGlzIG1vZGUgY3JpdGVyaW9uLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBtb2RlOiBBbmRyb2lkIFBob25lIHN0YXRlIChub3JtYWwsIHJpbmd0b25lLCBjc3YsIGluIGNvbW11bmljYXRpb24pCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIGNyaXRlcmlvbiBzZXQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKTsKKworICAgIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBTZXQgRm9yY2UgVXNlIGNvbmZpZyBmb3IgYSBnaXZlbiB1c2FnZS4KKyAgICAgKiBJdCB3aWxsIHNldCB0aGUgY29ycmVzcG9uZGluZyBwb2xpY3kgcGFyYW1ldGVyIGZyYW1ld29yayBjcml0ZXJpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVzYWdlIGZvciB3aGljaCBhIGNvbmZpZ3VyYXRpb24gc2hhbGwgYmUgZm9yY2VkLgorICAgICAqIEBwYXJhbVtpbl0gY29uZmlnIHdpc2hlZCB0byBiZSBmb3JjZWQgZm9yIHRoZSBnaXZlbiBzaGFsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIGNyaXRlcmlvbiB3YXMgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UgKGUuZy4gY29uZmlnIG5vdAorICAgICAqIGFsbG93ZWQgYSBnaXZlbiB1c2FnZS4uLikKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKKworICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29ubmVjdGlvbiBzdGF0ZSBvZiBkZXZpY2UocykuCisgICAgICogSXQgd2lsbCBzZXQgdGhlIGFzc29jaWF0ZWQgcG9saWN5IHBhcmFtZXRlciBmcmFtZXdvcmsgY3JpdGVyaW9uLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkZXZpY2VzIG1hc2sgb2YgZGV2aWNlcyBmb3Igd2hpY2ggdGhlIHN0YXRlIGhhcyBjaGFuZ2VkLgorICAgICAqIEBwYXJhbVtpbl0gc3RhdGUgb2YgYXZhaWxhYmlsaXR5IG9mIHRoaXModGhlc2UpIGRldmljZShzKS4KKyAgICAgKiBAcGFyYW1baW5dIGRldmljZUFkZHJlc3M6IHRoZSBtYXNrIG1pZ2h0IG5vdCBiZSBlbm91Z2gsIGFzIGl0IG1heSByZXByZXNlbnRzIGEgdHlwZSBvZgorICAgICAqICAgICAgICAgICAgZGV2aWNlLCBzbyBhZGRyZXNzIG9mIHRoZSBkZXZpY2Ugd2lsbCBoZWxwIHByZWNpc2UgaWRlbnRpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIGRldmljZXMgY3JpdGVyaW9uIHVwZGF0ZWQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZXMsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlQWRkcmVzcyk7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQXBwbHkgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHBsYXRmb3JtIG9uIHRoZSBwb2xpY3kgcGFyYW1ldGVyIG1hbmFnZXIuCisgICAgICogT25jZSBhbGwgdGhlIGNyaXRlcmlhIGhhdmUgYmVlbiBzZXQsIHRoZSBjbGllbnQgb2YgdGhlIHBsYXRmb3JtIHN0YXRlIG11c3QgY2FsbAorICAgICAqIHRoaXMgZnVuY3Rpb24gaW4gb3JkZXIgdG8gaGF2ZSB0aGUgcm91dGUgUEZXIHRha2luZyBpbnRvIGFjY291bnQgdGhlc2UgY3JpdGVyaWEuCisgICAgICoKKyAgICAgKiBPUEVOUzogc2hhbGwgd2UgZXhwb3NlIHRoaXM/CisgICAgICogICAgICAtIFllcyBpZiBhdG9taWMgc2V0IG9wZXJhdGlvbi4KKyAgICAgKiAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFic3RyYWN0IGl0IGJlaGluZCB0aGUgIlNUQUdFIEFORCBDT01NSVQiIHBhdHRlcm4KKyAgICAgKiAgICAgIC0gbm8gaWYgbmVlZCB0byBzZXQgbW9yZSB0aGFuIG9uZSBiZWZvcmUgdHJpZ2dlcmluZyBhbiBhcHBseSBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHZvaWQgYXBwbHlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIExvYWQgdGhlIGNyaXRlcmlvbiBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHBhdGggQ3JpdGVyaW9uIGNvbmYgZmlsZSBwYXRoLgorICAgICAqCisgICAgICogQHJldHVybiBOT19FUlJPUiBpcyBwYXJzaW5nIHN1Y2Nlc3NmdWwsIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHN0YXR1c190IGxvYWRBdWRpb1BvbGljeUNyaXRlcmlhQ29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpOworCisgICAgLyoqCisgICAgICogQWRkIGEgY3JpdGVyaW9uIHR5cGUgdG8gQXVkaW9Qb2xpY3lQZncuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHR5cGVOYW1lIG9mIHRoZSBQRlcgY3JpdGVyaW9uIHR5cGUuCisgICAgICogQHBhcmFtW2luXSBpc0luY2x1c2l2ZSBhdHRyaWJ1dGUgb2YgdGhlIGNyaXRlcmlvbiB0eXBlLgorICAgICAqLworICAgIHZvaWQgYWRkQ3JpdGVyaW9uVHlwZShjb25zdCBzdGQ6OnN0cmluZyAmdHlwZU5hbWUsIGJvb2wgaXNJbmNsdXNpdmUpOworCisgICAgLyoqCisgICAgICogQWRkIGEgY3JpdGVyaW9uIHR5cGUgdmFsdWUgcGFpciB0byBBdWRpb1BvbGljeVBmdy4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdHlwZU5hbWUgY3JpdGVyaW9uIHR5cGUgbmFtZSB0byB3aGljaCB0aGlzIHZhbHVlIHBhaXIgaXMgYWRkZWQgdG8uCisgICAgICogQHBhcmFtW2luXSBudW1lcmljIHBhcnQgb2YgdGhlIHZhbHVlIHBhaXIuCisgICAgICogQHBhcmFtW2luXSBsaXRlcmFsIHBhcnQgb2YgdGhlIHZhbHVlIHBhaXIuCisgICAgICovCisgICAgdm9pZCBhZGRDcml0ZXJpb25UeXBlVmFsdWVQYWlyKGNvbnN0IHN0ZDo6c3RyaW5nICZ0eXBlTmFtZSwgdWludDMyX3QgbnVtZXJpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmxpdGVyYWwpOworCisgICAgLyoqCisgICAgICogQWRkIGEgY3JpdGVyaW9uIHRvIEF1ZGlvUG9saWN5UGZ3LgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBuYW1lIG9mIHRoZSBQRlcgY3JpdGVyaW9uLgorICAgICAqIEBwYXJhbVtpbl0gdHlwZU5hbWUgY3JpdGVyaW9uIHR5cGUgbmFtZSB0byB3aGljaCB0aGlzIGNyaXRlcmlvbiBpcyBhc3NvY2lhdGVkIHRvLgorICAgICAqIEBwYXJhbVtpbl0gZGVmYXVsdExpdGVyYWxWYWx1ZSBvZiB0aGUgUEZXIGNyaXRlcmlvbi4KKyAgICAgKi8KKyAgICB2b2lkIGFkZENyaXRlcmlvbihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmRlZmF1bHRMaXRlcmFsVmFsdWUpOworICAgIC8qKgorICAgICAqIFBhcnNlIGFuZCBsb2FkIHRoZSBpbmNsdXNpdmUgY3JpdGVyaW9uIHR5cGUgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAqLworICAgIHZvaWQgbG9hZEluY2x1c2l2ZUNyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QpOworCisgICAgLyoqCisgICAgICogUGFyc2UgYW5kIGxvYWQgdGhlIGV4Y2x1c2l2ZSBjcml0ZXJpb24gdHlwZSBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICovCisgICAgdm9pZCBsb2FkRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCk7CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhbmQgbG9hZCB0aGUgY3JpdGVyaWEgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAqLworICAgIHZvaWQgbG9hZENyaXRlcmlhKGNub2RlICpyb290KTsKKworICAgIC8qKgorICAgICAqIFBhcnNlIGFuZCBsb2FkIGEgY3JpdGVyaW9uIGZyb20gY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgKi8KKyAgICB2b2lkIGxvYWRDcml0ZXJpb24oY25vZGUgKnJvb3QpOworCisgICAgLyoqCisgICAgICogUGFyc2UgYW5kIGxvYWQgdGhlIGNyaXRlcmlvbiB0eXBlcyBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAgKiBAcGFyYW1baW5dIGlzSW5jbHVzaXZlIHRydWUgaWYgaW5jbHVzaXZlLCBmYWxzZSBpcyBleGNsdXNpdmUuCisgICAgICovCisgICAgdm9pZCBsb2FkQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCwgYm9vbCBpc0luY2x1c2l2ZSk7CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAqLworICAgIHZvaWQgbG9hZENvbmZpZyhjbm9kZSAqcm9vdCk7CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhbmQgbG9hZCB0aGUgY2hpZHJlbiBub2RlIGZyb20gYSBnaXZlbiByb290IG5vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCisgICAgICogQHBhcmFtW291dF0gZGVmYXVsdFZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgbWFuYWdlciBlbGVtZW50IHRvIHJldHJpZXZlLgorICAgICAqIEBwYXJhbVtvdXRdIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBtYW5hZ2VyIGVsZW1lbnQgdG8gcmV0cmlldmUuCisgICAgKi8KKyAgICB2b2lkIHBhcnNlQ2hpbGRyZW4oY25vZGUgKnJvb3QsIHN0ZDo6c3RyaW5nICZkZWZhdWx0VmFsdWUsIHN0ZDo6c3RyaW5nICZ0eXBlKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIGFuIGVsZW1lbnQgZnJvbSBhIG1hcCBieSBpdHMgbmFtZS4KKyAgICAgKgorICAgICAqIEB0cGFyYW0gVCB0eXBlIG9mIGVsZW1lbnQgdG8gc2VhcmNoLgorICAgICAqIEBwYXJhbVtpbl0gbmFtZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIGZpbmQuCisgICAgICogQHBhcmFtW2luXSBlbGVtZW50c01hcCBtYXBzIG9mIGVsZW1lbnRzIHRvIHNlYXJjaCBpbnRvLgorICAgICAqCisgICAgICogQHJldHVybiB2YWxpZCBwb2ludGVyIG9uIGVsZW1lbnQgaWYgZm91bmQsIE5VTEwgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIFQgKmdldEVsZW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUICo+ICZlbGVtZW50c01hcCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhbiBlbGVtZW50IGZyb20gYSBtYXAgYnkgaXRzIG5hbWUuIENvbnN0IHZlcnNpb24uCisgICAgICoKKyAgICAgKiBAdHBhcmFtIFQgdHlwZSBvZiBlbGVtZW50IHRvIHNlYXJjaC4KKyAgICAgKiBAcGFyYW1baW5dIG5hbWUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBmaW5kLgorICAgICAqIEBwYXJhbVtpbl0gZWxlbWVudHNNYXAgbWFwcyBvZiBlbGVtZW50cyB0byBzZWFyY2ggaW50by4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdmFsaWQgcG9pbnRlciBvbiBlbGVtZW50IGlmIGZvdW5kLCBOVUxMIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBjb25zdCBUICpnZXRFbGVtZW50KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFQgKj4gJmVsZW1lbnRzTWFwKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIHNldCB0aGUgdmFsdWUgb2YgYSBjb21wb25lbnQgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHZhbHVlIG5ldyB2YWx1ZSB0byBzZXQgdG8gdGhlIGNvbXBvbmVudCBzdGF0ZS4KKyAgICAgKiBAcGFyYW1baW5dIHN0YXRlTmFtZSBvZiB0aGUgY29tcG9uZW50IHN0YXRlLgorICAgICAqLworICAgIHZvaWQgc2V0VmFsdWUoaW50IHZhbHVlLCBjb25zdCBzdGQ6OnN0cmluZyAmc3RhdGVOYW1lKTsKKworICAgIC8qKgorICAgICAqIGdldCB0aGUgdmFsdWUgb2YgYSBjb21wb25lbnQgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBzdGF0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBzdGF0ZQorICAgICAqLworICAgIGludCBnZXRWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyAmc3RhdGVOYW1lKSBjb25zdDsKKworICAgIGJvb2wgaXNWYWx1ZVZhbGlkRm9yQ3JpdGVyaW9uKElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiwgaW50IHZhbHVlVG9DaGVjayk7CisKKyAgICBDcml0ZXJpb25UeXBlQ29sbGVjdGlvbiBtUG9saWN5Q3JpdGVyaW9uVHlwZXM7IC8qKjwgUG9saWN5IENyaXRlcmlvbiBUeXBlIG1hcC4gKi8KKyAgICBDcml0ZXJpb25Db2xsZWN0aW9uIG1Qb2xpY3lDcml0ZXJpYTsgLyoqPCBQb2xpY3kgQ3JpdGVyaW9uIE1hcC4gKi8KKworICAgIENQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvciAqbVBmd0Nvbm5lY3RvcjsgLyoqPCBQb2xpY3kgUGFyYW1ldGVyIE1hbmFnZXIgY29ubmVjdG9yLiAqLworICAgIFBhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yTG9nZ2VyICptUGZ3Q29ubmVjdG9yTG9nZ2VyOyAvKio8IFBvbGljeSBQRlcgbG9nZ2VyLiAqLworCisKKyAgICAvKioKKyAgICAgKiBwcm92aWRlIGEgY29tcGlsZSB0aW1lIGVycm9yIGlmIG5vIHNwZWNpYWxpemF0aW9uIGlzIHByb3ZpZGVkIGZvciBhIGdpdmVuIHR5cGUuCisgICAgICoKKyAgICAgKiBAdHBhcmFtIFQ6IHR5cGUgb2YgdGhlIHBhcmFtZXRlciBtYW5hZ2VyIGVsZW1lbnQuIFN1cHBvcnRlZCBvbmUgYXJlOgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIC0gQ3JpdGVyaW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgLSBDcml0ZXJpb25UeXBlLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBwYXJhbWV0ZXJNYW5hZ2VyRWxlbWVudFN1cHBvcnRlZDsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtUG9saWN5UGZ3RGVmYXVsdENvbmZGaWxlTmFtZTsgLyoqPCBEZWZhdWx0IFBvbGljeSBQRlcgdG9wIGZpbGUgbmFtZS4qLworfTsKKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGQ0M2I4OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ2IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMgQ29tcG9uZW50IGJ1aWxkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBzcmMvRW5naW5lLmNwcCBcCisgICAgc3JjL0VuZ2luZUluc3RhbmNlLmNwcCBcCisgICAgc3JjL0dhaW5zLmNwcCBcCisKKworYXVkaW9fcG9saWN5X2VuZ2luZV9pbmNsdWRlc19jb21tb24gOj0gXAorICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlCisKK0xPQ0FMX0NGTEFHUyArPSBcCisgICAgLVdhbGwgXAorICAgIC1XZXJyb3IgXAorICAgIC1XZXh0cmEgXAorCitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gXAorICAgICQoYXVkaW9fcG9saWN5X2VuZ2luZV9pbmNsdWRlc19jb21tb24pCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoYXVkaW9fcG9saWN5X2VuZ2luZV9pbmNsdWRlc19jb21tb24pIFwKKyAgICAkKFRBUkdFVF9PVVRfSEVBREVSUykvaHcgXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBmcmFtZXdvcmtzLWF2KSBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGJpb25pYykgXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUKKworCitMT0NBTF9NT0RVTEUgOj0gbGliYXVkaW9wb2xpY3llbmdpbmVkZWZhdWx0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGliYXVkaW91dGlscyBcCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2luY2x1ZGUvQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFlMzI5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2luY2x1ZGUvQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlOworCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworCitjbGFzcyBFbmdpbmU7CisKK2NsYXNzIEVuZ2luZUluc3RhbmNlCit7Citwcm90ZWN0ZWQ6CisgICAgRW5naW5lSW5zdGFuY2UoKTsKKworcHVibGljOgorICAgIHZpcnR1YWwgfkVuZ2luZUluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgQXVkaW8gUG9saWN5IEVuZ2luZSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcG9pbnRlciB0byBSb3V0ZSBNYW5hZ2VyIEluc3RhbmNlIG9iamVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgRW5naW5lSW5zdGFuY2UgKmdldEluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgcXVlcnkuCisgICAgICogVGhlIGZpcnN0IGNsaWVudCBvZiBhbiBpbnRlcmZhY2Ugb2YgdGhlIHBvbGljeSBlbmdpbmUgd2lsbCBzdGFydCB0aGUgc2luZ2xldG9uLgorICAgICAqCisgICAgICogQHRwYXJhbSBSZXF1ZXN0ZWRJbnRlcmZhY2U6IGludGVyZmFjZSB0aGF0IHRoZSBjbGllbnQgaXMgd2lzaGluZyB0byByZXRyaWV2ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW50ZXJmYWNlIGhhbmRsZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVxdWVzdGVkSW50ZXJmYWNlPgorICAgIFJlcXVlc3RlZEludGVyZmFjZSAqcXVlcnlJbnRlcmZhY2UoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIC8qKgorICAgICAqIEdldCBBdWRpbyBQb2xpY3kgRW5naW5lIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHJldHVybiBBdWRpbyBQb2xpY3kgRW5naW5lIHNpbmdsZXRvbi4KKyAgICAgKi8KKyAgICBFbmdpbmUgKmdldEVuZ2luZSgpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLworICAgIEVuZ2luZUluc3RhbmNlKGNvbnN0IEVuZ2luZUluc3RhbmNlICZvYmplY3QpOworICAgIEVuZ2luZUluc3RhbmNlICZvcGVyYXRvcj0oY29uc3QgRW5naW5lSW5zdGFuY2UgJm9iamVjdCk7Cit9OworCisvKioKKyAqIExpbWl0IHRlbXBsYXRlIGluc3RhbnRhdGlvbiB0byBzdXBwb3J0ZWQgdHlwZSBpbnRlcmZhY2VzLgorICogQ29tcGlsZSB0aW1lIGVycm9yIHdpbGwgY2xhaW0gaWYgaW52YWxpZCBpbnRlcmZhY2UgaXMgcmVxdWVzdGVkLgorICovCit0ZW1wbGF0ZSA8PgorQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlICpFbmdpbmVJbnN0YW5jZTo6cXVlcnlJbnRlcmZhY2UoKSBjb25zdDsKKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNjg2NDE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcApAQCAtMCwwICsxLDcxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworLy8jZGVmaW5lIFZFUllfVkVSQk9TRV9MT0dHSU5HCisjaWZkZWYgVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNkZWZpbmUgQUxPR1ZWIEFMT0dWCisjZWxzZQorI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworI2luY2x1ZGUgIkVuZ2luZS5oIgorI2luY2x1ZGUgIkdhaW5zLmgiCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxBdWRpb1BvcnQuaD4KKyNpbmNsdWRlIDxJT1Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CisKK0VuZ2luZTo6RW5naW5lKCkKKyAgICA6IG1NYW5hZ2VySW50ZXJmYWNlKHRoaXMpLAorICAgICAgbVBob25lU3RhdGUoQVVESU9fTU9ERV9OT1JNQUwpLAorICAgICAgbUFwbU9ic2VydmVyKE5VTEwpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVDsgaSsrKSB7CisgICAgICAgIG1Gb3JjZVVzZVtpXSA9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FOworICAgIH0KK30KKworRW5naW5lOjp+RW5naW5lKCkKK3sKK30KKwordm9pZCBFbmdpbmU6OnNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikKK3sKKyAgICBBTE9HX0FTU0VSVChvYnNlcnZlciAhPSBOVUxMLCAiSW52YWxpZCBBdWRpbyBQb2xpY3kgTWFuYWdlciBvYnNlcnZlciIpOworICAgIG1BcG1PYnNlcnZlciA9IG9ic2VydmVyOworfQorCitzdGF0dXNfdCBFbmdpbmU6OmluaXRDaGVjaygpCit7CisgICAgcmV0dXJuIChtQXBtT2JzZXJ2ZXIgIT0gTlVMTCkgPyAgTk9fRVJST1IgOiBOT19JTklUOworfQorCitmbG9hdCBFbmdpbmU6OnZvbEluZGV4VG9EYihWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBjYXRlZ29yeSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKQoreworICAgIGNvbnN0IFN0cmVhbURlc2NyaXB0b3IgJnN0cmVhbURlc2MgPSBtQXBtT2JzZXJ2ZXItPmdldFN0cmVhbURlc2NyaXB0b3JzKCkudmFsdWVBdChzdHJlYW1UeXBlKTsKKyAgICByZXR1cm4gR2FpbnM6OnZvbEluZGV4VG9EYihjYXRlZ29yeSwgc3RyZWFtRGVzYywgaW5kZXhJblVpKTsKK30KKworCitzdGF0dXNfdCBFbmdpbmU6OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQoreworICAgIEFMT0dWKCJpbml0U3RyZWFtVm9sdW1lKCkgc3RyZWFtICVkLCBtaW4gJWQsIG1heCAlZCIsIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgaWYgKGluZGV4TWluIDwgMCB8fCBpbmRleE1pbiA+PSBpbmRleE1heCkgeworICAgICAgICBBTE9HVygiaW5pdFN0cmVhbVZvbHVtZSgpIGludmFsaWQgaW5kZXggbGltaXRzIGZvciBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwKKyAgICAgICAgICAgICAgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbUFwbU9ic2VydmVyLT5nZXRTdHJlYW1EZXNjcmlwdG9ycygpLnNldFZvbHVtZUluZGV4TWluKHN0cmVhbSwgaW5kZXhNaW4pOworICAgIG1BcG1PYnNlcnZlci0+Z2V0U3RyZWFtRGVzY3JpcHRvcnMoKS5zZXRWb2x1bWVJbmRleE1heChzdHJlYW0sIGluZGV4TWF4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgRW5naW5lOjppbml0aWFsaXplVm9sdW1lQ3VydmVzKGJvb2wgaXNTcGVha2VyRHJjRW5hYmxlZCkKK3sKKyAgICBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbiAmc3RyZWFtcyA9IG1BcG1PYnNlcnZlci0+Z2V0U3RyZWFtRGVzY3JpcHRvcnMoKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgVm9sdW1lOjpERVZJQ0VfQ0FURUdPUllfQ05UOyBqKyspIHsKKyAgICAgICAgICAgIHN0cmVhbXMuc2V0Vm9sdW1lQ3VydmVQb2ludChzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Vm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnk+KGopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1ZvbHVtZVByb2ZpbGVzW2ldW2pdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIGF2YWlsYWJpbGl0eSBvZiBEUkMgb24gc3BlYWtlciBwYXRoOiBpZiBhdmFpbGFibGUsIG92ZXJyaWRlIHNvbWUgb2YgdGhlIHNwZWFrZXIgY3VydmVzCisgICAgaWYgKGlzU3BlYWtlckRyY0VuYWJsZWQpIHsKKyAgICAgICAgc3RyZWFtcy5zZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9TWVNURU0sIFZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCisgICAgICAgICAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmMpOworICAgICAgICBzdHJlYW1zLnNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX1JJTkcsIFZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCisgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmMpOworICAgICAgICBzdHJlYW1zLnNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0FMQVJNLCBWb2x1bWU6OkRFVklDRV9DQVRFR09SWV9TUEVBS0VSLAorICAgICAgICAgICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjKTsKKyAgICAgICAgc3RyZWFtcy5zZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04sIFZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCisgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmMpOworICAgICAgICBzdHJlYW1zLnNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX01VU0lDLCBWb2x1bWU6OkRFVklDRV9DQVRFR09SWV9TUEVBS0VSLAorICAgICAgICAgICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmMpOworICAgICAgICBzdHJlYW1zLnNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksIFZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCisgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyYyk7CisgICAgfQorfQorCisKK3N0YXR1c190IEVuZ2luZTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCit7CisgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBzdGF0ZSAlZCIsIHN0YXRlKTsKKworICAgIGlmIChzdGF0ZSA8IDAgfHwgc3RhdGUgPj0gQVVESU9fTU9ERV9DTlQpIHsKKyAgICAgICAgQUxPR1coInNldFBob25lU3RhdGUoKSBpbnZhbGlkIHN0YXRlICVkIiwgc3RhdGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSBtUGhvbmVTdGF0ZSApIHsKKyAgICAgICAgQUxPR1coInNldFBob25lU3RhdGUoKSBzZXR0aW5nIHNhbWUgc3RhdGUgJWQiLCBzdGF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gc3RvcmUgcHJldmlvdXMgcGhvbmUgc3RhdGUgZm9yIG1hbmFnZW1lbnQgb2Ygc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGJlbG93CisgICAgaW50IG9sZFN0YXRlID0gbVBob25lU3RhdGU7CisgICAgbVBob25lU3RhdGUgPSBzdGF0ZTsKKyAgICBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbiAmc3RyZWFtcyA9IG1BcG1PYnNlcnZlci0+Z2V0U3RyZWFtRGVzY3JpcHRvcnMoKTsKKyAgICAvLyBhcmUgd2UgZW50ZXJpbmcgb3Igc3RhcnRpbmcgYSBjYWxsCisgICAgaWYgKCFpc19zdGF0ZV9pbl9jYWxsKG9sZFN0YXRlKSAmJiBpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSkgeworICAgICAgICBBTE9HVigiICBFbnRlcmluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IFZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX0NOVDsgaisrKSB7CisgICAgICAgICAgICBzdHJlYW1zLnNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0RUTUYsIHN0YXRpY19jYXN0PFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5PihqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTF1bal0pOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpc19zdGF0ZV9pbl9jYWxsKG9sZFN0YXRlKSAmJiAhaXNfc3RhdGVfaW5fY2FsbChzdGF0ZSkpIHsKKyAgICAgICAgQUxPR1YoIiAgRXhpdGluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IFZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX0NOVDsgaisrKSB7CisgICAgICAgICAgICBzdHJlYW1zLnNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0RUTUYsIHN0YXRpY19jYXN0PFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5PihqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fRFRNRl1bal0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgRW5naW5lOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQoreworICAgIHN3aXRjaCh1c2FnZSkgeworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfQ09NTVVOSUNBVElPTiIsIGNvbmZpZyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQToKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfSEVBRFBIT05FUyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0EyRFAgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0RJR0lUQUxfRE9DSyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVIgKSB7CisgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX01FRElBIiwgY29uZmlnKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRDoKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfUkVDT1JEIiwgY29uZmlnKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0s6CisgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9DQVJfRE9DSyAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9ERVNLX0RPQ0sgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0RJR0lUQUxfRE9DSykgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9ET0NLIiwgY29uZmlnKTsKKyAgICAgICAgfQorICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9TWVNURU0iLCBjb25maWcpOworICAgICAgICB9CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJTzoKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9IRE1JX1NZU1RFTV9BVURJT19FTkZPUkNFRCkgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9ySERNSV9TWVNURU1fQVVESU8iLCBjb25maWcpOworICAgICAgICB9CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgdXNhZ2UgJWQiLCB1c2FnZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3JvdXRpbmdfc3RyYXRlZ3kgRW5naW5lOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICAvLyBzdHJlYW0gdG8gc3RyYXRlZ3kgbWFwcGluZworICAgIHN3aXRjaCAoc3RyZWFtKSB7CisgICAgY2FzZSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDoKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfUEhPTkU7CisgICAgY2FzZSBBVURJT19TVFJFQU1fUklORzoKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9BTEFSTToKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTjsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT046CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9EVE1GOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfRFRNRjsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgidW5rbm93biBzdHJlYW0gdHlwZSAlZCIsIHN0cmVhbSk7CisgICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgorICAgICAgICAvLyBOT1RFOiBTWVNURU0gc3RyZWFtIHVzZXMgTUVESUEgc3RyYXRlZ3kgYmVjYXVzZSBtdXRpbmcgbXVzaWMgYW5kIHN3aXRjaGluZyBvdXRwdXRzCisgICAgICAgIC8vIHdoaWxlIGtleSBjbGlja3MgYXJlIHBsYXllZCBwcm9kdWNlcyBhIHBvb3IgcmVzdWx0CisgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9NRURJQTsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9UVFM6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVI7CisgICAgY2FzZSBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWToKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFk7CisgICAgY2FzZSBBVURJT19TVFJFQU1fUkVST1VUSU5HOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfUkVST1VUSU5HOworICAgIH0KK30KKworcm91dGluZ19zdHJhdGVneSBFbmdpbmU6OmdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSkKK3sKKyAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IG1BcG1PYnNlcnZlci0+Z2V0T3V0cHV0cygpOworCisgICAgLy8gdXNhZ2UgdG8gc3RyYXRlZ3kgbWFwcGluZworICAgIHN3aXRjaCAodXNhZ2UpIHsKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKKyAgICAgICAgaWYgKG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcpIHx8CisgICAgICAgICAgICAgICAgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fQUxBUk0pKSB7CisgICAgICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OOworICAgICAgICB9CisgICAgICAgIGlmIChpc0luQ2FsbCgpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RSQVRFR1lfUEhPTkU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFk7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgorICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfTUVESUE7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9QSE9ORTsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfRFRNRjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OOworCisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfTUVESUE7CisgICAgfQorfQorCithdWRpb19kZXZpY2VzX3QgRW5naW5lOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSBjb25zdAoreworICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9IG1BcG1PYnNlcnZlci0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlSW5wdXREZXZpY2VzID0gbUFwbU9ic2VydmVyLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKTsKKworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gbUFwbU9ic2VydmVyLT5nZXRPdXRwdXRzKCk7CisKKyAgICB1aW50MzJfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICB1aW50MzJfdCBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKKworICAgIHN3aXRjaCAoc3RyYXRlZ3kpIHsKKworICAgIGNhc2UgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOgorICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgaWYgKCFkZXZpY2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3IgIlwKKyAgICAgICAgICAgICAgICAgICAgIlNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDoKKyAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTik7CisgICAgICAgIH0gZWxzZSBpZiAob3V0cHV0cy5pc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KEFVRElPX1NUUkVBTV9NVVNJQywKKyAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkpIHsKKyAgICAgICAgICAgIC8vIHdoaWxlIG1lZGlhIGlzIHBsYXlpbmcgb24gYSByZW1vdGUgZGV2aWNlLCB1c2UgdGhlIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IuCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgdGVzdCB0aGlzIHVzZWNhc2UgYmVmb3JlIHRlc3RpbmcgaWYgbWVkaWEgaXMgcGxheWluZyBiZWNhdXNlCisgICAgICAgICAgICAvLyAgIHRoZSBpc1N0cmVhbUFjdGl2ZSgpIG1ldGhvZCBvbmx5IGluZm9ybXMgYWJvdXQgdGhlIGFjdGl2aXR5IG9mIGEgc3RyZWFtLCBub3QKKyAgICAgICAgICAgIC8vICAgaWYgaXQncyBmb3IgbG9jYWwgcGxheWJhY2suIE5vdGUgYWxzbyB0aGF0IHdlIHVzZSB0aGUgc2FtZSBkZWxheSBiZXR3ZWVuIGJvdGggdGVzdHMKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTik7CisgICAgICAgICAgICAvL3VzZXIgInNhZmUiIHNwZWFrZXIgaWYgYXZhaWxhYmxlIGluc3RlYWQgb2Ygbm9ybWFsIHNwZWFrZXIgdG8gYXZvaWQgdHJpZ2dlcmluZworICAgICAgICAgICAgLy9vdGhlciBhY291c3RpYyBzYWZldHkgbWVjaGFuaXNtcyBmb3Igbm90aWZpY2F0aW9uCisgICAgICAgICAgICBpZiAoKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgJiYKKyAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlIHw9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOworICAgICAgICAgICAgICAgIGRldmljZSAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkpIHsKKyAgICAgICAgICAgIC8vIHdoaWxlIG1lZGlhIGlzIHBsYXlpbmcgKG9yIGhhcyByZWNlbnRseSBwbGF5ZWQpLCB1c2UgdGhlIHNhbWUgZGV2aWNlCisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB3aGVuIG1lZGlhIGlzIG5vdCBwbGF5aW5nIGFueW1vcmUsIGZhbGwgYmFjayBvbiB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yCisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04pOworICAgICAgICAgICAgLy91c2VyICJzYWZlIiBzcGVha2VyIGlmIGF2YWlsYWJsZSBpbnN0ZWFkIG9mIG5vcm1hbCBzcGVha2VyIHRvIGF2b2lkIHRyaWdnZXJpbmcKKyAgICAgICAgICAgIC8vb3RoZXIgYWNvdXN0aWMgc2FmZXR5IG1lY2hhbmlzbXMgZm9yIG5vdGlmaWNhdGlvbgorICAgICAgICAgICAgaWYgKChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpICYmCisgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSkgeworICAgICAgICAgICAgICAgIGRldmljZSB8PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKKyAgICAgICAgICAgICAgICBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgU1RSQVRFR1lfRFRNRjoKKyAgICAgICAgaWYgKCFpc0luQ2FsbCgpKSB7CisgICAgICAgICAgICAvLyB3aGVuIG9mZiBjYWxsLCBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMgTUVESUEgc3RyYXRlZ3kKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIHdoZW4gaW4gY2FsbCwgRFRNRiBhbmQgUEhPTkUgc3RyYXRlZ2llcyBmb2xsb3cgdGhlIHNhbWUgcnVsZXMKKyAgICAgICAgLy8gRkFMTCBUSFJPVUdICisKKyAgICBjYXNlIFNUUkFURUdZX1BIT05FOgorICAgICAgICAvLyBGb3JjZSB1c2Ugb2Ygb25seSBkZXZpY2VzIG9uIHByaW1hcnkgb3V0cHV0IGlmOgorICAgICAgICAvLyAtIGluIGNhbGwgQU5ECisgICAgICAgIC8vICAgLSBjYW5ub3Qgcm91dGUgZnJvbSB2b2ljZSBjYWxsIFJYIE9SCisgICAgICAgIC8vICAgLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA8IDMuMCBhbmQgVFggZGV2aWNlIGlzIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZQorICAgICAgICBpZiAoZ2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR4RGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBwcmltYXJ5T3V0cHV0ID0gb3V0cHV0cy5nZXRQcmltYXJ5T3V0cHV0KCk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxQcmltYXJ5SW5wdXREZXZpY2VzID0KKyAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUocHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsUHJpbWFyeU91dHB1dERldmljZXMgPQorICAgICAgICAgICAgICAgICAgICBwcmltYXJ5T3V0cHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CisKKyAgICAgICAgICAgIGlmICgoKGF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAoKCh0eERldmljZSAmIGF2YWlsUHJpbWFyeUlucHV0RGV2aWNlcyAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChwcmltYXJ5T3V0cHV0LT5nZXRBdWRpb1BvcnQoKS0+Z2V0TW9kdWxlVmVyc2lvbigpIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkpKSB7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgPSBhdmFpbFByaW1hcnlPdXRwdXREZXZpY2VzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGZvciBwaG9uZSBzdHJhdGVneSwgd2UgZmlyc3QgY29uc2lkZXIgdGhlIGZvcmNlZCB1c2UgYW5kIHRoZW4gdGhlIGF2YWlsYWJsZSBkZXZpY2VzIGJ5IG9yZGVyCisgICAgICAgIC8vIG9mIHByaW9yaXR5CisgICAgICAgIHN3aXRjaCAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pIHsKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPOgorICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpIHx8IHN0cmF0ZWd5ICE9IFNUUkFURUdZX0RUTUYpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQ7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTzsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgLy8gaWYgU0NPIGRldmljZSBpcyByZXF1ZXN0ZWQgYnV0IG5vIFNDTyBkZXZpY2UgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gZGVmYXVsdCBjYXNlCisgICAgICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgICAgICBkZWZhdWx0OiAgICAvLyBGT1JDRV9OT05FCisgICAgICAgICAgICAvLyB3aGVuIG5vdCBpbiBhIHBob25lIGNhbGwsIHBob25lIHN0cmF0ZWd5IHNob3VsZCByb3V0ZSBTVFJFQU1fVk9JQ0VfQ0FMTCB0byBBMkRQCisgICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG91dHB1dHMuZ2V0QTJkcE91dHB1dCgpICE9IDApKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQ7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgZGV2aWNlID0gbUFwbU9ic2VydmVyLT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPnR5cGUoKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIFNUUkFURUdZX1BIT05FIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSOgorICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8KKyAgICAgICAgICAgIC8vIEEyRFAgc3BlYWtlciB3aGVuIGZvcmNpbmcgdG8gc3BlYWtlciBvdXRwdXQKKyAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgorICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgICAgICAob3V0cHV0cy5nZXRBMmRwT3V0cHV0KCkgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0xJTkU7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBkZXZpY2UgPSBtQXBtT2JzZXJ2ZXItPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+dHlwZSgpOworICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3IgU1RSQVRFR1lfUEhPTkUsIEZPUkNFX1NQRUFLRVIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTjoKKworICAgICAgICAvLyBJZiBpbmNhbGwsIGp1c3Qgc2VsZWN0IHRoZSBTVFJBVEVHWV9QSE9ORSBkZXZpY2U6IFRoZSByZXN0IG9mIHRoZSBiZWhhdmlvciBpcyBoYW5kbGVkIGJ5CisgICAgICAgIC8vIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpLgorICAgICAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gRkFMTCBUSFJPVUdICisKKyAgICBjYXNlIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU6CisgICAgICAgIC8vIHN0cmF0ZWd5IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUgdXNlcyBzYW1lIHJvdXRpbmcgcG9saWN5IGFzIFNUUkFURUdZX1NPTklGSUNBVElPTgorICAgICAgICAvLyBleGNlcHQ6CisgICAgICAgIC8vICAgLSB3aGVuIGluIGNhbGwgd2hlcmUgaXQgZG9lc24ndCBkZWZhdWx0IHRvIFNUUkFURUdZX1BIT05FIGJlaGF2aW9yCisgICAgICAgIC8vICAgLSBpbiBjb3VudHJpZXMgd2hlcmUgbm90IGVuZm9yY2VkIGluIHdoaWNoIGNhc2UgaXQgZm9sbG93cyBTVFJBVEVHWV9NRURJQQorCisgICAgICAgIGlmICgoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAorICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBzcGVha2VyIGRldmljZSBub3QgZm91bmQgZm9yIFNUUkFURUdZX1NPTklGSUNBVElPTiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFRoZSBzZWNvbmQgZGV2aWNlIHVzZWQgZm9yIHNvbmlmaWNhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgZGV2aWNlIHVzZWQgYnkgbWVkaWEgc3RyYXRlZ3kKKyAgICAgICAgLy8gRkFMTCBUSFJPVUdICisKKyAgICAvLyBGSVhNRTogU1RSQVRFR1lfQUNDRVNTSUJJTElUWSBhbmQgU1RSQVRFR1lfUkVST1VUSU5HIGZvbGxvdyBTVFJBVEVHWV9NRURJQSBmb3Igbm93CisgICAgY2FzZSBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZOgorICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfQUNDRVNTSUJJTElUWSkgeworICAgICAgICAgICAgLy8gZG8gbm90IHJvdXRlIGFjY2Vzc2liaWxpdHkgcHJvbXB0cyB0byBhIGRpZ2l0YWwgb3V0cHV0IGN1cnJlbnRseSBjb25maWd1cmVkIHdpdGggYQorICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBmb3JtYXQgYXMgdGhleSB3b3VsZCBsaWtlbHkgbm90IGJlIG1peGVkIGFuZCBkcm9wcGVkLgorICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gb3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gZGVzYy0+ZGV2aWNlKCkgJgorICAgICAgICAgICAgICAgICAgICAoQVVESU9fREVWSUNFX09VVF9IRE1JIHwgQVVESU9fREVWSUNFX09VVF9TUERJRiB8IEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpOworICAgICAgICAgICAgICAgIGlmIChkZXNjLT5pc0FjdGl2ZSgpICYmICFhdWRpb19pc19saW5lYXJfcGNtKGRlc2MtPm1Gb3JtYXQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgfmRldmljZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEZBTEwgVEhST1VHSAorCisgICAgY2FzZSBTVFJBVEVHWV9SRVJPVVRJTkc6CisgICAgY2FzZSBTVFJBVEVHWV9NRURJQTogeworICAgICAgICB1aW50MzJfdCBkZXZpY2UyID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIGlmIChzdHJhdGVneSAhPSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHsKKyAgICAgICAgICAgIC8vIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKKyAgICAgICAgICAgIGlmIChhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsIFN0cmluZzgoIjAiKSkgIT0gMCkgeworICAgICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzSW5DYWxsKCkgJiYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSkgeworICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJgorICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCisgICAgICAgICAgICAgICAgKG91dHB1dHMuZ2V0QTJkcE91dHB1dCgpICE9IDApKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOworICAgICAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCisgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdID09IEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSKSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9MSU5FOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUOworICAgICAgICB9CisgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYgKHN0cmF0ZWd5ICE9IFNUUkFURUdZX1NPTklGSUNBVElPTikpIHsKKyAgICAgICAgICAgIC8vIG5vIHNvbmlmaWNhdGlvbiBvbiBhdXggZGlnaXRhbCAoZS5nLiBIRE1JKQorICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCisgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0tdID09IEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSykpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgfQorICAgICAgICBpbnQgZGV2aWNlMyA9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpIHsKKyAgICAgICAgICAgIC8vIEFSQywgU1BESUYgYW5kIEFVWF9MSU5FIGNhbiBjby1leGlzdCB3aXRoIG90aGVycy4KKyAgICAgICAgICAgIGRldmljZTMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkM7CisgICAgICAgICAgICBkZXZpY2UzIHw9IChhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BESUYpOworICAgICAgICAgICAgZGV2aWNlMyB8PSAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FKTsKKyAgICAgICAgfQorCisgICAgICAgIGRldmljZTIgfD0gZGV2aWNlMzsKKyAgICAgICAgLy8gZGV2aWNlIGlzIERFVklDRV9PVVRfU1BFQUtFUiBpZiB3ZSBjb21lIGZyb20gY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT04gb3IKKyAgICAgICAgLy8gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgQVVESU9fREVWSUNFX05PTkUgb3RoZXJ3aXNlCisgICAgICAgIGRldmljZSB8PSBkZXZpY2UyOworCisgICAgICAgIC8vIElmIGhkbWkgc3lzdGVtIGF1ZGlvIG1vZGUgaXMgb24sIHJlbW92ZSBzcGVha2VyIG91dCBvZiBvdXRwdXQgbGlzdC4KKyAgICAgICAgaWYgKChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgJiYKKyAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJT10gPT0KKyAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfSERNSV9TWVNURU1fQVVESU9fRU5GT1JDRUQpKSB7CisgICAgICAgICAgICBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICBkZXZpY2UgPSBtQXBtT2JzZXJ2ZXItPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+dHlwZSgpOworICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIFNUUkFURUdZX01FRElBIik7CisgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIHVua25vd24gc3RyYXRlZ3k6ICVkIiwgc3RyYXRlZ3kpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBBTE9HVlYoImdldERldmljZUZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIGRldmljZSAleCIsIHN0cmF0ZWd5LCBkZXZpY2UpOworICAgIHJldHVybiBkZXZpY2U7Cit9CisKKworYXVkaW9fZGV2aWNlc190IEVuZ2luZTo6Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0Cit7CisgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gbUFwbU9ic2VydmVyLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMgPSBtQXBtT2JzZXJ2ZXItPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpOworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gbUFwbU9ic2VydmVyLT5nZXRPdXRwdXRzKCk7CisgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZURldmljZVR5cGVzID0gYXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKKworICAgIHVpbnQzMl90IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworCisgICAgc3dpdGNoIChpbnB1dFNvdXJjZSkgeworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSzoKKyAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMKSB7CisgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVVESU9fU09VUkNFX0RFRkFVTFQ6CisgICAgY2FzZSBBVURJT19TT1VSQ0VfTUlDOgorICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFA7CisgICAgfSBlbHNlIGlmICgobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSAmJgorICAgICAgICAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSkgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUOworICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCkgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVDsKKyAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpIHsKKyAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0U7CisgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgLy8gQWxsb3cgb25seSB1c2Ugb2YgZGV2aWNlcyBvbiBwcmltYXJ5IGlucHV0IGlmIGluIGNhbGwgYW5kIEhBTCBkb2VzIG5vdCBzdXBwb3J0IHJvdXRpbmcKKyAgICAgICAgLy8gdG8gdm9pY2UgY2FsbCBwYXRoLgorICAgICAgICBpZiAoKGdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwpICYmCisgICAgICAgICAgICAgICAgKGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSA9PSAwKSB7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBvdXRwdXRzLmdldFByaW1hcnlPdXRwdXQoKTsKKyAgICAgICAgICAgIGF2YWlsYWJsZURldmljZVR5cGVzID0KKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUocHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpCisgICAgICAgICAgICAgICAgICAgICYgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTzoKKyAgICAgICAgICAgIC8vIGlmIFNDTyBkZXZpY2UgaXMgcmVxdWVzdGVkIGJ1dCBubyBTQ08gZGV2aWNlIGlzIGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgY2FzZQorICAgICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgICAgICBkZWZhdWx0OiAgICAvLyBGT1JDRV9OT05FCisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUjoKKyAgICAgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CQUNLX01JQykgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CQUNLX01JQzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOgorICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6CisgICAgICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0U7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6CisgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CQUNLX01JQykgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDOworICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKKyAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVg6CisgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6CisgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUikgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpIGludmFsaWQgaW5wdXQgc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgQUxPR1YoImdldERldmljZUZvcklucHV0U291cmNlKClpbnB1dCBzb3VyY2UgJWQsIGRldmljZSAlMDh4IiwgaW5wdXRTb3VyY2UsIGRldmljZSk7CisgICAgcmV0dXJuIGRldmljZTsKK30KKwordGVtcGxhdGUgPD4KK0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqRW5naW5lOjpxdWVyeUludGVyZmFjZSgpCit7CisgICAgcmV0dXJuICZtTWFuYWdlckludGVyZmFjZTsKK30KKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NmE0NzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmgKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworCisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiR2FpbnMuaCIKKyNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXI7CisKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKKworY2xhc3MgRW5naW5lCit7CitwdWJsaWM6CisgICAgRW5naW5lKCk7CisgICAgdmlydHVhbCB+RW5naW5lKCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVxdWVzdGVkSW50ZXJmYWNlPgorICAgIFJlcXVlc3RlZEludGVyZmFjZSAqcXVlcnlJbnRlcmZhY2UoKTsKKworcHJpdmF0ZToKKyAgICAvLy8gSW50ZXJmYWNlIG1lbWJlcnMKKyAgICBjbGFzcyBNYW5hZ2VySW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBNYW5hZ2VySW50ZXJmYWNlSW1wbChFbmdpbmUgKnBvbGljeUVuZ2luZSkKKyAgICAgICAgICAgIDogbVBvbGljeUVuZ2luZShwb2xpY3lFbmdpbmUpIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikKKyAgICAgICAgeworICAgICAgICAgICAgbVBvbGljeUVuZ2luZS0+c2V0T2JzZXJ2ZXIob2JzZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmluaXRDaGVjaygpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JVc2FnZSh1c2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UGhvbmVTdGF0ZShtb2RlKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFBob25lU3RhdGUoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRGb3JjZVVzZSh1c2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gLypkZXZEZXNjKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCAvKnN0YXRlKi8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+aW5pdFN0cmVhbVZvbHVtZShzdHJlYW0sIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoYm9vbCBpc1NwZWFrZXJEcmNFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+aW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhpc1NwZWFrZXJEcmNFbmFibGVkKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSxpbnQgaW5kZXhJblVpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+dm9sSW5kZXhUb0RiKGRldmljZUNhdGVnb3J5LCBzdHJlYW0sIGluZGV4SW5VaSk7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICBFbmdpbmUgKm1Qb2xpY3lFbmdpbmU7CisgICAgfSBtTWFuYWdlckludGVyZmFjZTsKKworcHJpdmF0ZToKKyAgICAvKiBDb3B5IGZhY2lsaXRpZXMgYXJlIHB1dCBwcml2YXRlIHRvIGRpc2FibGUgY29weS4gKi8KKyAgICBFbmdpbmUoY29uc3QgRW5naW5lICZvYmplY3QpOworICAgIEVuZ2luZSAmb3BlcmF0b3I9KGNvbnN0IEVuZ2luZSAmb2JqZWN0KTsKKworICAgIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKTsKKworICAgIHN0YXR1c190IGluaXRDaGVjaygpOworCisgICAgaW5saW5lIGJvb2wgaXNJbkNhbGwoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzX3N0YXRlX2luX2NhbGwobVBob25lU3RhdGUpOworICAgIH0KKworICAgIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpOworICAgIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtUGhvbmVTdGF0ZTsKKyAgICB9CisgICAgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CisgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbUZvcmNlVXNlW3VzYWdlXTsKKyAgICB9CisgICAgc3RhdHVzX3Qgc2V0RGVmYXVsdERldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKworICAgIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgY29uc3Q7CisgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKSBjb25zdDsKKworICAgIGZsb2F0IHZvbEluZGV4VG9EYihWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBjYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4SW5VaSk7CisgICAgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpOworICAgIHZvaWQgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhib29sIGlzU3BlYWtlckRyY0VuYWJsZWQpOworCisgICAgYXVkaW9fbW9kZV90IG1QaG9uZVN0YXRlOyAgLyoqPCBjdXJyZW50IHBob25lIHN0YXRlLiAqLworCisgICAgLyoqIGN1cnJlbnQgZm9yY2VkIHVzZSBjb25maWd1cmF0aW9uLiAqLworICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UXTsKKworICAgIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICptQXBtT2JzZXJ2ZXI7Cit9OworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZUluc3RhbmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZUluc3RhbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xN2U5ODMyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lSW5zdGFuY2UuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oIgorI2luY2x1ZGUgIkVuZ2luZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworCitFbmdpbmVJbnN0YW5jZTo6RW5naW5lSW5zdGFuY2UoKQoreworfQorCitFbmdpbmVJbnN0YW5jZSAqRW5naW5lSW5zdGFuY2U6OmdldEluc3RhbmNlKCkKK3sKKyAgICBzdGF0aWMgRW5naW5lSW5zdGFuY2UgaW5zdGFuY2U7CisgICAgcmV0dXJuICZpbnN0YW5jZTsKK30KKworRW5naW5lSW5zdGFuY2U6On5FbmdpbmVJbnN0YW5jZSgpCit7Cit9CisKK0VuZ2luZSAqRW5naW5lSW5zdGFuY2U6OmdldEVuZ2luZSgpIGNvbnN0Cit7CisgICAgc3RhdGljIEVuZ2luZSBlbmdpbmU7CisgICAgcmV0dXJuICZlbmdpbmU7Cit9CisKK3RlbXBsYXRlIDw+CitBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UgKkVuZ2luZUluc3RhbmNlOjpxdWVyeUludGVyZmFjZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGdldEVuZ2luZSgpLT5xdWVyeUludGVyZmFjZTxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2U+KCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9HYWlucy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9HYWlucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmMjkwOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0dhaW5zLmNwcApAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpHYWlucyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworLy8jZGVmaW5lIFZFUllfVkVSQk9TRV9MT0dHSU5HCisjaWZkZWYgVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNkZWZpbmUgQUxPR1ZWIEFMT0dWCisjZWxzZQorI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworI2luY2x1ZGUgIkdhaW5zLmgiCisjaW5jbHVkZSA8Vm9sdW1lLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBFbmdpbmVkZWZhdWx0Citjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7CisgICAgezEsIC00OS41Zn0sIHszMywgLTMzLjVmfSwgezY2LCAtMTcuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTU4LjBmfSwgezIwLCAtNDAuMGZ9LCB7NjAsIC0xNy4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0geworICAgIHsxLCAtNTguMGZ9LCB7MjAsIC00MC4wZn0sIHs2MCwgLTIxLjBmfSwgezEwMCwgLTEwLjBmfQorfTsKKworY29uc3QgVm9sdW1lQ3VydmVQb2ludAorR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7CisgICAgezEsIC01Ni4wZn0sIHsyMCwgLTM0LjBmfSwgezYwLCAtMTEuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgVm9sdW1lQ3VydmVQb2ludAorR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF0gPSB7CisgICAgezEsIC01NS4wZn0sIHsyMCwgLTQzLjBmfSwgezg2LCAtMTIuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgVm9sdW1lQ3VydmVQb2ludAorR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0geworICAgIHsxLCAtMjkuN2Z9LCB7MzMsIC0yMC4xZn0sIHs2NiwgLTEwLjJmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IFZvbHVtZUN1cnZlUG9pbnQKK0dhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTM1LjdmfSwgezMzLCAtMjYuMWZ9LCB7NjYsIC0xMy4yZn0sIHsxMDAsIDAuMGZ9Cit9OworCisvLyBBVURJT19TVFJFQU1fU1lTVEVNLCBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSBhbmQgQVVESU9fU1RSRUFNX0RUTUYgdm9sdW1lIHRyYWNrcworLy8gQVVESU9fU1RSRUFNX1JJTkcgb24gcGhvbmVzIGFuZCBBVURJT19TVFJFQU1fTVVTSUMgb24gdGFibGV0cy4KKy8vIEFVRElPX1NUUkVBTV9EVE1GIHRyYWNrcyBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCB3aGlsZSBpbiBjYWxsIChTZWUgQXVkaW9TZXJ2aWNlLmphdmEpLgorLy8gVGhlIHJhbmdlIGlzIGNvbnN0cmFpbmVkIGJldHdlZW4gLTI0ZEIgYW5kIC02ZEIgb3ZlciBzcGVha2VyIGFuZCAtMzBkQiBhbmQgLTE4ZEIgb3ZlciBoZWFkc2V0LgorCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7CisgICAgezEsIC0yNC4wZn0sIHszMywgLTE4LjBmfSwgezY2LCAtMTIuMGZ9LCB7MTAwLCAtNi4wZn0KK307CisKK2NvbnN0IFZvbHVtZUN1cnZlUG9pbnQKK0dhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTM0LjBmfSwgezMzLCAtMjQuMGZ9LCB7NjYsIC0xNS4wZn0sIHsxMDAsIC02LjBmfQorfTsKKworY29uc3QgVm9sdW1lQ3VydmVQb2ludAorR2FpbnM6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0geworICAgIHsxLCAtMzAuMGZ9LCB7MzMsIC0yNi4wZn0sIHs2NiwgLTIyLjBmfSwgezEwMCwgLTE4LjBmfQorfTsKKworY29uc3QgVm9sdW1lQ3VydmVQb2ludAorR2FpbnM6OnNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7CisgICAgezAsIC00Mi4wZn0sIHszMywgLTI4LjBmfSwgezY2LCAtMTQuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgVm9sdW1lQ3VydmVQb2ludAorR2FpbnM6OnNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7CisgICAgezAsIC0yNC4wZn0sIHszMywgLTE2LjBmfSwgezY2LCAtOC4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c0xpbmVhclZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MCwgLTk2LjBmfSwgezMzLCAtNjguMGZ9LCB7NjYsIC0zNC4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c1NpbGVudFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MCwgLTk2LjBmfSwgezEsIC05Ni4wZn0sIHsyLCAtOTYuMGZ9LCB7MTAwLCAtOTYuMGZ9Cit9OworCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MCwgMC4wZn0sIHsxLCAwLjBmfSwgezIsIDAuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fQ05UXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbVm9sdW1lOjpERVZJQ0VfQ0FURUdPUllfQ05UXSA9IHsKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9TWVNURU0KKyAgICAgICAgR2FpbnM6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX1JJTkcKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX01VU0lDCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9BTEFSTQorICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFCisgICAgICAgIEdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgIC8vIEFVRElPX1NUUkVBTV9EVE1GCisgICAgICAgIEdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX1RUUworICAgICAgLy8gIlRyYW5zbWl0dGVkIFRocm91Z2ggU3BlYWtlciI6IGFsd2F5cyBzaWxlbnQgZXhjZXB0IG9uIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzU2lsZW50Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzTGluZWFyVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzU2lsZW50Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c1NpbGVudFZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9SRVJPVVRJTkcKKyAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX1BBVENICisgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKK307CisKKy8vc3RhdGljCitmbG9hdCBHYWluczo6dm9sSW5kZXhUb0RiKFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJlYW1EZXNjcmlwdG9yJiBzdHJlYW1EZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKQoreworICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmN1cnZlID0gc3RyZWFtRGVzYy5nZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZUNhdGVnb3J5KTsKKworICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0gdHlwZQorICAgIGludCBuYlN0ZXBzID0gMSArIGN1cnZlW1ZvbHVtZTo6Vk9MTUFYXS5tSW5kZXggLQorICAgICAgICAgICAgY3VydmVbVm9sdW1lOjpWT0xNSU5dLm1JbmRleDsKKyAgICBpbnQgdm9sSWR4ID0gKG5iU3RlcHMgKiAoaW5kZXhJblVpIC0gc3RyZWFtRGVzYy5nZXRWb2x1bWVJbmRleE1pbigpKSkgLworICAgICAgICAgICAgKHN0cmVhbURlc2MuZ2V0Vm9sdW1lSW5kZXhNYXgoKSAtIHN0cmVhbURlc2MuZ2V0Vm9sdW1lSW5kZXhNaW4oKSk7CisKKyAgICAvLyBmaW5kIHdoYXQgcGFydCBvZiB0aGUgY3VydmUgdGhpcyBpbmRleCB2b2x1bWUgYmVsb25ncyB0bywgb3IgaWYgaXQncyBvdXQgb2YgYm91bmRzCisgICAgaW50IHNlZ21lbnQgPSAwOworICAgIGlmICh2b2xJZHggPCBjdXJ2ZVtWb2x1bWU6OlZPTE1JTl0ubUluZGV4KSB7ICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcworICAgICAgICByZXR1cm4gVk9MVU1FX01JTl9EQjsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZvbHVtZTo6Vk9MS05FRTFdLm1JbmRleCkgeworICAgICAgICBzZWdtZW50ID0gMDsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZvbHVtZTo6Vk9MS05FRTJdLm1JbmRleCkgeworICAgICAgICBzZWdtZW50ID0gMTsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8PSBjdXJ2ZVtWb2x1bWU6OlZPTE1BWF0ubUluZGV4KSB7CisgICAgICAgIHNlZ21lbnQgPSAyOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcworICAgICAgICByZXR1cm4gMC4wZjsKKyAgICB9CisKKyAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpbiB0aGUgYXR0ZW51YXRpb24gdGFibGUgaW4gZEIKKyAgICBmbG9hdCBkZWNpYmVscyA9IGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uICsKKyAgICAgICAgICAgICgoZmxvYXQpKHZvbElkeCAtIGN1cnZlW3NlZ21lbnRdLm1JbmRleCkpICoKKyAgICAgICAgICAgICAgICAoIChjdXJ2ZVtzZWdtZW50KzFdLm1EQkF0dGVudWF0aW9uIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uKSAvCisgICAgICAgICAgICAgICAgICAgICgoZmxvYXQpKGN1cnZlW3NlZ21lbnQrMV0ubUluZGV4IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgpKSApOworCisgICAgQUxPR1ZWKCJWT0xVTUUgdm9sIGluZGV4PVslZCAlZCAlZF0sIGRCPVslLjFmICUuMWYgJS4xZl0iLAorICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubUluZGV4LCB2b2xJZHgsCisgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50KzFdLm1JbmRleCwKKyAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uLAorICAgICAgICAgICAgZGVjaWJlbHMsCisgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50KzFdLm1EQkF0dGVudWF0aW9uKTsKKworICAgIHJldHVybiBkZWNpYmVsczsKK30KKworCisvL3N0YXRpYworZmxvYXQgR2FpbnM6OnZvbEluZGV4VG9BbXBsKFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbURlc2NyaXB0b3ImIHN0cmVhbURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4SW5VaSkKK3sKKyAgICByZXR1cm4gVm9sdW1lOjpEYlRvQW1wbCh2b2xJbmRleFRvRGIoZGV2aWNlQ2F0ZWdvcnksIHN0cmVhbURlc2MsIGluZGV4SW5VaSkpOworfQorCisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0dhaW5zLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9HYWlucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MjBiN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9HYWlucy5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPFN0cmVhbURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTdHJlYW1EZXNjcmlwdG9yOworCitjbGFzcyBHYWlucworeworcHVibGljIDoKKyAgICBzdGF0aWMgZmxvYXQgdm9sSW5kZXhUb0FtcGwoVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbURlc2NyaXB0b3ImIHN0cmVhbURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpOworCisgICAgc3RhdGljIGZsb2F0IHZvbEluZGV4VG9EYihWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbURlc2NyaXB0b3ImIHN0cmVhbURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKTsKKworICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlCisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07CisgICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmUgZm9yIG1lZGlhIHN0cmF0ZWd5CisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICAvLyB2b2x1bWUgY3VydmUgZm9yIG5vbi1tZWRpYSBhdWRpbyBvbiBleHQgbWVkaWEgb3V0cHV0cyAoSERNSSwgTGluZSwgZXRjKQorICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICAvLyB2b2x1bWUgY3VydmUgZm9yIG1lZGlhIHN0cmF0ZWd5IG9uIHNwZWFrZXJzCisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdOworICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3Igc29uaWZpY2F0aW9uIHN0cmF0ZWd5IG9uIHNwZWFrZXJzCisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07CisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF07CisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07CisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF07CisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07CisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOworICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNMaW5lYXJWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07CisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NpbGVudFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRnVsbFNjYWxlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOworICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlcyBwZXIgc3RyZWFtIGFuZCBkZXZpY2UgY2F0ZWdvcnkuIFNlZSBpbml0aWFsaXplVm9sdW1lQ3VydmVzKCkKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqc1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9DTlRdW1ZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX0NOVF07Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXIvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcApzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUZhY3RvcnkuY3BwCnJlbmFtZSB0byBzZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAKaW5kZXggMmFlN2JjMS4uOTkxMGExZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXIuaCIKKyNpbmNsdWRlICJtYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2Y2ODY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDQ4ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lNYW5hZ2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisvLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCisjaW5jbHVkZSAiYXVkaW9fcG9saWN5X2NvbmYuaCIKKyNpbmNsdWRlIDxDb25maWdQYXJzaW5nVXRpbHMuaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdWRpb1BvbGljeUludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKK3sKKyAgICByZXR1cm4gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQoreworICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoKSBkZXZpY2U6IDB4JVgsIHN0YXRlICVkLCBhZGRyZXNzICVzIG5hbWUgJXMiLAorLSAgICAgICAgICAgIGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CisKKyAgICAvLyBjb25uZWN0L2Rpc2Nvbm5lY3Qgb25seSAxIGRldmljZSBhdCBhIHRpbWUKKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KKyAgICAgICAgICAgIG1Id01vZHVsZXMuZ2V0RGV2aWNlRGVzY3JpcHRvcihkZXZpY2UsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CisKKyAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZXMKKyAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgIFNvcnRlZFZlY3RvciA8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHM7CisKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YoZGV2RGVzYyk7CisKKyAgICAgICAgLy8gc2F2ZSBhIGNvcHkgb2YgdGhlIG9wZW5lZCBvdXRwdXQgZGVzY3JpcHRvcnMgYmVmb3JlIGFueSBvdXRwdXQgaXMgb3BlbmVkIG9yIGNsb3NlZAorICAgICAgICAvLyBieSBjaGVja091dHB1dHNGb3JEZXZpY2UoKS4gVGhpcyB3aWxsIGJlIG5lZWRlZCBieSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQorICAgICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgLy8gaGFuZGxlIG91dHB1dCBkZXZpY2UgY29ubmVjdGlvbgorICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOiB7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWQ6ICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY29ubmVjdGluZyBkZXZpY2UgJXgiLCBkZXZpY2UpOworCisgICAgICAgICAgICAvLyByZWdpc3RlciBuZXcgZGV2aWNlIGFzIGF2YWlsYWJsZQorICAgICAgICAgICAgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5hZGQoZGV2RGVzYyk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZShkZXZpY2UpOworICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmF0dGFjaChtb2R1bGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBvdXRwdXRzLCBkZXZEZXNjLT5tQWRkcmVzcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRldmljZSBhdmFpbGFiaWxpdHkgdG8gRW5naW5lCisgICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYywgc3RhdGUpOworCisgICAgICAgICAgICAvLyBvdXRwdXRzIHNob3VsZCBuZXZlciBiZSBlbXB0eSBoZXJlCisgICAgICAgICAgICBBTE9HX0FTU0VSVChvdXRwdXRzLnNpemUoKSAhPSAwLCAic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCk6IgorICAgICAgICAgICAgICAgICAgICAiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgcmV0dXJuZWQgbm8gb3V0cHV0cyBidXQgc3RhdHVzIE9LIik7CisgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgcmV0dXJuZWQgJXp1IG91dHB1dHMiLAorICAgICAgICAgICAgICAgICAgb3V0cHV0cy5zaXplKCkpOworCisgICAgICAgICAgICAvLyBTZW5kIGNvbm5lY3QgdG8gSEFMcworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX0NPTk5FQ1QpLCBkZXZpY2UpOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZSBkaXNjb25uZWN0aW9uCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTogeworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3Rpbmcgb3V0cHV0IGRldmljZSAleCIsIGRldmljZSk7CisKKyAgICAgICAgICAgIC8vIFNlbmQgRGlzY29ubmVjdCB0byBIQUxzCisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfRElTQ09OTkVDVCksIGRldmljZSk7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwgcGFyYW0udG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIC8vIHJlbW92ZSBkZXZpY2UgZnJvbSBhdmFpbGFibGUgb3V0cHV0IGRldmljZXMKKyAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKworICAgICAgICAgICAgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBvdXRwdXRzLCBkZXZEZXNjLT5tQWRkcmVzcyk7CisKKyAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBkZXZpY2UgYXZhaWxhYmlsaXR5IHRvIEVuZ2luZQorICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MsIHN0YXRlKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVja0EyZHBTdXNwZW5kIG11c3QgcnVuIGJlZm9yZSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMgc28gdGhhdCBBMkRQCisgICAgICAgIC8vIG91dHB1dCBpcyBzdXNwZW5kZWQgYmVmb3JlIGFueSB0cmFja3MgYXJlIG1vdmVkIHRvIGl0CisgICAgICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICAgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7CisgICAgICAgIC8vIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKKyAgICAgICAgaWYgKCFvdXRwdXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzW2ldKTsKKyAgICAgICAgICAgICAgICAvLyBjbG9zZSB1bnVzZWQgb3V0cHV0cyBhZnRlciBkZXZpY2UgZGlzY29ubmVjdGlvbiBvciBkaXJlY3Qgb3V0cHV0cyB0aGF0IGhhdmUgYmVlbgorICAgICAgICAgICAgICAgIC8vIG9wZW5lZCBieSBjaGVja091dHB1dHNGb3JEZXZpY2UoKSB0byBxdWVyeSBkeW5hbWljIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICBpZiAoKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dHNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNoZWNrIGFnYWluIGFmdGVyIGNsb3NpbmcgQTJEUCBvdXRwdXQgdG8gcmVzZXQgbUEyZHBTdXNwZW5kZWQgaWYgbmVlZGVkCisgICAgICAgICAgICBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgICAgIH0KKworICAgICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworICAgICAgICBpZiAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCAmJiBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHx8IChkZXNjICE9IG1QcmltYXJ5T3V0cHV0KSkgeworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UoZGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgICAgICAvLyBkbyBub3QgZm9yY2UgZGV2aWNlIGNoYW5nZSBvbiBkdXBsaWNhdGVkIG91dHB1dCBiZWNhdXNlIGlmIGRldmljZSBpcyAwLCBpdCB3aWxsCisgICAgICAgICAgICAgICAgLy8gYWxzbyBmb3JjZSBhIGRldmljZSAwIGZvciB0aGUgdHdvIG91dHB1dHMgaXQgaXMgZHVwbGljYXRlZCB0byB3aGljaCBtYXkgb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAvLyBhIHZhbGlkIGRldmljZSBzZWxlY3Rpb24gb24gdGhvc2Ugb3V0cHV0cy4KKyAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gIWRlc2MtPmlzRHVwbGljYXRlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgZm9yY2Ugd2hlbiBkaXNjb25uZWN0aW5nIChhIG5vbi1kdXBsaWNhdGVkIGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpKTsKKyAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UoZGVzYywgbmV3RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9ICAvLyBlbmQgaWYgaXMgb3V0cHV0IGRldmljZQorCisgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZXMKKyAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgU29ydGVkVmVjdG9yIDxhdWRpb19pb19oYW5kbGVfdD4gaW5wdXRzOworCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2YoZGV2RGVzYyk7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZSBjb25uZWN0aW9uCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU6IHsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBhbHJlYWR5IGNvbm5lY3RlZDogJWQiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZShkZXZpY2UpOworICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOiBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGVja0lucHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgaW5wdXRzLCBkZXZEZXNjLT5tQWRkcmVzcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluZGV4ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGV2RGVzYyk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5hdHRhY2gobW9kdWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2V0IGNvbm5lY3QgdG8gSEFMcworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX0NPTk5FQ1QpLCBkZXZpY2UpOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAvLyBQcm9wYWdhdGUgZGV2aWNlIGF2YWlsYWJpbGl0eSB0byBFbmdpbmUKKyAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZEZXNjLCBzdGF0ZSk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZSBkaXNjb25uZWN0aW9uCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTogeworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJWQiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3RpbmcgaW5wdXQgZGV2aWNlICV4IiwgZGV2aWNlKTsKKworICAgICAgICAgICAgLy8gU2V0IERpc2Nvbm5lY3QgdG8gSEFMcworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX0RJU0NPTk5FQ1QpLCBkZXZpY2UpOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICBjaGVja0lucHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgaW5wdXRzLCBkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKworICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRldmljZSBhdmFpbGFiaWxpdHkgdG8gRW5naW5lCisgICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYywgc3RhdGUpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBzdGF0ZTogJXgiLCBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgY2xvc2VBbGxJbnB1dHMoKTsKKworICAgICAgICBpZiAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCAmJiBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gLy8gZW5kIGlmIGlzIGlucHV0IGRldmljZQorCisgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgZGV2aWNlOiAleCIsIGRldmljZSk7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCit7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG1Id01vZHVsZXMuZ2V0RGV2aWNlRGVzY3JpcHRvcihkZXZpY2UsIGRldmljZV9hZGRyZXNzLCAiIik7CisKKyAgICBEZXZpY2VWZWN0b3IgKmRldmljZVZlY3RvcjsKKworICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgZGV2aWNlVmVjdG9yID0gJm1BdmFpbGFibGVPdXRwdXREZXZpY2VzOworICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgZGV2aWNlVmVjdG9yID0gJm1BdmFpbGFibGVJbnB1dERldmljZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coImdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgZGV2aWNlIHR5cGUgJTA4eCIsIGRldmljZSk7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlVmVjdG9yLT5nZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYyk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIGludCBkZWxheU1zKQoreworICAgIGJvb2wgY3JlYXRlVHhQYXRjaCA9IGZhbHNlOworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdDsKKworICAgIGlmKCFoYXNQcmltYXJ5T3V0cHV0KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhdWRpb19kZXZpY2VzX3QgdHhEZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTik7CisgICAgQUxPR1YoInVwZGF0ZUNhbGxSb3V0aW5nIGRldmljZSByeERldmljZSAlMDh4IHR4RGV2aWNlICUwOHgiLCByeERldmljZSwgdHhEZXZpY2UpOworCisgICAgLy8gcmVsZWFzZSBleGlzdGluZyBSWCBwYXRjaCBpZiBhbnkKKyAgICBpZiAobUNhbGxSeFBhdGNoICE9IDApIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsUnhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICBtQ2FsbFJ4UGF0Y2guY2xlYXIoKTsKKyAgICB9CisgICAgLy8gcmVsZWFzZSBUWCBwYXRjaCBpZiBhbnkKKyAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsVHhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICBtQ2FsbFR4UGF0Y2guY2xlYXIoKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgUlggZGV2aWNlIGlzIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZSwgdGhlbiB1c2UgbGVnYWN5IHJvdXRpbmcgbWV0aG9kIGZvciB2b2ljZSBjYWxscworICAgIC8vIHZpYSBzZXRPdXRwdXREZXZpY2UoKSBvbiBwcmltYXJ5IG91dHB1dC4KKyAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSB0d28gYXVkaW8gcGF0Y2hlcyBmb3IgVFggYW5kIFJYIHBhdGguCisgICAgaWYgKGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCkgJiByeERldmljZSkgeworICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCB0cnVlLCBkZWxheU1zKTsKKyAgICAgICAgLy8gSWYgdGhlIFRYIGRldmljZSBpcyBhbHNvIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZSwgc2V0T3V0cHV0RGV2aWNlKCkgd2lsbCB0YWtlIGNhcmUKKyAgICAgICAgLy8gb2YgaXQgZHVlIHRvIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbi4gSWYgbm90LCBjcmVhdGUgYSBwYXRjaC4KKyAgICAgICAgaWYgKChhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgJiB0eERldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKQorICAgICAgICAgICAgICAgID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBjcmVhdGVUeFBhdGNoID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGNyZWF0ZSBSWCBwYXRoIGF1ZGlvIHBhdGNoCisgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocnhEZXZpY2UpOworICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIHNlbGVjdGVkIGRldmljZSBub3QgaW4gb3V0cHV0IGRldmljZSBsaXN0Iik7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHJ4U2lua0RldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKyAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpOworICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIG5vIHRlbGVwaG9ueSBSWCBkZXZpY2UiKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcnhTb3VyY2VEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CisKKyAgICAgICAgcnhTb3VyY2VEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7CisgICAgICAgIHJ4U2lua0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1swXSk7CisKKyAgICAgICAgLy8gcmVxdWVzdCB0byByZXVzZSBleGlzdGluZyBvdXRwdXQgc3RyZWFtIGlmIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCB0byByZWFjaCB0aGUgUlggZGV2aWNlCisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2UocnhEZXZpY2UsIG1PdXRwdXRzKTsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOworICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBSWCBkZXZpY2Ugb3V0cHV0IGlzIGR1cGxpY2F0ZWQiKTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzFdKTsKKyAgICAgICAgICAgIHBhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKKyAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmYWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgInVwZGF0ZUNhbGxSb3V0aW5nKCkgZXJyb3IgJWQgY3JlYXRpbmcgUlggYXVkaW8gcGF0Y2giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtQ2FsbFJ4UGF0Y2ggPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOworICAgICAgICAgICAgbUNhbGxSeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICBtQ2FsbFJ4UGF0Y2gtPm1VaWQgPSBtVWlkQ2FjaGVkOworICAgICAgICB9CisgICAgICAgIGNyZWF0ZVR4UGF0Y2ggPSB0cnVlOworICAgIH0KKyAgICBpZiAoY3JlYXRlVHhQYXRjaCkgeworCisgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOworICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUodHhEZXZpY2UpOworICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIHNlbGVjdGVkIGRldmljZSBub3QgaW4gaW5wdXQgZGV2aWNlIGxpc3QiKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gdHhTb3VyY2VEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CisgICAgICAgIHR4U291cmNlRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOworICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKTsKKyAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBubyB0ZWxlcGhvbnkgVFggZGV2aWNlIik7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHR4U2lua0RldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKyAgICAgICAgdHhTaW5rRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKKworICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYLCBtT3V0cHV0cyk7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKyAgICAgICAgLy8gcmVxdWVzdCB0byByZXVzZSBleGlzdGluZyBvdXRwdXQgc3RyZWFtIGlmIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCB0byByZWFjaCB0aGUgVFgKKyAgICAgICAgLy8gcGF0aCBvdXRwdXQgZGV2aWNlCisgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBSWCBkZXZpY2Ugb3V0cHV0IGlzIGR1cGxpY2F0ZWQiKTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzFdKTsKKyAgICAgICAgICAgIHBhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKKyAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmYWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgInNldFBob25lU3RhdGUoKSBlcnJvciAlZCBjcmVhdGluZyBUWCBhdWRpbyBwYXRjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1DYWxsVHhQYXRjaCA9IG5ldyBBdWRpb1BhdGNoKCZwYXRjaCwgbVVpZENhY2hlZCk7CisgICAgICAgICAgICBtQ2FsbFR4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIG1DYWxsVHhQYXRjaC0+bVVpZCA9IG1VaWRDYWNoZWQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKK3sKKyAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIHN0YXRlICVkIiwgc3RhdGUpOworICAgIC8vIHN0b3JlIHByZXZpb3VzIHBob25lIHN0YXRlIGZvciBtYW5hZ2VtZW50IG9mIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBiZWxvdworICAgIGludCBvbGRTdGF0ZSA9IG1FbmdpbmUtPmdldFBob25lU3RhdGUoKTsKKworICAgIGlmIChtRW5naW5lLT5zZXRQaG9uZVN0YXRlKHN0YXRlKSAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIGludmFsaWQgb3Igc2FtZSBzdGF0ZSAlZCIsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLy8gT3BlbnM6IGNhbiB0aGVzZSBsaW5lIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBzd2l0Y2ggb2Ygdm9sdW1lIGN1cnZlcz8/PworICAgIC8vIGlmIGxlYXZpbmcgY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcworICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQorICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSkgeworICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOworICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgeworICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZvcmNlIHJlZXZhbHVhdGluZyBhY2Nlc3NpYmlsaXR5IHJvdXRpbmcgd2hlbiBjYWxsIHN0b3BzCisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTd2l0Y2hpbmcgdG8gb3IgZnJvbSBpbmNhbGwgc3RhdGUgb3Igc3dpdGNoaW5nIGJldHdlZW4gdGVsZXBob255IGFuZCBWb0lQIGxlYWQgdG8gZm9yY2UKKyAgICAgKiByb3V0aW5nIGNvbW1hbmQuCisgICAgICovCisgICAgYm9vbCBmb3JjZSA9ICgoaXNfc3RhdGVfaW5fY2FsbChvbGRTdGF0ZSkgIT0gaXNfc3RhdGVfaW5fY2FsbChzdGF0ZSkpCisgICAgICAgICAgICAgICAgICB8fCAoaXNfc3RhdGVfaW5fY2FsbChzdGF0ZSkgJiYgKHN0YXRlICE9IG9sZFN0YXRlKSkpOworCisgICAgLy8gY2hlY2sgZm9yIGRldmljZSBhbmQgb3V0cHV0IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IG5ldyBwaG9uZSBzdGF0ZQorICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKKyAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworCisgICAgaW50IGRlbGF5TXMgPSAwOworICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSkgeworICAgICAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIC8vIG11dGUgbWVkaWEgYW5kIHNvbmlmaWNhdGlvbiBzdHJhdGVnaWVzIGFuZCBkZWxheSBkZXZpY2Ugc3dpdGNoIGJ5IHRoZSBsYXJnZXN0CisgICAgICAgICAgICAvLyBsYXRlbmN5IG9mIGFueSBvdXRwdXQgd2hlcmUgZWl0aGVyIHN0cmF0ZWd5IGlzIGFjdGl2ZS4KKyAgICAgICAgICAgIC8vIFRoaXMgYXZvaWQgc2VuZGluZyB0aGUgcmluZyB0b25lIG9yIG11c2ljIHRhaWwgaW50byB0aGUgZWFycGllY2Ugb3IgaGVhZHNldC4KKyAgICAgICAgICAgIGlmICgoaXNTdHJhdGVneUFjdGl2ZShkZXNjLCBTVFJBVEVHWV9NRURJQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNUaW1lKSB8fAorICAgICAgICAgICAgICAgICBpc1N0cmF0ZWd5QWN0aXZlKGRlc2MsIFNUUkFURUdZX1NPTklGSUNBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNUaW1lKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGRlbGF5TXMgPCAoaW50KWRlc2MtPmxhdGVuY3koKSoyKSkgeworICAgICAgICAgICAgICAgIGRlbGF5TXMgPSBkZXNjLT5sYXRlbmN5KCkqMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgdHJ1ZSwgZGVzYyk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfTUVESUEsIGZhbHNlLCBkZXNjLCBNVVRFX1RJTUVfTVMsCisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIHRydWUgLypmcm9tQ2FjaGUqLykpOworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSwgZGVzYyk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmYWxzZSwgZGVzYywgTVVURV9USU1FX01TLAorICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSAvKmZyb21DYWNoZSovKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaGFzUHJpbWFyeU91dHB1dCgpKSB7CisgICAgICAgIC8vIE5vdGUgdGhhdCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgZ2V0TmV3T3V0cHV0RGV2aWNlKCkgaXMgY2FsbGVkIG9uIHRoZSBwcmltYXJ5IG91dHB1dCwKKyAgICAgICAgLy8gdGhlIGRldmljZSByZXR1cm5lZCBpcyBub3QgbmVjZXNzYXJpbHkgcmVhY2hhYmxlIHZpYSB0aGlzIG91dHB1dAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBlbmRpbmcgY2FsbAorICAgICAgICAvLyBldmVuIGlmIG5vIGRldmljZSBjaGFuZ2UgaXMgbmVlZGVkCisgICAgICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSAmJiByeERldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgcnhEZXZpY2UgPSBtUHJpbWFyeU91dHB1dC0+ZGV2aWNlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhyeERldmljZSwgZGVsYXlNcyk7CisgICAgICAgIH0gZWxzZSBpZiAob2xkU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgICAgICBpZiAobUNhbGxSeFBhdGNoICE9IDApIHsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxSeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgICAgICAgICAgbUNhbGxSeFBhdGNoLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxUeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgICAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gaWYgZW50ZXJpbmcgaW4gY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcworICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQorICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSkgeworICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOworICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgeworICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIHRydWUsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZm9yY2UgcmVldmFsdWF0aW5nIGFjY2Vzc2liaWxpdHkgcm91dGluZyB3aGVuIGNhbGwgc3RhcnRzCisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKTsKKyAgICB9CisKKyAgICAvLyBGbGFnIHRoYXQgcmluZ3RvbmUgdm9sdW1lIG11c3QgYmUgbGltaXRlZCB0byBtdXNpYyB2b2x1bWUgdW50aWwgd2UgZXhpdCBNT0RFX1JJTkdUT05FCisgICAgaWYgKHN0YXRlID09IEFVRElPX01PREVfUklOR1RPTkUgJiYKKyAgICAgICAgaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSkpIHsKKyAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lID0gZmFsc2U7CisgICAgfQorfQorCithdWRpb19tb2RlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRQaG9uZVN0YXRlKCkgeworICAgIHJldHVybiBtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQoreworICAgIEFMT0dWKCJzZXRGb3JjZVVzZSgpIHVzYWdlICVkLCBjb25maWcgJWQsIG1QaG9uZVN0YXRlICVkIiwgdXNhZ2UsIGNvbmZpZywgbUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpKTsKKworICAgIGlmIChtRW5naW5lLT5zZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKSAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBjb3VsZCBub3Qgc2V0IGZvcmNlIGNmZyAlZCBmb3IgdXNhZ2UgJWQiLCBjb25maWcsIHVzYWdlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBib29sIGZvcmNlVm9sdW1lUmVldmFsID0gKHVzYWdlID09IEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTikgfHwKKyAgICAgICAgICAgICh1c2FnZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0spIHx8CisgICAgICAgICAgICAodXNhZ2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pOworCisgICAgLy8gY2hlY2sgZm9yIGRldmljZSBhbmQgb3V0cHV0IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IG5ldyBmb3JjZSB1c2FnZQorICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKKyAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBpZiAoKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHx8IChvdXRwdXREZXNjICE9IG1QcmltYXJ5T3V0cHV0KSkgeworICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIG5ld0RldmljZSwgKG5ld0RldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JjZVZvbHVtZVJlZXZhbCAmJiAobmV3RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSkgeworICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dERlc2MsIG5ld0RldmljZSwgMCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCBhY3RpdmVJbnB1dCA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXQoKTsKKyAgICBpZiAoYWN0aXZlSW5wdXQgIT0gMCkgeworICAgICAgICBzZXRJbnB1dERldmljZShhY3RpdmVJbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoYWN0aXZlSW5wdXQpKTsKKyAgICB9CisKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN5c3RlbVByb3BlcnR5KGNvbnN0IGNoYXIqIHByb3BlcnR5LCBjb25zdCBjaGFyKiB2YWx1ZSkKK3sKKyAgICBBTE9HVigic2V0U3lzdGVtUHJvcGVydHkoKSBwcm9wZXJ0eSAlcywgdmFsdWUgJXMiLCBwcm9wZXJ0eSwgdmFsdWUpOworfQorCisvLyBGaW5kIGEgZGlyZWN0IG91dHB1dCBwcm9maWxlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVycyBwYXNzZWQsIGV2ZW4gaWYgdGhlIGlucHV0IGZsYWdzIGRvCisvLyBub3QgZXhwbGljaXRseSByZXF1ZXN0IGEgZGlyZWN0IG91dHB1dAorc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKK3sKKyAgICAvLyBvbmx5IHJldGFpbiBmbGFncyB0aGF0IHdpbGwgZHJpdmUgdGhlIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSBzZWxlY3Rpb24KKyAgICAvLyBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUmVsZXZhbnRGbGFncyA9CisgICAgICAgICAgICAoQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOworICAgIGZsYWdzID0KKyAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KSgoZmxhZ3MgJiBrUmVsZXZhbnRGbGFncykgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworCisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IGN1clByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal07CisgICAgICAgICAgICBpZiAoIWN1clByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlLCBTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBOVUxMIC8qdXBkYXRlZFNhbXBsaW5nUmF0ZSovLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIE5VTEwgLyp1cGRhdGVkRm9ybWF0Ki8sCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBOVUxMIC8qdXBkYXRlZENoYW5uZWxNYXNrKi8sCisgICAgICAgICAgICAgICAgICAgIGZsYWdzKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcmVqZWN0IHByb2ZpbGVzIG5vdCBjb3JyZXNwb25kaW5nIHRvIGEgZGV2aWNlIGN1cnJlbnRseSBhdmFpbGFibGUKKyAgICAgICAgICAgIGlmICgobUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIGN1clByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGlmIHNldmVyYWwgcHJvZmlsZXMgYXJlIGNvbXBhdGlibGUsIGdpdmUgcHJpb3JpdHkgdG8gb25lIHdpdGggb2ZmbG9hZCBjYXBhYmlsaXR5CisgICAgICAgICAgICBpZiAocHJvZmlsZSAhPSAwICYmICgoY3VyUHJvZmlsZS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2ZpbGUgPSBjdXJQcm9maWxlOworICAgICAgICAgICAgaWYgKChwcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHByb2ZpbGU7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKyAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBkZXZpY2UgJWQsIHN0cmVhbSAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJXgsIGNoYW5uZWxNYXNrICV4LCBmbGFncyAleCIsCisgICAgICAgICAgZGV2aWNlLCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOworCisgICAgcmV0dXJuIGdldE91dHB1dEZvckRldmljZShkZXZpY2UsIEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIHNhbXBsaW5nUmF0ZSxmb3JtYXQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOworICAgIGlmIChhdHRyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkQXR0cmlidXRlcyhhdHRyKSkgeworICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHIoKSBpbnZhbGlkIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAorICAgICAgICAgICAgICAgICAgYXR0ci0+dXNhZ2UsIGF0dHItPmNvbnRlbnRfdHlwZSwgYXR0ci0+ZmxhZ3MsCisgICAgICAgICAgICAgICAgICBhdHRyLT50YWdzKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYXR0cmlidXRlcyA9ICphdHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgqc3RyZWFtIDwgQVVESU9fU1RSRUFNX01JTiB8fCAqc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CisgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cigpOiAgaW52YWxpZCBzdHJlYW0gdHlwZSIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW1fdHlwZV90b19hdWRpb19hdHRyaWJ1dGVzKCpzdHJlYW0sICZhdHRyaWJ1dGVzKTsKKyAgICB9CisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7CisgICAgaWYgKG1Qb2xpY3lNaXhlcy5nZXRPdXRwdXRGb3JBdHRyKGF0dHJpYnV0ZXMsIGRlc2MpID09IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKGRlc2MgIT0gMCwgIkludmFsaWQgZGVzYyByZXR1cm5lZCBieSBnZXRPdXRwdXRGb3JBdHRyIik7CisgICAgICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgICpzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJmF0dHJpYnV0ZXMpOworICAgICAgICAqb3V0cHV0ID0gZGVzYy0+bUlvSGFuZGxlOworICAgICAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybnMgb3V0cHV0ICVkIiwgKm91dHB1dCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgaWYgKGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UpIHsKKyAgICAgICAgQUxPR1coImdldE91dHB1dEZvckF0dHIoKSBubyBwb2xpY3kgbWl4IGZvdW5kIGZvciB1c2FnZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgdXNhZ2U9JWQsIGNvbnRlbnQ9JWQsIHRhZz0lcyBmbGFncz0lMDh4IgorICAgICAgICAgICAgIiBzZXNzaW9uICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLAorICAgICAgICAgICAgYXR0cmlidXRlcy51c2FnZSwgYXR0cmlidXRlcy5jb250ZW50X3R5cGUsIGF0dHJpYnV0ZXMudGFncywgYXR0cmlidXRlcy5mbGFncywKKyAgICAgICAgICAgIHNlc3Npb24sIHNlbGVjdGVkRGV2aWNlSWQpOworCisgICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmYXR0cmlidXRlcyk7CisKKyAgICAvLyBFeHBsaWNpdCByb3V0aW5nPworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2M7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPmdldElkKCkgPT0gc2VsZWN0ZWREZXZpY2VJZCkgeworICAgICAgICAgICAgZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dHB1dFJvdXRlcy5hZGRSb3V0ZShzZXNzaW9uLCAqc3RyZWFtLCBTZXNzaW9uUm91dGU6OlNPVVJDRV9UWVBFX05BLCBkZXZpY2VEZXNjLCB1aWQpOworCisgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IChyb3V0aW5nX3N0cmF0ZWd5KSBnZXRTdHJhdGVneUZvckF0dHIoJmF0dHJpYnV0ZXMpOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisKKyAgICBpZiAoKGF0dHJpYnV0ZXMuZmxhZ3MgJiBBVURJT19GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CisgICAgfQorCisgICAgQUxPR1YoImdldE91dHB1dEZvckF0dHIoKSBkZXZpY2UgMHgleCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJXgsIGNoYW5uZWxNYXNrICV4LCBmbGFncyAleCIsCisgICAgICAgICAgZGV2aWNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzKTsKKworICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2UoZGV2aWNlLCBzZXNzaW9uLCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKKyAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBtT3V0cHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckRldmljZSgKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gX191bnVzZWQsCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgdWludDMyX3QgbGF0ZW5jeSA9IDA7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICBpZiAobUN1ck91dHB1dCAhPSAwKSB7CisgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSB0ZXN0IG91dHB1dCBtQ3VyT3V0cHV0ICVkLCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgJXgsIG1EaXJlY3RPdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgIG1DdXJPdXRwdXQsIG1UZXN0U2FtcGxpbmdSYXRlLCBtVGVzdEZvcm1hdCwgbVRlc3RDaGFubmVscywgbURpcmVjdE91dHB1dCk7CisKKyAgICAgICAgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgb3BlbmluZyB0ZXN0IG91dHB1dCIpOworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UpOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IG1UZXN0RGV2aWNlOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUxhdGVuY3kgPSBtVGVzdExhdGVuY3lNczsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyA9CisgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkobURpcmVjdE91dHB1dCA/IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCA6IDApOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gbVRlc3RTYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gbVRlc3RDaGFubmVsczsKKyAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBtVGVzdEZvcm1hdDsKKyAgICAgICAgICAgIGlmIChvZmZsb2FkSW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9ICpvZmZsb2FkSW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksbUN1ck91dHB1dCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLG91dHB1dENtZC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBhZGRPdXRwdXQobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdOworICAgIH0KKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisKKyAgICAvLyBvcGVuIGEgZGlyZWN0IG91dHB1dCBpZiByZXF1aXJlZCBieSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAgIC8vZm9yY2UgZGlyZWN0IGZsYWcgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldDogb2ZmbG9hZGluZyBpbXBsaWVzIGEgZGlyZWN0IG91dHB1dCBzdHJlYW0KKyAgICAvLyBhbmQgYWxsIGNvbW1vbiBiZWhhdmlvcnMgYXJlIGRyaXZlbiBieSBjaGVja2luZyBvbmx5IHRoZSBkaXJlY3QgZmxhZworICAgIC8vIHRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIHNldCBhcHByb3ByaWF0ZWx5IGluIHRoZSBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCisgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICB9CisgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICB9CisgICAgLy8gb25seSBhbGxvdyBkZWVwIGJ1ZmZlcmluZyBmb3IgbXVzaWMgc3RyZWFtIHR5cGUKKyAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9NVVNJQykgeworICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgJn5BVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUik7CisgICAgfSBlbHNlIGlmICgvKiBzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDICYmICovCisgICAgICAgICAgICBmbGFncyA9PSBBVURJT19PVVRQVVRfRkxBR19OT05FICYmCisgICAgICAgICAgICBwcm9wZXJ0eV9nZXRfYm9vbCgiYXVkaW8uZGVlcF9idWZmZXIubWVkaWEiLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKSkgeworICAgICAgICAvLyB1c2UgREVFUF9CVUZGRVIgYXMgZGVmYXVsdCBvdXRwdXQgZm9yIG11c2ljIHN0cmVhbSB0eXBlCisgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KUFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOworICAgIH0KKyAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMpIHsKKyAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19UVFM7CisgICAgfQorCisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOworCisgICAgLy8gc2tpcCBkaXJlY3Qgb3V0cHV0IHNlbGVjdGlvbiBpZiB0aGUgcmVxdWVzdCBjYW4gb2J2aW91c2x5IGJlIGF0dGFjaGVkIHRvIGEgbWl4ZWQgb3V0cHV0CisgICAgLy8gYW5kIG5vdCBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgIGlmICgoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSAmJgorICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmIHNhbXBsaW5nUmF0ZSA8PSBNQVhfTUlYRVJfU0FNUExJTkdfUkFURSAmJgorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKSA8PSAyKSB7CisgICAgICAgIGdvdG8gbm9uX2RpcmVjdF9vdXRwdXQ7CisgICAgfQorCisgICAgLy8gRG8gbm90IGFsbG93IG9mZmxvYWRpbmcgaWYgb25lIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgaXMgZW5hYmxlZC4gVGhpcyBwcmV2ZW50cyBmcm9tCisgICAgLy8gY3JlYXRpbmcgYW4gb2ZmbG9hZGVkIHRyYWNrIGFuZCB0ZWFyaW5nIGl0IGRvd24gaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQgd2hlbiBhdWRpb2ZsaW5nZXIKKyAgICAvLyBkZXRlY3RzIHRoZXJlIGlzIGFuIGFjdGl2ZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0LgorICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY2hlY2sgdGhlIGF1ZGlvIHNlc3Npb24gaGVyZSBidXQgd2UgZG8gbm90IGhhdmUgaXQgaW4gdGhpcyBjb250ZXh0LgorICAgIC8vIFRoaXMgbWF5IHByZXZlbnQgb2ZmbG9hZGluZyBpbiByYXJlIHNpdHVhdGlvbnMgd2hlcmUgZWZmZWN0cyBhcmUgbGVmdCBhY3RpdmUgYnkgYXBwcworICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kLgorCisgICAgaWYgKCgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSA9PSAwKSB8fAorICAgICAgICAgICAgIW1FZmZlY3RzLmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkpIHsKKyAgICAgICAgcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KWZsYWdzKTsKKyAgICB9CisKKyAgICBpZiAocHJvZmlsZSAhPSAwKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gTlVMTDsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIChwcm9maWxlID09IGRlc2MtPm1Qcm9maWxlKSkgeworICAgICAgICAgICAgICAgIG91dHB1dERlc2MgPSBkZXNjOworICAgICAgICAgICAgICAgIC8vIHJldXNlIGRpcmVjdCBvdXRwdXQgaWYgY3VycmVudGx5IG9wZW4gYW5kIGNvbmZpZ3VyZWQgd2l0aCBzYW1lIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICBpZiAoKHNhbXBsaW5nUmF0ZSA9PSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCA9PSBvdXRwdXREZXNjLT5tRm9ybWF0KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IG91dHB1dERlc2MtPm1DaGFubmVsTWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCsrOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgcmV1c2luZyBkaXJlY3Qgb3V0cHV0ICVkIiwgbU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU91dHB1dHMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGNsb3NlIGRpcmVjdCBvdXRwdXQgaWYgY3VycmVudGx5IG9wZW4gYW5kIGNvbmZpZ3VyZWQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycworICAgICAgICBpZiAob3V0cHV0RGVzYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgdGhlIHNlbGVjdGVkIHByb2ZpbGUgaXMgb2ZmbG9hZGVkIGFuZCBubyBvZmZsb2FkIGluZm8gd2FzIHNwZWNpZmllZCwKKyAgICAgICAgLy8gY3JlYXRlIGEgZGVmYXVsdCBvbmUKKyAgICAgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgZGVmYXVsdE9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICAgICAgaWYgKChwcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAmJiAhb2ZmbG9hZEluZm8pIHsKKyAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOworICAgICAgICAgICAgZGVmYXVsdE9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlID0gc2FtcGxpbmdSYXRlOworICAgICAgICAgICAgZGVmYXVsdE9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOworICAgICAgICAgICAgZGVmYXVsdE9mZmxvYWRJbmZvLmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgIGRlZmF1bHRPZmZsb2FkSW5mby5zdHJlYW1fdHlwZSA9IHN0cmVhbTsKKyAgICAgICAgICAgIGRlZmF1bHRPZmZsb2FkSW5mby5iaXRfcmF0ZSA9IDA7CisgICAgICAgICAgICBkZWZhdWx0T2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPSAtMTsKKyAgICAgICAgICAgIGRlZmF1bHRPZmZsb2FkSW5mby5oYXNfdmlkZW8gPSB0cnVlOyAvLyBjb25zZXJ2YXRpdmUKKyAgICAgICAgICAgIGRlZmF1bHRPZmZsb2FkSW5mby5pc19zdHJlYW1pbmcgPSB0cnVlOyAvLyBsaWtlbHkKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvID0gJmRlZmF1bHRPZmZsb2FkSW5mbzsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dERlc2MgPSBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOworICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgICAgICBvdXRwdXREZXNjLT5tTGF0ZW5jeSA9IDA7CisgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkob3V0cHV0RGVzYy0+bUZsYWdzIHwgZmxhZ3MpOworICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOworICAgICAgICBjb25maWcuZm9ybWF0ID0gZm9ybWF0OworICAgICAgICBpZiAob2ZmbG9hZEluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9ICpvZmZsb2FkSW5mbzsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChwcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyk7CisKKyAgICAgICAgLy8gb25seSBhY2NlcHQgYW4gb3V0cHV0IHdpdGggdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXJzCisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgIChzYW1wbGluZ1JhdGUgIT0gMCAmJiBzYW1wbGluZ1JhdGUgIT0gY29uZmlnLnNhbXBsZV9yYXRlKSB8fAorICAgICAgICAgICAgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCAmJiBmb3JtYXQgIT0gY29uZmlnLmZvcm1hdCkgfHwKKyAgICAgICAgICAgIChjaGFubmVsTWFzayAhPSAwICYmIGNoYW5uZWxNYXNrICE9IGNvbmZpZy5jaGFubmVsX21hc2spKSB7CisgICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgZmFpbGVkIG9wZW5pbmcgZGlyZWN0IG91dHB1dDogb3V0cHV0ICVkIHNhbXBsaW5nUmF0ZSAlZCAlZCwiCisgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgJWQgJWQsIGNoYW5uZWxNYXNrICUwNHggJTA0eCIsIG91dHB1dCwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLCBmb3JtYXQsIG91dHB1dERlc2MtPm1Gb3JtYXQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIG1peGVyIG91dHB1dCBpZiBwb3NzaWJsZSB3aGVuIHRoZSBkaXJlY3Qgb3V0cHV0IGNvdWxkIG5vdCBiZSBvcGVuCisgICAgICAgICAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmIHNhbXBsaW5nUmF0ZSA8PSBNQVhfTUlYRVJfU0FNUExJTkdfUkFURSkgeworICAgICAgICAgICAgICAgIGdvdG8gbm9uX2RpcmVjdF9vdXRwdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgIG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID0gMDsKKyAgICAgICAgb3V0cHV0RGVzYy0+bVN0b3BUaW1lW3N0cmVhbV0gPSAwOworICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50ID0gMTsKKworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQgPSBnZXRPdXRwdXRGb3JFZmZlY3QoKTsKKyAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCA9IGdldE91dHB1dEZvckVmZmVjdCgpOworICAgICAgICBpZiAoZHN0T3V0cHV0ID09IG91dHB1dCkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm1vdmVFZmZlY3RzKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgc3JjT3V0cHV0LCBkc3RPdXRwdXQpOworICAgICAgICB9CisgICAgICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKKyAgICAgICAgQUxPR1YoImdldE91dHB1dCgpIHJldHVybnMgbmV3IGRpcmVjdCBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgfQorCitub25fZGlyZWN0X291dHB1dDoKKyAgICAvLyBpZ25vcmluZyBjaGFubmVsIG1hc2sgZHVlIHRvIGRvd25taXggY2FwYWJpbGl0eSBpbiBtaXhlcgorCisgICAgLy8gb3BlbiBhIG5vbiBkaXJlY3Qgb3V0cHV0CisKKyAgICAvLyBmb3Igbm9uIGRpcmVjdCBvdXRwdXRzLCBvbmx5IFBDTSBpcyBzdXBwb3J0ZWQKKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgIC8vIGdldCB3aGljaCBvdXRwdXQgaXMgc3VpdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtLiBUaGUgYWN0dWFsCisgICAgICAgIC8vIHJvdXRpbmcgY2hhbmdlIHdpbGwgaGFwcGVuIHdoZW4gc3RhcnRPdXRwdXQoKSB3aWxsIGJlIGNhbGxlZAorICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworCisgICAgICAgIC8vIGF0IHRoaXMgc3RhZ2Ugd2Ugc2hvdWxkIGlnbm9yZSB0aGUgRElSRUNUIGZsYWcgYXMgbm8gZGlyZWN0IG91dHB1dCBjb3VsZCBiZSBmb3VuZCBlYXJsaWVyCisgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgZmxhZ3MsIGZvcm1hdCk7CisgICAgfQorICAgIEFMT0dXX0lGKChvdXRwdXQgPT0gMCksICJnZXRPdXRwdXQoKSBjb3VsZCBub3QgZmluZCBvdXRwdXQgZm9yIHN0cmVhbSAlZCwgc2FtcGxpbmdSYXRlICVkLCIKKyAgICAgICAgICAgICJmb3JtYXQgJWQsIGNoYW5uZWxzICV4LCBmbGFncyAleCIsIHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncyk7CisKKyAgICBBTE9HVigiICBnZXRPdXRwdXRGb3JEZXZpY2UoKSByZXR1cm5zIG91dHB1dCAlZCIsIG91dHB1dCk7CisKKyAgICByZXR1cm4gb3V0cHV0OworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNlbGVjdE91dHB1dChjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKK3sKKyAgICAvLyBzZWxlY3Qgb25lIG91dHB1dCBhbW9uZyBzZXZlcmFsIHRoYXQgcHJvdmlkZSBhIHBhdGggdG8gYSBwYXJ0aWN1bGFyIGRldmljZSBvciBzZXQgb2YKKyAgICAvLyBkZXZpY2VzICh0aGUgbGlzdCB3YXMgcHJldmlvdXNseSBidWlsZCBieSBnZXRPdXRwdXRzRm9yRGV2aWNlKCkpLgorICAgIC8vIFRoZSBwcmlvcml0eSBpcyBhcyBmb2xsb3dzOgorICAgIC8vIDE6IHRoZSBvdXRwdXQgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgcmVxdWVzdGVkIHBvbGljeSBmbGFncworICAgIC8vIDI6IHRoZSBwcmltYXJ5IG91dHB1dAorICAgIC8vIDM6IHRoZSBmaXJzdCBvdXRwdXQgaW4gdGhlIGxpc3QKKworICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMSkgeworICAgICAgICByZXR1cm4gb3V0cHV0c1swXTsKKyAgICB9CisKKyAgICBpbnQgbWF4Q29tbW9uRmxhZ3MgPSAwOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dEZsYWdzID0gMDsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRQcmltYXJ5ID0gMDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICAvLyBpZiBhIHZhbGlkIGZvcm1hdCBpcyBzcGVjaWZpZWQsIHNraXAgb3V0cHV0IGlmIG5vdCBjb21wYXRpYmxlCisgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEKSB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IG91dHB1dERlc2MtPm1Gb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGNvbW1vbkZsYWdzID0gcG9wY291bnQob3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1GbGFncyAmIGZsYWdzKTsKKyAgICAgICAgICAgIGlmIChjb21tb25GbGFncyA+IG1heENvbW1vbkZsYWdzKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RmxhZ3MgPSBvdXRwdXRzW2ldOworICAgICAgICAgICAgICAgIG1heENvbW1vbkZsYWdzID0gY29tbW9uRmxhZ3M7CisgICAgICAgICAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dCgpIGNvbW1vbkZsYWdzIGZvciBvdXRwdXQgJWQsICUwNHgiLCBvdXRwdXRzW2ldLCBjb21tb25GbGFncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRQcmltYXJ5ID0gb3V0cHV0c1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRwdXRGbGFncyAhPSAwKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRGbGFnczsKKyAgICB9CisgICAgaWYgKG91dHB1dFByaW1hcnkgIT0gMCkgeworICAgICAgICByZXR1cm4gb3V0cHV0UHJpbWFyeTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0cHV0c1swXTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwKKyAgICAgICAgICBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJzdGFydE91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgLy8gUm91dGluZz8KKyAgICBtT3V0cHV0Um91dGVzLmluY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CisKKyAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlOworICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpIHsKKyAgICAgICAgbmV3RGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOworICAgIH0gZWxzZSBpZiAobU91dHB1dFJvdXRlcy5oYXNSb3V0ZUNoYW5nZWQoc2Vzc2lvbikpIHsKKyAgICAgICAgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBjaGVja1N0cmF0ZWd5Um91dGUoZ2V0U3RyYXRlZ3koc3RyZWFtKSwgb3V0cHV0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBuZXdEZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBkZWxheU1zID0gMDsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgbmV3RGV2aWNlLCAmZGVsYXlNcyk7CisKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIG1PdXRwdXRSb3V0ZXMuZGVjUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgLy8gQXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggaW5wdXQgd2hlbiBvdXRwdXQgaXMgc3RhcnRlZCBvbiBhIHJlIHJvdXRpbmcgbWl4CisgICAgLy8gb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UobmV3RGV2aWNlKSAmJiBvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwgJiYKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgeworICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peC0+bVJlZ2lzdHJhdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAicmVtb3RlLXN1Ym1peCIpOworICAgIH0KKworICAgIGlmIChkZWxheU1zICE9IDApIHsKKyAgICAgICAgdXNsZWVwKGRlbGF5TXMgKiAxMDAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0U291cmNlKHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkZWxheU1zKQoreworICAgIC8vIGNhbm5vdCBzdGFydCBwbGF5YmFjayBvZiBTVFJFQU1fVFRTIGlmIGFueSBvdGhlciBvdXRwdXQgaXMgYmVpbmcgdXNlZAorICAgIHVpbnQzMl90IGJlYWNvbk11dGVMYXRlbmN5ID0gMDsKKworICAgICpkZWxheU1zID0gMDsKKyAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMpIHsKKyAgICAgICAgQUxPR1YoIlx0IGZvdW5kIEJFQUNPTiBzdHJlYW0iKTsKKyAgICAgICAgaWYgKG1PdXRwdXRzLmlzQW55T3V0cHV0QWN0aXZlKEFVRElPX1NUUkVBTV9UVFMgLypzdHJlYW1Ub0lnbm9yZSovKSkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmVhY29uTXV0ZUxhdGVuY3kgPSBoYW5kbGVFdmVudEZvckJlYWNvbihTVEFSVElOR19CRUFDT04pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gc29tZSBwbGF5YmFjayBvdGhlciB0aGFuIGJlYWNvbiBzdGFydHMKKyAgICAgICAgYmVhY29uTXV0ZUxhdGVuY3kgPSBoYW5kbGVFdmVudEZvckJlYWNvbihTVEFSVElOR19PVVRQVVQpOworICAgIH0KKworICAgIC8vIGNoZWNrIGFjdGl2ZSBiZWZvcmUgaW5jcmVtZW50aW5nIHVzYWdlIGNvdW50CisgICAgYm9vbCBmb3JjZSA9ICFvdXRwdXREZXNjLT5pc0FjdGl2ZSgpOworCisgICAgLy8gaW5jcmVtZW50IHVzYWdlIGNvdW50IGZvciB0aGlzIHN0cmVhbSBvbiB0aGUgcmVxdWVzdGVkIG91dHB1dDoKKyAgICAvLyBOT1RFIHRoYXQgdGhlIHVzYWdlIGNvdW50IGlzIHRoZSBzYW1lIGZvciBkdXBsaWNhdGVkIG91dHB1dCBhbmQgaGFyZHdhcmUgb3V0cHV0IHdoaWNoIGlzCisgICAgLy8gbmVjZXNzYXJ5IGZvciBhIGNvcnJlY3QgY29udHJvbCBvZiBoYXJkd2FyZSBvdXRwdXQgcm91dGluZyBieSBzdGFydE91dHB1dCgpIGFuZCBzdG9wT3V0cHV0KCkKKyAgICBvdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIDEpOworCisgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDEgfHwgZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIC8vIHN0YXJ0aW5nIGFuIG91dHB1dCBiZWluZyByZXJvdXRlZD8KKyAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICB9CisgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOworICAgICAgICBib29sIHNob3VsZFdhaXQgPSAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVhY29uTXV0ZUxhdGVuY3kgPiAwKTsKKyAgICAgICAgdWludDMyX3Qgd2FpdE1zID0gYmVhY29uTXV0ZUxhdGVuY3k7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoZGVzYyAhPSBvdXRwdXREZXNjKSB7CisgICAgICAgICAgICAgICAgLy8gZm9yY2UgYSBkZXZpY2UgY2hhbmdlIGlmIGFueSBvdGhlciBvdXRwdXQgaXMgbWFuYWdlZCBieSB0aGUgc2FtZSBodworICAgICAgICAgICAgICAgIC8vIG1vZHVsZSBhbmQgaGFzIGEgY3VycmVudCBkZXZpY2Ugc2VsZWN0aW9uIHRoYXQgZGlmZmVycyBmcm9tIHNlbGVjdGVkIGRldmljZS4KKyAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSBhdWRpbyBIQUwgbXVzdCByZWNlaXZlIHRoZSBuZXcgZGV2aWNlIHNlbGVjdGlvbiBzbyB0aGF0IGl0IGNhbgorICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgZGV2aWNlIGN1cnJlbnRseSBzZWxlY3RlZCBieSB0aGUgb3RoZXIgYWN0aXZlIG91dHB1dC4KKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+c2hhcmVzSHdNb2R1bGVXaXRoKGRlc2MpICYmCisgICAgICAgICAgICAgICAgICAgIGRlc2MtPmRldmljZSgpICE9IGRldmljZSkgeworICAgICAgICAgICAgICAgICAgICBmb3JjZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIGF1ZGlvIG9uIG90aGVyIGFjdGl2ZSBvdXRwdXRzIHRvIGJlIHByZXNlbnRlZCB3aGVuIHN0YXJ0aW5nCisgICAgICAgICAgICAgICAgLy8gYSBub3RpZmljYXRpb24gc28gdGhhdCBhdWRpbyBmb2N1cyBlZmZlY3QgY2FuIHByb3BhZ2F0ZSwgb3IgdGhhdCBhIG11dGUvdW5tdXRlCisgICAgICAgICAgICAgICAgLy8gZXZlbnQgb2NjdXJyZWQgZm9yIGJlYWNvbgorICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhdGVuY3kgPSBkZXNjLT5sYXRlbmN5KCk7CisgICAgICAgICAgICAgICAgaWYgKHNob3VsZFdhaXQgJiYgZGVzYy0+aXNBY3RpdmUobGF0ZW5jeSAqIDIpICYmICh3YWl0TXMgPCBsYXRlbmN5KSkgeworICAgICAgICAgICAgICAgICAgICB3YWl0TXMgPSBsYXRlbmN5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGRldmljZSwgZm9yY2UpOworCisgICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCisgICAgICAgIGlmIChpc0luQ2FsbCgpKSB7CisgICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhcHBseSB2b2x1bWUgcnVsZXMgZm9yIGN1cnJlbnQgc3RyZWFtIGFuZCBkZXZpY2UgaWYgbmVjZXNzYXJ5CisgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXMudmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworCisgICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdGFydGluZyBhbiBvdXRwdXQgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uCisgICAgICAgIC8vIHJvdXRpbmcKKyAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShzdHJlYW0pOworCisgICAgICAgIC8vIGZvcmNlIHJlZXZhbHVhdGluZyBhY2Nlc3NpYmlsaXR5IHJvdXRpbmcgd2hlbiByaW5ndG9uZSBvciBhbGFybSBzdGFydHMKKyAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgQUxPR1YoInN0b3BPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKworICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9PSAxKSB7CisgICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBpbnB1dCB3aGVuIG91dHB1dCBpcyBzdG9wcGVkIG9uIGEKKyAgICAgICAgLy8gcmUgcm91dGluZyBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKG91dHB1dERlc2MtPm1EZXZpY2UpICYmCisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CisgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1SZWdpc3RyYXRpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgInJlbW90ZS1zdWJtaXgiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJvdXRpbmc/CisgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSA9IGZhbHNlOworICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA+IDApIHsKKyAgICAgICAgaW50IGFjdGl2aXR5Q291bnQgPSBtT3V0cHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CisgICAgICAgIGZvcmNlRGV2aWNlVXBkYXRlID0gKG1PdXRwdXRSb3V0ZXMuaGFzUm91dGUoc2Vzc2lvbikgJiYgKGFjdGl2aXR5Q291bnQgPT0gMCkpOworCisgICAgICAgIGlmIChmb3JjZURldmljZVVwZGF0ZSkgeworICAgICAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGdldFN0cmF0ZWd5KHN0cmVhbSksIEFVRElPX0lPX0hBTkRMRV9OT05FKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdG9wU291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgZm9yY2VEZXZpY2VVcGRhdGUpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BTb3VyY2Uoc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSkKK3sKKyAgICAvLyBhbHdheXMgaGFuZGxlIHN0cmVhbSBzdG9wLCBjaGVjayB3aGljaCBzdHJlYW0gdHlwZSBpcyBzdG9wcGluZworICAgIGhhbmRsZUV2ZW50Rm9yQmVhY29uKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVFRTID8gU1RPUFBJTkdfQkVBQ09OIDogU1RPUFBJTkdfT1VUUFVUKTsKKworICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCisgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKHN0cmVhbSwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPiAwKSB7CisgICAgICAgIC8vIGRlY3JlbWVudCB1c2FnZSBjb3VudCBvZiB0aGlzIHN0cmVhbSBvbiB0aGUgb3V0cHV0CisgICAgICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgLTEpOworCisgICAgICAgIC8vIHN0b3JlIHRpbWUgYXQgd2hpY2ggdGhlIHN0cmVhbSB3YXMgc3RvcHBlZCAtIHNlZSBpc1N0cmVhbUFjdGl2ZSgpCisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9PSAwIHx8IGZvcmNlRGV2aWNlVXBkYXRlKSB7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICAvLyBkZWxheSB0aGUgZGV2aWNlIHN3aXRjaCBieSB0d2ljZSB0aGUgbGF0ZW5jeSBiZWNhdXNlIHN0b3BPdXRwdXQoKSBpcyBleGVjdXRlZCB3aGVuCisgICAgICAgICAgICAvLyB0aGUgdHJhY2sgc3RvcCgpIGNvbW1hbmQgaXMgcmVjZWl2ZWQgYW5kIGF0IHRoYXQgdGltZSB0aGUgYXVkaW8gdHJhY2sgYnVmZmVyIGNhbgorICAgICAgICAgICAgLy8gc3RpbGwgY29udGFpbiBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgZHJhaW5lZC4gVGhlIGxhdGVuY3kgb25seSBjb3ZlcnMgdGhlIGF1ZGlvIEhBTAorICAgICAgICAgICAgLy8gYW5kIGtlcm5lbCBidWZmZXJzLiBBbHNvIHRoZSBsYXRlbmN5IGRvZXMgbm90IGFsd2F5cyBpbmNsdWRlIGFkZGl0aW9uYWwgZGVsYXkgaW4gdGhlCisgICAgICAgICAgICAvLyBhdWRpbyBwYXRoIChhdWRpbyBEU1AsIENPREVDIC4uLikKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBuZXdEZXZpY2UsIGZhbHNlLCBvdXRwdXREZXNjLT5sYXRlbmN5KCkqMik7CisKKyAgICAgICAgICAgIC8vIGZvcmNlIHJlc3RvcmluZyB0aGUgZGV2aWNlIHNlbGVjdGlvbiBvbiBvdGhlciBhY3RpdmUgb3V0cHV0cyBpZiBpdCBkaWZmZXJzIGZyb20gdGhlCisgICAgICAgICAgICAvLyBvbmUgYmVpbmcgc2VsZWN0ZWQgZm9yIHRoaXMgb3V0cHV0CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgY3VyT3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzYyAhPSBvdXRwdXREZXNjICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5pc0FjdGl2ZSgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5zaGFyZXNId01vZHVsZVdpdGgoZGVzYykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChuZXdEZXZpY2UgIT0gZGVzYy0+ZGV2aWNlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3T3V0cHV0RGV2aWNlKGRlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmxhdGVuY3koKSoyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG91dHB1dHMgaWYgc3RvcHBpbmcgb25lIHdpdGggYSBzdHJlYW0gdGhhdCBjYW4gYWZmZWN0IG5vdGlmaWNhdGlvbiByb3V0aW5nCisgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJzdG9wT3V0cHV0KCkgcmVmY291bnQgaXMgYWxyZWFkeSAwIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gX191bnVzZWQpCit7CisgICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSAlZCIsIG91dHB1dCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgcmVsZWFzaW5nIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgaW50IHRlc3RJbmRleCA9IHRlc3RPdXRwdXRJbmRleChvdXRwdXQpOworICAgIGlmICh0ZXN0SW5kZXggIT0gMCkgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKCkpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgcmVtb3ZlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICBtVGVzdE91dHB1dHNbdGVzdEluZGV4XSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisKKyAgICAvLyBSb3V0aW5nCisgICAgbU91dHB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKKworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisgICAgaWYgKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICBpZiAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA8PSAwKSB7CisgICAgICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIGludmFsaWQgb3BlbiBjb3VudCAlZCBmb3Igb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bURpcmVjdE9wZW5Db3VudCwgb3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoLS1kZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAvLyBJZiBlZmZlY3RzIHdoZXJlIHByZXNlbnQgb24gdGhlIG91dHB1dCwgYXVkaW9mbGluZ2VyIG1vdmVkIHRoZW0gdG8gdGhlIHByaW1hcnkKKyAgICAgICAgICAgIC8vIG91dHB1dCBieSBkZWZhdWx0OiBtb3ZlIHRoZW0gYmFjayB0byB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0LgorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRWZmZWN0KCk7CisgICAgICAgICAgICBpZiAoaGFzUHJpbWFyeU91dHB1dCgpICYmIGRzdE91dHB1dCAhPSBtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm1vdmVFZmZlY3RzKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSwgZHN0T3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3R5cGVfdCAqaW5wdXRUeXBlKQoreworICAgIEFMT0dWKCJnZXRJbnB1dEZvckF0dHIoKSBzb3VyY2UgJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAleCwiCisgICAgICAgICAgICAic2Vzc2lvbiAlZCwgZmxhZ3MgJSN4IiwKKyAgICAgICAgICBhdHRyLT5zb3VyY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgc2Vzc2lvbiwgZmxhZ3MpOworCisgICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9JTlZBTElEOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2U7CisgICAgLy8gaGFuZGxlIGxlZ2FjeSByZW1vdGUgc3VibWl4IGNhc2Ugd2hlcmUgdGhlIGFkZHJlc3Mgd2FzIG5vdCBhbHdheXMgc3BlY2lmaWVkCisgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7CisgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciA9IGZhbHNlOworICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlID0gYXR0ci0+c291cmNlOworICAgIGF1ZGlvX3NvdXJjZV90IGhhbElucHV0U291cmNlOworICAgIEF1ZGlvTWl4ICpwb2xpY3lNaXggPSBOVUxMOworCisgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7CisgICAgICAgIGlucHV0U291cmNlID0gQVVESU9fU09VUkNFX01JQzsKKyAgICB9CisgICAgaGFsSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKKworICAgIC8vIEV4cGxpY2l0IHJvdXRpbmc/CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYzsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPmdldElkKCkgPT0gc2VsZWN0ZWREZXZpY2VJZCkgeworICAgICAgICAgICAgZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVJbnB1dERldmljZXNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBtSW5wdXRSb3V0ZXMuYWRkUm91dGUoc2Vzc2lvbiwgU2Vzc2lvblJvdXRlOjpTVFJFQU1fVFlQRV9OQSwgaW5wdXRTb3VyY2UsIGRldmljZURlc2MsIHVpZCk7CisKKyAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVggJiYKKyAgICAgICAgICAgIHN0cm5jbXAoYXR0ci0+dGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwKSB7CisgICAgICAgIHN0YXR1c190IHJldCA9IG1Qb2xpY3lNaXhlcy5nZXRJbnB1dE1peEZvckF0dHIoKmF0dHIsICZwb2xpY3lNaXgpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTUlYX0VYVF9QT0xJQ1lfUkVST1VURTsKKyAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7CisgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KGF0dHItPnRhZ3MgKyBzdHJsZW4oImFkZHI9IikpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGlucHV0U291cmNlLCAmcG9saWN5TWl4KTsKKyAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGNvdWxkIG5vdCBmaW5kIGRldmljZSBmb3Igc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1SZWdpc3RyYXRpb25JZDsKKyAgICAgICAgICAgIGlmIChwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgeworICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGFuIGV4dGVybmFsIHBvbGljeSwgYnV0IHRoaXMgaW5wdXQgaXMgYXR0YWNoZWQgdG8gYSBtaXggb2YgcmVjb3JkZXJzLAorICAgICAgICAgICAgICAgIC8vIG1lYW5pbmcgaXQgcmVjZWl2ZXMgYXVkaW8gaW5qZWN0ZWQgaW50byB0aGUgZnJhbWV3b3JrLCBzbyB0aGUgcmVjb3JkZXIgZG9lc24ndAorICAgICAgICAgICAgICAgIC8vIGtub3cgYWJvdXQgaXQgYW5kIGlzIHRoZXJlZm9yZSBjb25zaWRlcmVkICJsZWdhY3kiCisgICAgICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9MRUdBQ1k7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHJlY29yZGluZyBhIG1peCBvZiBwbGF5ZXJzIGRlZmluZWQgYnkgYW4gZXh0ZXJuYWwgcG9saWN5LCB3ZSdyZSByZXJvdXRpbmcgZm9yCisgICAgICAgICAgICAgICAgLy8gYW4gZXh0ZXJuYWwgcG9saWN5CisgICAgICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9NSVhfRVhUX1BPTElDWV9SRVJPVVRFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CisgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9DQVBUVVJFOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSB7CisgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX1RFTEVQSE9OWV9SWDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOworICAgICAgICB9CisgICAgICAgIC8vIGFkYXB0IGNoYW5uZWwgc2VsZWN0aW9uIHRvIGlucHV0IHNvdXJjZQorICAgICAgICBzd2l0Y2ggKGlucHV0U291cmNlKSB7CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSzoKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTks7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6CisgICAgICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NBTEw6CisgICAgICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LIHwgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTks7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgeworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb24pOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAqaW5wdXQgPSBtU291bmRUcmlnZ2VyU2Vzc2lvbnMudmFsdWVGb3Ioc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgaXNTb3VuZFRyaWdnZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19IV19IT1RXT1JEKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiU291bmRUcmlnZ2VyIGNhcHR1cmUgb24gc2Vzc2lvbiAlZCBpbnB1dCAlZCIsIHNlc3Npb24sICppbnB1dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhhbElucHV0U291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gZmluZCBhIGNvbXBhdGlibGUgaW5wdXQgcHJvZmlsZSAobm90IG5lY2Vzc2FyaWx5IGlkZW50aWNhbCBpbiBwYXJhbWV0ZXJzKQorICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZTsKKyAgICAvLyBzYW1wbGluZ1JhdGUgYW5kIGZsYWdzIG1heSBiZSB1cGRhdGVkIGJ5IGdldElucHV0UHJvZmlsZQorICAgIHVpbnQzMl90IHByb2ZpbGVTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgYXVkaW9fZm9ybWF0X3QgcHJvZmlsZUZvcm1hdCA9IGZvcm1hdDsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBwcm9maWxlQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICBhdWRpb19pbnB1dF9mbGFnc190IHByb2ZpbGVGbGFncyA9IGZsYWdzOworICAgIGZvciAoOzspIHsKKyAgICAgICAgcHJvZmlsZSA9IGdldElucHV0UHJvZmlsZShkZXZpY2UsIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVNhbXBsaW5nUmF0ZSwgcHJvZmlsZUZvcm1hdCwgcHJvZmlsZUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVGbGFncyk7CisgICAgICAgIGlmIChwcm9maWxlICE9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOyAvLyBzdWNjZXNzCisgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZUZsYWdzICE9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICAgICAgcHJvZmlsZUZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FOyAvLyByZXRyeQorICAgICAgICB9IGVsc2UgeyAvLyBmYWlsCisgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgY291bGQgbm90IGZpbmQgcHJvZmlsZSBmb3IgZGV2aWNlIDB4JVgsIHNhbXBsaW5nUmF0ZSAldSwiCisgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAweCVYLCBmbGFncyAlI3giLAorICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJnZXRJbnB1dEZvckF0dHIoKTogSFcgbW9kdWxlICVzIG5vdCBvcGVuZWQiLCBwcm9maWxlLT5nZXRNb2R1bGVOYW1lKCkpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gcHJvZmlsZVNhbXBsaW5nUmF0ZTsKKyAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gcHJvZmlsZUNoYW5uZWxNYXNrOworICAgIGNvbmZpZy5mb3JtYXQgPSBwcm9maWxlRm9ybWF0OworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5JbnB1dChwcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlRmxhZ3MpOworCisgICAgLy8gb25seSBhY2NlcHQgaW5wdXQgd2l0aCB0aGUgZXhhY3QgcmVxdWVzdGVkIHNldCBvZiBwYXJhbWV0ZXJzCisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCAqaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUgfHwKKyAgICAgICAgKHByb2ZpbGVTYW1wbGluZ1JhdGUgIT0gY29uZmlnLnNhbXBsZV9yYXRlKSB8fAorICAgICAgICAocHJvZmlsZUZvcm1hdCAhPSBjb25maWcuZm9ybWF0KSB8fAorICAgICAgICAocHJvZmlsZUNoYW5uZWxNYXNrICE9IGNvbmZpZy5jaGFubmVsX21hc2spKSB7CisgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBmYWlsZWQgb3BlbmluZyBpbnB1dDogc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIgorICAgICAgICAgICAgICAgICIgY2hhbm5lbE1hc2sgJXgiLAorICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CisgICAgICAgIGlmICgqaW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KCppbnB1dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKHByb2ZpbGUpOworICAgIGlucHV0RGVzYy0+bUlucHV0U291cmNlID0gaW5wdXRTb3VyY2U7CisgICAgaW5wdXREZXNjLT5tUmVmQ291bnQgPSAwOworICAgIGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudCA9IDE7CisgICAgaW5wdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gcHJvZmlsZVNhbXBsaW5nUmF0ZTsKKyAgICBpbnB1dERlc2MtPm1Gb3JtYXQgPSBwcm9maWxlRm9ybWF0OworICAgIGlucHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gcHJvZmlsZUNoYW5uZWxNYXNrOworICAgIGlucHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKyAgICBpbnB1dERlc2MtPm1TZXNzaW9ucy5hZGQoc2Vzc2lvbik7CisgICAgaW5wdXREZXNjLT5tSXNTb3VuZFRyaWdnZXIgPSBpc1NvdW5kVHJpZ2dlcjsKKyAgICBpbnB1dERlc2MtPm1Qb2xpY3lNaXggPSBwb2xpY3lNaXg7CisKKyAgICBBTE9HVigiZ2V0SW5wdXRGb3JBdHRyKCkgcmV0dXJucyBpbnB1dCB0eXBlID0gJWQiLCAqaW5wdXRUeXBlKTsKKworICAgIGFkZElucHV0KCppbnB1dCwgaW5wdXREZXNjKTsKKyAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigic3RhcnRJbnB1dCgpIGlucHV0ICVkIiwgaW5wdXQpOworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoKSB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKKworICAgIGluZGV4ID0gaW5wdXREZXNjLT5tU2Vzc2lvbnMuaW5kZXhPZihzZXNzaW9uKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIHZpcnR1YWwgaW5wdXQgZGV2aWNlcyBhcmUgY29tcGF0aWJsZSB3aXRoIG90aGVyIGlucHV0IGRldmljZXMKKyAgICBpZiAoIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKKworICAgICAgICAvLyBmb3IgYSBub24tdmlydHVhbCBpbnB1dCBkZXZpY2UsIGNoZWNrIGlmIHRoZXJlIGlzIGFub3RoZXIgKG5vbi12aXJ0dWFsKSBhY3RpdmUgaW5wdXQKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYWN0aXZlSW5wdXQgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0KCk7CisgICAgICAgIGlmIChhY3RpdmVJbnB1dCAhPSAwICYmIGFjdGl2ZUlucHV0ICE9IGlucHV0KSB7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBhbHJlYWR5IGFjdGl2ZSBpbnB1dCB1c2VzIEFVRElPX1NPVVJDRV9IT1RXT1JEIHRoZW4gaXQgaXMgY2xvc2VkLAorICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBhY3RpdmUgaW5wdXQgY29udGludWVzIGFuZCB0aGUgbmV3IGlucHV0IGNhbm5vdCBiZSBzdGFydGVkLgorICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGFjdGl2ZURlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGFjdGl2ZUlucHV0KTsKKyAgICAgICAgICAgIGlmIChhY3RpdmVEZXNjLT5tSW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgcHJlZW1wdGluZyBsb3ctcHJpb3JpdHkgaW5wdXQgJWQiLCBpbnB1dCwgYWN0aXZlSW5wdXQpOworICAgICAgICAgICAgICAgIHN0b3BJbnB1dChhY3RpdmVJbnB1dCwgYWN0aXZlRGVzYy0+bVNlc3Npb25zLml0ZW1BdCgwKSk7CisgICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVEZXNjLT5tU2Vzc2lvbnMuaXRlbUF0KDApKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInN0YXJ0SW5wdXQoJWQpIGZhaWxlZDogb3RoZXIgaW5wdXQgJWQgYWxyZWFkeSBzdGFydGVkIiwgaW5wdXQsIGFjdGl2ZUlucHV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSb3V0aW5nPworICAgIG1JbnB1dFJvdXRlcy5pbmNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOworCisgICAgaWYgKGlucHV0RGVzYy0+bVJlZkNvdW50ID09IDAgfHwgbUlucHV0Um91dGVzLmhhc1JvdXRlQ2hhbmdlZChzZXNzaW9uKSkgeworICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQorICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICYmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tUmVnaXN0cmF0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9NSVhJTkcpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZSh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXQpLCB0cnVlIC8qIGZvcmNlICovKTsKKworICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdGFydGVkIGlmIG5vdAorICAgICAgICAvLyB1c2VkIGJ5IGEgcG9saWN5IG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUworICAgICAgICAvLyBGb3IgcmVtb3RlIHN1Ym1peCAoYSB2aXJ0dWFsIGRldmljZSksIHdlIG9wZW4gb25seSBvbmUgaW5wdXQgcGVyIGNhcHR1cmUgcmVxdWVzdC4KKyAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgoIiIpOworICAgICAgICAgICAgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGVzYy0+bVBvbGljeU1peC0+bVJlZ2lzdHJhdGlvbklkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKKyAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCAicmVtb3RlLXN1Ym1peCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIkF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dCgpIGlucHV0IHNvdXJjZSA9ICVkIiwgaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UpOworCisgICAgaW5wdXREZXNjLT5tUmVmQ291bnQrKzsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgQUxPR1YoInN0b3BJbnB1dCgpIGlucHV0ICVkIiwgaW5wdXQpOworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgaW5kZXggPSBpbnB1dERlc2MtPm1TZXNzaW9ucy5pbmRleE9mKHNlc3Npb24pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXREZXNjLT5tUmVmQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HVygic3RvcElucHV0KCkgaW5wdXQgJWQgYWxyZWFkeSBzdG9wcGVkIiwgaW5wdXQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaW5wdXREZXNjLT5tUmVmQ291bnQtLTsKKworICAgIC8vIFJvdXRpbmc/CisgICAgbUlucHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CisKKyAgICBpZiAoaW5wdXREZXNjLT5tUmVmQ291bnQgPT0gMCkgeworICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQorICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICYmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tUmVnaXN0cmF0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9JRExFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdG9wcGVkIGlmIG5vdAorICAgICAgICAvLyB1c2VkIGJ5IGEgcG9saWN5IG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUworICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgeworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7CisgICAgICAgICAgICBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tUmVnaXN0cmF0aW9uSWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSAiIikgeworICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXNldElucHV0RGV2aWNlKGlucHV0KTsKKworICAgICAgICBpZiAobUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudCgpID09IDApIHsKKyAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSAlZCIsIGlucHV0KTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSByZWxlYXNpbmcgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFJvdXRpbmcKKyAgICBtSW5wdXRSb3V0ZXMucmVtb3ZlUm91dGUoc2Vzc2lvbik7CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICBBTE9HX0FTU0VSVChpbnB1dERlc2MgIT0gMCk7CisKKyAgICBpbmRleCA9IGlucHV0RGVzYy0+bVNlc3Npb25zLmluZGV4T2Yoc2Vzc2lvbik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlucHV0RGVzYy0+bVNlc3Npb25zLnJlbW92ZShzZXNzaW9uKTsKKyAgICBpZiAoaW5wdXREZXNjLT5tT3BlblJlZkNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIGludmFsaWQgb3BlbiByZWYgY291bnQgJWQiLCBpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudC0tOworICAgIGlmIChpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQgPiAwKSB7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0ID4gMCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2xvc2VJbnB1dChpbnB1dCk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0Iik7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUFsbElucHV0cygpIHsKKyAgICBib29sIHBhdGNoUmVtb3ZlZCA9IGZhbHNlOworCisgICAgZm9yKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7CisgICAgICAgIHNzaXplX3QgcGF0Y2hfaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICBpZiAocGF0Y2hfaW5kZXggPj0gMCkgeworICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KHBhdGNoX2luZGV4KTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgICAgIG1BdWRpb1BhdGNoZXMucmVtb3ZlSXRlbXNBdChwYXRjaF9pbmRleCk7CisgICAgICAgICAgICBwYXRjaFJlbW92ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICB9CisgICAgbUlucHV0cy5jbGVhcigpOworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisKKyAgICBpZiAocGF0Y2hSZW1vdmVkKSB7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCit7CisgICAgQUxPR1YoImluaXRTdHJlYW1Wb2x1bWUoKSBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICBtRW5naW5lLT5pbml0U3RyZWFtVm9sdW1lKHN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICAvL0ZJWE1FOiBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSB2b2x1bWUgZm9sbG93cyBBVURJT19TVFJFQU1fTVVTSUMgZm9yIG5vdworICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDKSB7CisgICAgICAgIG1FbmdpbmUtPmluaXRTdHJlYW1Wb2x1bWUoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisKKyAgICBpZiAoKGluZGV4IDwgbVN0cmVhbXMudmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1pbigpKSB8fAorICAgICAgICAgICAgKGluZGV4ID4gbVN0cmVhbXMudmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1heCgpKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEZvcmNlIG1heCB2b2x1bWUgaWYgc3RyZWFtIGNhbm5vdCBiZSBtdXRlZAorICAgIGlmICghbVN0cmVhbXMuY2FuQmVNdXRlZChzdHJlYW0pKSBpbmRleCA9IG1TdHJlYW1zLnZhbHVlRm9yKHN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXhNYXgoKTsKKworICAgIEFMT0dWKCJzZXRTdHJlYW1Wb2x1bWVJbmRleCgpIHN0cmVhbSAlZCwgZGV2aWNlICUwNHgsIGluZGV4ICVkIiwKKyAgICAgICAgICBzdHJlYW0sIGRldmljZSwgaW5kZXgpOworCisgICAgLy8gaWYgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCBzZXQgZGVmYXVsdCB2YWx1ZSBhbmQKKyAgICAvLyBjbGVhciBhbGwgZGV2aWNlIHNwZWNpZmljIHZhbHVlcworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSB7CisgICAgICAgIG1TdHJlYW1zLmNsZWFyQ3VycmVudFZvbHVtZUluZGV4KHN0cmVhbSk7CisgICAgfQorICAgIG1TdHJlYW1zLmFkZEN1cnJlbnRWb2x1bWVJbmRleChzdHJlYW0sIGRldmljZSwgaW5kZXgpOworCisgICAgLy8gdXBkYXRlIHZvbHVtZSBvbiBhbGwgb3V0cHV0cyB3aG9zZSBjdXJyZW50IGRldmljZSBpcyBhbHNvIHNlbGVjdGVkIGJ5IHRoZSBzYW1lCisgICAgLy8gc3RyYXRlZ3kgYXMgdGhlIGRldmljZSBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlcgorICAgIGF1ZGlvX2RldmljZXNfdCBzdHJhdGVneURldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KGdldFN0cmF0ZWd5KHN0cmVhbSksIHRydWUgLypmcm9tQ2FjaGUqLyk7CisKKworICAgIC8vRklYTUU6IEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIHZvbHVtZSBmb2xsb3dzIEFVRElPX1NUUkVBTV9NVVNJQyBmb3Igbm93CisgICAgYXVkaW9fZGV2aWNlc190IGFjY2Vzc2liaWxpdHlEZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9NVVNJQykgeworICAgICAgICBtU3RyZWFtcy5hZGRDdXJyZW50Vm9sdW1lSW5kZXgoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksIGRldmljZSwgaW5kZXgpOworICAgICAgICBhY2Nlc3NpYmlsaXR5RGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfQUNDRVNTSUJJTElUWSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICB9CisgICAgaWYgKChkZXZpY2UgIT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSAmJgorICAgICAgICAgICAgKGRldmljZSAmIChzdHJhdGVneURldmljZSB8IGFjY2Vzc2liaWxpdHlEZXZpY2UpKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXNjLT5kZXZpY2UoKSk7CisgICAgICAgIGlmICgoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCkgfHwgKChjdXJEZXZpY2UgJiBzdHJhdGVneURldmljZSkgIT0gMCkpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9IGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwgaW5kZXgsIGRlc2MsIGN1ckRldmljZSk7CisgICAgICAgICAgICBpZiAodm9sU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdm9sU3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCkgfHwgKChjdXJEZXZpY2UgJiBhY2Nlc3NpYmlsaXR5RGV2aWNlKSAhPSAwKSkgeworICAgICAgICAgICAgc3RhdHVzX3Qgdm9sU3RhdHVzID0gY2hlY2tBbmRTZXRWb2x1bWUoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgZGVzYywgY3VyRGV2aWNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKGluZGV4ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgLy8gaWYgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCwgcmV0dXJuIHZvbHVtZSBmb3IgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8KKyAgICAvLyB0aGUgc3RyYXRlZ3kgdGhlIHN0cmVhbSBiZWxvbmdzIHRvLgorICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KGdldFN0cmF0ZWd5KHN0cmVhbSksIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgfQorICAgIGRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7CisKKyAgICAqaW5kZXggPSAgbVN0cmVhbXMudmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleChkZXZpY2UpOworICAgIEFMT0dWKCJnZXRTdHJlYW1Wb2x1bWVJbmRleCgpIHN0cmVhbSAlZCBkZXZpY2UgJTA4eCBpbmRleCAlZCIsIHN0cmVhbSwgZGV2aWNlLCAqaW5kZXgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzKQoreworICAgIC8vIHNlbGVjdCBvbmUgb3V0cHV0IGFtb25nIHNldmVyYWwgc3VpdGFibGUgZm9yIGdsb2JhbCBlZmZlY3RzLgorICAgIC8vIFRoZSBwcmlvcml0eSBpcyBhcyBmb2xsb3dzOgorICAgIC8vIDE6IEFuIG9mZmxvYWRlZCBvdXRwdXQuIElmIHRoZSBlZmZlY3QgZW5kcyB1cCBub3QgYmVpbmcgb2ZmbG9hZGFibGUsCisgICAgLy8gICAgQXVkaW9GbGluZ2VyIHdpbGwgaW52YWxpZGF0ZSB0aGUgdHJhY2sgYW5kIHRoZSBvZmZsb2FkZWQgb3V0cHV0CisgICAgLy8gICAgd2lsbCBiZSBjbG9zZWQgY2F1c2luZyB0aGUgZWZmZWN0IHRvIGJlIG1vdmVkIHRvIGEgUENNIG91dHB1dC4KKyAgICAvLyAyOiBBIGRlZXAgYnVmZmVyIG91dHB1dAorICAgIC8vIDM6IHRoZSBmaXJzdCBvdXRwdXQgaW4gdGhlIGxpc3QKKworICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dE9mZmxvYWRlZCA9IDA7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0RGVlcEJ1ZmZlciA9IDA7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzW2ldKTsKKyAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dEZvckVmZmVjdHMgb3V0cHV0c1slenVdIGZsYWdzICV4IiwgaSwgZGVzYy0+bUZsYWdzKTsKKyAgICAgICAgaWYgKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7CisgICAgICAgICAgICBvdXRwdXRPZmZsb2FkZWQgPSBvdXRwdXRzW2ldOworICAgICAgICB9CisgICAgICAgIGlmICgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpICE9IDApIHsKKyAgICAgICAgICAgIG91dHB1dERlZXBCdWZmZXIgPSBvdXRwdXRzW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoInNlbGVjdE91dHB1dEZvckVmZmVjdHMgb3V0cHV0T2ZmbG9hZGVkICVkIG91dHB1dERlZXBCdWZmZXIgJWQiLAorICAgICAgICAgIG91dHB1dE9mZmxvYWRlZCwgb3V0cHV0RGVlcEJ1ZmZlcik7CisgICAgaWYgKG91dHB1dE9mZmxvYWRlZCAhPSAwKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRPZmZsb2FkZWQ7CisgICAgfQorICAgIGlmIChvdXRwdXREZWVwQnVmZmVyICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dERlZXBCdWZmZXI7CisgICAgfQorCisgICAgcmV0dXJuIG91dHB1dHNbMF07Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCit7CisgICAgLy8gYXBwbHkgc2ltcGxlIHJ1bGUgd2hlcmUgZ2xvYmFsIGVmZmVjdHMgYXJlIGF0dGFjaGVkIHRvIHRoZSBzYW1lIG91dHB1dCBhcyBNVVNJQyBzdHJlYW1zCisKKyAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koQVVESU9fU1RSRUFNX01VU0lDKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZHN0T3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBtT3V0cHV0cyk7CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKGRzdE91dHB1dHMpOworICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JFZmZlY3QoKSBnb3Qgb3V0cHV0ICVkIGZvciBmeCAlcyBmbGFncyAleCIsCisgICAgICAgICAgb3V0cHV0LCAoZGVzYyA9PSBOVUxMKSA/ICJ1bnNwZWNpZmllZCIgOiBkZXNjLT5uYW1lLCAgKGRlc2MgPT0gTlVMTCkgPyAwIDogZGVzYy0+ZmxhZ3MpOworCisgICAgcmV0dXJuIG91dHB1dDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCit7CisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkoaW8pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW8pOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBBTE9HVygicmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIGlvICVkIiwgaW8pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtRWZmZWN0cy5yZWdpc3RlckVmZmVjdChkZXNjLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICByZXR1cm4gbU91dHB1dHMuaXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICByZXR1cm4gbU91dHB1dHMuaXNTdHJlYW1BY3RpdmVSZW1vdGVseShzdHJlYW0sIGluUGFzdE1zKTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChpbnB1dERlc2NyaXB0b3ItPm1SZWZDb3VudCA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXREZXNjcmlwdG9yLT5tSW5wdXRTb3VyY2UgPT0gKGludClzb3VyY2UpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIC8vIEFVRElPX1NPVVJDRV9IT1RXT1JEIGlzIGVxdWl2YWxlbnQgdG8gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIG9ubHkgaWYgaXQKKyAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gYW4gYWN0aXZlIGNhcHR1cmUgdHJpZ2dlcmVkIGJ5IGEgaGFyZHdhcmUgaG90d29yZCByZWNvZ25pdGlvbgorICAgICAgICBpZiAoKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pICYmCisgICAgICAgICAgICAgICAgIChpbnB1dERlc2NyaXB0b3ItPm1JbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgbm90IGFzc3VtZSB0aGF0IHRoZSBmaXJzdCBzZXNzaW9uIGlzIHRoZSBhY3RpdmUgb25lIGFuZCBrZWVwCisgICAgICAgICAgICAvLyBhY3Rpdml0eSBjb3VudCBwZXIgc2Vzc2lvbi4gU2FtZSBpbiBzdGFydElucHV0KCkuCisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVNvdW5kVHJpZ2dlclNlc3Npb25zLmluZGV4T2ZLZXkoaW5wdXREZXNjcmlwdG9yLT5tU2Vzc2lvbnMuaXRlbUF0KDApKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZWdpc3RlciBhIGxpc3Qgb2YgY3VzdG9tIG1peGVzIHdpdGggdGhlaXIgYXR0cmlidXRlcyBhbmQgZm9ybWF0LgorLy8gV2hlbiBhIG1peCBpcyByZWdpc3RlcmVkLCBjb3JyZXNwb25kaW5nIGlucHV0IGFuZCBvdXRwdXQgcHJvZmlsZXMgYXJlCisvLyBhZGRlZCB0byB0aGUgcmVtb3RlIHN1Ym1peCBodyBtb2R1bGUuIFRoZSBwcm9maWxlIGNvbnRhaW5zIG9ubHkgdGhlCisvLyBwYXJhbWV0ZXJzIChzYW1wbGluZyByYXRlLCBmb3JtYXQuLi4pIHNwZWNpZmllZCBieSB0aGUgbWl4LgorLy8gVGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQgcmVtb3RlIHN1Ym1peCBkZXZpY2UgaXMgYWxzbyBjb25uZWN0ZWQuCisvLworLy8gV2hlbiBhIHJlbW90ZSBzdWJtaXggZGV2aWNlIGlzIGNvbm5lY3RlZCwgdGhlIGFkZHJlc3MgaXMgY2hlY2tlZCB0byBzZWxlY3QgdGhlCisvLyBhcHByb3ByaWF0ZSBwcm9maWxlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBpbnB1dCBvciBvdXRwdXQgc3RyZWFtIGlzIG9wZW5lZC4KKy8vCisvLyBXaGVuIGNhcHR1cmUgc3RhcnRzLCBnZXRJbnB1dEZvckF0dHIoKSB3aWxsOgorLy8gIC0gMSBsb29rIGZvciBhIG1peCBtYXRjaGluZyB0aGUgYWRkcmVzcyBwYXNzZWQgaW4gYXR0cmlidHV0ZXMgdGFncyBpZiBhbnkKKy8vICAtIDIgaWYgbm9uZSBmb3VuZCwgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKSB3aWxsOgorLy8gICAgIC0gMi4xIGxvb2sgZm9yIGEgbWl4IG1hdGNoaW5nIHRoZSBhdHRyaWJ1dGVzIHNvdXJjZQorLy8gICAgIC0gMi4yIGlmIG5vbmUgZm91bmQsIGRlZmF1bHQgdG8gZGV2aWNlIHNlbGVjdGlvbiBieSBwb2xpY3kgcnVsZXMKKy8vIEF0IHRoaXMgdGltZSwgdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0IHJlbW90ZSBzdWJtaXggZGV2aWNlIGlzIGFsc28gY29ubmVjdGVkCisvLyBhbmQgYWN0aXZlIHBsYXliYWNrIHVzZSBjYXNlcyBjYW4gYmUgdHJhbnNmZXJyZWQgdG8gdGhpcyBtaXggaWYgbmVlZGVkIHdoZW4gcmVjb25uZWN0aW5nCisvLyBhZnRlciBBdWRpb1RyYWNrcyBhcmUgaW52YWxpZGF0ZWQKKy8vCisvLyBXaGVuIHBsYXliYWNrIHN0YXJ0cywgZ2V0T3V0cHV0Rm9yQXR0cigpIHdpbGw6CisvLyAgLSAxIGxvb2sgZm9yIGEgbWl4IG1hdGNoaW5nIHRoZSBhZGRyZXNzIHBhc3NlZCBpbiBhdHRyaWJ0dXRlcyB0YWdzIGlmIGFueQorLy8gIC0gMiBpZiBub25lIGZvdW5kLCBsb29rIGZvciBhIG1peCBtYXRjaGluZyB0aGUgYXR0cmlidXRlcyB1c2FnZQorLy8gIC0gMyBpZiBub25lIGZvdW5kLCBkZWZhdWx0IHRvIGRldmljZSBhbmQgb3V0cHV0IHNlbGVjdGlvbiBieSBwb2xpY3kgcnVsZXMuCisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzKQoreworICAgIHNwPEh3TW9kdWxlPiBtb2R1bGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVgsIG1Id01vZHVsZXNbaV0tPm1OYW1lKSA9PSAwICYmCisgICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bUhhbmRsZSAhPSAwKSB7CisgICAgICAgICAgICBtb2R1bGUgPSBtSHdNb2R1bGVzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobW9kdWxlID09IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIEFMT0dWKCJyZWdpc3RlclBvbGljeU1peGVzKCkgbnVtIG1peGVzICVkIiwgbWl4ZXMuc2l6ZSgpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWl4ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4ZXNbaV0ubVJlZ2lzdHJhdGlvbklkOworCisgICAgICAgIGlmIChtUG9saWN5TWl4ZXMucmVnaXN0ZXJNaXgoYWRkcmVzcywgbWl4ZXNbaV0pICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhdWRpb19jb25maWdfdCBvdXRwdXRDb25maWcgPSBtaXhlc1tpXS5tRm9ybWF0OworICAgICAgICBhdWRpb19jb25maWdfdCBpbnB1dENvbmZpZyA9IG1peGVzW2ldLm1Gb3JtYXQ7CisgICAgICAgIC8vIE5PVEU6IGF1ZGlvIGZsaW5nZXIgbWl4ZXIgZG9lcyBub3Qgc3VwcG9ydCBtb25vIG91dHB1dDogY29uZmlndXJlIHJlbW90ZSBzdWJtaXggSEFMIGluCisgICAgICAgIC8vIHN0ZXJlbyBhbmQgbGV0IGF1ZGlvIGZsaW5nZXIgZG8gdGhlIGNoYW5uZWwgY29udmVyc2lvbiBpZiBuZWVkZWQuCisgICAgICAgIG91dHB1dENvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgICAgIGlucHV0Q29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPOworICAgICAgICBtb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUoYWRkcmVzcywgJm91dHB1dENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwgYWRkcmVzcyk7CisgICAgICAgIG1vZHVsZS0+YWRkSW5wdXRQcm9maWxlKGFkZHJlc3MsICZpbnB1dENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLCBhZGRyZXNzKTsKKworICAgICAgICBpZiAobWl4ZXNbaV0ubU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnVucmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzKQoreworICAgIHNwPEh3TW9kdWxlPiBtb2R1bGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVgsIG1Id01vZHVsZXNbaV0tPm1OYW1lKSA9PSAwICYmCisgICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bUhhbmRsZSAhPSAwKSB7CisgICAgICAgICAgICBtb2R1bGUgPSBtSHdNb2R1bGVzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobW9kdWxlID09IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIEFMT0dWKCJ1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoKSBudW0gbWl4ZXMgJWQiLCBtaXhlcy5zaXplKCkpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaXhlcy5zaXplKCk7IGkrKykgeworICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXhlc1tpXS5tUmVnaXN0cmF0aW9uSWQ7CisKKyAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy51bnJlZ2lzdGVyTWl4KGFkZHJlc3MpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsIGFkZHJlc3Muc3RyaW5nKCkpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkKKyAgICAgICAgeworICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLCBhZGRyZXNzLnN0cmluZygpKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIpOworICAgICAgICB9CisgICAgICAgIG1vZHVsZS0+cmVtb3ZlT3V0cHV0UHJvZmlsZShhZGRyZXNzKTsKKyAgICAgICAgbW9kdWxlLT5yZW1vdmVJbnB1dFByb2ZpbGUoYWRkcmVzcyk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5BdWRpb1BvbGljeU1hbmFnZXIgRHVtcDogJXBcbiIsIHRoaXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBQcmltYXJ5IE91dHB1dDogJWRcbiIsCisgICAgICAgICAgICAgaGFzUHJpbWFyeU91dHB1dCgpID8gbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSA6IEFVRElPX0lPX0hBTkRMRV9OT05FKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFBob25lIHN0YXRlOiAlZFxuIiwgbUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgY29tbXVuaWNhdGlvbnMgJWRcbiIsCisgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIG1lZGlhICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIHJlY29yZCAlZFxuIiwgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkQpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgZG9jayAlZFxuIiwgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIHN5c3RlbSAlZFxuIiwgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgaGRtaSBzeXN0ZW0gYXVkaW8gJWRcbiIsCisgICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgib3V0cHV0IikpOworICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiaW5wdXQiKSk7CisgICAgbUh3TW9kdWxlcy5kdW1wKGZkKTsKKyAgICBtT3V0cHV0cy5kdW1wKGZkKTsKKyAgICBtSW5wdXRzLmR1bXAoZmQpOworICAgIG1TdHJlYW1zLmR1bXAoZmQpOworICAgIG1FZmZlY3RzLmR1bXAoZmQpOworICAgIG1BdWRpb1BhdGNoZXMuZHVtcChmZCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGZvciB0aGUgcGFyYW1ldGVycyB3aGljaCBjYW4gYmUgb2ZmbG9hZGVkLgorLy8gVGhpcyBjYW4gYmUgZW5oYW5jZWQgZGVwZW5kaW5nIG9uIHRoZSBjYXBhYmlsaXR5IG9mIHRoZSBEU1AgYW5kIHBvbGljeQorLy8gb2YgdGhlIHN5c3RlbS4KK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIG9mZmxvYWRJbmZvKQoreworICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQ6IFNSPSV1LCBDTT0weCV4LCBGb3JtYXQ9MHgleCwgU3RyZWFtVHlwZT0lZCwiCisgICAgICIgQml0UmF0ZT0ldSwgZHVyYXRpb249JSIgUFJJZDY0ICIgdXMsIGhhc192aWRlbz0lZCIsCisgICAgIG9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlLCBvZmZsb2FkSW5mby5jaGFubmVsX21hc2ssCisgICAgIG9mZmxvYWRJbmZvLmZvcm1hdCwKKyAgICAgb2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUsIG9mZmxvYWRJbmZvLmJpdF9yYXRlLCBvZmZsb2FkSW5mby5kdXJhdGlvbl91cywKKyAgICAgb2ZmbG9hZEluZm8uaGFzX3ZpZGVvKTsKKworICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaGFzIGJlZW4gZGlzYWJsZWQKKyAgICBjaGFyIHByb3BWYWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoImF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIsIHByb3BWYWx1ZSwgIjAiKSkgeworICAgICAgICBpZiAoYXRvaShwcm9wVmFsdWUpICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJvZmZsb2FkIGRpc2FibGVkIGJ5IGF1ZGlvLm9mZmxvYWQuZGlzYWJsZT0lcyIsIHByb3BWYWx1ZSApOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHR5cGUgaXMgbXVzaWMsIHRoZW4gb25seSBhbGxvdyBvZmZsb2FkIGFzIG9mIG5vdy4KKyAgICBpZiAob2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUgIT0gQVVESU9fU1RSRUFNX01VU0lDKQorICAgIHsKKyAgICAgICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZDogc3RyZWFtX3R5cGUgIT0gTVVTSUMsIHJldHVybmluZyBmYWxzZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy9UT0RPOiBlbmFibGUgYXVkaW8gb2ZmbG9hZGluZyB3aXRoIHZpZGVvIHdoZW4gcmVhZHkKKyAgICBjb25zdCBib29sIGFsbG93T2ZmbG9hZFdpdGhWaWRlbyA9CisgICAgICAgICAgICBwcm9wZXJ0eV9nZXRfYm9vbCgiYXVkaW8ub2ZmbG9hZC52aWRlbyIsIGZhbHNlIC8qIGRlZmF1bHRfdmFsdWUgKi8pOworICAgIGlmIChvZmZsb2FkSW5mby5oYXNfdmlkZW8gJiYgIWFsbG93T2ZmbG9hZFdpdGhWaWRlbykgeworICAgICAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkOiBoYXNfdmlkZW8gPT0gdHJ1ZSwgcmV0dXJuaW5nIGZhbHNlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvL0lmIGR1cmF0aW9uIGlzIGxlc3MgdGhhbiBtaW5pbXVtIHZhbHVlIGRlZmluZWQgaW4gcHJvcGVydHksIHJldHVybiBmYWxzZQorICAgIGlmIChwcm9wZXJ0eV9nZXQoImF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MiLCBwcm9wVmFsdWUsIE5VTEwpKSB7CisgICAgICAgIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IChhdG9pKHByb3BWYWx1ZSkgKiAxMDAwMDAwICkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MoPSVzKSIsIHByb3BWYWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTICogMTAwMDAwMCkgeworICAgICAgICBBTE9HVigiT2ZmbG9hZCBkZW5pZWQgYnkgZHVyYXRpb24gPCBkZWZhdWx0IG1pbig9JXUpIiwgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIERvIG5vdCBhbGxvdyBvZmZsb2FkaW5nIGlmIG9uZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0IGlzIGVuYWJsZWQuIFRoaXMgcHJldmVudHMgZnJvbQorICAgIC8vIGNyZWF0aW5nIGFuIG9mZmxvYWRlZCB0cmFjayBhbmQgdGVhcmluZyBpdCBkb3duIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0IHdoZW4gYXVkaW9mbGluZ2VyCisgICAgLy8gZGV0ZWN0cyB0aGVyZSBpcyBhbiBhY3RpdmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdC4KKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGNoZWNrIHRoZSBhdWRpbyBzZXNzaW9uIGhlcmUgYnV0IHdlIGRvIG5vdCBoYXZlIGl0IGluIHRoaXMgY29udGV4dC4KKyAgICAvLyBUaGlzIG1heSBwcmV2ZW50IG9mZmxvYWRpbmcgaW4gcmFyZSBzaXR1YXRpb25zIHdoZXJlIGVmZmVjdHMgYXJlIGxlZnQgYWN0aXZlIGJ5IGFwcHMKKyAgICAvLyBpbiB0aGUgYmFja2dyb3VuZC4KKyAgICBpZiAobUVmZmVjdHMuaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgcHJvZmlsZSB0byBzdXBwb3J0IHRoaXMuCisgICAgLy8gQVVESU9fREVWSUNFX05PTkUKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KEFVRElPX0RFVklDRV9OT05FIC8qaWdub3JlIGRldmljZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKTsKKyAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkKCkgcHJvZmlsZSAlc2ZvdW5kIiwgcHJvZmlsZSAhPSAwID8gIiIgOiAiTk9UICIpOworICAgIHJldHVybiAocHJvZmlsZSAhPSAwKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCit7CisgICAgaWYgKG51bV9wb3J0cyA9PSBOVUxMIHx8ICgqbnVtX3BvcnRzICE9IDAgJiYgcG9ydHMgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgIGdlbmVyYXRpb24gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigibGlzdEF1ZGlvUG9ydHMoKSByb2xlICVkIHR5cGUgJWQgbnVtX3BvcnRzICVkIHBvcnRzICVwIiwgcm9sZSwgdHlwZSwgKm51bV9wb3J0cywgcG9ydHMpOworICAgIGlmIChwb3J0cyA9PSBOVUxMKSB7CisgICAgICAgICpudW1fcG9ydHMgPSAwOworICAgIH0KKworICAgIHNpemVfdCBwb3J0c1dyaXR0ZW4gPSAwOworICAgIHNpemVfdCBwb3J0c01heCA9ICpudW1fcG9ydHM7CisgICAgKm51bV9wb3J0cyA9IDA7CisgICAgaWYgKHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX05PTkUgfHwgdHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LIHx8IHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX05PTkUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgICAgICAgICBpICA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKSAmJiBwb3J0c1dyaXR0ZW4gPCBwb3J0c01heDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPnRvQXVkaW9Qb3J0KCZwb3J0c1twb3J0c1dyaXR0ZW4rK10pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKm51bV9wb3J0cyArPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaSAgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKSAmJiBwb3J0c1dyaXR0ZW4gPCBwb3J0c01heDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqbnVtX3BvcnRzICs9IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorICAgIGlmICh0eXBlID09IEFVRElPX1BPUlRfVFlQRV9OT05FIHx8IHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpICYmIHBvcnRzV3JpdHRlbiA8IHBvcnRzTWF4OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpudW1fcG9ydHMgKz0gbUlucHV0cy5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7CisgICAgICAgICAgICBzaXplX3QgbnVtT3V0cHV0cyA9IDA7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtT3V0cHV0c1tpXS0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtT3V0cHV0cysrOworICAgICAgICAgICAgICAgICAgICBpZiAocG9ydHNXcml0dGVuIDwgcG9ydHNNYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpudW1fcG9ydHMgKz0gbnVtT3V0cHV0czsKKyAgICAgICAgfQorICAgIH0KKyAgICAqZ2VuZXJhdGlvbiA9IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICBBTE9HVigibGlzdEF1ZGlvUG9ydHMoKSBnb3QgJXp1IHBvcnRzIG5lZWRlZCAlZCIsIHBvcnRzV3JpdHRlbiwgKm51bV9wb3J0cyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCBfX3VudXNlZCkKK3sKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCit7CisgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSIpOworCisgICAgaWYgKGhhbmRsZSA9PSBOVUxMIHx8IHBhdGNoID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBudW0gc291cmNlcyAlZCBudW0gc2lua3MgJWQiLCBwYXRjaC0+bnVtX3NvdXJjZXMsIHBhdGNoLT5udW1fc2lua3MpOworCisgICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA9PSAwIHx8IHBhdGNoLT5udW1fc291cmNlcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCB8fAorICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcyA9PSAwIHx8IHBhdGNoLT5udW1fc2lua3MgPiBBVURJT19QQVRDSF9QT1JUU19NQVgpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgLy8gb25seSBvbmUgc291cmNlIHBlciBhdWRpbyBwYXRjaCBzdXBwb3J0ZWQgZm9yIG5vdworICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPiAxKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0ucm9sZSAhPSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS5yb2xlICE9IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2M7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqaGFuZGxlKTsKKworICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoIHNvdXJjZSBpZCAlZCByb2xlICVkIHR5cGUgJWQiLCBwYXRjaC0+c291cmNlc1swXS5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0ucm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0udHlwZSk7CisjaWYgTE9HX05ERUJVRyA9PSAwCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2ggc2luayAlZDogaWQgJWQgcm9sZSAlZCB0eXBlICVkIiwgaSwgcGF0Y2gtPnNpbmtzW2ldLmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS5yb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS50eXBlKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgbVVpZENhY2hlZCAlZCBwYXRjaERlc2MtPm1VaWQgJWQgdWlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VaWRDYWNoZWQsIHBhdGNoRGVzYy0+bVVpZCwgdWlkKTsKKyAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkICYmIHVpZCAhPSBwYXRjaERlc2MtPm1VaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICpoYW5kbGUgPSAwOworICAgIH0KKworICAgIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy5nZXRPdXRwdXRGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG91dHB1dCBub3QgZm91bmQgZm9yIGlkICVkIiwgcGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksImR1cGxpY2F0ZWQgb3V0cHV0ICVkIGluIHNvdXJjZSBpbiBwb3J0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDApIHsKKyAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPm1QYXRjaC5zb3VyY2VzWzBdLmlkICE9IHBhdGNoLT5zb3VyY2VzWzBdLmlkKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzb3VyY2UgaWQgZGlmZmVycyBmb3IgcGF0Y2ggY3VycmVudCBpZCAlZCBuZXcgaWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2guc291cmNlc1swXS5pZCwgcGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnQgbWl4IHRvIGRldmljZXMgY29ubmVjdGlvbgorICAgICAgICAgICAgLy8gVE9ETyBhZGQgc3VwcG9ydCBmb3IgbWl4IHRvIG1peCBjb25uZWN0aW9uCisgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc291cmNlIG1peCBidXQgc2luayBpcyBub3QgYSBkZXZpY2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zaW5rc1tpXS5pZCk7CisgICAgICAgICAgICBpZiAoZGV2RGVzYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBvdXQgZGV2aWNlIG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c2lua3NbaV0uaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghb3V0cHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2RGVzYy0+dHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyB1cGRhdGVkU2FtcGxpbmdSYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgIC8vIHVwZGF0ZWRGb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgLy8gdXBkYXRlZENoYW5uZWxNYXNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUgLypGSVhNRSovKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgcHJvZmlsZSBub3Qgc3VwcG9ydGVkIGZvciBkZXZpY2UgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT50eXBlKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZXMuYWRkKGRldkRlc2MpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2VzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiByZWNvbmZpZ3VyZSBvdXRwdXQgZm9ybWF0IGFuZCBjaGFubmVscyBoZXJlCisgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0dGluZyBkZXZpY2UgJTA4eCBvbiBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICBkZXZpY2VzLnR5cGVzKCksIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBkZXZpY2VzLnR5cGVzKCksIHRydWUsIDAsIGhhbmRsZSk7CisgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwICYmIHBhdGNoRGVzYyAhPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRPdXRwdXREZXZpY2UoKSBkaWQgbm90IHJldXNlIHRoZSBwYXRjaCBwcm92aWRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgIHBhdGNoRGVzYy0+bVVpZCA9IHVpZDsKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc3VjY2VzcyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRPdXRwdXREZXZpY2UoKSBmYWlsZWQgdG8gY3JlYXRlIGEgcGF0Y2giKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgICAgICAvLyBpbnB1dCBkZXZpY2UgdG8gaW5wdXQgbWl4IGNvbm5lY3Rpb24KKyAgICAgICAgICAgIC8vIG9ubHkgb25lIHNpbmsgc3VwcG9ydGVkIHdoZW4gY29ubmVjdGluZyBhbiBpbnB1dCBkZXZpY2UgdG8gYSBtaXgKKyAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NpbmtzID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLmdldElucHV0RnJvbUlkKHBhdGNoLT5zaW5rc1swXS5pZCk7CisgICAgICAgICAgICBpZiAoaW5wdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVBhdGNoLnNpbmtzWzBdLmlkICE9IHBhdGNoLT5zaW5rc1swXS5pZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQorICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgICAgICBpZiAoZGV2RGVzYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFpbnB1dERlc2MtPm1Qcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldkRlc2MtPnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgLyp1cGRhdGVkU2FtcGxlUmF0ZSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAvKnVwZGF0ZWRGb3JtYXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgLyp1cGRhdGVkQ2hhbm5lbE1hc2sqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGZvciB0aGUgcGFyYW1ldGVyIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBOT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IHJlY29uZmlndXJlIG91dHB1dCBmb3JtYXQgYW5kIGNoYW5uZWxzIGhlcmUKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0dGluZyBkZXZpY2UgJTA4eCBvbiBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT50eXBlKCksIGlucHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0RGVzYy0+bUlvSGFuZGxlLCBkZXZEZXNjLT50eXBlKCksIHRydWUsIGhhbmRsZSk7CisgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwICYmIHBhdGNoRGVzYyAhPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0SW5wdXREZXZpY2UoKSBkaWQgbm90IHJldXNlIHRoZSBwYXRjaCBwcm92aWRlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVVpZCA9IHVpZDsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHN1Y2Nlc3MiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRJbnB1dERldmljZSgpIGZhaWxlZCB0byBjcmVhdGUgYSBwYXRjaCIpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICAvLyBkZXZpY2UgdG8gZGV2aWNlIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPm1QYXRjaC5zb3VyY2VzWzBdLmlkICE9IHBhdGNoLT5zb3VyY2VzWzBdLmlkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlRGVzYyA9CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgIGlmIChzcmNEZXZpY2VEZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3VwZGF0ZSBzb3VyY2UgYW5kIHNpbmsgd2l0aCBvdXIgb3duIGRhdGEgYXMgdGhlIGRhdGEgcGFzc2VkIGluIHRoZSBwYXRjaCBtYXkKKyAgICAgICAgICAgIC8vIGJlIGluY29tcGxldGUuCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbmV3UGF0Y2ggPSAqcGF0Y2g7CisgICAgICAgICAgICBzcmNEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc291cmNlc1swXSwgJnBhdGNoLT5zb3VyY2VzWzBdKTsKKworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNvdXJjZSBkZXZpY2UgYnV0IG9uZSBzaW5rIGlzIG5vdCBhIGRldmljZSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZURlc2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zaW5rc1tpXS5pZCk7CisgICAgICAgICAgICAgICAgaWYgKHNpbmtEZXZpY2VEZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2lua0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdQYXRjaC5zaW5rc1tpXSwgJnBhdGNoLT5zaW5rc1tpXSk7CisKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBzb2Z0d2FyZSBicmlkZ2UgaW4gUGF0Y2hQYW5lbCBpZjoKKyAgICAgICAgICAgICAgICAvLyAtIHNvdXJjZSBhbmQgc2luayBkZXZpY2VzIGFyZSBvbiBkaWZmZXJudCBIVyBtb2R1bGVzIE9SCisgICAgICAgICAgICAgICAgLy8gLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA8IDMuMAorICAgICAgICAgICAgICAgIGlmICgoc3JjRGV2aWNlRGVzYy0+Z2V0TW9kdWxlSGFuZGxlKCkgIT0gc2lua0RldmljZURlc2MtPmdldE1vZHVsZUhhbmRsZSgpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHNyY0RldmljZURlc2MtPm1Nb2R1bGUtPm1IYWxWZXJzaW9uIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBvbmx5IG9uZSBzaW5rIGRldmljZSBmb3Igbm93IHRvIHNpbXBsaWZ5IG91dHB1dCBzZWxlY3Rpb24gbG9naWMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5udW1fc2lua3MgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZShzaW5rRGV2aWNlRGVzYy0+dHlwZSgpLCBtT3V0cHV0cyk7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzaW5rIGRldmljZSBpcyByZWFjaGFibGUgdmlhIGFuIG9wZW5lZCBvdXRwdXQgc3RyZWFtLCByZXF1ZXN0IHRvIGdvIHZpYQorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG91dHB1dCBzdHJlYW0gYnkgYWRkaW5nIGEgc2Vjb25kIHNvdXJjZSB0byB0aGUgcGF0Y2ggZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNvdXJjZXNbMV0sICZwYXRjaC0+c291cmNlc1swXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fUEFUQ0g7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5udW1fc291cmNlcyA9IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBmcm9tIHJvdXRpbmcgY2FwYWJpbGl0aWVzIGluIGNvbmZpZyBmaWxlIGFuZCBvdGhlciBjb25mbGljdGluZyBwYXRjaGVzCisKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZuZXdQYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgmbmV3UGF0Y2gsIHVpZCk7CisgICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gbmV3UGF0Y2g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgICAgICpoYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIGNvdWxkIG5vdCBjb25uZWN0IGRldmljZSBwYXRjaCwgZXJyb3IgJWQiLAorICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKK3sKKyAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBwYXRjaCAlZCIsIGhhbmRsZSk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGhhbmRsZSk7CisKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgbVVpZENhY2hlZCAlZCBwYXRjaERlc2MtPm1VaWQgJWQgdWlkICVkIiwKKyAgICAgICAgICBtVWlkQ2FjaGVkLCBwYXRjaERlc2MtPm1VaWQsIHVpZCk7CisgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkICYmIHVpZCAhPSBwYXRjaERlc2MtPm1VaWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2ggPSAmcGF0Y2hEZXNjLT5tUGF0Y2g7CisgICAgcGF0Y2hEZXNjLT5tVWlkID0gbVVpZENhY2hlZDsKKyAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMuZ2V0T3V0cHV0RnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgb3V0cHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfSBlbHNlIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLmdldElucHV0RnJvbUlkKHBhdGNoLT5zaW5rc1swXS5pZCk7CisgICAgICAgICAgICBpZiAoaW5wdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBpbnB1dCBub3QgZm91bmQgZm9yIGlkICVkIiwgcGF0Y2gtPnNpbmtzWzBdLmlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXREZXNjLT5tSW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdJbnB1dERldmljZShpbnB1dERlc2MtPm1Jb0hhbmRsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgICAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBwYXRjaCBwYW5lbCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSk7CisgICAgICAgICAgICByZW1vdmVBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCit7CisgICAgaWYgKGdlbmVyYXRpb24gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAqZ2VuZXJhdGlvbiA9IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICByZXR1cm4gbUF1ZGlvUGF0Y2hlcy5saXN0QXVkaW9QYXRjaGVzKG51bV9wYXRjaGVzLCBwYXRjaGVzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgQUxPR1YoInNldEF1ZGlvUG9ydENvbmZpZygpIik7CisKKyAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoInNldEF1ZGlvUG9ydENvbmZpZygpIG9uIHBvcnQgaGFuZGxlICVkIiwgY29uZmlnLT5pZCk7CisgICAgLy8gT25seSBzdXBwb3J0IGdhaW4gY29uZmlndXJhdGlvbiBmb3Igbm93CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgIT0gQVVESU9fUE9SVF9DT05GSUdfR0FJTikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3A8QXVkaW9Qb3J0Q29uZmlnPiBhdWRpb1BvcnRDb25maWc7CisgICAgaWYgKGNvbmZpZy0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIGlmIChjb25maWctPnJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgeworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy5nZXRPdXRwdXRGcm9tSWQoY29uZmlnLT5pZCk7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXRBdWRpb1BvcnRDb25maWcoKSBjYWxsZWQgb24gZHVwbGljYXRlZCBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvUG9ydENvbmZpZyA9IG91dHB1dERlc2M7CisgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7CisgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy5nZXRJbnB1dEZyb21JZChjb25maWctPmlkKTsKKyAgICAgICAgICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb1BvcnRDb25maWcgPSBpbnB1dERlc2M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjb25maWctPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOworICAgICAgICBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHsKKyAgICAgICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChjb25maWctPmlkKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb25maWctPnJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKKyAgICAgICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoY29uZmlnLT5pZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2VEZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9Qb3J0Q29uZmlnID0gZGV2aWNlRGVzYzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBiYWNrdXBDb25maWc7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb3J0Q29uZmlnLT5hcHBseUF1ZGlvUG9ydENvbmZpZyhjb25maWcsICZiYWNrdXBDb25maWcpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIG5ld0NvbmZpZzsKKyAgICAgICAgYXVkaW9Qb3J0Q29uZmlnLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3Q29uZmlnLCBjb25maWcpOworICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZuZXdDb25maWcsIDApOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGF1ZGlvUG9ydENvbmZpZy0+YXBwbHlBdWRpb1BvcnRDb25maWcoJmJhY2t1cENvbmZpZyk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VSZXNvdXJjZXNGb3JVaWQodWlkX3QgdWlkKQoreworICAgIGNsZWFyQXVkaW9QYXRjaGVzKHVpZCk7CisgICAgY2xlYXJTZXNzaW9uUm91dGVzKHVpZCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpCit7CisgICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltQXVkaW9QYXRjaGVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgPT0gdWlkKSB7CisgICAgICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChtQXVkaW9QYXRjaGVzLmtleUF0KGkpLCB1aWQpOworICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja1N0cmF0ZWd5Um91dGUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3VwdHV0VG9Ta2lwKQoreworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1PdXRwdXRzLnNpemUoKTsgaisrKSB7CisgICAgICAgIGlmIChtT3V0cHV0cy5rZXlBdChqKSA9PSBvdXB0dXRUb1NraXApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChqKTsKKyAgICAgICAgaWYgKCFpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIChyb3V0aW5nX3N0cmF0ZWd5KXN0cmF0ZWd5KSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgdGhlIGRlZmF1bHQgZGV2aWNlIGZvciB0aGlzIHN0cmF0ZWd5IGlzIG9uIGFub3RoZXIgb3V0cHV0IG1peCwKKyAgICAgICAgLy8gaW52YWxpZGF0ZSBhbGwgdHJhY2tzIGluIHRoaXMgc3RyYXRlZ3kgdG8gZm9yY2UgcmUgY29ubmVjdGlvbi4KKyAgICAgICAgLy8gT3RoZXJ3aXNlIHNlbGVjdCBuZXcgZGV2aWNlIG9uIHRoZSBvdXRwdXQgbWl4LgorICAgICAgICBpZiAob3V0cHV0cy5pbmRleE9mKG1PdXRwdXRzLmtleUF0KGopKSA8IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pID09IHN0cmF0ZWd5KSB7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBuZXdEZXZpY2UsIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsZWFyU2Vzc2lvblJvdXRlcyh1aWRfdCB1aWQpCit7CisgICAgLy8gcmVtb3ZlIG91dHB1dCByb3V0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdWlkCisgICAgU29ydGVkVmVjdG9yPHJvdXRpbmdfc3RyYXRlZ3k+IGFmZmVjdGVkU3RyYXRlZ2llczsKKyAgICBmb3IgKHNzaXplX3QgaSA9IChzc2l6ZV90KW1PdXRwdXRSb3V0ZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pICB7CisgICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtT3V0cHV0Um91dGVzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChyb3V0ZS0+bVVpZCA9PSB1aWQpIHsKKyAgICAgICAgICAgIG1PdXRwdXRSb3V0ZXMucmVtb3ZlSXRlbXNBdChpKTsKKyAgICAgICAgICAgIGlmIChyb3V0ZS0+bURldmljZURlc2NyaXB0b3IgIT0gMCkgeworICAgICAgICAgICAgICAgIGFmZmVjdGVkU3RyYXRlZ2llcy5hZGQoZ2V0U3RyYXRlZ3kocm91dGUtPm1TdHJlYW1UeXBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gcmVyb3V0ZSBvdXRwdXRzIGlmIG5lY2Vzc2FyeQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWZmZWN0ZWRTdHJhdGVnaWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNoZWNrU3RyYXRlZ3lSb3V0ZShhZmZlY3RlZFN0cmF0ZWdpZXNbaV0sIEFVRElPX0lPX0hBTkRMRV9OT05FKTsKKyAgICB9CisKKyAgICAvLyByZW1vdmUgaW5wdXQgcm91dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVpZAorICAgIFNvcnRlZFZlY3RvcjxhdWRpb19zb3VyY2VfdD4gYWZmZWN0ZWRTb3VyY2VzOworICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbUlucHV0Um91dGVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgeworICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gbUlucHV0Um91dGVzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChyb3V0ZS0+bVVpZCA9PSB1aWQpIHsKKyAgICAgICAgICAgIG1JbnB1dFJvdXRlcy5yZW1vdmVJdGVtc0F0KGkpOworICAgICAgICAgICAgaWYgKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7CisgICAgICAgICAgICAgICAgYWZmZWN0ZWRTb3VyY2VzLmFkZChyb3V0ZS0+bVNvdXJjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gcmVyb3V0ZSBpbnB1dHMgaWYgbmVjZXNzYXJ5CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBpbnB1dHNUb0Nsb3NlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoYWZmZWN0ZWRTb3VyY2VzLmluZGV4T2YoaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UpID49IDApIHsKKyAgICAgICAgICAgIGlucHV0c1RvQ2xvc2UuYWRkKGlucHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0c1RvQ2xvc2Uuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY2xvc2VJbnB1dChpbnB1dHNUb0Nsb3NlW2ldKTsKKyAgICB9Cit9CisKKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSkKK3sKKyAgICAqc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpbXBDbGllbnRJbnRlcmZhY2UtPm5ld0F1ZGlvVW5pcXVlSWQoKTsKKyAgICAqaW9IYW5kbGUgPSAoYXVkaW9faW9faGFuZGxlX3QpbXBDbGllbnRJbnRlcmZhY2UtPm5ld0F1ZGlvVW5pcXVlSWQoKTsKKyAgICAqZGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX0hPVFdPUkQpOworCisgICAgcmV0dXJuIG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5hY3F1aXJlU2Vzc2lvbigqc2Vzc2lvbiwgKmlvSGFuZGxlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmhhbmRsZSBfX3VudXNlZCkKK3sKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSBfX3VudXNlZCkKK3sKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF1ZGlvUG9saWN5TWFuYWdlcgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpCit7CisgICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2luYygmbUF1ZGlvUG9ydEdlbmVyYXRpb24pOworfQorCitBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQorICAgIDoKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgIFRocmVhZChmYWxzZSksCisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKGZhbHNlKSwgbUxhc3RWb2ljZVZvbHVtZSgtMS4wZiksCisgICAgbUEyZHBTdXNwZW5kZWQoZmFsc2UpLAorICAgIG1TcGVha2VyRHJjRW5hYmxlZChmYWxzZSksCisgICAgbUF1ZGlvUG9ydEdlbmVyYXRpb24oMSksCisgICAgbUJlYWNvbk11dGVSZWZDb3VudCgwKSwKKyAgICBtQmVhY29uUGxheWluZ1JlZkNvdW50KDApLAorICAgIG1CZWFjb25NdXRlZChmYWxzZSkKK3sKKyAgICBhdWRpb19wb2xpY3k6OkVuZ2luZUluc3RhbmNlICplbmdpbmVJbnN0YW5jZSA9IGF1ZGlvX3BvbGljeTo6RW5naW5lSW5zdGFuY2U6OmdldEluc3RhbmNlKCk7CisgICAgaWYgKCFlbmdpbmVJbnN0YW5jZSkgeworICAgICAgICBBTE9HRSgiJXM6ICBDb3VsZCBub3QgZ2V0IGFuIGluc3RhbmNlIG9mIHBvbGljeSBlbmdpbmUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFJldHJpZXZlIHRoZSBQb2xpY3kgTWFuYWdlciBJbnRlcmZhY2UKKyAgICBtRW5naW5lID0gZW5naW5lSW5zdGFuY2UtPnF1ZXJ5SW50ZXJmYWNlPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZT4oKTsKKyAgICBpZiAobUVuZ2luZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCBQb2xpY3kgRW5naW5lIEludGVyZmFjZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUVuZ2luZS0+c2V0T2JzZXJ2ZXIodGhpcyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVuZ2luZS0+aW5pdENoZWNrKCk7CisgICAgQUxPR19BU1NFUlQoc3RhdHVzID09IE5PX0VSUk9SLCAiUG9saWN5IGVuZ2luZSBub3QgaW5pdGlhbGl6ZWQoZXJyPSVkKSIsIHN0YXR1cyk7CisKKyAgICBtVWlkQ2FjaGVkID0gZ2V0dWlkKCk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UgPSBjbGllbnRJbnRlcmZhY2U7CisKKyAgICBtRGVmYXVsdE91dHB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUik7CisgICAgaWYgKENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEF1ZGlvUG9saWN5Q29uZmlnKEFVRElPX1BPTElDWV9WRU5ET1JfQ09ORklHX0ZJTEUsCisgICAgICAgICAgICAgICAgIG1Id01vZHVsZXMsIG1BdmFpbGFibGVJbnB1dERldmljZXMsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZSwgbVNwZWFrZXJEcmNFbmFibGVkKSAhPSBOT19FUlJPUikgeworICAgICAgICBpZiAoQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQXVkaW9Qb2xpY3lDb25maWcoQVVESU9fUE9MSUNZX0NPTkZJR19GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Id01vZHVsZXMsIG1BdmFpbGFibGVJbnB1dERldmljZXMsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLCBtU3BlYWtlckRyY0VuYWJsZWQpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IGxvYWQgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSwgc2V0dGluZyBkZWZhdWx0cyIpOworICAgICAgICAgICAgZGVmYXVsdEF1ZGlvUG9saWN5Q29uZmlnKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gbUF2YWlsYWJsZU91dHB1dERldmljZXMgYW5kIG1BdmFpbGFibGVJbnB1dERldmljZXMgbm93IGNvbnRhaW4gYWxsIGF0dGFjaGVkIGRldmljZXMKKworICAgIC8vIG11c3QgYmUgZG9uZSBhZnRlciByZWFkaW5nIHRoZSBwb2xpY3kgKHNpbmNlIGNvbmRpdGlvbm5lZCBieSBTcGVha2VyIERyYyBFbmFibGluZykKKyAgICBtRW5naW5lLT5pbml0aWFsaXplVm9sdW1lQ3VydmVzKG1TcGVha2VyRHJjRW5hYmxlZCk7CisKKyAgICAvLyBvcGVuIGFsbCBvdXRwdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMKKyAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOworICAgIGF1ZGlvX2RldmljZXNfdCBpbnB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPSBtcENsaWVudEludGVyZmFjZS0+bG9hZEh3TW9kdWxlKG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coImNvdWxkIG5vdCBvcGVuIEhXIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcworICAgICAgICAvLyBleGNlcHQgZm9yIGRpcmVjdCBvdXRwdXQgc3RyZWFtcyB0aGF0IGFyZSBvbmx5IG9wZW5lZCB3aGVuIHRoZXkgYXJlIGFjdHVhbGx5CisgICAgICAgIC8vIHJlcXVpcmVkIGJ5IGFuIGFwcC4KKyAgICAgICAgLy8gVGhpcyBhbHNvIHZhbGlkYXRlcyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBsaXN0CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IG91dFByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal07CisKKyAgICAgICAgICAgIGlmIChvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiT3V0cHV0IHByb2ZpbGUgY29udGFpbnMgbm8gZGV2aWNlIG9uIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChvdXRQcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcm9maWxlVHlwZSA9IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCk7CisgICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgbURlZmF1bHRPdXRwdXREZXZpY2UtPnR5cGUoKSkgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIG1TdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZgorICAgICAgICAgICAgICAgIC8vIG91dHB1dERldmljZVR5cGVzCisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgIDwgb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXS0+dHlwZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgb3V0cHV0RGV2aWNlVHlwZXMpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIG91dHB1dERldmljZVR5cGVzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihvdXRQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UpOworCisgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gcHJvZmlsZVR5cGU7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IG91dHB1dERlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBvdXRwdXREZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChvdXRQcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyk7CisKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OworCisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgIDwgb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXS0+dHlwZSgpOworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+aXNBdHRhY2hlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmF0dGFjaChtSHdNb2R1bGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVByaW1hcnlPdXRwdXQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJvZmlsZS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgeworICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dCA9IG91dHB1dERlc2M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIG91dHB1dERlc2MpOworICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBvcGVuIGlucHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzIHRvIHZhbGlkYXRlCisgICAgICAgIC8vIG1BdmFpbGFibGVJbnB1dERldmljZXMgbGlzdAorICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IGluUHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzW2pdOworCisgICAgICAgICAgICBpZiAoaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiSW5wdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2hvc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gbVN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCisgICAgICAgICAgICAvLyBpbnB1dERldmljZVR5cGVzCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJvZmlsZVR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSA9IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10tPnR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZVR5cGUgJiBpbnB1dERldmljZVR5cGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBpbnB1dERldmljZVR5cGVzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGluUHJvZmlsZSk7CisKKyAgICAgICAgICAgIGlucHV0RGVzYy0+bUlucHV0U291cmNlID0gQVVESU9fU09VUkNFX01JQzsKKyAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IHByb2ZpbGVUeXBlOworCisgICAgICAgICAgICAvLyBmaW5kIHRoZSBhZGRyZXNzCisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocHJvZmlsZVR5cGUpOworICAgICAgICAgICAgLy8gICB0aGUgaW5wdXRzIHZlY3RvciBtdXN0IGJlIG9mIHNpemUgMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZQorICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcworICAgICAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOworICAgICAgICAgICAgQUxPR1YoIiAgZm9yIGlucHV0IGRldmljZSAweCV4IHVzaW5nIGFkZHJlc3MgJXMiLCBwcm9maWxlVHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICBBTE9HRV9JRihpbnB1dERldmljZXMuc2l6ZSgpID09IDAsICJJbnB1dCBkZXZpY2UgbGlzdCBpcyBlbXB0eSEiKTsKKworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gaW5wdXREZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGlucHV0RGVzYy0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IGlucHV0RGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KGluUHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdLT50eXBlKCk7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGV2RGVzYy0+aXNBdHRhY2hlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+YXR0YWNoKG1Id01vZHVsZXNbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChpblByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIGlucHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIG1ha2Ugc3VyZSBhbGwgYXR0YWNoZWQgZGV2aWNlcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGEgdW5pcXVlIElECisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOykgeworICAgICAgICBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT5pc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBkZXZpY2UgJTA4eCB1bnJlYWNoYWJsZSIsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT50eXBlKCkpOworICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBkZXZpY2UgaXMgbm93IHZhbGlkYXRlZCBhbmQgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBvZiB0aGUgZW5naW5lCisgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTspIHsKKyAgICAgICAgaWYgKCFtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5pc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBkZXZpY2UgJTA4eCB1bnJlYWNoYWJsZSIsIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnR5cGUoKSk7CisgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnJlbW92ZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBkZXZpY2UgaXMgbm93IHZhbGlkYXRlZCBhbmQgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBvZiB0aGUgZW5naW5lCisgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpOworICAgICAgICBpKys7CisgICAgfQorICAgIC8vIG1ha2Ugc3VyZSBkZWZhdWx0IGRldmljZSBpcyByZWFjaGFibGUKKyAgICBpZiAobUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihtRGVmYXVsdE91dHB1dERldmljZSkgPCAwKSB7CisgICAgICAgIEFMT0dFKCJEZWZhdWx0IGRldmljZSAlMDh4IGlzIHVucmVhY2hhYmxlIiwgbURlZmF1bHRPdXRwdXREZXZpY2UtPnR5cGUoKSk7CisgICAgfQorCisgICAgQUxPR0VfSUYoKG1QcmltYXJ5T3V0cHV0ID09IDApLCAiRmFpbGVkIHRvIG9wZW4gcHJpbWFyeSBvdXRwdXQiKTsKKworICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgIGlmIChtUHJpbWFyeU91dHB1dCAhPSAwKSB7CisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksIDApOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlLCBvdXRwdXRDbWQudG9TdHJpbmcoKSk7CisKKyAgICAgICAgbVRlc3REZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlID0gNDQxMDA7CisgICAgICAgIG1UZXN0Rm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIG1UZXN0Q2hhbm5lbHMgPSAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgICAgICBtVGVzdExhdGVuY3lNcyA9IDA7CisgICAgICAgIG1DdXJPdXRwdXQgPSAwOworICAgICAgICBtRGlyZWN0T3V0cHV0ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RFU1RfT1VUUFVUUzsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdE91dHB1dHNbaV0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb1BvbGljeU1hbmFnZXJUZXN0Iik7CisgICAgICAgIHJ1bihidWZmZXIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgIH0KKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6fkF1ZGlvUG9saWN5TWFuYWdlcigpCit7CisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICBleGl0KCk7CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQobU91dHB1dHMua2V5QXQoaSkpOworICAgfQorICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KG1JbnB1dHMua2V5QXQoaSkpOworICAgfQorICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuY2xlYXIoKTsKKyAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuY2xlYXIoKTsKKyAgIG1PdXRwdXRzLmNsZWFyKCk7CisgICBtSW5wdXRzLmNsZWFyKCk7CisgICBtSHdNb2R1bGVzLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdENoZWNrKCkKK3sKKyAgICByZXR1cm4gaGFzUHJpbWFyeU91dHB1dCgpID8gTk9fRVJST1IgOiBOT19JTklUOworfQorCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp0aHJlYWRMb29wKCkKK3sKKyAgICBBTE9HVigiZW50ZXJpbmcgdGhyZWFkTG9vcCgpIik7CisgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQorICAgIHsKKyAgICAgICAgU3RyaW5nOCBjb21tYW5kOworICAgICAgICBpbnQgdmFsdWVJbnQ7CisgICAgICAgIFN0cmluZzggdmFsdWU7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdFJlbGF0aXZlKG1Mb2NrLCBtaWxsaXNlY29uZHMoNTApKTsKKworICAgICAgICBjb21tYW5kID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoMCwgU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5IikpOworICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGNvbW1hbmQpOworCisgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUiAmJgorICAgICAgICAgICAgdmFsdWVJbnQgIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoIlRlc3QgY29tbWFuZCAlcyByZWNlaXZlZCIsIGNvbW1hbmQuc3RyaW5nKCkpOworICAgICAgICAgICAgU3RyaW5nOCB0YXJnZXQ7CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRhcmdldCIpLCB0YXJnZXQpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gIk1hbmFnZXIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfb3V0cHV0IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfb3V0cHV0IikpOworICAgICAgICAgICAgICAgIG1DdXJPdXRwdXQgPSB2YWx1ZUludDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2RpcmVjdCIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2RpcmVjdCIpKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gImZhbHNlIikgeworICAgICAgICAgICAgICAgICAgICBtRGlyZWN0T3V0cHV0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAidHJ1ZSIpIHsKKyAgICAgICAgICAgICAgICAgICAgbURpcmVjdE91dHB1dCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfaW5wdXQiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9pbnB1dCIpKTsKKyAgICAgICAgICAgICAgICBtVGVzdElucHV0ID0gdmFsdWVJbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2Zvcm1hdCIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2Zvcm1hdCIpKTsKKyAgICAgICAgICAgICAgICBpbnQgZm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJQQ00gMTYgYml0cyIpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiUENNIDggYml0cyIpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV84X0JJVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJDb21wcmVzc2VkIE1QMyIpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX01QMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KCJmb3JtYXQiKSwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0UGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9jaGFubmVscyIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2NoYW5uZWxzIikpOworICAgICAgICAgICAgICAgIGludCBjaGFubmVscyA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gIkNoYW5uZWxzIFN0ZXJlbyIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIkNoYW5uZWxzIE1vbm8iKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gIEFVRElPX0NIQU5ORUxfT1VUX01PTk87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjaGFubmVscyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gIk1hbmFnZXIiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVGVzdENoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KCJjaGFubmVscyIpLCBjaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dFBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfc2FtcGxlUmF0ZSIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3NhbXBsZVJhdGUiKSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlSW50ID49IDAgJiYgdmFsdWVJbnQgPD0gOTYwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsaW5nUmF0ZSA9IHZhbHVlSW50OworICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KCJzYW1wbGluZ19yYXRlIiksIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dFBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9yZW9wZW4iKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9yZW9wZW4iKSk7CisKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQobXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG1QcmltYXJ5T3V0cHV0KTspOworCisgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSA9IG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKTsKKworICAgICAgICAgICAgICAgIHJlbW92ZU91dHB1dChtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3IoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZSk7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBvdXRwdXREZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChtb2R1bGVIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZW9wZW4gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsaW5nUmF0ZTogJWQsIGZvcm1hdCAlZCwgY2hhbm5lbHMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwgb3V0cHV0RGVzYy0+bUZvcm1hdCwgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQgPSBvdXRwdXREZXNjOworICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRDbWQuYWRkSW50KFN0cmluZzgoInNldF9pZCIpLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaGFuZGxlLCBvdXRwdXRDbWQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dChoYW5kbGUsIG91dHB1dERlc2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycygwLCBTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3k9IikpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmV4aXQoKQoreworICAgIHsKKyAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICAgICAgcmVxdWVzdEV4aXQoKTsKKyAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CisgICAgfQorICAgIHJlcXVlc3RFeGl0QW5kV2FpdCgpOworfQorCitpbnQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp0ZXN0T3V0cHV0SW5kZXgoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RFU1RfT1VUUFVUUzsgaSsrKSB7CisgICAgICAgIGlmIChvdXRwdXQgPT0gbVRlc3RPdXRwdXRzW2ldKSByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorCisvLyAtLS0KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmFkZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjKQoreworICAgIG91dHB1dERlc2MtPnNldElvSGFuZGxlKG91dHB1dCk7CisgICAgbU91dHB1dHMuYWRkKG91dHB1dCwgb3V0cHV0RGVzYyk7CisgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbW92ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgbU91dHB1dHMucmVtb3ZlSXRlbShvdXRwdXQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MpCit7CisgICAgaW5wdXREZXNjLT5zZXRJb0hhbmRsZShpbnB1dCk7CisgICAgbUlucHV0cy5hZGQoaW5wdXQsIGlucHV0RGVzYyk7CisgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbmRJb0hhbmRsZXNCeUFkZHJlc3Moc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgLyppbiovLAorICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlIC8qaW4qLywKKyAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzIC8qaW4qLywKKyAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyAvKm91dCovKSB7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9CisgICAgICAgIGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlLCBhZGRyZXNzKTsKKyAgICBpZiAoZGV2RGVzYyAhPSAwKSB7CisgICAgICAgIEFMT0dWKCJmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKCk6IGFkZGluZyBvcGVuZWQgb3V0cHV0ICVkIG9uIHNhbWUgYWRkcmVzcyAlcyIsCisgICAgICAgICAgICAgIGRlc2MtPm1Jb0hhbmRsZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgIG91dHB1dHMuYWRkKGRlc2MtPm1Jb0hhbmRsZSk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcykKK3sKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZGV2RGVzYy0+dHlwZSgpOworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjOworCisgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKKyAgICAgICAgLy8gZXJhc2UgYWxsIGN1cnJlbnQgc2FtcGxlIHJhdGVzLCBmb3JtYXRzIGFuZCBjaGFubmVsIG1hc2tzCisgICAgICAgIGRldkRlc2MtPmNsZWFyQ2FwYWJpbGl0aWVzKCk7CisgICAgfQorCisgICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSB7CisgICAgICAgIC8vIGZpcnN0IGxpc3QgYWxyZWFkeSBvcGVuIG91dHB1dHMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiAoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgZGV2aWNlKSkgeworICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQiLCBtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiICBjaGVja2luZyBhZGRyZXNzIG1hdGNoIGR1ZSB0byBkZXZpY2UgMHgleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoZGVzYywgZGV2aWNlLCBhZGRyZXNzLCBvdXRwdXRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gdGhlbiBsb29rIGZvciBvdXRwdXQgcHJvZmlsZXMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCisgICAgICAgIFNvcnRlZFZlY3Rvcjwgc3A8SU9Qcm9maWxlPiA+IHByb2ZpbGVzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPT0gcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNbMF0tPm1BZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlenUiLCBqLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCIgIGZvdW5kICVkIHByb2ZpbGVzLCAlZCBvdXRwdXRzIiwgcHJvZmlsZXMuc2l6ZSgpLCBvdXRwdXRzLnNpemUoKSk7CisKKyAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSAmJiBvdXRwdXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgLy8gb3BlbiBvdXRwdXRzIGZvciBtYXRjaGluZyBwcm9maWxlcyBpZiBuZWVkZWQuIERpcmVjdCBvdXRwdXRzIGFyZSBhbHNvIG9wZW5lZCB0bworICAgICAgICAvLyBxdWVyeSBmb3IgZHluYW1pYyBwYXJhbWV0ZXJzIGFuZCB3aWxsIGJlIGNsb3NlZCBsYXRlciBieSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKQorICAgICAgICBmb3IgKHNzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7IHByb2ZpbGVfaW5kZXggPCAoc3NpemVfdClwcm9maWxlcy5zaXplKCk7IHByb2ZpbGVfaW5kZXgrKykgeworICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gcHJvZmlsZXNbcHJvZmlsZV9pbmRleF07CisKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaWYgb25lIG91dHB1dCBpcyBhbHJlYWR5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlCisgICAgICAgICAgICBzaXplX3QgajsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRwdXRzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHMuaXRlbUF0KGopKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgcHJvZmlsZTogc2F2ZSB0aGUgc2FtcGxlIHJhdGVzLCBmb3JtYXQgYW5kIGNoYW5uZWwgbWFza3Mgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBwcm9maWxlIGluIG91ciBkZXZpY2UgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqICE9IG91dHB1dHMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggd2l0aCBwYXJhbXMgJXMgcHJvZmlsZSAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCksIHByb2ZpbGUuZ2V0KCkpOworICAgICAgICAgICAgZGVzYyA9IG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7CisgICAgICAgICAgICBkZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uc2FtcGxlX3JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5jaGFubmVsX21hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmZvcm1hdCA9IGRlc2MtPm1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KHByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRmxhZ3MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICBkZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKworICAgICAgICAgICAgICAgIC8vIEhlcmUgaXMgd2hlcmUgdGhlIG91dF9zZXRfcGFyYW1ldGVycygpIGZvciBjYXJkICYgZGV2aWNlIGdldHMgY2FsbGVkCisgICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2UsIGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhvdXRwdXQsIFN0cmluZzgocGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShwYXJhbSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSGVyZSBpcyB3aGVyZSB3ZSBzdGVwIHRocm91Z2ggYW5kIHJlc29sdmUgYW55ICJkeW5hbWljIiBmaWVsZHMKKyAgICAgICAgICAgICAgICBTdHJpbmc4IHJlcGx5OworICAgICAgICAgICAgICAgIGNoYXIgKnZhbHVlOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX1NBTVBMSU5HX1JBVEVTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRTYW1wbGluZ1JhdGVzKHZhbHVlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9GT1JNQVRTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBzdXBwb3J0ZWQgZm9ybWF0cyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEZvcm1hdHModmFsdWUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0NIQU5ORUxTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBzdXBwb3J0ZWQgY2hhbm5lbCBtYXNrcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZE91dENoYW5uZWxzKHZhbHVlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCgocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDwgMikpIHx8CisgICAgICAgICAgICAgICAgICAgICAoKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPCAyKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICgocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA8IDIpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgbWlzc2luZyBwYXJhbSIpOworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwIHx8IHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHByb2ZpbGUtPnBpY2tTYW1wbGluZ1JhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHByb2ZpbGUtPnBpY2tDaGFubmVsTWFzaygpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gcHJvZmlsZS0+cGlja0Zvcm1hdCgpOworICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLnNhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQocHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1GbGFncyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgZGVzYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgJiYgYWRkcmVzcyAhPSAiMCIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLmdldEF1ZGlvUG9saWN5TWl4KGFkZHJlc3MsIHBvbGljeU1peCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY2Fubm90IGZpbmQgcG9saWN5IGZvciBhZGRyZXNzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeU1peC0+c2V0T3V0cHV0KGRlc2MpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peC0+Z2V0TWl4KCk7CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZHVwbGljYXRlZCBvdXRwdXQgZm9yIGRpcmVjdCBvdXRwdXRzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0cyB1c2VkIGJ5IGR5bmFtaWMgcG9saWN5IG1peGVzCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkdXBsaWNhdGVkT3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBpbml0aWFsIHN0cmVhbSB2b2x1bWUgZm9yIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKGRlc2MsIGRldmljZSwgMCwgdHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogY29uZmlndXJlIGF1ZGlvIGVmZmVjdCBvdXRwdXQgc3RhZ2UgaGVyZQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcGVuIGEgZHVwbGljYXRpbmcgb3V0cHV0IHRocmVhZCBmb3IgdGhlIG5ldyBvdXRwdXQgYW5kIHRoZSBwcmltYXJ5IG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlZE91dHB1dCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuRHVwbGljYXRlT3V0cHV0KG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHVwbGljYXRlZE91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBkdXBsaWNhdGVkIG91dHB1dCBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGR1cE91dHB1dERlc2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwsIG1wQ2xpZW50SW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9IG1QcmltYXJ5T3V0cHV0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQyID0gZGVzYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tRm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUxhdGVuY3kgPSBkZXNjLT5tTGF0ZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQoZHVwbGljYXRlZE91dHB1dCwgZHVwT3V0cHV0RGVzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKGR1cE91dHB1dERlc2MsIGRldmljZSwgMCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBkdXAgb3V0cHV0IGZvciAlZCBhbmQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSwgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gb3V0cHV0IGZvciBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJlbW92ZUF0KHByb2ZpbGVfaW5kZXgpOworICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgtLTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAvLyBMb2FkIGRpZ2l0YWwgZm9ybWF0IGluZm8gb25seSBmb3IgZGlnaXRhbCBkZXZpY2VzCisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBzZXRPdXRwdXREZXZpY2UoZGV2PTB4JXgsIGFkZHI9JXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UoZGVzYywgZGV2aWNlLCB0cnVlLypmb3JjZSovLCAwLypkZWxheSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwvKnBhdGNoIGhhbmRsZSovLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogTm8gb3V0cHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICUwNHgiLCBkZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIERpc2Nvbm5lY3QKKyAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9wZW5lZCBvdXRwdXQgaXMgbm90IG5lZWRlZCBhbnkgbW9yZSBhZnRlciBkaXNjb25uZWN0aW5nIG9uZSBkZXZpY2UKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gZXhhY3QgbWF0Y2ggb24gZGV2aWNlCisgICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSA9PSBkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoZGVzYywgZGV2aWNlLCBhZGRyZXNzLCBvdXRwdXRzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBkaXNjb25uZWN0aW5nIGFkZGluZyBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBDbGVhciBhbnkgcHJvZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXNjb25uZWN0ZWQgZGV2aWNlLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xlYXJpbmcgZGlyZWN0IG91dHB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXp1IiwgaiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrSW5wdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MpCit7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGRldkRlc2MtPnR5cGUoKTsKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZGVzYzsKKworICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UpKSB7CisgICAgICAgIC8vIGVyYXNlIGFsbCBjdXJyZW50IHNhbXBsZSByYXRlcywgZm9ybWF0cyBhbmQgY2hhbm5lbCBtYXNrcworICAgICAgICBkZXZEZXNjLT5jbGVhckNhcGFiaWxpdGllcygpOworICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgeworICAgICAgICAvLyBmaXJzdCBsaXN0IGFscmVhZHkgb3BlbiBpbnB1dHMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCisgICAgICAgIGZvciAoc2l6ZV90IGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgeworICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7CisgICAgICAgICAgICBpZiAoZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiAoZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBvcGVuZWQgaW5wdXQgJWQiLCBtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7CisgICAgICAgICAgICAgICBpbnB1dHMuYWRkKG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZW4gbG9vayBmb3IgaW5wdXQgcHJvZmlsZXMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCisgICAgICAgIFNvcnRlZFZlY3Rvcjwgc3A8SU9Qcm9maWxlPiA+IHByb2ZpbGVzOworICAgICAgICBmb3IgKHNpemVfdCBtb2R1bGVfaWR4ID0gMDsgbW9kdWxlX2lkeCA8IG1Id01vZHVsZXMuc2l6ZSgpOyBtb2R1bGVfaWR4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW21vZHVsZV9pZHhdLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOworICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4IDwgbUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUlucHV0UHJvZmlsZXNbcHJvZmlsZV9pbmRleF07CisKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIChkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID09IHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzWzBdLT5tQWRkcmVzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKHByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgbW9kdWxlX2lkeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpICYmIGlucHV0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBObyBpbnB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICAvLyBvcGVuIGlucHV0cyBmb3IgbWF0Y2hpbmcgcHJvZmlsZXMgaWYgbmVlZGVkLiBEaXJlY3QgaW5wdXRzIGFyZSBhbHNvIG9wZW5lZCB0bworICAgICAgICAvLyBxdWVyeSBmb3IgZHluYW1pYyBwYXJhbWV0ZXJzIGFuZCB3aWxsIGJlIGNsb3NlZCBsYXRlciBieSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKQorICAgICAgICBmb3IgKHNzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7IHByb2ZpbGVfaW5kZXggPCAoc3NpemVfdClwcm9maWxlcy5zaXplKCk7IHByb2ZpbGVfaW5kZXgrKykgeworCisgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBwcm9maWxlc1twcm9maWxlX2luZGV4XTsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaWYgb25lIGlucHV0IGlzIGFscmVhZHkgb3BlbmVkIGZvciB0aGlzIHByb2ZpbGUKKyAgICAgICAgICAgIHNpemVfdCBpbnB1dF9pbmRleDsKKyAgICAgICAgICAgIGZvciAoaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7CisgICAgICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5wdXRfaW5kZXggIT0gbUlucHV0cy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoIm9wZW5pbmcgaW5wdXQgZm9yIGRldmljZSAweCVYIHdpdGggcGFyYW1zICVzIiwgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgIGRlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IocHJvZmlsZSk7CisgICAgICAgICAgICBkZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KHByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUgLypGSVhNRSovKTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICBkZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKworICAgICAgICAgICAgICAgIGlmICghYWRkcmVzcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlLCBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXQsIFN0cmluZzgocGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShwYXJhbSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSGVyZSBpcyB3aGVyZSB3ZSBzdGVwIHRocm91Z2ggYW5kIHJlc29sdmUgYW55ICJkeW5hbWljIiBmaWVsZHMKKyAgICAgICAgICAgICAgICBTdHJpbmc4IHJlcGx5OworICAgICAgICAgICAgICAgIGNoYXIgKnZhbHVlOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfU0FNUExJTkdfUkFURVMpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgZGlyZWN0IGlucHV0IHN1cCBzYW1wbGluZyByYXRlcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZFNhbXBsaW5nUmF0ZXModmFsdWUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfRk9STUFUUykpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBkaXJlY3QgaW5wdXQgc3VwIGZvcm1hdHMgJXMiLCByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEZvcm1hdHModmFsdWUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfQ0hBTk5FTFMpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgZGlyZWN0IGlucHV0IHN1cCBjaGFubmVsIG1hc2tzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkSW5DaGFubmVscyh2YWx1ZSArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApICYmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgPCAyKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICgocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gMCkgJiYgKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSA8IDIpKSB8fAorICAgICAgICAgICAgICAgICAgICAgKChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApICYmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA8IDIpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBkaXJlY3QgaW5wdXQgbWlzc2luZyBwYXJhbSIpOworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGlucHV0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkSW5wdXQoaW5wdXQsIGRlc2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy8gZW5kaWYgaW5wdXQgIT0gMAorCisgICAgICAgICAgICBpZiAoaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBpbnB1dCBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJlbW92ZUF0KHByb2ZpbGVfaW5kZXgpOworICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgtLTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5wdXRzLmFkZChpbnB1dCk7CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IC8vIGVuZCBzY2FuIHByb2ZpbGVzCisKKyAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IE5vIGlucHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERpc2Nvbm5lY3QKKyAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9wZW5lZCBpbnB1dCBpcyBub3QgbmVlZGVkIGFueSBtb3JlIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgb25lIGRldmljZQorICAgICAgICBmb3IgKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKKyAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOworICAgICAgICAgICAgaWYgKCEoZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJgorICAgICAgICAgICAgICAgICAgICB+QVVESU9fREVWSUNFX0JJVF9JTikpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogZGlzY29ubmVjdGluZyBhZGRpbmcgaW5wdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICAgICAgICAgICAgICBpbnB1dHMuYWRkKG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBDbGVhciBhbnkgcHJvZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXNjb25uZWN0ZWQgZGV2aWNlLgorICAgICAgICBmb3IgKHNpemVfdCBtb2R1bGVfaW5kZXggPSAwOyBtb2R1bGVfaW5kZXggPCBtSHdNb2R1bGVzLnNpemUoKTsgbW9kdWxlX2luZGV4KyspIHsKKyAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW21vZHVsZV9pbmRleF0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXggPCBtSHdNb2R1bGVzW21vZHVsZV9pbmRleF0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCsrKSB7CisgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1ttb2R1bGVfaW5kZXhdLT5tSW5wdXRQcm9maWxlc1twcm9maWxlX2luZGV4XTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIChkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGNsZWFyaW5nIGRpcmVjdCBpbnB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgbW9kdWxlX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gLy8gZW5kIGRpc2Nvbm5lY3QKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIEFMT0dWKCJjbG9zZU91dHB1dCglZCkiLCBvdXRwdXQpOworCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImNsb3NlT3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Qb2xpY3lNaXhlcy5jbG9zZU91dHB1dChvdXRwdXREZXNjKTsKKworICAgIC8vIGxvb2sgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0cyBjb25uZWN0ZWQgdG8gdGhlIG91dHB1dCBiZWluZyByZW1vdmVkLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGR1cE91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoZHVwT3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYKKyAgICAgICAgICAgICAgICAoZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPT0gb3V0cHV0RGVzYyB8fAorICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQyID09IG91dHB1dERlc2MpKSB7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MyOworICAgICAgICAgICAgaWYgKGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID09IG91dHB1dERlc2MpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjMiA9IGR1cE91dHB1dERlc2MtPm1PdXRwdXQyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjMiA9IGR1cE91dHB1dERlc2MtPm1PdXRwdXQxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQXMgYWxsIGFjdGl2ZSB0cmFja3Mgb24gZHVwbGljYXRlZCBvdXRwdXQgd2lsbCBiZSBkZWxldGVkLAorICAgICAgICAgICAgLy8gYW5kIGFzIHRoZXkgd2VyZSBhbHNvIHJlZmVyZW5jZWQgb24gdGhlIG90aGVyIG91dHB1dCwgdGhlIHJlZmVyZW5jZQorICAgICAgICAgICAgLy8gY291bnQgZm9yIHRoZWlyIHN0cmVhbSB0eXBlIG11c3QgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkgb24KKyAgICAgICAgICAgIC8vIHRoZSBvdGhlciBvdXRwdXQuCisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEFVRElPX1NUUkVBTV9DTlQ7IGorKykgeworICAgICAgICAgICAgICAgIGludCByZWZDb3VudCA9IGR1cE91dHB1dERlc2MtPm1SZWZDb3VudFtqXTsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjMi0+Y2hhbmdlUmVmQ291bnQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaiwtcmVmQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHVwbGljYXRlZE91dHB1dCA9IG1PdXRwdXRzLmtleUF0KGkpOworICAgICAgICAgICAgQUxPR1YoImNsb3NlT3V0cHV0KCkgY2xvc2luZyBhbHNvIGR1cGxpY2F0ZWQgb3V0cHV0ICVkIiwgZHVwbGljYXRlZE91dHB1dCk7CisKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChkdXBsaWNhdGVkT3V0cHV0KTsKKyAgICAgICAgICAgIHJlbW92ZU91dHB1dChkdXBsaWNhdGVkT3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICBtQXVkaW9QYXRjaGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIH0KKworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgIHBhcmFtLmFkZChTdHJpbmc4KCJjbG9zaW5nIiksIFN0cmluZzgoInRydWUiKSk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBwYXJhbS50b1N0cmluZygpKTsKKworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgIHJlbW92ZU91dHB1dChvdXRwdXQpOworICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCit7CisgICAgQUxPR1YoImNsb3NlSW5wdXQoJWQpIiwgaW5wdXQpOworCisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoaW5wdXQpOworICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiY2xvc2VJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworCisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICBtQXVkaW9QYXRjaGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIH0KKworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKKyAgICBtSW5wdXRzLnJlbW92ZUl0ZW0oaW5wdXQpOworfQorCitTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0c0ZvckRldmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uIG9wZW5PdXRwdXRzKQoreworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKKworICAgIEFMT0dWVigiZ2V0T3V0cHV0c0ZvckRldmljZSgpIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wZW5PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFMT0dWVigib3V0cHV0ICVkIGlzRHVwbGljYXRlZD0lZCBkZXZpY2U9JTA0eCIsCisgICAgICAgICAgICAgICAgaSwgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+aXNEdXBsaWNhdGVkKCksCisgICAgICAgICAgICAgICAgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydGVkRGV2aWNlcygpKTsKKyAgICAgICAgaWYgKChkZXZpY2UgJiBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5zdXBwb3J0ZWREZXZpY2VzKCkpID09IGRldmljZSkgeworICAgICAgICAgICAgQUxPR1ZWKCJnZXRPdXRwdXRzRm9yRGV2aWNlKCkgZm91bmQgb3V0cHV0ICVkIiwgb3Blbk91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgb3V0cHV0cy5hZGQob3Blbk91dHB1dHMua2V5QXQoaSkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvdXRwdXRzOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6dmVjdG9yc0VxdWFsKFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMikKK3sKKyAgICBpZiAob3V0cHV0czEuc2l6ZSgpICE9IG91dHB1dHMyLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0czEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG91dHB1dHMxW2ldICE9IG91dHB1dHMyW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCit7CisgICAgYXVkaW9fZGV2aWNlc190IG9sZERldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzcmNPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShvbGREZXZpY2UsIG1QcmV2aW91c091dHB1dHMpOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZHN0T3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UobmV3RGV2aWNlLCBtT3V0cHV0cyk7CisKKyAgICAvLyBhbHNvIHRha2UgaW50byBhY2NvdW50IGV4dGVybmFsIHBvbGljeS1yZWxhdGVkIGNoYW5nZXM6IGFkZCBhbGwgb3V0cHV0cyB3aGljaCBhcmUKKyAgICAvLyBhc3NvY2lhdGVkIHdpdGggcG9saWNpZXMgaW4gdGhlICJiZWZvcmUiIGFuZCAiYWZ0ZXIiIG91dHB1dCB2ZWN0b3JzCisgICAgQUxPR1ZWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCk6IHBvbGljeSByZWxhdGVkIG91dHB1dHMiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBtUHJldmlvdXNPdXRwdXRzLnNpemUoKSA7IGkrKykgeworICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1QcmV2aW91c091dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGRlc2MgIT0gMCAmJiBkZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNyY091dHB1dHMuYWRkKGRlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICBBTE9HVlYoIiBwcmV2aW91cyBvdXRwdXRzOiBhZGRpbmcgJWQiLCBkZXNjLT5tSW9IYW5kbGUpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IG1PdXRwdXRzLnNpemUoKSA7IGkrKykgeworICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChkZXNjICE9IDAgJiYgZGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKSB7CisgICAgICAgICAgICBkc3RPdXRwdXRzLmFkZChkZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgQUxPR1ZWKCIgbmV3IG91dHB1dHM6IGFkZGluZyAlZCIsIGRlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXZlY3RvcnNFcXVhbChzcmNPdXRwdXRzLGRzdE91dHB1dHMpKSB7CisgICAgICAgIEFMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIG1vdmluZyBmcm9tIG91dHB1dCAlZCB0byBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICBzdHJhdGVneSwgc3JjT3V0cHV0c1swXSwgZHN0T3V0cHV0c1swXSk7CisgICAgICAgIC8vIG11dGUgc3RyYXRlZ3kgd2hpbGUgbW92aW5nIHRyYWNrcyBmcm9tIG9uZSBvdXRwdXQgdG8gYW5vdGhlcgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNyY091dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Ioc3JjT3V0cHV0c1tpXSk7CisgICAgICAgICAgICBpZiAoaXNTdHJhdGVneUFjdGl2ZShkZXNjLCBzdHJhdGVneSkpIHsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIHRydWUsIGRlc2MpOworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJhdGVneSwgZmFsc2UsIGRlc2MsIE1VVEVfVElNRV9NUywgbmV3RGV2aWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE1vdmUgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAorICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpIHsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGZ4T3V0cHV0ID0gc2VsZWN0T3V0cHV0Rm9yRWZmZWN0cyhkc3RPdXRwdXRzKTsKKyAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gbW92ZWQ7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IG1FZmZlY3RzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGVmZmVjdERlc2MtPm1TZXNzaW9uID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bUlvICE9IGZ4T3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlZC5pbmRleE9mKGVmZmVjdERlc2MtPm1JbykgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIG1vdmluZyBlZmZlY3QgJWQgdG8gb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzLmtleUF0KGkpLCBmeE91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+bW92ZUVmZmVjdHMoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBlZmZlY3REZXNjLT5tSW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbW92ZWQuYWRkKGVmZmVjdERlc2MtPm1Jbyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bUlvID0gZnhPdXRwdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE1vdmUgdHJhY2tzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKSA9PSBzdHJhdGVneSkgeworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKChhdWRpb19zdHJlYW1fdHlwZV90KWkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKK3sKKyAgICBpZiAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpCisgICAgICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSk7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSk7CisgICAgaWYgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKQorICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpOworICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkpOworICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEpOworICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRFRNRik7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9SRVJPVVRJTkcpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBMmRwU3VzcGVuZCgpCit7CisgICAgYXVkaW9faW9faGFuZGxlX3QgYTJkcE91dHB1dCA9IG1PdXRwdXRzLmdldEEyZHBPdXRwdXQoKTsKKyAgICBpZiAoYTJkcE91dHB1dCA9PSAwKSB7CisgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGlzU2NvQ29ubmVjdGVkID0KKyAgICAgICAgICAgICgobUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCAmCisgICAgICAgICAgICAgICAgICAgIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSB8fAorICAgICAgICAgICAgKChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9BTExfU0NPKSAhPSAwKTsKKyAgICAvLyBzdXNwZW5kIEEyRFAgb3V0cHV0IGlmOgorICAgIC8vICAgICAgKE5PVCBhbHJlYWR5IHN1c3BlbmRlZCkgJiYKKyAgICAvLyAgICAgICgoU0NPIGRldmljZSBpcyBjb25uZWN0ZWQgJiYKKyAgICAvLyAgICAgICAoZm9yY2VkIHVzYWdlIGZvciBjb21tdW5pY2F0aW9uIHx8IGZvciByZWNvcmQgaXMgU0NPKSkpIHx8CisgICAgLy8gICAgICAocGhvbmUgc3RhdGUgaXMgcmluZ2luZyB8fCBpbiBjYWxsKQorICAgIC8vCisgICAgLy8gcmVzdG9yZSBBMkRQIG91dHB1dCBpZjoKKyAgICAvLyAgICAgIChBbHJlYWR5IHN1c3BlbmRlZCkgJiYKKyAgICAvLyAgICAgICgoU0NPIGRldmljZSBpcyBOT1QgY29ubmVjdGVkIHx8CisgICAgLy8gICAgICAgKGZvcmNlZCB1c2FnZSBOT1QgZm9yIGNvbW11bmljYXRpb24gJiYgTk9UIGZvciByZWNvcmQgaXMgU0NPKSkpICYmCisgICAgLy8gICAgICAocGhvbmUgc3RhdGUgaXMgTk9UIHJpbmdpbmcgJiYgTk9UIGluIGNhbGwpCisgICAgLy8KKyAgICBpZiAobUEyZHBTdXNwZW5kZWQpIHsKKyAgICAgICAgaWYgKCghaXNTY29Db25uZWN0ZWQgfHwKKyAgICAgICAgICAgICAoKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTikgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgJiYKKyAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkpICYmCisgICAgICAgICAgICAgKChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSAmJgorICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfUklOR1RPTkUpKSkgeworCisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVzdG9yZU91dHB1dChhMmRwT3V0cHV0KTsKKyAgICAgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKGlzU2NvQ29ubmVjdGVkICYmCisgICAgICAgICAgICAgKChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHx8CisgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRCkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykpKSB8fAorICAgICAgICAgICAgICgobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCkgfHwKKyAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX1JJTkdUT05FKSkpIHsKKworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN1c3BlbmRPdXRwdXQoYTJkcE91dHB1dCk7CisgICAgICAgICAgICBtQTJkcFN1c3BlbmRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld091dHB1dERldmljZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKQoreworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJnZXROZXdPdXRwdXREZXZpY2UoKSBkZXZpY2UgJTA4eCBmb3JjZWQgYnkgcGF0Y2ggJWQiLAorICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlKCksIG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjaGVjayB0aGUgZm9sbG93aW5nIGJ5IG9yZGVyIG9mIHByaW9yaXR5IHRvIHJlcXVlc3QgYSByb3V0aW5nIGNoYW5nZSBpZiBuZWNlc3Nhcnk6CisgICAgLy8gMTogdGhlIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUgaXMgYWN0aXZlIGFuZCBlbmZvcmNlZCBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQorICAgIC8vIDI6IHdlIGFyZSBpbiBjYWxsIG9yIHRoZSBzdHJhdGVneSBwaG9uZSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHBob25lCisgICAgLy8gMzogdGhlIHN0cmF0ZWd5IGZvciBlbmZvcmNlZCBhdWRpYmxlIGlzIGFjdGl2ZSBidXQgbm90IGVuZm9yY2VkIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgdGhlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQorICAgIC8vIDQ6IHRoZSBzdHJhdGVneSBhY2Nlc3NpYmlsaXR5IGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgYWNjZXNzaWJpbGl0eQorICAgIC8vIDU6IHRoZSBzdHJhdGVneSBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBzb25pZmljYXRpb24KKyAgICAvLyA2OiB0aGUgc3RyYXRlZ3kgInJlc3BlY3RmdWwiIHNvbmlmaWNhdGlvbiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5ICJyZXNwZWN0ZnVsIiBzb25pZmljYXRpb24KKyAgICAvLyA3OiB0aGUgc3RyYXRlZ3kgbWVkaWEgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBtZWRpYQorICAgIC8vIDg6IHRoZSBzdHJhdGVneSBEVE1GIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgRFRNRgorICAgIC8vIDk6IHRoZSBzdHJhdGVneSBmb3IgYmVhY29uLCBhLmsuYS4gInRyYW5zbWl0dGVkIHRocm91Z2ggc3BlYWtlciIgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSB0LXQtcworICAgIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCisgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChpc0luQ2FsbCgpIHx8CisgICAgICAgICAgICAgICAgICAgIGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfUEhPTkUpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9BQ0NFU1NJQklMSVRZLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9TT05JRklDQVRJT04pKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9NRURJQSkpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0RUTUYpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0RUTUYsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUikpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9SRVJPVVRJTkcpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1JFUk9VVElORywgZnJvbUNhY2hlKTsKKyAgICB9CisKKyAgICBBTE9HVigiZ2V0TmV3T3V0cHV0RGV2aWNlKCkgc2VsZWN0ZWQgZGV2aWNlICV4IiwgZGV2aWNlKTsKKyAgICByZXR1cm4gZGV2aWNlOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXROZXdJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3sKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJnZXROZXdJbnB1dERldmljZSgpIGRldmljZSAlMDh4IGZvcmNlZCBieSBwYXRjaCAlZCIsCisgICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UsIGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dERlc2MtPm1EZXZpY2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UpOworCisgICAgcmV0dXJuIGRldmljZTsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgeworICAgIHJldHVybiAodWludDMyX3QpZ2V0U3RyYXRlZ3koc3RyZWFtKTsKK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgeworICAgIC8vIEJ5IGNoZWNraW5nIHRoZSByYW5nZSBvZiBzdHJlYW0gYmVmb3JlIGNhbGxpbmcgZ2V0U3RyYXRlZ3ksIHdlIGF2b2lkCisgICAgLy8gZ2V0U3RyYXRlZ3kncyBiZWhhdmlvciBmb3IgaW52YWxpZCBzdHJlYW1zLiAgZ2V0U3RyYXRlZ3kgd291bGQgZG8gYSBBTE9HRQorICAgIC8vIGFuZCB0aGVuIHJldHVybiBTVFJBVEVHWV9NRURJQSwgYnV0IHdlIHdhbnQgdG8gcmV0dXJuIHRoZSBlbXB0eSBzZXQuCisgICAgaWYgKHN0cmVhbSA8IChhdWRpb19zdHJlYW1fdHlwZV90KSAwIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgeworICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgfQorICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzOworICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOworICAgIGRldmljZXMgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZXMsIG1PdXRwdXRzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7CisgICAgICAgIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIHN0cmF0ZWd5KSkgeworICAgICAgICAgICAgZGV2aWNlcyA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKkZpbHRlciBTUEVBS0VSX1NBRkUgb3V0IG9mIHJlc3VsdHMsIGFzIEF1ZGlvU2VydmljZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKKyAgICAgIGFuZCBkb2Vzbid0IHJlYWxseSBuZWVkIHRvLiovCisgICAgaWYgKGRldmljZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkgeworICAgICAgICBkZXZpY2VzIHw9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgZGV2aWNlcyAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7CisgICAgfQorCisgICAgcmV0dXJuIGRldmljZXM7Cit9CisKK3JvdXRpbmdfc3RyYXRlZ3kgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKK3sKKyAgICBBTE9HX0FTU0VSVChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1BBVENILCJnZXRTdHJhdGVneSgpIGNhbGxlZCBmb3IgQVVESU9fU1RSRUFNX1BBVENIIik7CisgICAgcmV0dXJuIG1FbmdpbmUtPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikgeworICAgIC8vIGZsYWdzIHRvIHN0cmF0ZWd5IG1hcHBpbmcKKyAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19CRUFDT04pID09IEFVRElPX0ZMQUdfQkVBQ09OKSB7CisgICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUjsKKyAgICB9CisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7CisgICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU7CisgICAgfQorICAgIC8vIHVzYWdlIHRvIHN0cmF0ZWd5IG1hcHBpbmcKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1FbmdpbmUtPmdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXR0ci0+dXNhZ2UpKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKKyAgICBzd2l0Y2goc3RyZWFtKSB7CisgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6CisgICAgICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpOworICAgICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlRXZlbnRGb3JCZWFjb24oaW50IGV2ZW50KSB7CisgICAgc3dpdGNoKGV2ZW50KSB7CisgICAgY2FzZSBTVEFSVElOR19PVVRQVVQ6CisgICAgICAgIG1CZWFjb25NdXRlUmVmQ291bnQrKzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTVE9QUElOR19PVVRQVVQ6CisgICAgICAgIGlmIChtQmVhY29uTXV0ZVJlZkNvdW50ID4gMCkgeworICAgICAgICAgICAgbUJlYWNvbk11dGVSZWZDb3VudC0tOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1RBUlRJTkdfQkVBQ09OOgorICAgICAgICBtQmVhY29uUGxheWluZ1JlZkNvdW50Kys7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1RPUFBJTkdfQkVBQ09OOgorICAgICAgICBpZiAobUJlYWNvblBsYXlpbmdSZWZDb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1CZWFjb25QbGF5aW5nUmVmQ291bnQtLTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAobUJlYWNvbk11dGVSZWZDb3VudCA+IDApIHsKKyAgICAgICAgLy8gYW55IHBsYXliYWNrIGNhdXNlcyBiZWFjb24gdG8gYmUgbXV0ZWQKKyAgICAgICAgcmV0dXJuIHNldEJlYWNvbk11dGUodHJ1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbm8gb3RoZXIgcGxheWJhY2s6IHVubXV0ZSB3aGVuIGJlYWNvbiBzdGFydHMgcGxheWluZywgbXV0ZSB3aGVuIGl0IHN0b3BzCisgICAgICAgIHJldHVybiBzZXRCZWFjb25NdXRlKG1CZWFjb25QbGF5aW5nUmVmQ291bnQgPT0gMCk7CisgICAgfQorfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEJlYWNvbk11dGUoYm9vbCBtdXRlKSB7CisgICAgQUxPR1YoInNldEJlYWNvbk11dGUoJWQpIG1CZWFjb25NdXRlUmVmQ291bnQ9JWQgbUJlYWNvblBsYXlpbmdSZWZDb3VudD0lZCIsCisgICAgICAgICAgICBtdXRlLCBtQmVhY29uTXV0ZVJlZkNvdW50LCBtQmVhY29uUGxheWluZ1JlZkNvdW50KTsKKyAgICAvLyBrZWVwIHRyYWNrIG9mIG11dGVkIHN0YXRlIHRvIGF2b2lkIHJlcGVhdGluZyBtdXRlL3VubXV0ZSBvcGVyYXRpb25zCisgICAgaWYgKG1CZWFjb25NdXRlZCAhPSBtdXRlKSB7CisgICAgICAgIC8vIG11dGUvdW5tdXRlIEFVRElPX1NUUkVBTV9UVFMgb24gYWxsIG91dHB1dHMKKyAgICAgICAgQUxPR1YoIlx0IG11dGluZyAlZCIsIG11dGUpOworICAgICAgICB1aW50MzJfdCBtYXhMYXRlbmN5ID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShBVURJT19TVFJFQU1fVFRTLCBtdXRlLypvbiovLAorICAgICAgICAgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgICAgICAgICAwIC8qZGVsYXkqLywgQVVESU9fREVWSUNFX05PTkUpOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbGF0ZW5jeSA9IGRlc2MtPmxhdGVuY3koKSAqIDI7CisgICAgICAgICAgICBpZiAobGF0ZW5jeSA+IG1heExhdGVuY3kpIHsKKyAgICAgICAgICAgICAgICBtYXhMYXRlbmN5ID0gbGF0ZW5jeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQmVhY29uTXV0ZWQgPSBtdXRlOworICAgICAgICByZXR1cm4gbWF4TGF0ZW5jeTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSkKK3sKKyAgICAvLyBSb3V0aW5nCisgICAgLy8gc2VlIGlmIHdlIGhhdmUgYW4gZXhwbGljaXQgcm91dGUKKyAgICAvLyBzY2FuIHRoZSB3aG9sZSBSb3V0ZU1hcCwgZm9yIGVhY2ggZW50cnksIGNvbnZlcnQgdGhlIHN0cmVhbSB0eXBlIHRvIGEgc3RyYXRlZ3kKKyAgICAvLyAoZ2V0U3RyYXRlZ3koc3RyZWFtKSkuCisgICAgLy8gaWYgdGhlIHN0cmF0ZWd5IGZyb20gdGhlIHN0cmVhbSB0eXBlIGluIHRoZSBSb3V0ZU1hcCBpcyB0aGUgc2FtZSBhcyB0aGUgYXJndW1lbnQgYWJvdmUsCisgICAgLy8gYW5kIGFjdGl2aXR5IGNvdW50IGlzIG5vbi16ZXJvCisgICAgLy8gdGhlIGRldmljZSA9IHRoZSBkZXZpY2UgZnJvbSB0aGUgZGVzY3JpcHRvciBpbiB0aGUgUm91dGVNYXAsIGFuZCBleGl0LgorICAgIGZvciAoc2l6ZV90IHJvdXRlSW5kZXggPSAwOyByb3V0ZUluZGV4IDwgbU91dHB1dFJvdXRlcy5zaXplKCk7IHJvdXRlSW5kZXgrKykgeworICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gbU91dHB1dFJvdXRlcy52YWx1ZUF0KHJvdXRlSW5kZXgpOworICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ID0gZ2V0U3RyYXRlZ3kocm91dGUtPm1TdHJlYW1UeXBlKTsKKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBhY2Nlc3NpYmlsaXR5IHN0cmF0ZWd5IHdoaWNoIG11c3QgZm9sbG93IGFueSBzdHJhdGVneSBpdCBpcworICAgICAgICAvLyBjdXJyZW50bHkgcmVtYXBwZWQgdG8KKyAgICAgICAgYm9vbCBzdHJhdGVneU1hdGNoID0gKHN0cmF0ID09IHN0cmF0ZWd5KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cmF0ZWd5ID09IFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1FbmdpbmUtPmdldFN0cmF0ZWd5Rm9yVXNhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSkgPT0gc3RyYXQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ID09IFNUUkFURUdZX01FRElBKSkpOworICAgICAgICBpZiAoc3RyYXRlZ3lNYXRjaCAmJiByb3V0ZS0+aXNBY3RpdmUoKSkgeworICAgICAgICAgICAgcmV0dXJuIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvci0+dHlwZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyb21DYWNoZSkgeworICAgICAgICBBTE9HVlYoImdldERldmljZUZvclN0cmF0ZWd5KCkgZnJvbSBjYWNoZSBzdHJhdGVneSAlZCwgZGV2aWNlICV4IiwKKyAgICAgICAgICAgICAgc3RyYXRlZ3ksIG1EZXZpY2VGb3JTdHJhdGVneVtzdHJhdGVneV0pOworICAgICAgICByZXR1cm4gbURldmljZUZvclN0cmF0ZWd5W3N0cmF0ZWd5XTsKKyAgICB9CisgICAgcmV0dXJuIG1FbmdpbmUtPmdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKKyAgICAgICAgbURldmljZUZvclN0cmF0ZWd5W2ldID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgfQorICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJldkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKQoreworICAgIC8vIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMgdXNpbmcgYW4gaW5jb21wYXRpYmxlIGRldmljZSBjb21iaW5hdGlvbgorICAgIC8vIGlmIG11dGluZywgd2FpdCBmb3IgdGhlIGF1ZGlvIGluIHBjbSBidWZmZXIgdG8gYmUgZHJhaW5lZCBiZWZvcmUgcHJvY2VlZGluZworICAgIC8vIGlmIHVubXV0aW5nLCB1bm11dGUgb25seSBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5CisgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVpbnQzMl90IG11dGVXYWl0TXMgPSAwOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICBib29sIHNob3VsZE11dGUgPSBvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChwb3Bjb3VudChkZXZpY2UpID49IDIpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgY3VyRGV2aWNlID0gY3VyRGV2aWNlICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpOworICAgICAgICBib29sIG11dGUgPSBzaG91bGRNdXRlICYmIChjdXJEZXZpY2UgJiBkZXZpY2UpICYmIChjdXJEZXZpY2UgIT0gZGV2aWNlKTsKKyAgICAgICAgYm9vbCBkb011dGUgPSBmYWxzZTsKKworICAgICAgICBpZiAobXV0ZSAmJiAhb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSkgeworICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCFtdXRlICYmIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0peworICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZG9NdXRlKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1PdXRwdXRzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChqKTsKKyAgICAgICAgICAgICAgICAvLyBza2lwIG91dHB1dCBpZiBpdCBkb2VzIG5vdCBzaGFyZSBhbnkgZGV2aWNlIHdpdGggY3VycmVudCBvdXRwdXQKKyAgICAgICAgICAgICAgICBpZiAoKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVlYoImNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoKSAlcyBzdHJhdGVneSAlZCAoY3VyRGV2aWNlICUwNHgpIiwKKyAgICAgICAgICAgICAgICAgICAgICBtdXRlID8gIm11dGluZyIgOiAidW5tdXRpbmciLCBpLCBjdXJEZXZpY2UpOworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCBtdXRlLCBkZXNjLCBtdXRlID8gMCA6IGRlbGF5TXMpOworICAgICAgICAgICAgICAgIGlmIChpc1N0cmF0ZWd5QWN0aXZlKGRlc2MsIChyb3V0aW5nX3N0cmF0ZWd5KWkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtdXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogc2hvdWxkIG5vdCBuZWVkIHRvIGRvdWJsZSBsYXRlbmN5IGlmIHZvbHVtZSBjb3VsZCBiZSBhcHBsaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSBieSB0aGUgYXVkaW9mbGluZ2VyIG1peGVyLiBXZSBtdXN0IGFjY291bnQgZm9yIHRoZSBkZWxheQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmV0d2VlbiBub3cgYW5kIHRoZSBuZXh0IHRpbWUgdGhlIGF1ZGlvZmxpbmdlciB0aHJlYWQgZm9yIHRoaXMgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHByb2Nlc3MgYSBidWZmZXIgKHdoaWNoIGNvcnJlc3BvbmRzIHRvIG9uZSBidWZmZXIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzdWFsbHkgMS8yIG9yIDEvNCBvZiB0aGUgbGF0ZW5jeSkuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXV0ZVdhaXRNcyA8IGRlc2MtPmxhdGVuY3koKSAqIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRlV2FpdE1zID0gZGVzYy0+bGF0ZW5jeSgpICogMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHRlbXBvcmFyeSBtdXRlIG91dHB1dCBpZiBkZXZpY2Ugc2VsZWN0aW9uIGNoYW5nZXMgdG8gYXZvaWQgdm9sdW1lIGJ1cnN0cyBkdWUgdG8KKyAgICAvLyBkaWZmZXJlbnQgcGVyIGRldmljZSB2b2x1bWVzCisgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgKGRldmljZSAhPSBwcmV2RGV2aWNlKSkgeworICAgICAgICBpZiAobXV0ZVdhaXRNcyA8IG91dHB1dERlc2MtPmxhdGVuY3koKSAqIDIpIHsKKyAgICAgICAgICAgIG11dGVXYWl0TXMgPSBvdXRwdXREZXNjLT5sYXRlbmN5KCkgKiAyOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgeworICAgICAgICAgICAgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgKHJvdXRpbmdfc3RyYXRlZ3kpaSkpIHsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgdHJ1ZSwgb3V0cHV0RGVzYyk7CisgICAgICAgICAgICAgICAgLy8gZG8gdGVtcE11dGUgdW5tdXRlIGFmdGVyIHR3aWNlIHRoZSBtdXRlIHdhaXQgdGltZQorICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSwgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZVdhaXRNcyAqMiwgZGV2aWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHdhaXQgZm9yIHRoZSBQQ00gb3V0cHV0IGJ1ZmZlcnMgdG8gZW1wdHkgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZAorICAgIGlmIChtdXRlV2FpdE1zID4gZGVsYXlNcykgeworICAgICAgICBtdXRlV2FpdE1zIC09IGRlbGF5TXM7CisgICAgICAgIHVzbGVlcChtdXRlV2FpdE1zICogMTAwMCk7CisgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzKQoreworICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBkZXZpY2UgJTA0eCBkZWxheU1zICVkIiwgZGV2aWNlLCBkZWxheU1zKTsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICB1aW50MzJfdCBtdXRlV2FpdE1zOworCisgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+c3ViT3V0cHV0MSgpLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zKTsKKyAgICAgICAgbXV0ZVdhaXRNcyArPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+c3ViT3V0cHV0MigpLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zKTsKKyAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CisgICAgfQorICAgIC8vIG5vIG5lZWQgdG8gcHJvY2VlZCBpZiBuZXcgZGV2aWNlIGlzIG5vdCBBVURJT19ERVZJQ0VfTk9ORSBhbmQgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50CisgICAgLy8gb3V0cHV0IHByb2ZpbGUKKyAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKKyAgICAgICAgICAgICgoZGV2aWNlICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKSA9PSAwKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBmaWx0ZXIgZGV2aWNlcyBhY2NvcmRpbmcgdG8gb3V0cHV0IHNlbGVjdGVkCisgICAgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkoZGV2aWNlICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKTsKKworICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlID0gb3V0cHV0RGVzYy0+bURldmljZTsKKworICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBwcmV2RGV2aWNlIDB4JTA0eCIsIHByZXZEZXZpY2UpOworCisgICAgaWYgKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgIH0KKyAgICBtdXRlV2FpdE1zID0gY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhvdXRwdXREZXNjLCBwcmV2RGV2aWNlLCBkZWxheU1zKTsKKworICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhlIHJvdXRpbmcgaWY6CisgICAgLy8gICAgICB0aGUgcmVxdWVzdGVkIGRldmljZSBpcyBBVURJT19ERVZJQ0VfTk9ORQorICAgIC8vICAgICAgT1IgdGhlIHJlcXVlc3RlZCBkZXZpY2UgaXMgdGhlIHNhbWUgYXMgY3VycmVudCBkZXZpY2UKKyAgICAvLyAgQU5EIGZvcmNlIGlzIG5vdCBzcGVjaWZpZWQKKyAgICAvLyAgQU5EIHRoZSBvdXRwdXQgaXMgY29ubmVjdGVkIGJ5IGEgdmFsaWQgYXVkaW8gcGF0Y2guCisgICAgLy8gRG9pbmcgdGhpcyBjaGVjayBoZXJlIGFsbG93cyB0aGUgY2FsbGVyIHRvIGNhbGwgc2V0T3V0cHV0RGV2aWNlKCkgd2l0aG91dCBjb25kaXRpb25zCisgICAgaWYgKChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUgfHwgZGV2aWNlID09IHByZXZEZXZpY2UpICYmCisgICAgICAgICFmb3JjZSAmJgorICAgICAgICBvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUgIT0gMCkgeworICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgc2V0dGluZyBzYW1lIGRldmljZSAweCUwNHggb3IgbnVsbCBkZXZpY2UiLCBkZXZpY2UpOworICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKKyAgICB9CisKKyAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgY2hhbmdpbmcgZGV2aWNlIik7CisKKyAgICAvLyBkbyB0aGUgcm91dGluZworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgcmVzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZGVsYXlNcywgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSAoYWRkcmVzcyA9PSBOVUxMKSA/CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSkKKyAgICAgICAgICAgICAgICA6IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZUFkZHIoZGV2aWNlLCBTdHJpbmc4KGFkZHJlc3MpKTsKKyAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOworICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOworICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzID0gMDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlTGlzdC5zaXplKCkgJiYgaSA8IEFVRElPX1BBVENIX1BPUlRTX01BWDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlTGlzdC5pdGVtQXQoaSktPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1tpXSk7CisgICAgICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4OworICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICYmICpwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7CisgICAgICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgY3JlYXRlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIKKyAgICAgICAgICAgICAgICAgICAgIm51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUsIHBhdGNoLm51bV9zb3VyY2VzLCBwYXRjaC5udW1fc2lua3MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJnBhdGNoLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBwYXRjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tVWlkID0gbVVpZENhY2hlZDsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaW5mb3JtIGFsbCBpbnB1dCBhcyB3ZWxsCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGlucHV0RGVzY3JpcHRvci0+bURldmljZSkpIHsKKyAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBpbnB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBpbmZvcm0gaW5wdXQgJWQgb2YgZGV2aWNlOiVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsIGRldmljZSk7CisgICAgICAgICAgICAgICAgaW5wdXRDbWQuYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLGRldmljZSk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDbWQudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHVwZGF0ZSBzdHJlYW0gdm9sdW1lcyBhY2NvcmRpbmcgdG8gbmV3IGRldmljZQorICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXREZXNjLCBkZXZpY2UsIGRlbGF5TXMpOworCisgICAgcmV0dXJuIG11dGVXYWl0TXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVzZXRPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSkKK3sKKyAgICBzc2l6ZV90IGluZGV4OworICAgIGlmIChwYXRjaEhhbmRsZSkgeworICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgfQorICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgZGVsYXlNcyk7CisgICAgQUxPR1YoInJlc2V0T3V0cHV0RGV2aWNlKCkgcmVsZWFzZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQiLCBzdGF0dXMpOworICAgIG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IDA7CisgICAgcmVtb3ZlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUpOworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7CisgICAgaWYgKChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpICYmICgoZGV2aWNlICE9IGlucHV0RGVzYy0+bURldmljZSkgfHwgZm9yY2UpKSB7CisgICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7CisgICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgICAgIGlucHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKKyAgICAgICAgICAgIC8vIEFVRElPX1NPVVJDRV9IT1RXT1JEIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seToKKyAgICAgICAgICAgIC8vIGhhbmRsZWQgYXMgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIGJ5IHRoZSBhdWRpbyBIQUwKKyAgICAgICAgICAgIGlmIChwYXRjaC5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmCisgICAgICAgICAgICAgICAgICAgICFpbnB1dERlc2MtPm1Jc1NvdW5kVHJpZ2dlcikgeworICAgICAgICAgICAgICAgIHBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgICAgICAgICAgLy9vbmx5IG9uZSBpbnB1dCBkZXZpY2UgZm9yIG5vdworICAgICAgICAgICAgZGV2aWNlTGlzdC5pdGVtQXQoMCktPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKKyAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXg7CisgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUgJiYgKnBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXRJbnB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJnBhdGNoLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBwYXRjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tVWlkID0gbVVpZENhY2hlZDsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZXNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSkKK3sKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7CisgICAgc3NpemVfdCBpbmRleDsKKyAgICBpZiAocGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgfQorICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgQUxPR1YoInJlc2V0SW5wdXREZXZpY2UoKSByZWxlYXNlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCIsIHN0YXR1cyk7CisgICAgaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUgPSAwOworICAgIHJlbW92ZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0UHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90JiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190JiBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKK3sKKyAgICAvLyBDaG9vc2UgYW4gaW5wdXQgcHJvZmlsZSBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIGNhcHR1cmUgcGFyYW1ldGVyczogc2VsZWN0IHRoZSBmaXJzdCBhdmFpbGFibGUKKyAgICAvLyBwcm9maWxlIHN1cHBvcnRpbmcgYWxsIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorICAgIC8vCisgICAgLy8gVE9ETzogcGVyaGFwcyBpc0NvbXBhdGlibGVQcm9maWxlIHNob3VsZCByZXR1cm4gYSAibWF0Y2hpbmciIHNjb3JlIHNvIHdlIGNhbiByZXR1cm4KKyAgICAvLyB0aGUgYmVzdCBtYXRjaGluZyBwcm9maWxlLCBub3QgdGhlIGZpcnN0IG9uZS4KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzW2pdOworICAgICAgICAgICAgLy8gcHJvZmlsZS0+bG9nKCk7CisgICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIGFkZHJlc3MsIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0IC8qdXBkYXRlZEZvcm1hdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbE1hc2sgLyp1cGRhdGVkQ2hhbm5lbE1hc2sqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgZmxhZ3MpKSB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ICoqcG9saWN5TWl4KQoreworICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVEZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgIGF1ZGlvX2RldmljZXNfdCBzZWxlY3RlZERldmljZUZyb21NaXggPQorICAgICAgICAgICBtUG9saWN5TWl4ZXMuZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UsIGF2YWlsYWJsZURldmljZVR5cGVzLCBwb2xpY3lNaXgpOworCisgICAgaWYgKHNlbGVjdGVkRGV2aWNlRnJvbU1peCAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICByZXR1cm4gc2VsZWN0ZWREZXZpY2VGcm9tTWl4OworICAgIH0KKyAgICByZXR1cm4gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkKK3sKKyAgICBmb3IgKHNpemVfdCByb3V0ZUluZGV4ID0gMDsgcm91dGVJbmRleCA8IG1JbnB1dFJvdXRlcy5zaXplKCk7IHJvdXRlSW5kZXgrKykgeworICAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1JbnB1dFJvdXRlcy52YWx1ZUF0KHJvdXRlSW5kZXgpOworICAgICAgICAgaWYgKGlucHV0U291cmNlID09IHJvdXRlLT5tU291cmNlICYmIHJvdXRlLT5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICAgcmV0dXJuIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvci0+dHlwZSgpOworICAgICAgICAgfQorICAgICB9CisKKyAgICAgcmV0dXJuIG1FbmdpbmUtPmdldERldmljZUZvcklucHV0U291cmNlKGlucHV0U291cmNlKTsKK30KKworZmxvYXQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgZmxvYXQgdm9sdW1lRGIgPSBtRW5naW5lLT52b2xJbmRleFRvRGIoVm9sdW1lOjpnZXREZXZpY2VDYXRlZ29yeShkZXZpY2UpLCBzdHJlYW0sIGluZGV4KTsKKworICAgIC8vIGlmIGEgaGVhZHNldCBpcyBjb25uZWN0ZWQsIGFwcGx5IHRoZSBmb2xsb3dpbmcgcnVsZXMgdG8gcmluZyB0b25lcyBhbmQgbm90aWZpY2F0aW9ucworICAgIC8vIHRvIGF2b2lkIHNvdW5kIGxldmVsIGJ1cnN0cyBpbiB1c2VyJ3MgZWFyczoKKyAgICAvLyAtIGFsd2F5cyBhdHRlbnVhdGUgcmluZyB0b25lcyBhbmQgbm90aWZpY2F0aW9ucyB2b2x1bWUgYnkgNmRCCisgICAgLy8gLSBpZiBtdXNpYyBpcyBwbGF5aW5nLCBhbHdheXMgbGltaXQgdGhlIHZvbHVtZSB0byBjdXJyZW50IG11c2ljIHZvbHVtZSwKKyAgICAvLyB3aXRoIGEgbWluaW11bSB0aHJlc2hvbGQgYXQgLTM2ZEIgc28gdGhhdCBub3RpZmljYXRpb24gaXMgYWx3YXlzIHBlcmNlaXZlZC4KKyAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CisgICAgaWYgKChkZXZpY2UgJiAoQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCB8CisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgfAorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUIHwKKyAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FKSkgJiYKKyAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKQorICAgICAgICAgICAgICAgIHx8IChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpCisgICAgICAgICAgICAgICAgfHwgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fU1lTVEVNKQorICAgICAgICAgICAgICAgIHx8ICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCisgICAgICAgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgJiYKKyAgICAgICAgICAgIG1TdHJlYW1zLmNhbkJlTXV0ZWQoc3RyZWFtKSkgeworICAgICAgICB2b2x1bWVEYiArPSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SX0RCOworICAgICAgICAvLyB3aGVuIHRoZSBwaG9uZSBpcyByaW5naW5nIHdlIG11c3QgY29uc2lkZXIgdGhhdCBtdXNpYyBjb3VsZCBoYXZlIGJlZW4gcGF1c2VkIGp1c3QgYmVmb3JlCisgICAgICAgIC8vIGJ5IHRoZSBtdXNpYyBhcHBsaWNhdGlvbiBhbmQgYmVoYXZlIGFzIGlmIG11c2ljIHdhcyBhY3RpdmUgaWYgdGhlIGxhc3QgbXVzaWMgdHJhY2sgd2FzCisgICAgICAgIC8vIGp1c3Qgc3RvcHBlZAorICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSkgfHwKKyAgICAgICAgICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG11c2ljRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICBmbG9hdCBtdXNpY1ZvbERCID0gY29tcHV0ZVZvbHVtZShBVURJT19TVFJFQU1fTVVTSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtcy52YWx1ZUZvcihBVURJT19TVFJFQU1fTVVTSUMpLmdldFZvbHVtZUluZGV4KG11c2ljRGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpY0RldmljZSk7CisgICAgICAgICAgICBmbG9hdCBtaW5Wb2xEQiA9IChtdXNpY1ZvbERCID4gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTl9EQikgPworICAgICAgICAgICAgICAgICAgICBtdXNpY1ZvbERCIDogU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTl9EQjsKKyAgICAgICAgICAgIGlmICh2b2x1bWVEYiA+IG1pblZvbERCKSB7CisgICAgICAgICAgICAgICAgdm9sdW1lRGIgPSBtaW5Wb2xEQjsKKyAgICAgICAgICAgICAgICBBTE9HVigiY29tcHV0ZVZvbHVtZSBsaW1pdGluZyB2b2x1bWUgdG8gJWYgbXVzaWNWb2wgJWYiLCBtaW5Wb2xEQiwgbXVzaWNWb2xEQik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdm9sdW1lRGI7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBbmRTZXRWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKK3sKKyAgICAvLyBkbyBub3QgY2hhbmdlIGFjdHVhbCBzdHJlYW0gdm9sdW1lIGlmIHRoZSBzdHJlYW0gaXMgbXV0ZWQKKyAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dICE9IDApIHsKKyAgICAgICAgQUxPR1ZWKCJjaGVja0FuZFNldFZvbHVtZSgpIHN0cmVhbSAlZCBtdXRlZCBjb3VudCAlZCIsCisgICAgICAgICAgICAgIHN0cmVhbSwgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlRm9yQ29tbSA9CisgICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pOworICAgIC8vIGRvIG5vdCBjaGFuZ2UgaW4gY2FsbCB2b2x1bWUgaWYgYmx1ZXRvb3RoIGlzIGNvbm5lY3RlZCBhbmQgdmljZSB2ZXJzYQorICAgIGlmICgoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMICYmIGZvcmNlVXNlRm9yQ29tbSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB8fAorICAgICAgICAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPICYmIGZvcmNlVXNlRm9yQ29tbSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkgeworICAgICAgICBBTE9HVigiY2hlY2tBbmRTZXRWb2x1bWUoKSBjYW5ub3Qgc2V0IHN0cmVhbSAlZCB2b2x1bWUgd2l0aCBmb3JjZSB1c2UgPSAlZCBmb3IgY29tbSIsCisgICAgICAgICAgICAgc3RyZWFtLCBmb3JjZVVzZUZvckNvbW0pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICB9CisKKyAgICBmbG9hdCB2b2x1bWVEYiA9IGNvbXB1dGVWb2x1bWUoc3RyZWFtLCBpbmRleCwgZGV2aWNlKTsKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNGaXhlZFZvbHVtZShkZXZpY2UpKSB7CisgICAgICAgIHZvbHVtZURiID0gMC4wZjsKKyAgICB9CisKKyAgICBvdXRwdXREZXNjLT5zZXRWb2x1bWUodm9sdW1lRGIsIHN0cmVhbSwgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7CisKKyAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIHx8CisgICAgICAgIHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgeworICAgICAgICBmbG9hdCB2b2ljZVZvbHVtZTsKKyAgICAgICAgLy8gRm9yY2Ugdm9pY2Ugdm9sdW1lIHRvIG1heCBmb3IgYmx1ZXRvb3RoIFNDTyBhcyB2b2x1bWUgaXMgbWFuYWdlZCBieSB0aGUgaGVhZHNldAorICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSB7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IChmbG9hdClpbmRleC8oZmxvYXQpbVN0cmVhbXMudmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1heCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7CisgICAgICAgIH0KKworICAgICAgICBpZiAodm9pY2VWb2x1bWUgIT0gbUxhc3RWb2ljZVZvbHVtZSAmJiBvdXRwdXREZXNjID09IG1QcmltYXJ5T3V0cHV0KSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0Vm9pY2VWb2x1bWUodm9pY2VWb2x1bWUsIGRlbGF5TXMpOworICAgICAgICAgICAgbUxhc3RWb2ljZVZvbHVtZSA9IHZvaWNlVm9sdW1lOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YXBwbHlTdHJlYW1Wb2x1bWVzKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQoreworICAgIEFMT0dWVigiYXBwbHlTdHJlYW1Wb2x1bWVzKCkgZm9yIGRldmljZSAlMDh4IiwgZGV2aWNlKTsKKworICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7CisgICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1BBVENIKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjaGVja0FuZFNldFZvbHVtZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zLnZhbHVlRm9yKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyYXRlZ3lNdXRlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBBTE9HVlYoInNldFN0cmF0ZWd5TXV0ZSgpIHN0cmF0ZWd5ICVkLCBtdXRlICVkLCBvdXRwdXQgSUQgJWQiLAorICAgICAgICAgICBzdHJhdGVneSwgb24sIG91dHB1dERlc2MtPmdldElkKCkpOworICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7CisgICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1BBVENIKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSA9PSBzdHJhdGVneSkgeworICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIG9uLCBvdXRwdXREZXNjLCBkZWxheU1zLCBkZXZpY2UpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBjb25zdCBTdHJlYW1EZXNjcmlwdG9yJiBzdHJlYW1EZXNjID0gbVN0cmVhbXMudmFsdWVGb3Ioc3RyZWFtKTsKKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgIH0KKworICAgIEFMT0dWVigic2V0U3RyZWFtTXV0ZSgpIHN0cmVhbSAlZCwgbXV0ZSAlZCwgbU11dGVDb3VudCAlZCBkZXZpY2UgJTA0eCIsCisgICAgICAgICAgc3RyZWFtLCBvbiwgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dLCBkZXZpY2UpOworCisgICAgaWYgKG9uKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gPT0gMCkgeworICAgICAgICAgICAgaWYgKHN0cmVhbURlc2MuY2FuQmVNdXRlZCgpICYmCisgICAgICAgICAgICAgICAgICAgICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAorICAgICAgICAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSB7CisgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLCAwLCBvdXRwdXREZXNjLCBkZXZpY2UsIGRlbGF5TXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGluY3JlbWVudCBtTXV0ZUNvdW50IGFmdGVyIGNhbGxpbmcgY2hlY2tBbmRTZXRWb2x1bWUoKSBzbyB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgbm90IGlnbm9yZWQKKyAgICAgICAgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigic2V0U3RyZWFtTXV0ZSgpIHVubXV0aW5nIG5vbiBtdXRlZCBzdHJlYW0hIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKC0tb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKKyAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2MuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RhcnRpbmcsIGJvb2wgc3RhdGVDaGFuZ2UpCit7CisgICAgaWYoIWhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaWYgdGhlIHN0cmVhbSBwZXJ0YWlucyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgYW5kIHdlIGFyZSBpbiBjYWxsIHdlIG11c3QKKyAgICAvLyBtdXRlIHRoZSBzdHJlYW0gaWYgaXQgaXMgbG93IHZpc2liaWxpdHkuIElmIGl0IGlzIGhpZ2ggdmlzaWJpbGl0eSwgd2UgbXVzdCBwbGF5IGEgdG9uZQorICAgIC8vIGluIHRoZSBkZXZpY2UgdXNlZCBmb3IgcGhvbmUgc3RyYXRlZ3kgYW5kIHBsYXkgdGhlIHRvbmUgaWYgdGhlIHNlbGVjdGVkIGRldmljZSBkb2VzIG5vdAorICAgIC8vIGludGVyZmVyZSB3aXRoIHRoZSBkZXZpY2UgdXNlZCBmb3IgcGhvbmUgc3RyYXRlZ3kKKyAgICAvLyBpZiBzdGF0ZUNoYW5nZSBpcyB0cnVlLCB3ZSBhcmUgY2FsbGVkIGZyb20gc2V0UGhvbmVTdGF0ZSgpIGFuZCB3ZSBtdXN0IG11dGUgb3IgdW5tdXRlIGFzCisgICAgLy8gbWFueSB0aW1lcyBhcyB0aGVyZSBhcmUgYWN0aXZlIHRyYWNrcyBvbiB0aGUgb3V0cHV0CisgICAgY29uc3Qgcm91dGluZ19zdHJhdGVneSBzdHJlYW1fc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOworICAgIGlmICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgfHwKKyAgICAgICAgICAgICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKSkpIHsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtUHJpbWFyeU91dHB1dDsKKyAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIHN0cmVhbSAlZCBzdGFydGluZyAlZCBkZXZpY2UgJXggc3RhdGVDaGFuZ2UgJWQiLAorICAgICAgICAgICAgICAgIHN0cmVhbSwgc3RhcnRpbmcsIG91dHB1dERlc2MtPm1EZXZpY2UsIHN0YXRlQ2hhbmdlKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dKSB7CisgICAgICAgICAgICBpbnQgbXV0ZUNvdW50ID0gMTsKKyAgICAgICAgICAgIGlmIChzdGF0ZUNoYW5nZSkgeworICAgICAgICAgICAgICAgIG11dGVDb3VudCA9IG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX2xvd192aXNpYmlsaXR5KHN0cmVhbSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgbG93IHZpc2liaWxpdHksIG11dGVDb3VudCAlZCIsIG11dGVDb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdXRlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1NdXRlKHN0cmVhbSwgc3RhcnRpbmcsIG1QcmltYXJ5T3V0cHV0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBoaWdoIHZpc2liaWxpdHkiKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+ZGV2aWNlKCkgJgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIHRydWUgLypmcm9tQ2FjaGUqLykpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGhpZ2ggdmlzaWJpbGl0eSBtdXRlZCwgbXV0ZUNvdW50ICVkIiwgbXV0ZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdXRlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHN0YXJ0aW5nLCBtUHJpbWFyeU91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0aW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zdGFydFRvbmUoQVVESU9fUE9MSUNZX1RPTkVfSU5fQ0FMTF9OT1RJRklDQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zdG9wVG9uZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkZWZhdWx0QXVkaW9Qb2xpY3lDb25maWcodm9pZCkKK3sKKyAgICBzcDxId01vZHVsZT4gbW9kdWxlOworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZWZhdWx0SW5wdXREZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpOworICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZSk7CisgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGVmYXVsdElucHV0RGV2aWNlKTsKKworICAgIG1vZHVsZSA9IG5ldyBId01vZHVsZSgicHJpbWFyeSIpOworCisgICAgcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpLCBBVURJT19QT1JUX1JPTEVfU09VUkNFKTsKKyAgICBwcm9maWxlLT5hdHRhY2gobW9kdWxlKTsKKyAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoNDQxMDApOworICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKKyAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5hZGQobURlZmF1bHRPdXRwdXREZXZpY2UpOworICAgIHByb2ZpbGUtPm1GbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlk7CisgICAgbW9kdWxlLT5tT3V0cHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOworCisgICAgcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpLCBBVURJT19QT1JUX1JPTEVfU0lOSyk7CisgICAgcHJvZmlsZS0+YXR0YWNoKG1vZHVsZSk7CisgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKDgwMDApOworICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoQVVESU9fQ0hBTk5FTF9JTl9NT05PKTsKKyAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5hZGQoZGVmYXVsdElucHV0RGV2aWNlKTsKKyAgICBtb2R1bGUtPm1JbnB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKKworICAgIG1Id01vZHVsZXMuYWRkKG1vZHVsZSk7Cit9CisKK2F1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKQoreworICAgIC8vIGZsYWdzIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKKyAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOworICAgIH0KKyAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19TQ08pID09IEFVRElPX0ZMQUdfU0NPKSB7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzsKKyAgICB9CisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQkVBQ09OKSA9PSBBVURJT19GTEFHX0JFQUNPTikgeworICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1RUUzsKKyAgICB9CisKKyAgICAvLyB1c2FnZSB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCisgICAgc3dpdGNoIChhdHRyLT51c2FnZSkgeworICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6CisgICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOworICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX0FMQVJNKSkgeworICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcpKSB7CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JJTkc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk7CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9TWVNURU07CisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9EVE1GOworCisgICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUklORzsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOworICAgIH0KK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKQoreworICAgIC8vIGhhcyBmbGFncyB0aGF0IG1hcCB0byBhIHN0cmF0ZWd5PworICAgIGlmICgocGFhLT5mbGFncyAmIChBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQgfCBBVURJT19GTEFHX1NDTyB8IEFVRElPX0ZMQUdfQkVBQ09OKSkgIT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBoYXMga25vd24gdXNhZ2U/CisgICAgc3dpdGNoIChwYWEtPnVzYWdlKSB7CisgICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6CisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgorICAgIGNhc2UgQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0U6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmF0ZWd5QWN0aXZlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksIHVpbnQzMl90IGluUGFzdE1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAoreworICAgIGlmICgoc3lzVGltZSA9PSAwKSAmJiAoaW5QYXN0TXMgIT0gMCkpIHsKKyAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICBpZiAoaSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgoKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWkpID09IHN0cmF0ZWd5KSB8fAorICAgICAgICAgICAgICAgIChOVU1fU1RSQVRFR0lFUyA9PSBzdHJhdGVneSkpICYmCisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2F1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpCit7CisgICAgcmV0dXJuIG1FbmdpbmUtPmdldEZvcmNlVXNlKHVzYWdlKTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzSW5DYWxsKCkKK3sKKyAgICByZXR1cm4gaXNTdGF0ZUluQ2FsbChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkpOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdGF0ZUluQ2FsbChpbnQgc3RhdGUpCit7CisgICAgcmV0dXJuIGlzX3N0YXRlX2luX2NhbGwoc3RhdGUpOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjNhZTRhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgKQEAgLTAsMCArMSw2MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeUludGVyZmFjZS5oIgorCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KKyNpbmNsdWRlIDxBdWRpb1BvcnQuaD4KKyNpbmNsdWRlIDxBdWRpb1BhdGNoLmg+CisjaW5jbHVkZSA8Q29uZmlnUGFyc2luZ1V0aWxzLmg+CisjaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPElPUHJvZmlsZS5oPgorI2luY2x1ZGUgPEh3TW9kdWxlLmg+CisjaW5jbHVkZSA8QXVkaW9JbnB1dERlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxBdWRpb091dHB1dERlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1peC5oPgorI2luY2x1ZGUgPEVmZmVjdERlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxTb3VuZFRyaWdnZXJTZXNzaW9uLmg+CisjaW5jbHVkZSA8U3RyZWFtRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPFNlc3Npb25Sb3V0ZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQXR0ZW51YXRpb24gYXBwbGllZCB0byBTVFJBVEVHWV9TT05JRklDQVRJT04gc3RyZWFtcyB3aGVuIGEgaGVhZHNldCBpcyBjb25uZWN0ZWQ6IDZkQgorI2RlZmluZSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SIDAuNQorI2RlZmluZSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SX0RCICgtNikKKy8vIE1pbiB2b2x1bWUgZm9yIFNUUkFURUdZX1NPTklGSUNBVElPTiBzdHJlYW1zIHdoZW4gbGltaXRlZCBieSBtdXNpYyB2b2x1bWU6IC0zNmRCCisjZGVmaW5lIFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU4gIDAuMDE2CisjZGVmaW5lIFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU5fREIgICgtMzYpCisKKy8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGR1cmluZyB3aGljaCB3ZSBjb25zaWRlciB0aGF0IG11c2ljIGlzIHN0aWxsIGFjdGl2ZSBhZnRlciBhIG11c2ljCisvLyB0cmFjayB3YXMgc3RvcHBlZCAtIHNlZSBjb21wdXRlVm9sdW1lKCkKKyNkZWZpbmUgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkgIDUwMDAKKworLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgZHVyaW5nIHdpdGNoIHNvbWUgc3RyZWFtcyBhcmUgbXV0ZWQgd2hpbGUgdGhlIGF1ZGlvIHBhdGgKKy8vIGlzIHN3aXRjaGVkCisjZGVmaW5lIE1VVEVfVElNRV9NUyAyMDAwCisKKyNkZWZpbmUgTlVNX1RFU1RfT1VUUFVUUyA1CisKKyNkZWZpbmUgTlVNX1ZPTF9DVVJWRV9LTkVFUyAyCisKKy8vIERlZmF1bHQgbWluaW11bSBsZW5ndGggYWxsb3dlZCBmb3Igb2ZmbG9hZGluZyBhIGNvbXByZXNzZWQgdHJhY2sKKy8vIENhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzIHByb3BlcnR5CisjZGVmaW5lIE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyA2MAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdWRpb1BvbGljeU1hbmFnZXIgaW1wbGVtZW50cyBhdWRpbyBwb2xpY3kgbWFuYWdlciBiZWhhdmlvciBjb21tb24gdG8gYWxsIHBsYXRmb3Jtcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyIDogcHVibGljIEF1ZGlvUG9saWN5SW50ZXJmYWNlLCBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIKKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgLCBwdWJsaWMgVGhyZWFkCisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAoreworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOworICAgICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeU1hbmFnZXIoKTsKKworICAgICAgICAvLyBBdWRpb1BvbGljeUludGVyZmFjZQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOworICAgICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0U3lzdGVtUHJvcGVydHkoY29uc3QgY2hhciogcHJvcGVydHksIGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKKyAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF90eXBlX3QgKmlucHV0VHlwZSk7CisKKyAgICAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdGFydHMgYmVpbmcgdXNlZC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworCisgICAgICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RvcHMgYmVpbmcgdXNlZC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjbG9zZUFsbElucHV0cygpOworICAgICAgICB2aXJ0dWFsIHZvaWQgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKworICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQorICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cik7CisKKyAgICAgICAgLy8gcmV0dXJuIHRoZSBlbmFibGVkIG91dHB1dCBkZXZpY2VzIGZvciB0aGUgZ2l2ZW4gc3RyZWFtIHR5cGUKKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisKKyAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyA9IE5VTEwpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1FZmZlY3RzLnVucmVnaXN0ZXJFZmZlY3QoaWQpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1FZmZlY3RzLnNldEVmZmVjdEVuYWJsZWQoaWQsIGVuYWJsZWQpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgICAgICAvLyByZXR1cm4gd2hldGhlciBhIHN0cmVhbSBpcyBwbGF5aW5nIHJlbW90ZWx5LCBvdmVycmlkZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YKKyAgICAgICAgLy8gICBsb2NhbC9yZW1vdGUgcGxheWJhY2ssIHVzZWQgZm9yIGluc3RhbmNlIGJ5IG5vdGlmaWNhdGlvbiBtYW5hZ2VyIHRvIG5vdCBtYWtlCisgICAgICAgIC8vICAgbWVkaWEgcGxheWVycyBsb3NlIGF1ZGlvIGZvY3VzIHdoZW4gbm90IHBsYXlpbmcgbG9jYWxseQorICAgICAgICAvLyAgIEZvciB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiwgInJlbW90ZWx5IiBtZWFucyBwbGF5aW5nIGR1cmluZyBzY3JlZW4gbWlycm9yaW5nIHdoaWNoCisgICAgICAgIC8vICAgdXNlcyBhbiBvdXRwdXQgZm9yIHBsYXliYWNrIHdpdGggYSBub24tZW1wdHksIG5vbiAiMCIgYWRkcmVzcy4KKyAgICAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtU291bmRUcmlnZ2VyU2Vzc2lvbnMucmVsZWFzZVNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpoYW5kbGUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgcmVsZWFzZVJlc291cmNlc0ZvclVpZCh1aWRfdCB1aWQpOworCisgICAgICAgIC8vIEF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUgcGFyc2luZyAoYXVkaW9fcG9saWN5LmNvbmYpCisgICAgICAgIC8vIFRPRE8gY2FuZGlkYXRlcyB0byBiZSBtb3ZlZCB0byBDb25maWdQYXJzaW5nVXRpbHMKKyAgICAgICAgICAgICAgICB2b2lkIGRlZmF1bHRBdWRpb1BvbGljeUNvbmZpZyh2b2lkKTsKKworICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQorICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgICAgICAvLyBGcm9tIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyCisgICAgICAgIHZpcnR1YWwgY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gJmdldEF1ZGlvUGF0Y2hlcygpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtQXVkaW9QYXRjaGVzOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgY29uc3QgU291bmRUcmlnZ2VyU2Vzc2lvbkNvbGxlY3Rpb24gJmdldFNvdW5kVHJpZ2dlclNlc3Npb25Db2xsZWN0aW9uKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Tb3VuZFRyaWdnZXJTZXNzaW9uczsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGNvbnN0IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbiAmZ2V0QXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lNaXhlczsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZnZXRPdXRwdXRzKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1PdXRwdXRzOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgY29uc3QgQXVkaW9JbnB1dENvbGxlY3Rpb24gJmdldElucHV0cygpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5wdXRzOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgY29uc3QgRGV2aWNlVmVjdG9yICZnZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgY29uc3QgRGV2aWNlVmVjdG9yICZnZXRBdmFpbGFibGVJbnB1dERldmljZXMoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZUlucHV0RGV2aWNlczsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uICZnZXRTdHJlYW1EZXNjcmlwdG9ycygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtU3RyZWFtczsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZnZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0T3V0cHV0RGV2aWNlOworICAgICAgICB9Citwcm90ZWN0ZWQ6CisgICAgICAgIHZvaWQgYWRkT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpOworICAgICAgICB2b2lkIHJlbW92ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworICAgICAgICB2b2lkIGFkZElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjKTsKKworICAgICAgICAvLyByZXR1cm4gYXBwcm9wcmlhdGUgZGV2aWNlIGZvciBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJhdGVneSBhY2NvcmRpbmcgdG8gY3VycmVudAorICAgICAgICAvLyBwaG9uZSBzdGF0ZSwgY29ubmVjdGVkIGRldmljZXMuLi4KKyAgICAgICAgLy8gaWYgZnJvbUNhY2hlIGlzIHRydWUsIHRoZSBkZXZpY2UgaXMgcmV0dXJuZWQgZnJvbSBtRGV2aWNlRm9yU3RyYXRlZ3lbXSwKKyAgICAgICAgLy8gb3RoZXJ3aXNlIGl0IGlzIGRldGVybWluZSBieSBjdXJyZW50IHN0YXRlCisgICAgICAgIC8vIChkZXZpY2UgY29ubmVjdGVkLHBob25lIHN0YXRlLCBmb3JjZSB1c2UsIGEyZHAgb3V0cHV0Li4uKQorICAgICAgICAvLyBUaGlzIGFsbG93cyB0bzoKKyAgICAgICAgLy8gIDEgc3BlZWQgdXAgcHJvY2VzcyB3aGVuIHRoZSBzdGF0ZSBpcyBzdGFibGUgKHdoZW4gc3RhcnRpbmcgb3Igc3RvcHBpbmcgYW4gb3V0cHV0KQorICAgICAgICAvLyAgMiBhY2Nlc3MgdG8gZWl0aGVyIGN1cnJlbnQgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IHRydWUpIG9yCisgICAgICAgIC8vICJmdXR1cmUiIGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSBmYWxzZSkgd2hlbiBjYWxsZWQgZnJvbSBhIGNvbnRleHQKKyAgICAgICAgLy8gIHdoZXJlIGNvbmRpdGlvbnMgYXJlIGNoYW5naW5nIChzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSwgc2V0UGhvbmVTdGF0ZSgpLi4uKSBBTkQKKyAgICAgICAgLy8gIGJlZm9yZSB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpIGlzIGNhbGxlZC4KKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpOworCisgICAgICAgIGJvb2wgaXNTdHJhdGVneUFjdGl2ZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OworCisgICAgICAgIC8vIGNoYW5nZSB0aGUgcm91dGUgb2YgdGhlIHNwZWNpZmllZCBvdXRwdXQuIFJldHVybnMgdGhlIG51bWJlciBvZiBtcyB3ZSBoYXZlIHNsZXB0IHRvCisgICAgICAgIC8vIGFsbG93IG5ldyByb3V0aW5nIHRvIHRha2UgZWZmZWN0IGluIGNlcnRhaW4gY2FzZXMuCisgICAgICAgIHZpcnR1YWwgdWludDMyX3Qgc2V0T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzID0gTlVMTCk7CisgICAgICAgIHN0YXR1c190IHJlc2V0T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7CisgICAgICAgIHN0YXR1c190IHNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOworICAgICAgICBzdGF0dXNfdCByZXNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOworCisgICAgICAgIC8vIHNlbGVjdCBpbnB1dCBkZXZpY2UgY29ycmVzcG9uZGluZyB0byByZXF1ZXN0ZWQgYXVkaW8gc291cmNlCisgICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKTsKKworICAgICAgICAvLyBjb21wdXRlIHRoZSBhY3R1YWwgdm9sdW1lIGZvciBhIGdpdmVuIHN0cmVhbSBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3RlZCBpbmRleCBhbmQgYSBwYXJ0aWN1bGFyCisgICAgICAgIC8vIGRldmljZQorICAgICAgICB2aXJ0dWFsIGZsb2F0IGNvbXB1dGVWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgcGVybWl0dGVkLCBjb21wdXRlIGFuZCBzZW5kIG5ldyB2b2x1bWUgdG8gYXVkaW8gaGFyZHdhcmUKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjaGVja0FuZFNldFZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CisKKyAgICAgICAgLy8gYXBwbHkgYWxsIHN0cmVhbSB2b2x1bWVzIHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IGFuZCBkZXZpY2UKKyAgICAgICAgdm9pZCBhcHBseVN0cmVhbVZvbHVtZXMoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGRlbGF5TXMgPSAwLCBib29sIGZvcmNlID0gZmFsc2UpOworCisgICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIGFsbCBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJhdGVneSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAorICAgICAgICB2b2lkIHNldFN0cmF0ZWd5TXV0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KTApOworCisgICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIHRoZSBzdHJlYW0gb24gdGhlIHNwZWNpZmllZCBvdXRwdXQKKyAgICAgICAgdm9pZCBzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkwKTsKKworICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlcyBmb3Igc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHdoaWxlIGluIGNhbGw6IG11dGUgc3RyZWFtcyBvciByZXBsYWNlIGJ5CisgICAgICAgIC8vIGEgc3BlY2lhbCB0b25lIGluIHRoZSBkZXZpY2UgdXNlZCBmb3IgY29tbXVuaWNhdGlvbgorICAgICAgICB2b2lkIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSk7CisKKyAgICAgICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKTsKKworICAgICAgICAvLyB0cnVlIGlmIGRldmljZSBpcyBpbiBhIHRlbGVwaG9ueSBvciBWb0lQIGNhbGwKKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5DYWxsKCk7CisgICAgICAgIC8vIHRydWUgaWYgZ2l2ZW4gc3RhdGUgcmVwcmVzZW50cyBhIGRldmljZSBpbiBhIHRlbGVwaG9ueSBvciBWb0lQIGNhbGwKKyAgICAgICAgdmlydHVhbCBib29sIGlzU3RhdGVJbkNhbGwoaW50IHN0YXRlKTsKKworICAgICAgICAvLyB3aGVuIGEgZGV2aWNlIGlzIGNvbm5lY3RlZCwgY2hlY2tzIGlmIGFuIG9wZW4gb3V0cHV0IGNhbiBiZSByb3V0ZWQKKyAgICAgICAgLy8gdG8gdGhpcyBkZXZpY2UuIElmIG5vbmUgaXMgb3BlbiwgdHJpZXMgdG8gb3BlbiBvbmUgb2YgdGhlIGF2YWlsYWJsZSBvdXRwdXRzLgorICAgICAgICAvLyBSZXR1cm5zIGFuIG91dHB1dCBzdWl0YWJsZSB0byB0aGlzIGRldmljZSBvciAwLgorICAgICAgICAvLyB3aGVuIGEgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgY2hlY2tzIGlmIGFuIG91dHB1dCBpcyBub3QgdXNlZCBhbnkgbW9yZSBhbmQKKyAgICAgICAgLy8gcmV0dXJucyBpdHMgaGFuZGxlIGlmIGFueS4KKyAgICAgICAgLy8gdHJhbnNmZXJzIHRoZSBhdWRpbyB0cmFja3MgYW5kIGVmZmVjdHMgZnJvbSBvbmUgb3V0cHV0IHRocmVhZCB0byBhbm90aGVyIGFjY29yZGluZ2x5LgorICAgICAgICBzdGF0dXNfdCBjaGVja091dHB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MpOworCisgICAgICAgIHN0YXR1c190IGNoZWNrSW5wdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MpOworCisgICAgICAgIC8vIGNsb3NlIGFuIG91dHB1dCBhbmQgaXRzIGNvbXBhbmlvbiBkdXBsaWNhdGluZyBvdXRwdXQuCisgICAgICAgIHZvaWQgY2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKworICAgICAgICAvLyBjbG9zZSBhbiBpbnB1dC4KKyAgICAgICAgdm9pZCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKKworICAgICAgICAvLyBjaGVja3MgYW5kIGlmIG5lY2Vzc2FyeSBjaGFuZ2VzIG91dHB1dHMgdXNlZCBmb3IgYWxsIHN0cmF0ZWdpZXMuCisgICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBvdXRwdXQgY2hvaWNlIGZvciBhIGdpdmVuIHN0cmF0ZWd5CisgICAgICAgIC8vIGNoYW5nZXM6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UuLi4KKyAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkKKyAgICAgICAgdm9pZCBjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpOworCisgICAgICAgIC8vIFNhbWUgYXMgY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIGJ1dCBmb3IgYSBhbGwgc3RyYXRlZ2llcyBpbiBvcmRlciBvZiBwcmlvcml0eQorICAgICAgICB2b2lkIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOworCisgICAgICAgIC8vIG1hbmFnZXMgQTJEUCBvdXRwdXQgc3VzcGVuZC9yZXN0b3JlIGFjY29yZGluZyB0byBwaG9uZSBzdGF0ZSBhbmQgQlQgU0NPIHVzYWdlCisgICAgICAgIHZvaWQgY2hlY2tBMmRwU3VzcGVuZCgpOworCisgICAgICAgIC8vIHNlbGVjdHMgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZGV2aWNlIG9uIG91dHB1dCBmb3IgY3VycmVudCBzdGF0ZQorICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBmb3IgYSBnaXZlbiBvdXRwdXQgaXMKKyAgICAgICAgLy8gY2hhbmdlZDogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZSwgb3V0cHV0IHN0YXJ0LCBvdXRwdXQgc3RvcC4uCisgICAgICAgIC8vIHNlZSBnZXREZXZpY2VGb3JTdHJhdGVneSgpIGZvciB0aGUgdXNlIG9mIGZyb21DYWNoZSBwYXJhbWV0ZXIKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGdldE5ld091dHB1dERldmljZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKTsKKworICAgICAgICAvLyB1cGRhdGVzIGNhY2hlIG9mIGRldmljZSB1c2VkIGJ5IGFsbCBzdHJhdGVnaWVzIChtRGV2aWNlRm9yU3RyYXRlZ3lbXSkKKyAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGRldmljZSBjaG9pY2UgZm9yIGEgZ2l2ZW4gc3RyYXRlZ3kgaXMKKyAgICAgICAgLy8gY2hhbmdlZDogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZS4uLgorICAgICAgICAvLyBjYWNoZWQgdmFsdWVzIGFyZSB1c2VkIGJ5IGdldERldmljZUZvclN0cmF0ZWd5KCkgaWYgcGFyYW1ldGVyIGZyb21DYWNoZSBpcyB0cnVlLgorICAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKKyAgICAgICAgdm9pZCB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworCisgICAgICAgIC8vIHNlbGVjdHMgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZGV2aWNlIG9uIGlucHV0IGZvciBjdXJyZW50IHN0YXRlCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXROZXdJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CisKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtRWZmZWN0cy5nZXRNYXhFZmZlY3RzQ3B1TG9hZCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRNYXhFZmZlY3RzTWVtb3J5KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1FZmZlY3RzLmdldE1heEVmZmVjdHNNZW1vcnkoKTsKKyAgICAgICAgfQorI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOworICAgICAgICBpbnQgdGVzdE91dHB1dEluZGV4KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorCisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZ2V0T3V0cHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gb3Blbk91dHB1dHMpOworICAgICAgICBib29sIHZlY3RvcnNFcXVhbChTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMik7CisKKyAgICAgICAgLy8gbXV0ZS91bm11dGUgc3RyYXRlZ2llcyB1c2luZyBhbiBpbmNvbXBhdGlibGUgZGV2aWNlIGNvbWJpbmF0aW9uCisgICAgICAgIC8vIGlmIG11dGluZywgd2FpdCBmb3IgdGhlIGF1ZGlvIGluIHBjbSBidWZmZXIgdG8gYmUgZHJhaW5lZCBiZWZvcmUgcHJvY2VlZGluZworICAgICAgICAvLyBpZiB1bm11dGluZywgdW5tdXRlIG9ubHkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheQorICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbXMgd2FpdGVkCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgIGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJldkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcyk7CisKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisgICAgICAgIC8vIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayBhcmUgaW4vb3V0IGFuZCBzbyBtYXkgYmUgbW9kaWZpZWQKKyAgICAgICAgc3A8SU9Qcm9maWxlPiBnZXRJbnB1dFByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCYgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCYgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+JiBwYXRjaCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1BdWRpb1BhdGNoZXMuYWRkQXVkaW9QYXRjaChoYW5kbGUsIHBhdGNoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUF1ZGlvUGF0Y2hlcy5yZW1vdmVBdWRpb1BhdGNoKGhhbmRsZSk7CisgICAgICAgIH0KKworICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtUHJpbWFyeU91dHB1dC0+c3VwcG9ydGVkRGV2aWNlcygpICYgbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKKyAgICAgICAgfQorICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaGFzUHJpbWFyeU91dHB1dCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShtUHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIGludCBkZWxheU1zID0gMCk7CisKKyAgICAgICAgLy8gaWYgYXJndW1lbnQgImRldmljZSIgaXMgZGlmZmVyZW50IGZyb20gQVVESU9fREVWSUNFX05PTkUsICBzdGFydFNvdXJjZSgpIHdpbGwgZm9yY2UKKyAgICAgICAgLy8gdGhlIHJlLWV2YWx1YXRpb24gb2YgdGhlIG91dHB1dCBkZXZpY2UuCisgICAgICAgIHN0YXR1c190IHN0YXJ0U291cmNlKHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkZWxheU1zKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RvcFNvdXJjZShzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSk7CisKKyAgICAgICAgdm9pZCBjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpOworICAgICAgICB2b2lkIGNsZWFyU2Vzc2lvblJvdXRlcyh1aWRfdCB1aWQpOworICAgICAgICB2b2lkIGNoZWNrU3RyYXRlZ3lSb3V0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LCBhdWRpb19pb19oYW5kbGVfdCBvdXB0dXRUb1NraXApOworCisgICAgICAgIHN0YXR1c190IGhhc1ByaW1hcnlPdXRwdXQoKSBjb25zdCB7IHJldHVybiBtUHJpbWFyeU91dHB1dCAhPSAwOyB9CisKKyAgICAgICAgdWlkX3QgbVVpZENhY2hlZDsKKyAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1wQ2xpZW50SW50ZXJmYWNlOyAgLy8gYXVkaW8gcG9saWN5IGNsaWVudCBpbnRlcmZhY2UKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1QcmltYXJ5T3V0cHV0OyAgICAgLy8gcHJpbWFyeSBvdXRwdXQgZGVzY3JpcHRvcgorICAgICAgICAvLyBsaXN0IG9mIGRlc2NyaXB0b3JzIGZvciBvdXRwdXRzIGN1cnJlbnRseSBvcGVuZWQKKworICAgICAgICBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiBtT3V0cHV0czsKKyAgICAgICAgLy8gY29weSBvZiBtT3V0cHV0cyBiZWZvcmUgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgb3BlbnMgbmV3IG91dHB1dHMKKyAgICAgICAgLy8gcmVzZXQgdG8gbU91dHB1dHMgd2hlbiB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpIGlzIGNhbGxlZC4KKyAgICAgICAgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gbVByZXZpb3VzT3V0cHV0czsKKyAgICAgICAgQXVkaW9JbnB1dENvbGxlY3Rpb24gbUlucHV0czsgICAgIC8vIGxpc3Qgb2YgaW5wdXQgZGVzY3JpcHRvcnMKKworICAgICAgICBEZXZpY2VWZWN0b3IgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzOyAvLyBhbGwgYXZhaWxhYmxlIG91dHB1dCBkZXZpY2VzCisgICAgICAgIERldmljZVZlY3RvciAgbUF2YWlsYWJsZUlucHV0RGV2aWNlczsgIC8vIGFsbCBhdmFpbGFibGUgaW5wdXQgZGV2aWNlcworCisgICAgICAgIFNlc3Npb25Sb3V0ZU1hcCBtT3V0cHV0Um91dGVzID0gU2Vzc2lvblJvdXRlTWFwKFNlc3Npb25Sb3V0ZU1hcDo6TUFQVFlQRV9PVVRQVVQpOworICAgICAgICBTZXNzaW9uUm91dGVNYXAgbUlucHV0Um91dGVzID0gU2Vzc2lvblJvdXRlTWFwKFNlc3Npb25Sb3V0ZU1hcDo6TUFQVFlQRV9JTlBVVCk7CisKKyAgICAgICAgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24gbVN0cmVhbXM7IC8vIHN0cmVhbSBkZXNjcmlwdG9ycyBmb3Igdm9sdW1lIGNvbnRyb2wKKyAgICAgICAgYm9vbCAgICBtTGltaXRSaW5ndG9uZVZvbHVtZTsgICAgICAgIC8vIGxpbWl0IHJpbmd0b25lIHZvbHVtZSB0byBtdXNpYyB2b2x1bWUgaWYgaGVhZHNldCBjb25uZWN0ZWQKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VGb3JTdHJhdGVneVtOVU1fU1RSQVRFR0lFU107CisgICAgICAgIGZsb2F0ICAgbUxhc3RWb2ljZVZvbHVtZTsgICAgICAgICAgICAvLyBsYXN0IHZvaWNlIHZvbHVtZSB2YWx1ZSBzZW50IHRvIGF1ZGlvIEhBTAorCisgICAgICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIG1FZmZlY3RzOyAgLy8gbGlzdCBvZiByZWdpc3RlcmVkIGF1ZGlvIGVmZmVjdHMKKyAgICAgICAgYm9vbCAgICBtQTJkcFN1c3BlbmRlZDsgIC8vIHRydWUgaWYgQTJEUCBvdXRwdXQgaXMgc3VzcGVuZGVkCisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1EZWZhdWx0T3V0cHV0RGV2aWNlOyAvLyBvdXRwdXQgZGV2aWNlIHNlbGVjdGVkIGJ5IGRlZmF1bHQgYXQgYm9vdCB0aW1lCisgICAgICAgIGJvb2wgbVNwZWFrZXJEcmNFbmFibGVkOy8vIHRydWUgb24gZGV2aWNlcyB0aGF0IHVzZSBEUkMgb24gdGhlIERFVklDRV9DQVRFR09SWV9TUEVBS0VSIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYm9vc3Qgc29mdCBzb3VuZHMsIHVzZWQgdG8gYWRqdXN0IHZvbHVtZSBjdXJ2ZXMgYWNjb3JkaW5nbHkKKworICAgICAgICBId01vZHVsZUNvbGxlY3Rpb24gbUh3TW9kdWxlczsKKworICAgICAgICB2b2xhdGlsZSBpbnQzMl90IG1BdWRpb1BvcnRHZW5lcmF0aW9uOworCisgICAgICAgIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1BdWRpb1BhdGNoZXM7CisKKyAgICAgICAgU291bmRUcmlnZ2VyU2Vzc2lvbkNvbGxlY3Rpb24gbVNvdW5kVHJpZ2dlclNlc3Npb25zOworCisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IG1DYWxsVHhQYXRjaDsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gbUNhbGxSeFBhdGNoOworCisgICAgICAgIC8vIGZvciBzdXBwb3J0aW5nICJiZWFjb24iIHN0cmVhbXMsIGkuZS4gc3RyZWFtcyB0aGF0IG9ubHkgcGxheSBvbiBzcGVha2VyLCBhbmQgbmV2ZXIKKyAgICAgICAgLy8gd2hlbiBzb21ldGhpbmcgb3RoZXIgdGhhbiBTVFJFQU1fVFRTIChhLmsuYS4gIlRyYW5zbWl0dGVkIFRocm91Z2ggU3BlYWtlciIpIGlzIHBsYXlpbmcKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBTVEFSVElOR19PVVRQVVQsCisgICAgICAgICAgICBTVEFSVElOR19CRUFDT04sCisgICAgICAgICAgICBTVE9QUElOR19PVVRQVVQsCisgICAgICAgICAgICBTVE9QUElOR19CRUFDT04KKyAgICAgICAgfTsKKyAgICAgICAgdWludDMyX3QgbUJlYWNvbk11dGVSZWZDb3VudDsgICAvLyByZWYgY291bnQgZm9yIHN0cmVhbSB0aGF0IHdvdWxkIG11dGUgYmVhY29uCisgICAgICAgIHVpbnQzMl90IG1CZWFjb25QbGF5aW5nUmVmQ291bnQ7Ly8gcmVmIGNvdW50IGZvciB0aGUgcGxheWluZyBiZWFjb24gc3RyZWFtcworICAgICAgICBib29sIG1CZWFjb25NdXRlZDsgICAgICAgICAgICAgIC8vIGhhcyBTVFJFQU1fVFRTIGJlZW4gbXV0ZWQKKworICAgICAgICBBdWRpb1BvbGljeU1peENvbGxlY3Rpb24gbVBvbGljeU1peGVzOyAvLyBsaXN0IG9mIHJlZ2lzdGVyZWQgbWl4ZXMKKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgICAgIE11dGV4ICAgbUxvY2s7CisgICAgICAgIENvbmRpdGlvbiBtV2FpdFdvcmtDVjsKKworICAgICAgICBpbnQgICAgICAgICAgICAgbUN1ck91dHB1dDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgIG1EaXJlY3RPdXRwdXQ7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1UZXN0T3V0cHV0c1tOVU1fVEVTVF9PVVRQVVRTXTsKKyAgICAgICAgaW50ICAgICAgICAgICAgIG1UZXN0SW5wdXQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdERldmljZTsKKyAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlOworICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RGb3JtYXQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdENoYW5uZWxzOworICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RMYXRlbmN5TXM7CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorCisgICAgICAgIHVpbnQzMl90IG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisKKyAgICAgICAgLy8gQXVkaW8gUG9saWN5IEVuZ2luZSBJbnRlcmZhY2UuCisgICAgICAgIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqbUVuZ2luZTsKK3ByaXZhdGU6CisgICAgICAgIC8vIHVwZGF0ZXMgZGV2aWNlIGNhY2hpbmcgYW5kIG91dHB1dCBmb3Igc3RyZWFtcyB0aGF0IGNhbiBpbmZsdWVuY2UgdGhlCisgICAgICAgIC8vICAgIHJvdXRpbmcgb2Ygbm90aWZpY2F0aW9ucworICAgICAgICB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgICAgICAvLyBmaW5kIHRoZSBvdXRwdXRzIG9uIGEgZ2l2ZW4gb3V0cHV0IGRlc2NyaXB0b3IgdGhhdCBoYXZlIHRoZSBnaXZlbiBhZGRyZXNzLgorICAgICAgICAvLyB0byBiZSBjYWxsZWQgb24gYW4gQXVkaW9PdXRwdXREZXNjcmlwdG9yIHdob3NlIHN1cHBvcnRlZCBkZXZpY2VzIChhcyBkZWZpbmVkCisgICAgICAgIC8vICAgaW4gbVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzKSBtYXRjaGVzIHRoZSBkZXZpY2Ugd2hvc2UgYWRkcmVzcyBpcyB0byBiZSBtYXRjaGVkLgorICAgICAgICAvLyBzZWUgZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhhdWRpb19kZXZpY2VzX3QpIGZvciB3aGV0aGVyIHRoZSBkZXZpY2UgdHlwZSBpcyBvbmUKKyAgICAgICAgLy8gICB3aGVyZSBhZGRyZXNzZXMgYXJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBvbmUgY29ubmVjdGVkIGRldmljZSBhbmQgYW5vdGhlci4KKyAgICAgICAgdm9pZCBmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjIC8qaW4qLywKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlIC8qaW4qLywKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MgLyppbiovLAorICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMgLypvdXQqLyk7CisgICAgICAgIHVpbnQzMl90IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsgfQorICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gcmV0dXJuIHRoZSBvdXRwdXQgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIGFuZCBmb3JtYXQKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRGV2aWNlKAorICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOworICAgICAgICAvLyBpbnRlcm5hbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBzdHJlYW0gdHlwZSB2YWx1ZSBmcm9tIGF1ZGlvIGF0dHJpYnV0ZXMKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKKyAgICAgICAgLy8gZXZlbnQgaXMgb25lIG9mIFNUQVJUSU5HX09VVFBVVCwgU1RBUlRJTkdfQkVBQ09OLCBTVE9QUElOR19PVVRQVVQsIFNUT1BQSU5HX0JFQUNPTgorICAgICAgICAvLyByZXR1cm5zIDAgaWYgbm8gbXV0ZS91bm11dGUgZXZlbnQgaGFwcGVuZWQsIHRoZSBsYXJnZXN0IGxhdGVuY3kgb2YgdGhlIGRldmljZSB3aGVyZQorICAgICAgICAvLyAgIHRoZSBtdXRlL3VubXV0ZSBoYXBwZW5lZAorICAgICAgICB1aW50MzJfdCBoYW5kbGVFdmVudEZvckJlYWNvbihpbnQgZXZlbnQpOworICAgICAgICB1aW50MzJfdCBzZXRCZWFjb25NdXRlKGJvb2wgbXV0ZSk7CisgICAgICAgIGJvb2wgICAgIGlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKTsKKworICAgICAgICAvLyBzZWxlY3QgaW5wdXQgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8gcmVxdWVzdGVkIGF1ZGlvIHNvdXJjZSBhbmQgcmV0dXJuIGFzc29jaWF0ZWQgcG9saWN5CisgICAgICAgIC8vIG1peCBpZiBhbnkuIENhbGxzIGdldERldmljZUZvcklucHV0U291cmNlKCkuCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXggPSBOVUxMKTsKKworICAgICAgICAvLyBDYWxsZWQgYnkgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkuCisgICAgICAgIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7Cit9OworCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCnJlbmFtZSB0byBzZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKaW5kZXggM2UwOTBlOS4uNDg5YTliZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKQEAgLTIxMyw2ICsyMTMsMTIgQEAKICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoCisgICAgICAgIFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpCit7CisgICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocmVnSWQsIHN0YXRlKTsKK30KKwogYXVkaW9fdW5pcXVlX2lkX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6bmV3QXVkaW9VbmlxdWVJZCgpCiB7CiAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1VuaXF1ZUlkKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGxMZWdhY3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGxMZWdhY3kuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGxMZWdhY3kuY3BwCnJlbmFtZSB0byBzZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbExlZ2FjeS5jcHAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcApyZW5hbWUgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCmluZGV4IGU2YWNlMjAuLjI4MmRkZWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCkBAIC0xMDksOCArMTA5LDggQEAKICAgICAgICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IGVmZmVjdHMgPSBtSW5wdXRTb3VyY2VzLnZhbHVlQXQoaW5kZXgpLT5tRWZmZWN0czsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBFZmZlY3REZXNjICplZmZlY3QgPSBlZmZlY3RzW2ldOwotICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGZ4ID0gbmV3IEF1ZGlvRWZmZWN0KE5VTEwsICZlZmZlY3QtPm1VdWlkLCAtMSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24sIGlucHV0KTsKKyAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBmeCA9IG5ldyBBdWRpb0VmZmVjdChOVUxMLCBTdHJpbmcxNigiYW5kcm9pZCIpLCAmZWZmZWN0LT5tVXVpZCwgLTEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgYXVkaW9TZXNzaW9uLCBpbnB1dCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmeC0+aW5pdENoZWNrKCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewogICAgICAgICAgICAgICAgIEFMT0dXKCJhZGRJbnB1dEVmZmVjdHMoKTogZmFpbGVkIHRvIGNyZWF0ZSBGeCAlcyBvbiBzb3VyY2UgJWQiLApAQCAtMjU0LDcgKzI1NCw3IEBACiAgICAgICAgIFZlY3RvciA8RWZmZWN0RGVzYyAqPiBlZmZlY3RzID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpbmRleCktPm1FZmZlY3RzOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IGVmZmVjdHNbaV07Ci0gICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZnggPSBuZXcgQXVkaW9FZmZlY3QoTlVMTCwgJmVmZmVjdC0+bVV1aWQsIDAsIDAsIDAsCisgICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZnggPSBuZXcgQXVkaW9FZmZlY3QoTlVMTCwgU3RyaW5nMTYoImFuZHJvaWQiKSwgJmVmZmVjdC0+bVV1aWQsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9TZXNzaW9uLCBvdXRwdXQpOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZngtPmluaXRDaGVjaygpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RWZmZWN0cy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKcmVuYW1lIHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKc2ltaWxhcml0eSBpbmRleCA4OSUKcmVuYW1lIGZyb20gc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcApyZW5hbWUgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCmluZGV4IGE0NWRiYjMuLmNhMzY1YTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCkBAIC0yOCw3ICsyOCw4IEBACiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtNDYsOCArNDcsOCBAQAogCiAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLCBkZXZpY2VfYWRkcmVzcyk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKIH0KIAogYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKApAQCAtNzUsMTAgKzc2LDE0IEBACiAKICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIik7CiAKKyAgICAvLyBhY3F1aXJlIGxvY2sgYmVmb3JlIGNhbGxpbmcgc2V0TW9kZSgpIHNvIHRoYXQgc2V0TW9kZSgpICsgc2V0UGhvbmVTdGF0ZSgpIGFyZSBhbiBhdG9taWMKKyAgICAvLyBvcGVyYXRpb24gZnJvbSBwb2xpY3kgbWFuYWdlciBzdGFuZHBvaW50IChubyBvdGhlciBvcGVyYXRpb24gKGUuZyB0cmFjayBzdGFydCBvciBzdG9wKQorICAgIC8vIGNhbiBiZSBpbnRlcmxlYXZlZCkuCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKwogICAgIC8vIFRPRE86IGNoZWNrIGlmIGl0IGlzIG1vcmUgYXBwcm9wcmlhdGUgdG8gZG8gaXQgaW4gcGxhdGZvcm0gc3BlY2lmaWMgcG9saWN5IG1hbmFnZXIKICAgICBBdWRpb1N5c3RlbTo6c2V0TW9kZShzdGF0ZSk7CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFBob25lU3RhdGUoc3RhdGUpOwogICAgIG1QaG9uZVN0YXRlID0gc3RhdGU7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMTQ1LDEwICsxNTAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKQEAgLTE1Niw4ICsxNjMsMTcgQEAKICAgICB9CiAgICAgQUxPR1YoImdldE91dHB1dCgpIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKKworICAgIC8vIGlmIHRoZSBjYWxsZXIgaXMgdXMsIHRydXN0IHRoZSBzcGVjaWZpZWQgdWlkCisgICAgaWYgKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWRfY2FjaGVkIHx8IHVpZCA9PSAodWlkX3QpLTEpIHsKKyAgICAgICAgdWlkX3QgbmV3Y2xpZW50VWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgICAgICBpZiAodWlkICE9ICh1aWRfdCktMSAmJiB1aWQgIT0gbmV3Y2xpZW50VWlkKSB7CisgICAgICAgICAgICBBTE9HVygiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgbmV3Y2xpZW50VWlkLCB1aWQpOworICAgICAgICB9CisgICAgICAgIHVpZCA9IG5ld2NsaWVudFVpZDsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoYXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBzdHJlYW0sIHVpZCwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIG9mZmxvYWRJbmZvKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCkBAIC0yNDYsMTAgKzI2MiwxMiBAQAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC0yNjAsMTkgKzI3OCwyOCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGlmICgoKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYgIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB8fAotICAgICAgICAoKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRk1fVFVORVIpICYmICFjYXB0dXJlRm1UdW5lckFsbG93ZWQoKSkpIHsKKyAgICBpZiAoKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYgIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjppbnB1dF90eXBlX3QgaW5wdXRUeXBlOworICAgIC8vIGlmIHRoZSBjYWxsZXIgaXMgdXMsIHRydXN0IHRoZSBzcGVjaWZpZWQgdWlkCisgICAgaWYgKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWRfY2FjaGVkIHx8IHVpZCA9PSAodWlkX3QpLTEpIHsKKyAgICAgICAgdWlkX3QgbmV3Y2xpZW50VWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgICAgICBpZiAodWlkICE9ICh1aWRfdCktMSAmJiB1aWQgIT0gbmV3Y2xpZW50VWlkKSB7CisgICAgICAgICAgICBBTE9HVygiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgbmV3Y2xpZW50VWlkLCB1aWQpOworICAgICAgICB9CisgICAgICAgIHVpZCA9IG5ld2NsaWVudFVpZDsKKyAgICB9CisKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIC8vIHRoZSBhdWRpb19pbl9hY291c3RpY3NfdCBwYXJhbWV0ZXIgaXMgaWdub3JlZCBieSBnZXRfaW5wdXQoKQotICAgICAgICBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRJbnB1dEZvckF0dHIoYXR0ciwgaW5wdXQsIHNlc3Npb24sCisgICAgICAgIHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldElucHV0Rm9yQXR0cihhdHRyLCBpbnB1dCwgc2Vzc2lvbiwgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCAmaW5wdXRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFR5cGUpOwogICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOwogCiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKQEAgLTI4MCw2ICszMDcsOCBAQAogICAgICAgICAgICAgc3dpdGNoIChpbnB1dFR5cGUpIHsKICAgICAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9MRUdBQ1k6CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfVEVMRVBIT05ZX1JYOgorICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB1c2UgdGhlIHNhbWUgcGVybWlzc2lvbiBhcyBmb3IgcmVtb3RlIHN1Ym1peCBmb3Igbm93LgogICAgICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX01JWF9DQVBUVVJFOgogICAgICAgICAgICAgICAgIGlmICghY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRJbnB1dEZvckF0dHIoKSBwZXJtaXNzaW9uIGRlbmllZDogY2FwdHVyZSBub3QgYWxsb3dlZCIpOwpAQCAtNTQ1LDkgKzU3NCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KQEAgLTU1OCw5ICs1ODQsNiBAQAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CkBAIC02MDEsOSArNjI0LDYgQEAKICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQpAQCAtNjYwLDQgKzY4MCwyNiBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRBdWRpb1NvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsIGhhbmRsZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BBdWRpb1NvdXJjZShoYW5kbGUpOworfQorCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsTGVnYWN5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsTGVnYWN5LmNwcApzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGxMZWdhY3kuY3BwCnJlbmFtZSB0byBzZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbExlZ2FjeS5jcHAKaW5kZXggYjg4NDZjNi4uMTNhZjNlZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsTGVnYWN5LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbExlZ2FjeS5jcHAKQEAgLTMzLDcgKzMzLDggQEAKIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lIF9fdW51c2VkKQogewogICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC0yMzMsMTAgKzIzNCwxMiBAQAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgX191bnVzZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkIF9fdW51c2VkKQogewogICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC0yNTQsOCArMjU3LDcgQEAKICAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOwogICAgIH0KIAotICAgIGlmICgoKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHx8Ci0gICAgICAgICgoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSKSAmJiAhY2FwdHVyZUZtVHVuZXJBbGxvd2VkKCkpKSB7CisgICAgaWYgKChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYgIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC01NjQsMTAgKzU2NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCiB7CiAgICAgaWYgKGF0dHIgIT0gTlVMTCkgewpAQCAtNjAzLDQgKzYwNywxNiBAQAogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wQXVkaW9Tb3VyY2UoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKQoreworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApyZW5hbWUgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IGViOTExNmQuLmM3N2NjNDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC0xNjYsNiArMTY2LDE3IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CisKKyAgICB1aWRfdCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodWlkKSA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUZvcih1aWQpLT5zZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGVuYWJsZWQpOworfQorCiAvLyByZW1vdmVOb3RpZmljYXRpb25DbGllbnQoKSBpcyBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IHByb2Nlc3MgZGllcy4KIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkKQogewpAQCAtMTc3LDcgKzE4OCw3IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgewotICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Y2xlYXJBdWRpb1BhdGNoZXModWlkKTsKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VSZXNvdXJjZXNGb3JVaWQodWlkKTsKICAgICAgICAgfQogICAgIH0KICNlbmRpZgpAQCAtMjIyLDYgKzIzMywyMSBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpCit7CisgICAgQUxPR1YoIkF1ZGlvUG9saWN5U2VydmljZTo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoJXMsICVkKSIsCisgICAgICAgICAgICByZWdJZC5zdHJpbmcoKSwgc3RhdGUpOworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5keW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGVDb21tYW5kKHJlZ0lkLCBzdGF0ZSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb09uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShyZWdJZCwgc3RhdGUpOworICAgIH0KK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjbGllbnRTZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKIHsKQEAgLTIzMSw3ICsyNTcsOCBAQAogQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Ok5vdGlmaWNhdGlvbkNsaWVudChjb25zdCBzcDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCi0gICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbVVpZCh1aWQpLCBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KGNsaWVudCkKKyAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtVWlkKHVpZCksIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQoY2xpZW50KSwKKyAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGZhbHNlKQogewogfQogCkBAIC0yNTAsMTggKzI3NywzMiBAQAogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKQogewotICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDApIHsKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKSB7CiAgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgIH0KIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpCiB7Ci0gICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCkgeworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgbUF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQpIHsKICAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgIH0KIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoCisgICAgICAgIFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCkgeworICAgICAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocmVnSWQsIHN0YXRlKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6OnNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkID0gZW5hYmxlZDsKK30KKworCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7CiAgICAgQUxPR1coImJpbmRlckRpZWQoKSAlcCwgY2FsbGluZyBwaWQgJWQiLCB3aG8udW5zYWZlX2dldCgpLAogICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKQEAgLTUxMSw2ICs1NTIsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBhZi0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZkYXRhLT5tQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRFlOX1BPTElDWV9NSVhfU1RBVEVfVVBEQVRFOiB7CisgICAgICAgICAgICAgICAgICAgIER5blBvbGljeU1peFN0YXRlVXBkYXRlRGF0YSAqZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKER5blBvbGljeU1peFN0YXRlVXBkYXRlRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8jIyNBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBkeW4gcG9saWN5IG1peCBzdGF0ZSB1cGRhdGUiKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgZHluIHBvbGljeSBtaXggc3RhdGUgdXBkYXRlICVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tUmVnSWQuc3RyaW5nKCksIGRhdGEtPm1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGRhdGEtPm1SZWdJZCwgZGF0YS0+bVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSB1bmtub3duIGNvbW1hbmQgJWQiLCBjb21tYW5kLT5tQ29tbWFuZCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTIyLDIyICs1NzcsMjggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB3YWl0VGltZSA9IElOVDY0X01BWDsKKyAgICAgICAgICAgICAgICAvLyByZWxlYXNlIG1Mb2NrIGJlZm9yZSByZWxlYXNpbmcgc3Ryb25nIHJlZmVyZW5jZSBvbiB0aGUgc2VydmljZSBhcworICAgICAgICAgICAgICAgIC8vIEF1ZGlvUG9saWN5U2VydmljZSBkZXN0cnVjdG9yIGNhbGxzIEF1ZGlvQ29tbWFuZFRocmVhZDo6ZXhpdCgpIHdoaWNoCisgICAgICAgICAgICAgICAgLy8gYWNxdWlyZXMgbUxvY2suCisgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgc3ZjLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB3YWl0VGltZSA9IG1BdWRpb0NvbW1hbmRzWzBdLT5tVGltZSAtIGN1clRpbWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgLy8gcmVsZWFzZSBtTG9jayBiZWZvcmUgcmVsZWFzaW5nIHN0cm9uZyByZWZlcmVuY2Ugb24gdGhlIHNlcnZpY2UgYXMKLSAgICAgICAgLy8gQXVkaW9Qb2xpY3lTZXJ2aWNlIGRlc3RydWN0b3IgY2FsbHMgQXVkaW9Db21tYW5kVGhyZWFkOjpleGl0KCkgd2hpY2ggYWNxdWlyZXMgbUxvY2suCi0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICBzdmMuY2xlYXIoKTsKLSAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICBpZiAoIWV4aXRQZW5kaW5nKCkgJiYgbUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAvLyByZWxlYXNlIGRlbGF5ZWQgY29tbWFuZHMgd2FrZSBsb2NrCisKKyAgICAgICAgLy8gcmVsZWFzZSBkZWxheWVkIGNvbW1hbmRzIHdha2UgbG9jayBpZiB0aGUgcXVldWUgaXMgZW1wdHkKKyAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgcmVsZWFzZV93YWtlX2xvY2sobU5hbWUuc3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXQgdGhpcyBzdGFnZSB3ZSBoYXZlIGVpdGhlciBhbiBlbXB0eSBjb21tYW5kIHF1ZXVlIG9yIHRoZSBmaXJzdCBjb21tYW5kIGluIHRoZSBxdWV1ZQorICAgICAgICAvLyBoYXMgYSBmaW5pdGUgZGVsYXkuIFNvIHVubGVzcyB3ZSBhcmUgZXhpdGluZyBpdCBpcyBzYWZlIHRvIHdhaXQuCisgICAgICAgIGlmICghZXhpdFBlbmRpbmcoKSkgewogICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGdvaW5nIHRvIHNsZWVwIik7CiAgICAgICAgICAgICBtV2FpdFdvcmtDVi53YWl0UmVsYXRpdmUobUxvY2ssIHdhaXRUaW1lKTsKLSAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSB3YWtpbmcgdXAiKTsKICAgICAgICAgfQogICAgIH0KICAgICAvLyByZWxlYXNlIGRlbGF5ZWQgY29tbWFuZHMgd2FrZSBsb2NrIGJlZm9yZSBxdWl0dGluZwpAQCAtNzQ3LDYgKzgwOCwyMCBAQAogICAgIHJldHVybiBzZW5kQ29tbWFuZChjb21tYW5kLCBkZWxheU1zKTsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6ZHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlQ29tbWFuZCgKKyAgICAgICAgU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSkKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBEWU5fUE9MSUNZX01JWF9TVEFURV9VUERBVEU7CisgICAgRHluUG9saWN5TWl4U3RhdGVVcGRhdGVEYXRhICpkYXRhID0gbmV3IER5blBvbGljeU1peFN0YXRlVXBkYXRlRGF0YSgpOworICAgIGRhdGEtPm1SZWdJZCA9IHJlZ0lkOworICAgIGRhdGEtPm1TdGF0ZSA9IHN0YXRlOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHNlbmRpbmcgZHluYW1pYyBwb2xpY3kgbWl4IChpZD0lcykgc3RhdGUgdXBkYXRlIHRvICVkIiwKKyAgICAgICAgICAgIHJlZ0lkLnN0cmluZygpLCBzdGF0ZSk7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzZW5kQ29tbWFuZChzcDxBdWRpb0NvbW1hbmQ+JiBjb21tYW5kLCBpbnQgZGVsYXlNcykKIHsKICAgICB7CkBAIC04NjEsNiArOTM2LDcgQEAKICAgICAgICAgICAgICAgICBwYXRjaDIgPSAoKENyZWF0ZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZDItPm1QYXJhbS5nZXQoKSktPm1QYXRjaDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaGFuZGxlMiA9ICgoUmVsZWFzZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZDItPm1QYXJhbS5nZXQoKSktPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZwYXRjaDIsIDAsIHNpemVvZihwYXRjaDIpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChoYW5kbGUgIT0gaGFuZGxlMikgYnJlYWs7CiAgICAgICAgICAgICAvKiBGaWx0ZXIgQ1JFQVRFX0FVRElPX1BBVENIIGNvbW1hbmRzIG9ubHkgd2hlbiB0aGV5IGFyZSBpc3N1ZWQgZm9yCkBAIC04ODgsNiArOTY0LDEwIEBACiAgICAgICAgICAgICBkZWxheU1zID0gMTsKICAgICAgICAgfSBicmVhazsKIAorICAgICAgICBjYXNlIERZTl9QT0xJQ1lfTUlYX1NUQVRFX1VQREFURTogeworCisgICAgICAgIH0gYnJlYWs7CisKICAgICAgICAgY2FzZSBTVEFSVF9UT05FOgogICAgICAgICBjYXNlIFNUT1BfVE9ORToKICAgICAgICAgZGVmYXVsdDoKQEAgLTkyOSw2ICsxMDA5LDggQEAKICAgICAgICAgcmVxdWVzdEV4aXQoKTsKICAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CiAgICAgfQorICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW4gY2FsbCBpdCBmcm9tIHRoZSB0aHJlYWQgbG9vcCBpZiBhbGwgb3RoZXIgcmVmZXJlbmNlcyBoYXZlIGJlZW4gcmVsZWFzZWQKKyAgICAvLyBidXQgaXQgd2lsbCBzYWZlbHkgcmV0dXJuIFdPVUxEX0JMT0NLIGluIHRoaXMgY2FzZQogICAgIHJlcXVlc3RFeGl0QW5kV2FpdCgpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKcmVuYW1lIHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggODAyODRhNC4uYTBkNWFhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtMzUsNyArMzUsNyBAQAogI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9BdWRpb1BvbGljeUludGVyZmFjZS5oPgogI2VuZGlmCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lFZmZlY3RzLmgiCi0jaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCisjaW5jbHVkZSAibWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCiAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNjEsNyArNjEsOCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKTsKICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CkBAIC03OSwxMCArODAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC05NiwxMCArOTksMTIgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCkBAIC0xODAsNiArMTg1LDggQEAKIAogICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50KTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpOwpAQCAtMTkwLDYgKzE5NywxMSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMsIGJvb2wgcmVnaXN0cmF0aW9uKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaGFuZGxlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUpOworCiAgICAgICAgICAgICBzdGF0dXNfdCBkb1N0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKQEAgLTIxMSw2ICsyMjMsOSBAQAogICAgICAgICAgICAgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICB2b2lkIGRvT25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogCisgICAgICAgICAgICB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpOworICAgICAgICAgICAgdm9pZCBkb09uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpOworCiBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlKCkgQU5EUk9JRF9BUEk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+QXVkaW9Qb2xpY3lTZXJ2aWNlKCk7CkBAIC0yNDEsNiArMjU2LDcgQEAKICAgICAgICAgICAgIFVQREFURV9BVURJT1BPUlRfTElTVCwKICAgICAgICAgICAgIFVQREFURV9BVURJT1BBVENIX0xJU1QsCiAgICAgICAgICAgICBTRVRfQVVESU9QT1JUX0NPTkZJRywKKyAgICAgICAgICAgIERZTl9QT0xJQ1lfTUlYX1NUQVRFX1VQREFURQogICAgICAgICB9OwogCiAgICAgICAgIEF1ZGlvQ29tbWFuZFRocmVhZCAoU3RyaW5nOCBuYW1lLCBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlKTsKQEAgLTI3OCw2ICsyOTQsNyBAQAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVBdWRpb1BhdGNoTGlzdENvbW1hbmQoKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0QXVkaW9Qb3J0Q29uZmlnQ29tbWFuZChjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZUNvbW1hbmQoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGluc2VydENvbW1hbmRfbChBdWRpb0NvbW1hbmQgKmNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CiAKICAgICBwcml2YXRlOgpAQCAtMzYyLDYgKzM3OSwxMiBAQAogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIG1Db25maWc7CiAgICAgICAgIH07CiAKKyAgICAgICAgY2xhc3MgRHluUG9saWN5TWl4U3RhdGVVcGRhdGVEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBTdHJpbmc4IG1SZWdJZDsKKyAgICAgICAgICAgIGludDMyX3QgbVN0YXRlOworICAgICAgICB9OworCiAgICAgICAgIE11dGV4ICAgbUxvY2s7CiAgICAgICAgIENvbmRpdGlvbiBtV2FpdFdvcmtDVjsKICAgICAgICAgVmVjdG9yIDwgc3A8QXVkaW9Db21tYW5kPiA+IG1BdWRpb0NvbW1hbmRzOyAvLyBsaXN0IG9mIHBlbmRpbmcgY29tbWFuZHMKQEAgLTQ2Nyw2ICs0OTAsNyBAQAogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogCiAgICAgICAgIHZpcnR1YWwgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZCgpOwogCkBAIC00ODIsOCArNTA2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOwogICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5Ob3RpZmljYXRpb25DbGllbnQoKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIHNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKTsKIAogICAgICAgICAgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CiAgICAgICAgICAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKQEAgLTQ5NSw2ICs1MjEsNyBAQAogICAgICAgICBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+ICAgICAgICBtU2VydmljZTsKICAgICAgICAgY29uc3QgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgbVVpZDsKICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4gbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDsKKyAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQ7CiAgICAgfTsKIAogICAgIC8vIEludGVybmFsIGR1bXAgdXRpbGl0aWVzLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzL2NvbnZlcnQvY29udmVydC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzL2NvbnZlcnQvY29udmVydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MGI1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS91dGlsaXRpZXMvY29udmVydC9jb252ZXJ0LmgKQEAgLTAsMCArMSwzODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Y21hdGg+CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CisKK25hbWVzcGFjZSB1dGlsaXRpZXMKK3sKKworLyoqCisgKiBDb252ZXJ0IGEgZ2l2ZW4gc291cmNlIHR5cGUgdG8gYSBnaXZlbiBkZXN0aW5hdGlvbiB0eXBlLgorICoKKyAqIFN0cmluZyBjb252ZXJzaW9uIHRvIFQgcmVhZHMgdGhlIHZhbHVlIG9mIHRoZSB0eXBlIFQgaW4gdGhlIGdpdmVuIHN0cmluZy4KKyAqIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBhbGxvdyB0byBoYXZlIHdoaXRlIHNwYWNlcyBhcm91bmQgdGhlIHZhbHVlIHRvIHBhcnNlCisgKiBhbmQgdHJpZXMgdG8gcGFyc2UgdGhlIHdob2xlIHN0cmluZywgd2hpY2ggbWVhbnMgdGhhdCBpZiBzb21lIGJ5dGVzIHdlcmUgbm90CisgKiByZWFkIGluIHRoZSBzdHJpbmcsIHRoZSBmdW5jdGlvbiBmYWlscy4KKyAqIEhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIChpZS4gbnVtYmVycyBzdGFydGluZyB3aXRoIDB4KSBpcyBzdXBwb3J0ZWQgb25seQorICogZm9yIGludGVncmFsIHR5cGVzIGNvbnZlcnNpb25zLgorICoKKyAqIE51bWVyaWMgY29udmVyc2lvbiB0byBzdHJpbmcgZm9ybWF0cyB0aGUgc291cmNlIHZhbHVlIHRvIGRlY2ltYWwgc3BhY2UuCisgKgorICogVmVjdG9yIHRvIHZlY3RvciBjb252ZXJzaW9uIGNhbGxzIGNvbnZlcnRUbyBvbiBlYWNoIGVsZW1lbnQuCisgKgorICogQHRwYXJhbSBzcmNUeXBlIHNvdXJjZSB0eXBlLCBkZWZhdWx0IHZhbHVlIGlzIHN0cmluZyB0eXBlCisgKiBAdHBhcmFtIGRzdFR5cGUgZGVzdGluYXRpb24gdHlwZQorICogQHBhcmFtW2luXSBpbnB1dCBUaGUgc291cmNlIHRvIGNvbnZlcnQgZnJvbS4KKyAqIEBwYXJhbVtvdXRdIHJlc3VsdCBDb252ZXJ0ZWQgdmFsdWUgaWYgc3VjY2VzcywgdW5kZWZpbmVkIG9uIGZhaWx1cmUuCisgKgorICogQHJldHVybiB0cnVlIGlmIGNvbnZlcnNpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZS4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIHNyY1R5cGUsIHR5cGVuYW1lIGRzdFR5cGU+CitzdGF0aWMgaW5saW5lIGJvb2wgY29udmVydFRvKGNvbnN0IHNyY1R5cGUgJmlucHV0LCBkc3RUeXBlICZyZXN1bHQpOworCisvKiBkZXRhaWxzIG5hbWVzcGFjZSBpcyBoZXJlIHRvIGhpZGUgaW1wbGVtZW50YXRpb24gZGV0YWlscyB0byBoZWFkZXIgZW5kIHVzZXIuIEl0CisgKiBpcyBOT1QgaW50ZW5kZWQgdG8gYmUgdXNlZCBvdXRzaWRlLiAqLworbmFtZXNwYWNlIGRldGFpbHMKK3sKKworLyoqIEhlbHBlciBjbGFzcyB0byBsaW1pdCBpbnN0YW50aWF0aW9uIG9mIHRlbXBsYXRlcyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQ29udmVyc2lvbkZyb21TdHJpbmdBbGxvd2VkOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQ29udmVyc2lvblRvU3RyaW5nQWxsb3dlZDsKKworLyogTGlzdCBvZiBhbGxvd2VkIHR5cGVzIGZvciBjb252ZXJzaW9uICovCit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbnZlcnNpb25Gcm9tU3RyaW5nQWxsb3dlZDxib29sPiB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29udmVyc2lvbkZyb21TdHJpbmdBbGxvd2VkPHVpbnQ2NF90PiB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29udmVyc2lvbkZyb21TdHJpbmdBbGxvd2VkPGludDY0X3Q+IHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb252ZXJzaW9uRnJvbVN0cmluZ0FsbG93ZWQ8dWludDMyX3Q+IHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb252ZXJzaW9uRnJvbVN0cmluZ0FsbG93ZWQ8aW50MzJfdD4ge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbnZlcnNpb25Gcm9tU3RyaW5nQWxsb3dlZDx1aW50MTZfdD4ge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbnZlcnNpb25Gcm9tU3RyaW5nQWxsb3dlZDxpbnQxNl90PiB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29udmVyc2lvbkZyb21TdHJpbmdBbGxvd2VkPGZsb2F0PiB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29udmVyc2lvbkZyb21TdHJpbmdBbGxvd2VkPGRvdWJsZT4ge307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29udmVyc2lvblRvU3RyaW5nQWxsb3dlZDxpbnQ2NF90PiB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29udmVyc2lvblRvU3RyaW5nQWxsb3dlZDx1aW50NjRfdD4ge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbnZlcnNpb25Ub1N0cmluZ0FsbG93ZWQ8dWludDMyX3Q+IHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb252ZXJzaW9uVG9TdHJpbmdBbGxvd2VkPGludDMyX3Q+IHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb252ZXJzaW9uVG9TdHJpbmdBbGxvd2VkPGRvdWJsZT4ge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbnZlcnNpb25Ub1N0cmluZ0FsbG93ZWQ8ZmxvYXQ+IHt9OworCisvKioKKyAqIFNldCB0aGUgZGVjaW1hbCBwcmVjaXNpb24gdG8gMTAgZGlnaXRzLgorICogTm90ZSB0aGF0IHRoaXMgc2V0dGluZyBpcyBhbGlnbmVkIHdpdGggQW5kcm9pZCBBdWRpbyBQYXJhbWV0ZXIKKyAqIHBvbGljeSBjb25jZXJuaW5nIGZsb2F0IHN0b3JhZ2UgaW50byBzdHJpbmcuCisgKi8KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBnRmxvYXRQcmVjaXNpb24gPSAxMDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIGJvb2wgZnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBUICZyZXN1bHQpCit7CisgICAgLyogQ2hlY2sgdGhhdCBjb252ZXJzaW9uIHRvIHRoYXQgdHlwZSBpcyBhbGxvd2VkLgorICAgICAqIElmIHRoaXMgZmFpbHMsIHRoaXMgbWVhbnMgdGhhdCB0aGlzIHRlbXBsYXRlIHdhcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZAorICAgICAqIHdpdGggdGhpcyB0eXBlLCB0aHVzIHRoYXQgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuICovCisgICAgQ29udmVyc2lvbkZyb21TdHJpbmdBbGxvd2VkPFQ+KCk7CisKKyAgICBpZiAoc3RyLmZpbmRfZmlyc3Rfb2Yoc3RkOjpzdHJpbmcoIlxyXG5cdFx2ICIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIGEgJy0nIGluIHN0cmluZy4gSWYgdHlwZSBpcyB1bnNpZ25lZCBhbmQgYSAtIGlzIGZvdW5kLCB0aGUKKyAgICAgKiBwYXJzaW5nIGZhaWxzLiBUaGlzIGlzIG1hZGUgbmVjZXNzYXJ5IGJlY2F1c2UgIi0xIiBpcyByZWFkIGFzIDY1NTM1IGZvcgorICAgICAqIHVpbnQxNl90LCBmb3IgZXhhbXBsZSAqLworICAgIGlmIChzdHIuZmluZCgiLSIpICE9IHN0ZDo6c3RyaW5nOjpucG9zCisgICAgICAgICYmICFzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzKHN0cik7CisKKyAgICAvKiBTYWRseSwgdGhlIHN0cmVhbSBjb252ZXJzaW9uIGRvZXMgbm90IGhhbmRsZSBoZXhhZGVjaW1hbCBmb3JtYXQsIHRodXMKKyAgICAgKiBjaGVjayBpcyBkb25lIG1hbnVhbGx5ICovCisgICAgaWYgKHN0ci5zdWJzdHIoMCwgMikgPT0gIjB4IikgeworICAgICAgICBpZiAoc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaW50ZWdlcikgeworICAgICAgICAgICAgc3MgPj4gc3RkOjpoZXggPj4gcmVzdWx0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogQ29udmVyc2lvbiB1bmRlZmluZWQgZm9yIG5vbiBpbnRlZ2VycyAqLworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3MgPj4gcmVzdWx0OworICAgIH0KKworICAgIHJldHVybiBzcy5lb2YoKSAmJiAhc3MuZmFpbCgpICYmICFzcy5iYWQoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIGJvb2wgdG9TdHJpbmcoY29uc3QgVCAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpCit7CisgICAgLyogQ2hlY2sgdGhhdCBjb252ZXJzaW9uIGZyb20gdGhhdCB0eXBlIGlzIGFsbG93ZWQuCisgICAgICogSWYgdGhpcyBmYWlscywgdGhpcyBtZWFucyB0aGF0IHRoaXMgdGVtcGxhdGUgd2FzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkCisgICAgICogd2l0aCB0aGlzIHR5cGUsIHRodXMgdGhhdCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4gKi8KKyAgICBDb252ZXJzaW9uVG9TdHJpbmdBbGxvd2VkPFQ+KCk7CisKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzLnByZWNpc2lvbihnRmxvYXRQcmVjaXNpb24pOworICAgIG9zcyA8PCB2YWx1ZTsKKyAgICBzdHIgPSBvc3Muc3RyKCk7CisgICAgcmV0dXJuICFvc3MuZmFpbCgpICYmICFvc3MuYmFkKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBzcmNUeXBlLCB0eXBlbmFtZSBkc3RUeXBlPgorY2xhc3MgQ29udmVydGVyOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgZHN0VHlwZT4KK2NsYXNzIENvbnZlcnRlcjxzdGQ6OnN0cmluZywgZHN0VHlwZT4KK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgcnVuKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGRzdFR5cGUgJnJlc3VsdCkKKyAgICB7CisgICAgICAgIHJldHVybiBmcm9tU3RyaW5nPGRzdFR5cGU+KHN0ciwgcmVzdWx0KTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgc3JjVHlwZT4KK2NsYXNzIENvbnZlcnRlcjxzcmNUeXBlLCBzdGQ6OnN0cmluZz4KK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgcnVuKGNvbnN0IHNyY1R5cGUgJnN0ciwgc3RkOjpzdHJpbmcgJnJlc3VsdCkKKyAgICB7CisgICAgICAgIHJldHVybiB0b1N0cmluZzxzcmNUeXBlPihzdHIsIHJlc3VsdCk7CisgICAgfQorfTsKKworLyoqIENvbnZlcnQgYSB2ZWN0b3IgYnkgYXBwbHlpbmcgY29udmVydFRvIG9uIGVhY2ggZWxlbWVudC4KKyAqCisgKiBAdHBhcmFtIFNyY0VsZW0gVHlwZSBvZiB0aGUgc3JjIGVsZW1lbnRzLgorICogQHRwYXJhbSBEc3RFbGVtIFR5cGUgb2YgdGhlIGRlc3RpbmF0aW9uIGVsZW1lbnRzLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjRWxlbSwgdHlwZW5hbWUgRHN0RWxlbT4KK2NsYXNzIENvbnZlcnRlcjxzdGQ6OnZlY3RvcjxTcmNFbGVtPiwgc3RkOjp2ZWN0b3I8RHN0RWxlbT4gPgoreworcHVibGljOgorICAgIHR5cGVkZWYgY29uc3Qgc3RkOjp2ZWN0b3I8U3JjRWxlbT4gU3JjOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8RHN0RWxlbT4gRHN0OworCisgICAgc3RhdGljIGlubGluZSBib29sIHJ1bihTcmMgJnNyYywgRHN0ICZkc3QpCisgICAgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIFNyYzo6Y29uc3RfaXRlcmF0b3IgU3JjSXQ7CisgICAgICAgIGRzdC5jbGVhcigpOworICAgICAgICBkc3QucmVzZXJ2ZShzcmMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChTcmNJdCBpdCA9IHNyYy5iZWdpbigpOyBpdCAhPSBzcmMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIERzdEVsZW0gZHN0RWxlbTsKKyAgICAgICAgICAgIGlmIChub3QgY29udmVydFRvKCppdCwgZHN0RWxlbSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3QucHVzaF9iYWNrKGRzdEVsZW0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGRldGFpbHMKKwordGVtcGxhdGUgPHR5cGVuYW1lIHNyY1R5cGUsIHR5cGVuYW1lIGRzdFR5cGU+CitzdGF0aWMgaW5saW5lIGJvb2wgY29udmVydFRvKGNvbnN0IHNyY1R5cGUgJmlucHV0LCBkc3RUeXBlICZyZXN1bHQpCit7CisgICAgcmV0dXJuIGRldGFpbHM6OkNvbnZlcnRlcjxzcmNUeXBlLCBkc3RUeXBlPjo6cnVuKGlucHV0LCByZXN1bHQpOworfQorCisvKioKKyAqIFNwZWNpYWxpemF0aW9uIGZvciBpbnQxNl90IG9mIGNvbnZlcnRUbyB0ZW1wbGF0ZSBmdW5jdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNhbWUgcGFyYWRpZ20gdGhhbiBpdCdzIGdlbmVyaWMgdmVyc2lvbi4KKyAqCisgKiBUaGUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gaXMgbWFkZSBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgc3RscG9ydCB2ZXJzaW9uIG9mCisgKiBzdHJpbmcgc3RyZWFtcyBpcyBidWdnZWQgYW5kIGRvZXMgbm90IGZhaWwgd2hlbiBnaXZpbmcgb3ZlcmZsb3dlZCB2YWx1ZXMuCisgKiBUaGlzIHNwZWNpYWxpc2F0aW9uIGNhbiBiZSBzYWZlbHkgcmVtb3ZlZCB3aGVuIHN0bHBvcnQgYmVoYXZpb3VyIGlzIGZpeGVkLgorICoKKyAqIEBwYXJhbVtpbl0gIHN0ciAgICB0aGUgc3RyaW5nIHRvIHBhcnNlLgorICogQHBhcmFtW291dF0gcmVzdWx0IHJlZmVyZW5jZSB0byBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdC4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgY29udmVydFRvPHN0ZDo6c3RyaW5nLCBpbnQxNl90Pihjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBpbnQxNl90ICZyZXN1bHQpCit7CisgICAgaW50NjRfdCByZXM7CisKKyAgICBpZiAoIWNvbnZlcnRUbzxzdGQ6OnN0cmluZywgaW50NjRfdD4oc3RyLCByZXMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAocmVzID4gc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KCkgfHwgcmVzIDwgc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWluKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PGludDE2X3Q+KHJlcyk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogU3BlY2lhbGl6YXRpb24gZm9yIGZsb2F0IG9mIGNvbnZlcnRUbyB0ZW1wbGF0ZSBmdW5jdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNhbWUgcGFyYWRpZ20gdGhhbiBpdCdzIGdlbmVyaWMgdmVyc2lvbiBhbmQgaXMKKyAqIGJhc2VkIG9uIGl0IGJ1dCBtYWtlcyBmdXJ0aGVycyBjaGVja3Mgb24gdGhlIHJldHVybmVkIHZhbHVlLgorICoKKyAqIFRoZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBpcyBtYWRlIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBzdGxwb3J0IGNvbnZlcnNpb24KKyAqIGZyb20gc3RyaW5nIHRvIGZsb2F0IGJlaGF2ZXMgZGlmZmVyZW50bHkgdGhhbiBHTlUgU1RMOiBvdmVyZmxvdyBwcm9kdWNlCisgKiArLy1JbmZpbml0eSByYXRoZXIgdGhhbiBhbiBlcnJvci4KKyAqCisgKiBAcGFyYW1baW5dICBzdHIgICAgdGhlIHN0cmluZyB0byBwYXJzZS4KKyAqIEBwYXJhbVtvdXRdIHJlc3VsdCByZWZlcmVuY2UgdG8gb2JqZWN0IHdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHQuCisgKgorICogQHJldHVybiB0cnVlIGlmIGNvbnZlcnNpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZS4KKyAqLwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIGNvbnZlcnRUbzxzdGQ6OnN0cmluZywgZmxvYXQ+KGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGZsb2F0ICZyZXN1bHQpCit7CisgICAgaWYgKCFkZXRhaWxzOjpDb252ZXJ0ZXI8c3RkOjpzdHJpbmcsIGZsb2F0Pjo6cnVuKHN0ciwgcmVzdWx0KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHN0ZDo6YWJzKHJlc3VsdCkgPT0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkgfHwKKyAgICAgICAgcmVzdWx0ID09IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpxdWlldF9OYU4oKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogU3BlY2lhbGl6YXRpb24gZm9yIGRvdWJsZSBvZiBjb252ZXJ0VG8gdGVtcGxhdGUgZnVuY3Rpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzYW1lIHBhcmFkaWdtIHRoYW4gaXQncyBnZW5lcmljIHZlcnNpb24gYW5kIGlzCisgKiBiYXNlZCBvbiBpdCBidXQgbWFrZXMgZnVydGhlcnMgY2hlY2tzIG9uIHRoZSByZXR1cm5lZCB2YWx1ZS4KKyAqCisgKiBUaGUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gaXMgbWFkZSBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgc3RscG9ydCBjb252ZXJzaW9uCisgKiBmcm9tIHN0cmluZyB0byBkb3VibGUgYmVoYXZlcyBkaWZmZXJlbnRseSB0aGFuIEdOVSBTVEw6IG92ZXJmbG93IHByb2R1Y2UKKyAqICsvLUluZmluaXR5IHJhdGhlciB0aGFuIGFuIGVycm9yLgorICoKKyAqIEBwYXJhbVtpbl0gIHN0ciAgICB0aGUgc3RyaW5nIHRvIHBhcnNlLgorICogQHBhcmFtW291dF0gcmVzdWx0IHJlZmVyZW5jZSB0byBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdC4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgY29udmVydFRvPHN0ZDo6c3RyaW5nLCBkb3VibGU+KGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGRvdWJsZSAmcmVzdWx0KQoreworICAgIGlmICghZGV0YWlsczo6Q29udmVydGVyPHN0ZDo6c3RyaW5nLCBkb3VibGU+OjpydW4oc3RyLCByZXN1bHQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoc3RkOjphYnMocmVzdWx0KSA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkgfHwKKyAgICAgICAgcmVzdWx0ID09IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFNwZWNpYWxpemF0aW9uIGZvciBib29sZWFuIG9mIGNvbnZlcnRUbyB0ZW1wbGF0ZSBmdW5jdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNhbWUgcGFyYWRpZ20gdGhhbiBpdCdzIGdlbmVyaWMgdmVyc2lvbi4KKyAqIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyB0byBwYXJzZSBib29sZWFuIGFzICIwLzEiIG9yICJmYWxzZS90cnVlIiBvcgorICogIkZBTFNFL1RSVUUiLgorICogVGhlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGlzIG1hZGUgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGJlaGF2aW91ciBvZgorICogc3RyaW5nIHN0cmVhbXMgd2hlbiBwYXJzaW5nIGJvb2xlYW4gdmFsdWVzIGlzIG5vdCBzdWZmaWNpZW50IHRvIGZpdCBvdXIKKyAqIHJlcXVpcmVtZW50cy4gSW5kZWVkLCBwYXJzaW5nICJ0cnVlIiB3aWxsIGNvcnJlY3RseSBwYXJzZSB0aGUgdmFsdWUsIGJ1dCB0aGUKKyAqIGVuZCBvZiBzdHJlYW0gaXMgbm90IHJlYWNoZWQgd2hpY2ggbWFrZXMgdGhlIHNzLmVvZigpIGZhaWxzIGluIHRoZSBnZW5lcmljCisgKiBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW1baW5dICBzdHIgICAgdGhlIHN0cmluZyB0byBwYXJzZS4KKyAqIEBwYXJhbVtvdXRdIHJlc3VsdCByZWZlcmVuY2UgdG8gb2JqZWN0IHdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHQuCisgKgorICogQHJldHVybiB0cnVlIGlmIGNvbnZlcnNpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZS4KKyAqLwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIGNvbnZlcnRUbzxzdGQ6OnN0cmluZywgYm9vbD4oY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgYm9vbCAmcmVzdWx0KQoreworICAgIGlmIChzdHIgPT0gIjAiIHx8IHN0ciA9PSAiRkFMU0UiIHx8IHN0ciA9PSAiZmFsc2UiKSB7CisgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoc3RyID09ICIxIiB8fCBzdHIgPT0gIlRSVUUiIHx8IHN0ciA9PSAidHJ1ZSIpIHsKKyAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIFNwZWNpYWxpemF0aW9uIGZvciBib29sZWFuIHRvIHN0cmluZyBvZiBjb252ZXJ0VG8gdGVtcGxhdGUgZnVuY3Rpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzYW1lIHBhcmFkaWdtIHRoYW4gaXQncyBnZW5lcmljIHZlcnNpb24uCisgKiBUaGlzIGZ1bmN0aW9uIGFyYml0cmFyaWx5IGRlY2lkZXMgdG8gcmV0dXJuICJmYWxzZS90cnVlIi4KKyAqIEl0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgc3BlY2lhbGl6YXRpb24gZnJvbSBzdHJpbmcgdG8gYm9vbGVhbi4KKyAqCisgKiBAcGFyYW1baW5dICBpc1NldCAgYm9vbGVhbiB0byBjb252ZXJ0IHRvIGEgc3RyaW5nLgorICogQHBhcmFtW291dF0gcmVzdWx0IHJlZmVyZW5jZSB0byBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdC4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgY29udmVydFRvPGJvb2wsIHN0ZDo6c3RyaW5nPihjb25zdCBib29sICZpc1NldCwgc3RkOjpzdHJpbmcgJnJlc3VsdCkKK3sKKyAgICByZXN1bHQgPSBpc1NldCA/ICJ0cnVlIiA6ICJmYWxzZSI7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogU3BlY2lhbGl6YXRpb24gZm9yIHN0cmluZyB0byBzdHJpbmcgb2YgY29udmVydFRvIHRlbXBsYXRlIGZ1bmN0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSBkdW1teSBjb252ZXJzaW9uIGZyb20gc3RyaW5nIHRvIHN0cmluZy4KKyAqIEluIGNhc2Ugb2YgY2xpZW50cyB1c2luZyB0ZW1wbGF0ZSBhcyB3ZWxsLCB0aGlzIGltcGxlbWVudGF0aW9uIGF2b2lkcyBhZGRpbmcgZXh0cmEKKyAqIHNwZWNpYWxpemF0aW9uIHRvIGJ5cGFzcyB0aGUgY29udmVyc2lvbiBmcm9tIHN0cmluZyB0byBzdHJpbmcuCisgKgorICogQHBhcmFtW2luXSAgc3RyICAgIHRoZSBzdHJpbmcgdG8gcGFyc2UuCisgKiBAcGFyYW1bb3V0XSByZXN1bHQgcmVmZXJlbmNlIHRvIG9iamVjdCB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0LgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiBjb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBjb252ZXJ0VG88c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPihjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBzdGQ6OnN0cmluZyAmcmVzdWx0KQoreworICAgIHJlc3VsdCA9IHN0cjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgdXRpbGl0aWVzCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IGUxODRkOTcuLmU4ZWYyNGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMjMsOCArMjMsMTAgQEAKIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAogICAgIENhbWVyYVNlcnZpY2UuY3BwIFwKICAgICBDYW1lcmFEZXZpY2VGYWN0b3J5LmNwcCBcCisgICAgQ2FtZXJhRmxhc2hsaWdodC5jcHAgXAogICAgIGNvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAgXAogICAgIGNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmNwcCBcCisgICAgY29tbW9uL0NhbWVyYU1vZHVsZS5jcHAgXAogICAgIGNvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwIFwKICAgICBhcGkxL0NhbWVyYUNsaWVudC5jcHAgXAogICAgIGFwaTEvQ2FtZXJhMkNsaWVudC5jcHAgXApAQCAtNDAsNyArNDIsNiBAQAogICAgIGFwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcCBcCiAgICAgYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuY3BwIFwKICAgICBhcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgXAotICAgIGFwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5jcHAgXAogICAgIGRldmljZTIvQ2FtZXJhMkRldmljZS5jcHAgXAogICAgIGRldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgXAogICAgIGRldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAgXApAQCAtNTIsNiArNTMsNyBAQAogICAgIGRldmljZTMvU3RhdHVzVHJhY2tlci5jcHAgXAogICAgIGd1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwIFwKICAgICB1dGlscy9DYW1lcmFUcmFjZXMuY3BwIFwKKyAgICB1dGlscy9BdXRvQ29uZGl0aW9uTG9jay5jcHAgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTOj0gXAogICAgIGxpYnVpIFwKQEAgLTYwLDYgKzYyLDcgQEAKICAgICBsaWJiaW5kZXIgXAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlibWVkaWEgXAorICAgIGxpYm1lZGlhdXRpbHMgXAogICAgIGxpYmNhbWVyYV9jbGllbnQgXAogICAgIGxpYmd1aSBcCiAgICAgbGliaGFyZHdhcmUgXApAQCAtNzAsNiArNzMsNyBAQAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIFwKICAgICBzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCisgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKICAgICBleHRlcm5hbC9qcGVnCiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRGV2aWNlRmFjdG9yeS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFEZXZpY2VGYWN0b3J5LmNwcAppbmRleCBiZmVmNTBlLi42NTg5ZTI3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFEZXZpY2VGYWN0b3J5LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFEZXZpY2VGYWN0b3J5LmNwcApAQCAtNDgsNiArNDgsNyBAQAogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zOgogICAgICAgICAgICAgZGV2aWNlID0gbmV3IENhbWVyYTNEZXZpY2UoY2FtZXJhSWQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MGJiOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmNwcApAQCAtMCwwICsxLDg4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhRmxhc2hsaWdodCIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgImNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgIkNhbWVyYUZsYXNobGlnaHQuaCIKKyNpbmNsdWRlICJndWkvSUdyYXBoaWNCdWZmZXJDb25zdW1lci5oIgorI2luY2x1ZGUgImd1aS9CdWZmZXJRdWV1ZS5oIgorI2luY2x1ZGUgImNhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmgiCisjaW5jbHVkZSAiQ2FtZXJhRGV2aWNlRmFjdG9yeS5oIgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYW1lcmFGbGFzaGxpZ2h0IGltcGxlbWVudGF0aW9uIGJlZ2lucworLy8gdXNlZCBieSBjYW1lcmEgc2VydmljZSB0byBjb250cm9sIGZsYXNoZmxpZ2h0LgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitDYW1lcmFGbGFzaGxpZ2h0OjpDYW1lcmFGbGFzaGxpZ2h0KENhbWVyYU1vZHVsZSYgY2FtZXJhTW9kdWxlLAorICAgICAgICBjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190JiBjYWxsYmFja3MpIDoKKyAgICAgICAgbUNhbWVyYU1vZHVsZSgmY2FtZXJhTW9kdWxlKSwKKyAgICAgICAgbUNhbGxiYWNrcygmY2FsbGJhY2tzKSwKKyAgICAgICAgbUZsYXNobGlnaHRNYXBJbml0aWFsaXplZChmYWxzZSkgeworfQorCitDYW1lcmFGbGFzaGxpZ2h0Ojp+Q2FtZXJhRmxhc2hsaWdodCgpIHsKK30KKworc3RhdHVzX3QgQ2FtZXJhRmxhc2hsaWdodDo6Y3JlYXRlRmxhc2hsaWdodENvbnRyb2woY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpIHsKKyAgICBBTE9HVigiJXM6IGNyZWF0aW5nIGEgZmxhc2ggbGlnaHQgY29udHJvbCBmb3IgY2FtZXJhICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgIGlmIChtRmxhc2hDb250cm9sICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgaWYgKG1DYW1lcmFNb2R1bGUtPmdldE1vZHVsZUFwaVZlcnNpb24oKSA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfNCkgeworICAgICAgICBtRmxhc2hDb250cm9sID0gbmV3IE1vZHVsZUZsYXNoQ29udHJvbCgqbUNhbWVyYU1vZHVsZSwgKm1DYWxsYmFja3MpOworICAgICAgICBpZiAobUZsYXNoQ29udHJvbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IGNhbm5vdCBjcmVhdGUgZmxhc2ggY29udHJvbCBmb3IgbW9kdWxlIGFwaSB2Mi40KyIsCisgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQzMl90IGRldmljZVZlcnNpb24gPSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDsKKworICAgICAgICBpZiAobUNhbWVyYU1vZHVsZS0+Z2V0TW9kdWxlQXBpVmVyc2lvbigpID49CisgICAgICAgICAgICAgICAgICAgIENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8wKSB7CisgICAgICAgICAgICBjYW1lcmFfaW5mbyBpbmZvOworICAgICAgICAgICAgcmVzID0gbUNhbWVyYU1vZHVsZS0+Z2V0Q2FtZXJhSW5mbygKKyAgICAgICAgICAgICAgICAgICAgYXRvaShTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSksICZpbmZvKTsKKyAgICAgICAgICAgIGlmIChyZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBnZXQgY2FtZXJhIGluZm8gZm9yIGNhbWVyYSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlVmVyc2lvbiA9IGluZm8uZGV2aWNlX3ZlcnNpb247CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMCkgeworICAgICAgICAgICAgQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sICpmbGFzaENvbnRyb2wgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sKCptQ2FtZXJhTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptQ2FsbGJhY2tzKTsKKyAgICAgICAgICAgIGlmICghZmxhc2hDb250cm9sKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUZsYXNoQ29udHJvbCA9IGZsYXNoQ29udHJvbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GbGFzaENvbnRyb2wgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2woKm1DYW1lcmFNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbUNhbGxiYWNrcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYUZsYXNobGlnaHQ6OnNldFRvcmNoTW9kZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCBlbmFibGVkKSB7CisgICAgaWYgKCFtRmxhc2hsaWdodE1hcEluaXRpYWxpemVkKSB7CisgICAgICAgIEFMT0dFKCIlczogZmluZEZsYXNoVW5pdHMoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhpcyBtZXRob2QuIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIEFMT0dWKCIlczogc2V0IHRvcmNoIG1vZGUgb2YgY2FtZXJhICVzIHRvICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIGVuYWJsZWQpOworCisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgaWYgKG1PcGVuZWRDYW1lcmFJZHMuaW5kZXhPZihjYW1lcmFJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgLy8gVGhpcyBjYXNlIGlzIG5lZWRlZCB0byBhdm9pZCBzdGF0ZSBjb3JydXB0aW9uIGR1cmluZyB0aGUgZm9sbG93aW5nIGNhbGwgc2VxdWVuY2U6CisgICAgICAgIC8vIENhbWVyYVNlcnZpY2U6OnNldFRvcmNoTW9kZSBmb3IgY2FtZXJhIElEIDAgYmVnaW5zLCBkb2VzIHRvcmNoIHN0YXR1cyBjaGVja3MKKyAgICAgICAgLy8gQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBmb3IgY2FtZXJhIElEIDAgYmVnaW5zLCBjYWxscyBwcmVwYXJlRGV2aWNlT3BlbiwgZW5kcworICAgICAgICAvLyBDYW1lcmFTZXJ2aWNlOjpzZXRUb3JjaE1vZGUgZm9yIGNhbWVyYSBJRCAwIGNvbnRpbnVlcywgY2FsbHMKKyAgICAgICAgLy8gICAgICAgIENhbWVyYUZsYXNobGlnaHQ6OnNldFRvcmNoTW9kZQorCisgICAgICAgIC8vIFRPRE86IE1vdmUgdG9yY2ggc3RhdHVzIGNoZWNrcyBhbmQgc3RhdGUgdXBkYXRlcyBiZWhpbmQgdGhpcyBDYW1lcmFGbGFzaGxpZ2h0IGxvY2sKKyAgICAgICAgLy8gdG8gYXZvaWQgb3RoZXIgc2ltaWxhciByYWNlIGNvbmRpdGlvbnMuCisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhIGRldmljZSAlcyBpcyBpbiB1c2UsIGNhbm5vdCBzZXQgdG9yY2ggbW9kZS4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gLUVCVVNZOworICAgIH0KKworICAgIGlmIChtRmxhc2hDb250cm9sID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGVuYWJsZWQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIHJlcyA9IGNyZWF0ZUZsYXNobGlnaHRDb250cm9sKGNhbWVyYUlkKTsKKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICByZXMgPSAgbUZsYXNoQ29udHJvbC0+c2V0VG9yY2hNb2RlKGNhbWVyYUlkLCBlbmFibGVkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBpZiBmbGFzaCBjb250cm9sIGFscmVhZHkgZXhpc3RzLCB0dXJuaW5nIG9uIHRvcmNoIG1vZGUgbWF5IGZhaWwgaWYgaXQncworICAgIC8vIHRpZWQgdG8gYW5vdGhlciBjYW1lcmEgZGV2aWNlIGZvciBtb2R1bGUgdjIuMyBhbmQgYmVsb3cuCisgICAgcmVzID0gbUZsYXNoQ29udHJvbC0+c2V0VG9yY2hNb2RlKGNhbWVyYUlkLCBlbmFibGVkKTsKKyAgICBpZiAocmVzID09IEJBRF9JTkRFWCkgeworICAgICAgICAvLyBmbGFzaCBjb250cm9sIGlzIHRpZWQgdG8gYW5vdGhlciBjYW1lcmEgZGV2aWNlLCBuZWVkIHRvIGNsb3NlIGl0IGFuZAorICAgICAgICAvLyB0cnkgYWdhaW4uCisgICAgICAgIG1GbGFzaENvbnRyb2wuY2xlYXIoKTsKKyAgICAgICAgcmVzID0gY3JlYXRlRmxhc2hsaWdodENvbnRyb2woY2FtZXJhSWQpOworICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIHJlcyA9IG1GbGFzaENvbnRyb2wtPnNldFRvcmNoTW9kZShjYW1lcmFJZCwgZW5hYmxlZCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQ2FtZXJhRmxhc2hsaWdodDo6ZmluZEZsYXNoVW5pdHMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHN0YXR1c190IHJlczsKKyAgICBpbnQzMl90IG51bUNhbWVyYXMgPSBtQ2FtZXJhTW9kdWxlLT5nZXROdW1iZXJPZkNhbWVyYXMoKTsKKworICAgIG1IYXNGbGFzaGxpZ2h0TWFwLmNsZWFyKCk7CisgICAgbUZsYXNobGlnaHRNYXBJbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIGJvb2wgaGFzRmxhc2ggPSBmYWxzZTsKKyAgICAgICAgU3RyaW5nOCBpZCA9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCBpKTsKKworICAgICAgICByZXMgPSBjcmVhdGVGbGFzaGxpZ2h0Q29udHJvbChpZCk7CisgICAgICAgIGlmIChyZXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNyZWF0ZSBmbGFzaCBjb250cm9sIGZvciAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgaWQuc3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gbUZsYXNoQ29udHJvbC0+aGFzRmxhc2hVbml0KGlkLCAmaGFzRmxhc2gpOworICAgICAgICAgICAgaWYgKHJlcyA9PSAtRVVTRVJTIHx8IHJlcyA9PSAtRUJVU1kpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjaGVjayBpZiBjYW1lcmEgJXMgaGFzIGEgZmxhc2ggdW5pdC4gU29tZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FtZXJhIGRldmljZXMgbWF5IGJlIG9wZW5lZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjaGVjayBpZiBjYW1lcmEgJXMgaGFzIGEgZmxhc2ggdW5pdC4gJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAiICglZCkiLCBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpLCBzdHJlcnJvcigtcmVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1GbGFzaENvbnRyb2wuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBtSGFzRmxhc2hsaWdodE1hcC5hZGQoaWQsIGhhc0ZsYXNoKTsKKyAgICB9CisKKyAgICBtRmxhc2hsaWdodE1hcEluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQ2FtZXJhRmxhc2hsaWdodDo6aGFzRmxhc2hVbml0KGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CisgICAgc3RhdHVzX3QgcmVzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHJldHVybiBoYXNGbGFzaFVuaXRMb2NrZWQoY2FtZXJhSWQpOworfQorCitib29sIENhbWVyYUZsYXNobGlnaHQ6Omhhc0ZsYXNoVW5pdExvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgeworICAgIGlmICghbUZsYXNobGlnaHRNYXBJbml0aWFsaXplZCkgeworICAgICAgICBBTE9HRSgiJXM6IGZpbmRGbGFzaFVuaXRzKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgbWV0aG9kLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3NpemVfdCBpbmRleCA9IG1IYXNGbGFzaGxpZ2h0TWFwLmluZGV4T2ZLZXkoY2FtZXJhSWQpOworICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSAlcyBub3QgcHJlc2VudCB3aGVuIGZpbmRGbGFzaFVuaXRzKCkgd2FzIGNhbGxlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gbUhhc0ZsYXNobGlnaHRNYXAudmFsdWVBdChpbmRleCk7Cit9CisKK3N0YXR1c190IENhbWVyYUZsYXNobGlnaHQ6OnByZXBhcmVEZXZpY2VPcGVuKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CisgICAgQUxPR1YoIiVzOiBwcmVwYXJlIGZvciBkZXZpY2Ugb3BlbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgaWYgKCFtRmxhc2hsaWdodE1hcEluaXRpYWxpemVkKSB7CisgICAgICAgIEFMT0dFKCIlczogZmluZEZsYXNoVW5pdHMoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhpcyBtZXRob2QuIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmIChtQ2FtZXJhTW9kdWxlLT5nZXRNb2R1bGVBcGlWZXJzaW9uKCkgPCBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfNCkgeworICAgICAgICAvLyBmcmFtZXdvcmsgaXMgZ29pbmcgdG8gb3BlbiBhIGNhbWVyYSBkZXZpY2UsIGFsbCBmbGFzaCBsaWdodCBjb250cm9sCisgICAgICAgIC8vIHNob3VsZCBiZSBjbG9zZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgc3VwcG9ydC4KKyAgICAgICAgbUZsYXNoQ29udHJvbC5jbGVhcigpOworCisgICAgICAgIGlmIChtT3BlbmVkQ2FtZXJhSWRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBub3RpZnkgdG9yY2ggdW5hdmFpbGFibGUgZm9yIGFsbCBjYW1lcmFzIHdpdGggYSBmbGFzaAorICAgICAgICAgICAgaW50IG51bUNhbWVyYXMgPSBtQ2FtZXJhTW9kdWxlLT5nZXROdW1iZXJPZkNhbWVyYXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhc0ZsYXNoVW5pdExvY2tlZChTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgaSkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja3MtPnRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZShtQ2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBpKS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT1JDSF9NT0RFX1NUQVRVU19OT1RfQVZBSUxBQkxFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjbG9zZSBmbGFzaCBjb250cm9sIHRoYXQgbWF5IGJlIG9wZW5lZCBieSBjYWxsaW5nIGhhc0ZsYXNoVW5pdExvY2tlZC4KKyAgICAgICAgbUZsYXNoQ29udHJvbC5jbGVhcigpOworICAgIH0KKworICAgIGlmIChtT3BlbmVkQ2FtZXJhSWRzLmluZGV4T2YoY2FtZXJhSWQpID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIG1PcGVuZWRDYW1lcmFJZHMuYWRkKGNhbWVyYUlkKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYUZsYXNobGlnaHQ6OmRldmljZUNsb3NlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgeworICAgIEFMT0dWKCIlczogZGV2aWNlICVzIGlzIGNsb3NlZCIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCkpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGlmICghbUZsYXNobGlnaHRNYXBJbml0aWFsaXplZCkgeworICAgICAgICBBTE9HRSgiJXM6IGZpbmRGbGFzaFVuaXRzKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgbWV0aG9kLiIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbU9wZW5lZENhbWVyYUlkcy5pbmRleE9mKGNhbWVyYUlkKTsKKyAgICBpZiAoaW5kZXggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjb3VsZG4ndCBmaW5kIGNhbWVyYSAlcyBpbiB0aGUgb3BlbmVkIGxpc3QiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1PcGVuZWRDYW1lcmFJZHMucmVtb3ZlQXQoaW5kZXgpOworICAgIH0KKworICAgIC8vIENhbm5vdCBkbyBhbnl0aGluZyB1bnRpbCBhbGwgY2FtZXJhcyBhcmUgY2xvc2VkLgorICAgIGlmIChtT3BlbmVkQ2FtZXJhSWRzLnNpemUoKSAhPSAwKQorICAgICAgICByZXR1cm4gT0s7CisKKyAgICBpZiAobUNhbWVyYU1vZHVsZS0+Z2V0TW9kdWxlQXBpVmVyc2lvbigpIDwgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzQpIHsKKyAgICAgICAgLy8gbm90aWZ5IHRvcmNoIGF2YWlsYWJsZSBmb3IgYWxsIGNhbWVyYXMgd2l0aCBhIGZsYXNoCisgICAgICAgIGludCBudW1DYW1lcmFzID0gbUNhbWVyYU1vZHVsZS0+Z2V0TnVtYmVyT2ZDYW1lcmFzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaGFzRmxhc2hVbml0TG9ja2VkKFN0cmluZzg6OmZvcm1hdCgiJWQiLCBpKSkpIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UobUNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBpKS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRPUkNIX01PREVfU1RBVFVTX0FWQUlMQUJMRV9PRkYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorLy8gQ2FtZXJhRmxhc2hsaWdodCBpbXBsZW1lbnRhdGlvbiBlbmRzCisKKworRmxhc2hDb250cm9sQmFzZTo6fkZsYXNoQ29udHJvbEJhc2UoKSB7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTW9kdWxlRmxhc2hDb250cm9sIGltcGxlbWVudGF0aW9uIGJlZ2lucworLy8gRmxhc2ggY29udHJvbCBmb3IgY2FtZXJhIG1vZHVsZSB2Mi40IGFuZCBhYm92ZS4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworTW9kdWxlRmxhc2hDb250cm9sOjpNb2R1bGVGbGFzaENvbnRyb2woQ2FtZXJhTW9kdWxlJiBjYW1lcmFNb2R1bGUsCisgICAgICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QmIGNhbGxiYWNrcykgOgorICAgIG1DYW1lcmFNb2R1bGUoJmNhbWVyYU1vZHVsZSkgeworfQorCitNb2R1bGVGbGFzaENvbnRyb2w6On5Nb2R1bGVGbGFzaENvbnRyb2woKSB7Cit9CisKK3N0YXR1c190IE1vZHVsZUZsYXNoQ29udHJvbDo6aGFzRmxhc2hVbml0KGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sICpoYXNGbGFzaCkgeworICAgIGlmICghaGFzRmxhc2gpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqaGFzRmxhc2ggPSBmYWxzZTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBjYW1lcmFfaW5mbyBpbmZvOworICAgIHN0YXR1c190IHJlcyA9IG1DYW1lcmFNb2R1bGUtPmdldENhbWVyYUluZm8oYXRvaShjYW1lcmFJZC5zdHJpbmcoKSksCisgICAgICAgICAgICAmaW5mbyk7CisgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgbWV0YWRhdGEgPSBpbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBmbGFzaEF2YWlsYWJsZSA9CisgICAgICAgICAgICBtZXRhZGF0YS5maW5kKEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEUpOworICAgIGlmIChmbGFzaEF2YWlsYWJsZS5jb3VudCA9PSAxICYmIGZsYXNoQXZhaWxhYmxlLmRhdGEudThbMF0gPT0gMSkgeworICAgICAgICAqaGFzRmxhc2ggPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTW9kdWxlRmxhc2hDb250cm9sOjpzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgZW5hYmxlZCkgeworICAgIEFMT0dWKCIlczogc2V0IGNhbWVyYSAlcyB0b3JjaCBtb2RlIHRvICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIGVuYWJsZWQpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHJldHVybiBtQ2FtZXJhTW9kdWxlLT5zZXRUb3JjaE1vZGUoY2FtZXJhSWQuc3RyaW5nKCksIGVuYWJsZWQpOworfQorLy8gTW9kdWxlRmxhc2hDb250cm9sIGltcGxlbWVudGF0aW9uIGVuZHMKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2wgaW1wbGVtZW50YXRpb24gYmVnaW5zCisvLyBGbGFzaCBjb250cm9sIGZvciBjYW1lcmEgbW9kdWxlIDw9IHYyLjMgYW5kIGNhbWVyYSBIQUwgdjItdjMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sOjpDYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2woCisgICAgICAgIENhbWVyYU1vZHVsZSYgY2FtZXJhTW9kdWxlLAorICAgICAgICBjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190JiBjYWxsYmFja3MpIDoKKyAgICAgICAgbUNhbWVyYU1vZHVsZSgmY2FtZXJhTW9kdWxlKSwKKyAgICAgICAgbUNhbGxiYWNrcygmY2FsbGJhY2tzKSwKKyAgICAgICAgbVRvcmNoRW5hYmxlZChmYWxzZSksCisgICAgICAgIG1NZXRhZGF0YShOVUxMKSwKKyAgICAgICAgbVN0cmVhbWluZyhmYWxzZSkgeworfQorCitDYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2w6On5DYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2woKSB7CisgICAgZGlzY29ubmVjdENhbWVyYURldmljZSgpOworICAgIGlmIChtTWV0YWRhdGEpIHsKKyAgICAgICAgZGVsZXRlIG1NZXRhZGF0YTsKKyAgICB9CisKKyAgICBtU3VyZmFjZS5jbGVhcigpOworICAgIG1TdXJmYWNlVGV4dHVyZS5jbGVhcigpOworICAgIG1Qcm9kdWNlci5jbGVhcigpOworICAgIG1Db25zdW1lci5jbGVhcigpOworCisgICAgaWYgKG1Ub3JjaEVuYWJsZWQpIHsKKyAgICAgICAgaWYgKG1DYWxsYmFja3MpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogbm90aWZ5IHRoZSBmcmFtZXdvcmsgdGhhdCB0b3JjaCB3YXMgdHVybmVkIG9mZiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBtQ2FsbGJhY2tzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UobUNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkLnN0cmluZygpLCBUT1JDSF9NT0RFX1NUQVRVU19BVkFJTEFCTEVfT0ZGKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sOjppbml0aWFsaXplU3VyZmFjZSgKKyAgICAgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZtUHJvZHVjZXIsICZtQ29uc3VtZXIpOworCisgICAgbVN1cmZhY2VUZXh0dXJlID0gbmV3IEdMQ29uc3VtZXIobUNvbnN1bWVyLCAwLCBHTENvbnN1bWVyOjpURVhUVVJFX0VYVEVSTkFMLAorICAgICAgICAgICAgdHJ1ZSwgdHJ1ZSk7CisgICAgaWYgKG1TdXJmYWNlVGV4dHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgaW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CisgICAgcmVzID0gbVN1cmZhY2VUZXh0dXJlLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJlcyA9IG1TdXJmYWNlVGV4dHVyZS0+c2V0RGVmYXVsdEJ1ZmZlckZvcm1hdChmb3JtYXQpOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtU3VyZmFjZSA9IG5ldyBTdXJmYWNlKG1Qcm9kdWNlciwgLyp1c2VBc3luYyovIHRydWUpOworICAgIGlmIChtU3VyZmFjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1TdXJmYWNlLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsCisgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1VOS05PV04sIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsICZtU3RyZWFtSWQpOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXMgPSBkZXZpY2UtPmNvbmZpZ3VyZVN0cmVhbXMoKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sOjpnZXRTbWFsbGVzdFN1cmZhY2VTaXplKAorICAgICAgICBjb25zdCBjYW1lcmFfaW5mbyYgaW5mbywgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgeworICAgIGlmICghd2lkdGggfHwgIWhlaWdodCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludDMyX3QgdyA9IElOVDMyX01BWDsKKyAgICBpbnQzMl90IGggPSAxOworCisgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgbWV0YWRhdGEgPSBpbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBzdHJlYW1Db25maWdzID0KKyAgICAgICAgICAgIG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJlYW1Db25maWdzLmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgaW50MzJfdCBmbXQgPSBzdHJlYW1Db25maWdzLmRhdGEuaTMyW2ldOworICAgICAgICBpZiAoZm10ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKKyAgICAgICAgICAgIGludDMyX3Qgd3cgPSBzdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyAxXTsKKyAgICAgICAgICAgIGludDMyX3QgaGggPSBzdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyAyXTsKKworICAgICAgICAgICAgaWYgKHcgKiBoID4gd3cgKiBoaCkgeworICAgICAgICAgICAgICAgIHcgPSB3dzsKKyAgICAgICAgICAgICAgICBoID0gaGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpZiBzdHJlYW0gY29uZmlndXJhdGlvbiBpcyBub3QgZm91bmQsIHRyeSBhdmFpbGFibGUgcHJvY2Vzc2VkIHNpemVzLgorICAgIGlmIChzdHJlYW1Db25maWdzLmNvdW50ID09IDApIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzID0KKyAgICAgICAgICAgIG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1BST0NFU1NFRF9TSVpFUyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuY291bnQ7IGkgKz0gMikgeworICAgICAgICAgICAgaW50MzJfdCB3dyA9IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmRhdGEuaTMyW2ldOworICAgICAgICAgICAgaW50MzJfdCBoaCA9IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmRhdGEuaTMyW2kgKyAxXTsKKyAgICAgICAgICAgIGlmICh3ICogaCA+IHd3ICogaGgpIHsKKyAgICAgICAgICAgICAgICB3ID0gd3c7CisgICAgICAgICAgICAgICAgaCA9IGhoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHcgPT0gSU5UMzJfTUFYKSB7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICAqd2lkdGggPSB3OworICAgICpoZWlnaHQgPSBoOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2w6OmNvbm5lY3RDYW1lcmFEZXZpY2UoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CisgICAgY2FtZXJhX2luZm8gaW5mbzsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ2FtZXJhTW9kdWxlLT5nZXRDYW1lcmFJbmZvKGF0b2koY2FtZXJhSWQuc3RyaW5nKCkpLCAmaW5mbyk7CisgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGdldCBjYW1lcmEgaW5mbyBmb3IgY2FtZXJhICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPQorICAgICAgICAgICAgQ2FtZXJhRGV2aWNlRmFjdG9yeTo6Y3JlYXRlRGV2aWNlKGF0b2koY2FtZXJhSWQuc3RyaW5nKCkpKTsKKyAgICBpZiAoZGV2aWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICByZXMgPSBkZXZpY2UtPmluaXRpYWxpemUobUNhbWVyYU1vZHVsZSk7CisgICAgaWYgKHJlcykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICByZXMgPSBnZXRTbWFsbGVzdFN1cmZhY2VTaXplKGluZm8sICZ3aWR0aCwgJmhlaWdodCk7CisgICAgaWYgKHJlcykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICByZXMgPSBpbml0aWFsaXplU3VyZmFjZShkZXZpY2UsIHdpZHRoLCBoZWlnaHQpOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtQ2FtZXJhSWQgPSBjYW1lcmFJZDsKKyAgICBtU3RyZWFtaW5nID0gKGluZm8uZGV2aWNlX3ZlcnNpb24gPD0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzEpOworICAgIG1EZXZpY2UgPSBkZXZpY2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbDo6ZGlzY29ubmVjdENhbWVyYURldmljZSgpIHsKKyAgICBpZiAobURldmljZSAhPSBOVUxMKSB7CisgICAgICAgIG1EZXZpY2UtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgbURldmljZS5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworCisKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbDo6aGFzRmxhc2hVbml0KGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICBib29sICpoYXNGbGFzaCkgeworICAgIEFMT0dWKCIlczogY2hlY2tpbmcgaWYgY2FtZXJhICVzIGhhcyBhIGZsYXNoIHVuaXQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgcmV0dXJuIGhhc0ZsYXNoVW5pdExvY2tlZChjYW1lcmFJZCwgaGFzRmxhc2gpOworCit9CisKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbDo6aGFzRmxhc2hVbml0TG9ja2VkKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCAqaGFzRmxhc2gpIHsKKyAgICBpZiAoIWhhc0ZsYXNoKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgY2FtZXJhX2luZm8gaW5mbzsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ2FtZXJhTW9kdWxlLT5nZXRDYW1lcmFJbmZvKAorICAgICAgICAgICAgYXRvaShjYW1lcmFJZC5zdHJpbmcoKSksICZpbmZvKTsKKyAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gZ2V0IGNhbWVyYSBpbmZvIGZvciBjYW1lcmEgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOworICAgIG1ldGFkYXRhID0gaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljczsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZmxhc2hBdmFpbGFibGUgPQorICAgICAgICAgICAgbWV0YWRhdGEuZmluZChBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFKTsKKyAgICBpZiAoZmxhc2hBdmFpbGFibGUuY291bnQgPT0gMSAmJiBmbGFzaEF2YWlsYWJsZS5kYXRhLnU4WzBdID09IDEpIHsKKyAgICAgICAgKmhhc0ZsYXNoID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbDo6c3VibWl0VG9yY2hFbmFibGVkUmVxdWVzdCgpIHsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBpZiAobU1ldGFkYXRhID09IE5VTEwpIHsKKyAgICAgICAgbU1ldGFkYXRhID0gbmV3IENhbWVyYU1ldGFkYXRhKCk7CisgICAgICAgIGlmIChtTWV0YWRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICByZXMgPSBtRGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdCgKKyAgICAgICAgICAgICAgICBDQU1FUkEzX1RFTVBMQVRFX1BSRVZJRVcsIG1NZXRhZGF0YSk7CisgICAgICAgIGlmIChyZXMpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1aW50OF90IHRvcmNoT24gPSBBTkRST0lEX0ZMQVNIX01PREVfVE9SQ0g7CisgICAgbU1ldGFkYXRhLT51cGRhdGUoQU5EUk9JRF9GTEFTSF9NT0RFLCAmdG9yY2hPbiwgMSk7CisgICAgbU1ldGFkYXRhLT51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TLCAmbVN0cmVhbUlkLCAxKTsKKworICAgIHVpbnQ4X3QgYWVNb2RlID0gQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT047CisgICAgbU1ldGFkYXRhLT51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX01PREUsICZhZU1vZGUsIDEpOworCisgICAgaW50MzJfdCByZXF1ZXN0SWQgPSAwOworICAgIG1NZXRhZGF0YS0+dXBkYXRlKEFORFJPSURfUkVRVUVTVF9JRCwgJnJlcXVlc3RJZCwgMSk7CisKKyAgICBpZiAobVN0cmVhbWluZykgeworICAgICAgICByZXMgPSBtRGV2aWNlLT5zZXRTdHJlYW1pbmdSZXF1ZXN0KCptTWV0YWRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IG1EZXZpY2UtPmNhcHR1cmUoKm1NZXRhZGF0YSk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKworCisKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbDo6c2V0VG9yY2hNb2RlKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCBlbmFibGVkKSB7CisgICAgYm9vbCBoYXNGbGFzaCA9IGZhbHNlOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHN0YXR1c190IHJlcyA9IGhhc0ZsYXNoVW5pdExvY2tlZChjYW1lcmFJZCwgJmhhc0ZsYXNoKTsKKworICAgIC8vIHByZS1jaGVjaworICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIC8vIGludmFsaWQgY2FtZXJhPworICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAvLyBubyBmbGFzaCB1bml0PworICAgICAgICBpZiAoIWhhc0ZsYXNoKSB7CisgICAgICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICAgICAgfQorICAgICAgICAvLyBhbHJlYWR5IG9wZW5lZCBmb3IgYSBkaWZmZXJlbnQgZGV2aWNlPworICAgICAgICBpZiAobURldmljZSAhPSBOVUxMICYmIGNhbWVyYUlkICE9IG1DYW1lcmFJZCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobURldmljZSA9PSBOVUxMIHx8IGNhbWVyYUlkICE9IG1DYW1lcmFJZCkgeworICAgICAgICAvLyBkaXNhYmxpbmcgdGhlIHRvcmNoIG1vZGUgb2YgYW4gdW4tb3BlbmVkIG9yIGRpZmZlcmVudCBkZXZpY2UuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBkaXNhYmxpbmcgdGhlIHRvcmNoIG1vZGUgb2YgY3VycmVudGx5IG9wZW5lZCBkZXZpY2UKKyAgICAgICAgZGlzY29ubmVjdENhbWVyYURldmljZSgpOworICAgICAgICBtVG9yY2hFbmFibGVkID0gZmFsc2U7CisgICAgICAgIG1DYWxsYmFja3MtPnRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZShtQ2FsbGJhY2tzLAorICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIFRPUkNIX01PREVfU1RBVFVTX0FWQUlMQUJMRV9PRkYpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKG1EZXZpY2UgPT0gTlVMTCkgeworICAgICAgICByZXMgPSBjb25uZWN0Q2FtZXJhRGV2aWNlKGNhbWVyYUlkKTsKKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IHN1Ym1pdFRvcmNoRW5hYmxlZFJlcXVlc3QoKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbVRvcmNoRW5hYmxlZCA9IHRydWU7CisgICAgbUNhbGxiYWNrcy0+dG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlKG1DYWxsYmFja3MsCisgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09OKTsKKyAgICByZXR1cm4gT0s7Cit9CisvLyBDYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2wgaW1wbGVtZW50YXRpb24gZW5kcworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2wgaW1wbGVtZW50YXRpb24gYmVnaW5zCisvLyBGbGFzaCBjb250cm9sIGZvciBjYW1lcmEgbW9kdWxlIDw9IHYyLjMgYW5kIGNhbWVyYSBIQUwgdjEKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2w6OkNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sKAorICAgICAgICBDYW1lcmFNb2R1bGUmIGNhbWVyYU1vZHVsZSwKKyAgICAgICAgY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCYgY2FsbGJhY2tzKSA6CisgICAgICAgIG1DYW1lcmFNb2R1bGUoJmNhbWVyYU1vZHVsZSksCisgICAgICAgIG1DYWxsYmFja3MoJmNhbGxiYWNrcyksCisgICAgICAgIG1Ub3JjaEVuYWJsZWQoZmFsc2UpIHsKKworfQorCitDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6fkNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sKCkgeworICAgIGRpc2Nvbm5lY3RDYW1lcmFEZXZpY2UoKTsKKworICAgIG1TdXJmYWNlLmNsZWFyKCk7CisgICAgbVN1cmZhY2VUZXh0dXJlLmNsZWFyKCk7CisgICAgbVByb2R1Y2VyLmNsZWFyKCk7CisgICAgbUNvbnN1bWVyLmNsZWFyKCk7CisKKyAgICBpZiAobVRvcmNoRW5hYmxlZCkgeworICAgICAgICBpZiAobUNhbGxiYWNrcykgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBub3RpZnkgdGhlIGZyYW1ld29yayB0aGF0IHRvcmNoIHdhcyB0dXJuZWQgb2ZmIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIG1DYWxsYmFja3MtPnRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZShtQ2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWQuc3RyaW5nKCksIFRPUkNIX01PREVfU1RBVFVTX0FWQUlMQUJMRV9PRkYpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6c2V0VG9yY2hNb2RlKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCBlbmFibGVkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgLy8gcHJlLWNoZWNrCisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIGJvb2wgaGFzRmxhc2ggPSBmYWxzZTsKKyAgICAgICAgcmVzID0gaGFzRmxhc2hVbml0TG9ja2VkKGNhbWVyYUlkLCAmaGFzRmxhc2gpOworICAgICAgICAvLyBpbnZhbGlkIGNhbWVyYT8KKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgLy8gaGFzRmxhc2hVbml0TG9ja2VkKCkgcmV0dXJucyBCQURfSU5ERVggaWYgbURldmljZSBpcyBjb25uZWN0ZWQgdG8KKyAgICAgICAgICAgIC8vIGFub3RoZXIgY2FtZXJhIGRldmljZS4KKyAgICAgICAgICAgIHJldHVybiByZXMgPT0gQkFEX0lOREVYID8gQkFEX0lOREVYIDogLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAvLyBubyBmbGFzaCB1bml0PworICAgICAgICBpZiAoIWhhc0ZsYXNoKSB7CisgICAgICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobURldmljZSA9PSBOVUxMIHx8IGNhbWVyYUlkICE9IG1DYW1lcmFJZCkgeworICAgICAgICAvLyBkaXNhYmxpbmcgdGhlIHRvcmNoIG1vZGUgb2YgYW4gdW4tb3BlbmVkIG9yIGRpZmZlcmVudCBkZXZpY2UuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBkaXNhYmxpbmcgdGhlIHRvcmNoIG1vZGUgb2YgY3VycmVudGx5IG9wZW5lZCBkZXZpY2UKKyAgICAgICAgZGlzY29ubmVjdENhbWVyYURldmljZSgpOworICAgICAgICBtVG9yY2hFbmFibGVkID0gZmFsc2U7CisgICAgICAgIG1DYWxsYmFja3MtPnRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZShtQ2FsbGJhY2tzLAorICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIFRPUkNIX01PREVfU1RBVFVTX0FWQUlMQUJMRV9PRkYpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgcmVzID0gc3RhcnRQcmV2aWV3QW5kVG9yY2goKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbVRvcmNoRW5hYmxlZCA9IHRydWU7CisgICAgbUNhbGxiYWNrcy0+dG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlKG1DYWxsYmFja3MsCisgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09OKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sOjpoYXNGbGFzaFVuaXQoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sICpoYXNGbGFzaCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICByZXR1cm4gaGFzRmxhc2hVbml0TG9ja2VkKGNhbWVyYUlkLCBoYXNGbGFzaCk7Cit9CisKK3N0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sOjpoYXNGbGFzaFVuaXRMb2NrZWQoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sICpoYXNGbGFzaCkgeworICAgIGlmICghaGFzRmxhc2gpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKG1EZXZpY2UgPT0gTlVMTCkgeworICAgICAgICByZXMgPSBjb25uZWN0Q2FtZXJhRGV2aWNlKGNhbWVyYUlkKTsKKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjYW1lcmFJZCAhPSBtQ2FtZXJhSWQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpmbGFzaE1vZGUgPQorICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfRkxBU0hfTU9ERVMpOworICAgIGlmIChmbGFzaE1vZGUgJiYgc3Ryc3RyKGZsYXNoTW9kZSwgQ2FtZXJhUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9UT1JDSCkpIHsKKyAgICAgICAgKmhhc0ZsYXNoID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAqaGFzRmxhc2ggPSBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sOjpzdGFydFByZXZpZXdBbmRUb3JjaCgpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICByZXMgPSBtRGV2aWNlLT5zdGFydFByZXZpZXcoKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogc3RhcnQgcHJldmlldyBmYWlsZWQuICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbVBhcmFtZXRlcnMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFLAorICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9UT1JDSCk7CisKKyAgICByZXR1cm4gbURldmljZS0+c2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7Cit9CisKK3N0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sOjpnZXRTbWFsbGVzdFN1cmZhY2VTaXplKAorICAgICAgICBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSB7CisgICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaW50MzJfdCB3ID0gSU5UMzJfTUFYOworICAgIGludDMyX3QgaCA9IDE7CisgICAgVmVjdG9yPFNpemU+IHNpemVzOworCisgICAgbVBhcmFtZXRlcnMuZ2V0U3VwcG9ydGVkUHJldmlld1NpemVzKHNpemVzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIFNpemUgcyA9IHNpemVzW2ldOworICAgICAgICBpZiAodyAqIGggPiBzLndpZHRoICogcy5oZWlnaHQpIHsKKyAgICAgICAgICAgIHcgPSBzLndpZHRoOworICAgICAgICAgICAgaCA9IHMuaGVpZ2h0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHcgPT0gSU5UMzJfTUFYKSB7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICAqd2lkdGggPSB3OworICAgICpoZWlnaHQgPSBoOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6aW5pdGlhbGl6ZVByZXZpZXdXaW5kb3coCisgICAgICAgIHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiBkZXZpY2UsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgc3RhdHVzX3QgcmVzOworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmbVByb2R1Y2VyLCAmbUNvbnN1bWVyKTsKKworICAgIG1TdXJmYWNlVGV4dHVyZSA9IG5ldyBHTENvbnN1bWVyKG1Db25zdW1lciwgMCwgR0xDb25zdW1lcjo6VEVYVFVSRV9FWFRFUk5BTCwKKyAgICAgICAgICAgIHRydWUsIHRydWUpOworICAgIGlmIChtU3VyZmFjZVRleHR1cmUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgIHJlcyA9IG1TdXJmYWNlVGV4dHVyZS0+c2V0RGVmYXVsdEJ1ZmZlclNpemUod2lkdGgsIGhlaWdodCk7CisgICAgaWYgKHJlcykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICByZXMgPSBtU3VyZmFjZVRleHR1cmUtPnNldERlZmF1bHRCdWZmZXJGb3JtYXQoZm9ybWF0KTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbVN1cmZhY2UgPSBuZXcgU3VyZmFjZShtUHJvZHVjZXIsIC8qdXNlQXN5bmMqLyB0cnVlKTsKKyAgICBpZiAobVN1cmZhY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QobVN1cmZhY2UuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSk7CisgICAgaWYgKHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25uZWN0IHRvIG5hdGl2ZSB3aW5kb3ciLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJldHVybiBkZXZpY2UtPnNldFByZXZpZXdXaW5kb3cobVN1cmZhY2UpOworfQorCitzdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6Y29ubmVjdENhbWVyYURldmljZSgKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpIHsKKyAgICBzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gZGV2aWNlID0KKyAgICAgICAgICAgIG5ldyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZShjYW1lcmFJZC5zdHJpbmcoKSk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBkZXZpY2UtPmluaXRpYWxpemUobUNhbWVyYU1vZHVsZSk7CisgICAgaWYgKHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IGluaXRpYWxpemluZyBjYW1lcmEgJXMgZmFpbGVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBuZWVkIHRvIHNldCBfX2dldF9tZW1vcnkgaW4gc2V0X2NhbGxiYWNrcygpLgorICAgIGRldmljZS0+c2V0Q2FsbGJhY2tzKE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAgbVBhcmFtZXRlcnMgPSBkZXZpY2UtPmdldFBhcmFtZXRlcnMoKTsKKworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICByZXMgPSBnZXRTbWFsbGVzdFN1cmZhY2VTaXplKCZ3aWR0aCwgJmhlaWdodCk7CisgICAgaWYgKHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBnZXQgc21hbGxlc3Qgc3VyZmFjZSBzaXplIGZvciBjYW1lcmEgJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJlcyA9IGluaXRpYWxpemVQcmV2aWV3V2luZG93KGRldmljZSwgd2lkdGgsIGhlaWdodCk7CisgICAgaWYgKHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBpbml0aWFsaXplIHByZXZpZXcgd2luZG93IGZvciBjYW1lcmEgJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIG1DYW1lcmFJZCA9IGNhbWVyYUlkOworICAgIG1EZXZpY2UgPSBkZXZpY2U7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6ZGlzY29ubmVjdENhbWVyYURldmljZSgpIHsKKyAgICBpZiAobURldmljZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtUGFyYW1ldGVycy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZMQVNIX01PREUsCisgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09GRik7CisgICAgbURldmljZS0+c2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7CisgICAgbURldmljZS0+c3RvcFByZXZpZXcoKTsKKyAgICBzdGF0dXNfdCByZXMgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG1TdXJmYWNlLmdldCgpLAorICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIEFMT0dXKCIlczogbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCBmYWlsZWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorICAgIG1EZXZpY2UtPnNldFByZXZpZXdXaW5kb3coTlVMTCk7CisgICAgbURldmljZS0+cmVsZWFzZSgpOworCisgICAgcmV0dXJuIE9LOworfQorLy8gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2wgaW1wbGVtZW50YXRpb24gZW5kcworCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ1ZmU4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuaApAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFGTEFTSExJR0hUX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFGTEFTSExJR0hUX0gKKworI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYV9jb21tb24uaCIKKyNpbmNsdWRlICJ1dGlscy9LZXllZFZlY3Rvci5oIgorI2luY2x1ZGUgInV0aWxzL1NvcnRlZFZlY3Rvci5oIgorI2luY2x1ZGUgImd1aS9HTENvbnN1bWVyLmgiCisjaW5jbHVkZSAiZ3VpL1N1cmZhY2UuaCIKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgImRldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIEZsYXNoQ29udHJvbEJhc2UgaXMgYSBiYXNlIGNsYXNzIGZvciBmbGFzaCBjb250cm9sLiBJdCBkZWZpbmVzIHRoZSBmdW5jdGlvbnMKKyAqIHRoYXQgYSBmbGFzaCBjb250cm9sIGZvciBlYWNoIGNhbWVyYSBtb2R1bGUvZGV2aWNlIHZlcnNpb24gc2hvdWxkIGltcGxlbWVudC4KKyAqLworY2xhc3MgRmxhc2hDb250cm9sQmFzZSA6IHB1YmxpYyB2aXJ0dWFsIFZpcnR1YWxMaWdodFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+Rmxhc2hDb250cm9sQmFzZSgpOworCisgICAgICAgIC8vIFdoZXRoZXIgYSBjYW1lcmEgZGV2aWNlIGhhcyBhIGZsYXNoIHVuaXQuIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBtYXkKKyAgICAgICAgLy8gY2F1c2UgdGhlIHRvcmNoIG1vZGUgdG8gYmUgdHVybmVkIG9mZiBpbiBIQUwgdjEgZGV2aWNlcy4gSWYKKyAgICAgICAgLy8gcHJldmlvdXNseS1vbiB0b3JjaCBtb2RlIGlzIHR1cm5lZCBvZmYsCisgICAgICAgIC8vIGNhbGxiYWNrcy50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UoKSBzaG91bGQgYmUgaW52b2tlZC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBoYXNGbGFzaFVuaXQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgKmhhc0ZsYXNoKSA9IDA7CisKKyAgICAgICAgLy8gc2V0IHRoZSB0b3JjaCBtb2RlIHRvIG9uIG9yIG9mZi4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCkgPSAwOworfTsKKworLyoqCisgKiBDYW1lcmFGbGFzaGxpZ2h0IGNhbiBiZSB1c2VkIGJ5IGNhbWVyYSBzZXJ2aWNlIHRvIGNvbnRyb2wgZmxhc2hmbGlnaHQuCisgKi8KK2NsYXNzIENhbWVyYUZsYXNobGlnaHQgOiBwdWJsaWMgdmlydHVhbCBWaXJ0dWFsTGlnaHRSZWZCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIENhbWVyYUZsYXNobGlnaHQoQ2FtZXJhTW9kdWxlJiBjYW1lcmFNb2R1bGUsCisgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCYgY2FsbGJhY2tzKTsKKyAgICAgICAgdmlydHVhbCB+Q2FtZXJhRmxhc2hsaWdodCgpOworCisgICAgICAgIC8vIEZpbmQgYWxsIGZsYXNoIHVuaXRzLiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBvdGhlciBtZXRob2RzLiBBbGwKKyAgICAgICAgLy8gY2FtZXJhIGRldmljZXMgbXVzdCBiZSBjbG9zZWQgd2hlbiBpdCdzIGNhbGxlZCBiZWNhdXNlIEhBTCB2MSBkZXZpY2VzCisgICAgICAgIC8vIG5lZWQgdG8gYmUgb3BlbmVkIHRvIHF1ZXJ5IGF2YWlsYWJsZSBmbGFzaCBtb2Rlcy4KKyAgICAgICAgc3RhdHVzX3QgZmluZEZsYXNoVW5pdHMoKTsKKworICAgICAgICAvLyBXaGV0aGVyIGEgY2FtZXJhIGRldmljZSBoYXMgYSBmbGFzaCB1bml0LiBCZWZvcmUgZmluZEZsYXNoVW5pdHMoKSBpcworICAgICAgICAvLyBjYWxsZWQsIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgZmFsc2UuCisgICAgICAgIGJvb2wgaGFzRmxhc2hVbml0KGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKTsKKworICAgICAgICAvLyBzZXQgdGhlIHRvcmNoIG1vZGUgdG8gb24gb3Igb2ZmLgorICAgICAgICBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgLy8gTm90aWZ5IENhbWVyYUZsYXNobGlnaHQgdGhhdCBjYW1lcmEgc2VydmljZSBpcyBnb2luZyB0byBvcGVuIGEgY2FtZXJhCisgICAgICAgIC8vIGRldmljZS4gQ2FtZXJhRmxhc2hsaWdodCB3aWxsIGZyZWUgdGhlIHJlc291cmNlcyB0aGF0IG1heSBjYXVzZSB0aGUKKyAgICAgICAgLy8gY2FtZXJhIG9wZW4gdG8gZmFpbC4gQ2FtZXJhIHNlcnZpY2UgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlCisgICAgICAgIC8vIG9wZW5pbmcgYSBjYW1lcmEgZGV2aWNlLgorICAgICAgICBzdGF0dXNfdCBwcmVwYXJlRGV2aWNlT3Blbihjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CisKKyAgICAgICAgLy8gTm90aWZ5IENhbWVyYUZsYXNobGlnaHQgdGhhdCBjYW1lcmEgc2VydmljZSBoYXMgY2xvc2VkIGEgY2FtZXJhCisgICAgICAgIC8vIGRldmljZS4gQ2FtZXJhRmxhc2hsaWdodCBtYXkgaW52b2tlIGNhbGxiYWNrcyBmb3IgdG9yY2ggbW9kZQorICAgICAgICAvLyBhdmFpbGFibGUgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgc3RhdHVzX3QgZGV2aWNlQ2xvc2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIGNyZWF0ZSBmbGFzaGxpZ2h0IGNvbnRyb2wgYmFzZWQgb24gY2FtZXJhIG1vZHVsZSBBUEkgYW5kIGNhbWVyYQorICAgICAgICAvLyBkZXZpY2UgQVBJIHZlcnNpb25zLgorICAgICAgICBzdGF0dXNfdCBjcmVhdGVGbGFzaGxpZ2h0Q29udHJvbChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CisKKyAgICAgICAgLy8gbUxvY2sgc2hvdWxkIGJlIGxvY2tlZC4KKyAgICAgICAgYm9vbCBoYXNGbGFzaFVuaXRMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpOworCisgICAgICAgIHNwPEZsYXNoQ29udHJvbEJhc2U+IG1GbGFzaENvbnRyb2w7CisgICAgICAgIENhbWVyYU1vZHVsZSAqbUNhbWVyYU1vZHVsZTsKKyAgICAgICAgY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCAqbUNhbGxiYWNrczsKKyAgICAgICAgU29ydGVkVmVjdG9yPFN0cmluZzg+IG1PcGVuZWRDYW1lcmFJZHM7CisKKyAgICAgICAgLy8gY2FtZXJhIGlkIC0+IGlmIGl0IGhhcyBhIGZsYXNoIHVuaXQKKyAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgYm9vbD4gbUhhc0ZsYXNobGlnaHRNYXA7CisgICAgICAgIGJvb2wgbUZsYXNobGlnaHRNYXBJbml0aWFsaXplZDsKKworICAgICAgICBNdXRleCBtTG9jazsgLy8gcHJvdGVjdCBDYW1lcmFGbGFzaGxpZ2h0IEFQSQorfTsKKworLyoqCisgKiBGbGFzaCBjb250cm9sIGZvciBjYW1lcmEgbW9kdWxlIHYyLjQgYW5kIGFib3ZlLgorICovCitjbGFzcyBNb2R1bGVGbGFzaENvbnRyb2wgOiBwdWJsaWMgRmxhc2hDb250cm9sQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICBNb2R1bGVGbGFzaENvbnRyb2woQ2FtZXJhTW9kdWxlJiBjYW1lcmFNb2R1bGUsCisgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCYgY2FsbGJhY2tzKTsKKyAgICAgICAgdmlydHVhbCB+TW9kdWxlRmxhc2hDb250cm9sKCk7CisKKyAgICAgICAgLy8gRmxhc2hDb250cm9sQmFzZQorICAgICAgICBzdGF0dXNfdCBoYXNGbGFzaFVuaXQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoKTsKKyAgICAgICAgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sIGVuYWJsZWQpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgQ2FtZXJhTW9kdWxlICptQ2FtZXJhTW9kdWxlOworCisgICAgICAgIE11dGV4IG1Mb2NrOworfTsKKworLyoqCisgKiBGbGFzaCBjb250cm9sIGZvciBjYW1lcmEgbW9kdWxlIDw9IHYyLjMgYW5kIGNhbWVyYSBIQUwgdjItdjMKKyAqLworY2xhc3MgQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sIDogcHVibGljIEZsYXNoQ29udHJvbEJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sKENhbWVyYU1vZHVsZSYgY2FtZXJhTW9kdWxlLAorICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QmIGNhbGxiYWNrcyk7CisgICAgICAgIHZpcnR1YWwgfkNhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbCgpOworCisgICAgICAgIC8vIEZsYXNoQ29udHJvbEJhc2UKKyAgICAgICAgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sIGVuYWJsZWQpOworICAgICAgICBzdGF0dXNfdCBoYXNGbGFzaFVuaXQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIGNvbm5lY3QgdG8gYSBjYW1lcmEgZGV2aWNlCisgICAgICAgIHN0YXR1c190IGNvbm5lY3RDYW1lcmFEZXZpY2UoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpOworICAgICAgICAvLyBkaXNjb25uZWN0IGFuZCBmcmVlIG1EZXZpY2UKKyAgICAgICAgc3RhdHVzX3QgZGlzY29ubmVjdENhbWVyYURldmljZSgpOworCisgICAgICAgIC8vIGluaXRpYWxpemUgYSBzdXJmYWNlCisgICAgICAgIHN0YXR1c190IGluaXRpYWxpemVTdXJmYWNlKHNwPENhbWVyYURldmljZUJhc2U+JiBkZXZpY2UsIGludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpOworCisgICAgICAgIC8vIHN1Ym1pdCBhIHJlcXVlc3QgdG8gZW5hYmxlIHRoZSB0b3JjaCBtb2RlCisgICAgICAgIHN0YXR1c190IHN1Ym1pdFRvcmNoRW5hYmxlZFJlcXVlc3QoKTsKKworICAgICAgICAvLyBnZXQgdGhlIHNtYWxsZXN0IHN1cmZhY2Ugc2l6ZSBvZiBJTVBMRU1FTlRBVElPTl9ERUZJTkVECisgICAgICAgIHN0YXR1c190IGdldFNtYWxsZXN0U3VyZmFjZVNpemUoY29uc3QgY2FtZXJhX2luZm8mIGluZm8sIGludDMyX3QgKndpZHRoLAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpoZWlnaHQpOworCisgICAgICAgIC8vIHByb3RlY3RlZCBieSBtTG9jaworICAgICAgICBzdGF0dXNfdCBoYXNGbGFzaFVuaXRMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoKTsKKworICAgICAgICBDYW1lcmFNb2R1bGUgKm1DYW1lcmFNb2R1bGU7CisgICAgICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QgKm1DYWxsYmFja3M7CisgICAgICAgIFN0cmluZzggbUNhbWVyYUlkOworICAgICAgICBib29sIG1Ub3JjaEVuYWJsZWQ7CisgICAgICAgIENhbWVyYU1ldGFkYXRhICptTWV0YWRhdGE7CisgICAgICAgIC8vIFdPUktBUk9VTkQ6IHdpbGwgYmUgc2V0IHRvIHRydWUgZm9yIEhBTCB2MiBkZXZpY2VzIHdoZXJlCisgICAgICAgIC8vIHNldFN0cmVhbWluZ1JlcXVlc3QoKSBuZWVkcyB0byBiZSBjYWxsIGZvciB0b3JjaCBtb2RlIHNldHRpbmdzIHRvCisgICAgICAgIC8vIHRha2UgZWZmZWN0LgorICAgICAgICBib29sIG1TdHJlYW1pbmc7CisKKyAgICAgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gbURldmljZTsKKworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICBtQ29uc3VtZXI7CisgICAgICAgIHNwPEdMQ29uc3VtZXI+IG1TdXJmYWNlVGV4dHVyZTsKKyAgICAgICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7CisgICAgICAgIGludDMyX3QgbVN0cmVhbUlkOworCisgICAgICAgIE11dGV4IG1Mb2NrOworfTsKKworLyoqCisgKiBGbGFzaCBjb250cm9sIGZvciBjYW1lcmEgbW9kdWxlIDw9IHYyLjMgYW5kIGNhbWVyYSBIQUwgdjEKKyAqLworY2xhc3MgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2wgOiBwdWJsaWMgRmxhc2hDb250cm9sQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbChDYW1lcmFNb2R1bGUmIGNhbWVyYU1vZHVsZSwKKyAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190JiBjYWxsYmFja3MpOworICAgICAgICB2aXJ0dWFsIH5DYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbCgpOworCisgICAgICAgIC8vIEZsYXNoQ29udHJvbEJhc2UKKyAgICAgICAgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sIGVuYWJsZWQpOworICAgICAgICBzdGF0dXNfdCBoYXNGbGFzaFVuaXQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIGNvbm5lY3QgdG8gYSBjYW1lcmEgZGV2aWNlCisgICAgICAgIHN0YXR1c190IGNvbm5lY3RDYW1lcmFEZXZpY2UoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpOworCisgICAgICAgIC8vIGRpc2Nvbm5lY3QgYW5kIGZyZWUgbURldmljZQorICAgICAgICBzdGF0dXNfdCBkaXNjb25uZWN0Q2FtZXJhRGV2aWNlKCk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgcHJldmlldyB3aW5kb3cKKyAgICAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZVByZXZpZXdXaW5kb3coc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IGRldmljZSwKKyAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKyAgICAgICAgLy8gc3RhcnQgcHJldmlldyBhbmQgZW5hYmxlIHRvcmNoCisgICAgICAgIHN0YXR1c190IHN0YXJ0UHJldmlld0FuZFRvcmNoKCk7CisKKyAgICAgICAgLy8gZ2V0IHRoZSBzbWFsbGVzdCBzdXJmYWNlCisgICAgICAgIHN0YXR1c190IGdldFNtYWxsZXN0U3VyZmFjZVNpemUoaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCk7CisKKyAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCisgICAgICAgIHN0YXR1c190IGhhc0ZsYXNoVW5pdExvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCAqaGFzRmxhc2gpOworCisgICAgICAgIENhbWVyYU1vZHVsZSAqbUNhbWVyYU1vZHVsZTsKKyAgICAgICAgY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCAqbUNhbGxiYWNrczsKKyAgICAgICAgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IG1EZXZpY2U7CisgICAgICAgIFN0cmluZzggbUNhbWVyYUlkOworICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIG1QYXJhbWV0ZXJzOworICAgICAgICBib29sIG1Ub3JjaEVuYWJsZWQ7CisKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAgbUNvbnN1bWVyOworICAgICAgICBzcDxHTENvbnN1bWVyPiBtU3VyZmFjZVRleHR1cmU7CisgICAgICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOworCisgICAgICAgIE11dGV4IG1Mb2NrOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggYTE0NDc1My4uODM5MWYyNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTE3LDkgKzE3LDE0IEBACiAjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNlcnZpY2UiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2xpbWl0cz4KICNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y3RpbWU+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0FwcE9wc01hbmFnZXIuaD4KQEAgLTI3LDYgKzMyLDggQEAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc0luZm9TZXJ2aWNlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFTZXJ2aWNlUHJveHkuaD4KICNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgpAQCAtMzQsNiArNDEsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KQEAgLTQ1LDcgKzUzLDYgQEAKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiYXBpMS9DYW1lcmFDbGllbnQuaCIKICNpbmNsdWRlICJhcGkxL0NhbWVyYTJDbGllbnQuaCIKLSNpbmNsdWRlICJhcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuaCIKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgogI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRyYWNlcy5oIgogI2luY2x1ZGUgIkNhbWVyYURldmljZUZhY3RvcnkuaCIKQEAgLTY2LDI1ICs3Myw0OCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1BpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotfQotCi1zdGF0aWMgaW50IGdldENhbGxpbmdVaWQoKSB7Ci0gICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLX0KLQogZXh0ZXJuICJDIiB7CiBzdGF0aWMgdm9pZCBjYW1lcmFfZGV2aWNlX3N0YXR1c19jaGFuZ2UoCiAgICAgICAgIGNvbnN0IHN0cnVjdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrcyogY2FsbGJhY2tzLAogICAgICAgICBpbnQgY2FtZXJhX2lkLAogICAgICAgICBpbnQgbmV3X3N0YXR1cykgewogICAgIHNwPENhbWVyYVNlcnZpY2U+IGNzID0gY29uc3RfY2FzdDxDYW1lcmFTZXJ2aWNlKj4oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBDYW1lcmFTZXJ2aWNlKj4oY2FsbGJhY2tzKSk7CisKKyAgICBjcy0+b25EZXZpY2VTdGF0dXNDaGFuZ2VkKHN0YXRpY19jYXN0PGNhbWVyYV9kZXZpY2Vfc3RhdHVzX3Q+KGNhbWVyYV9pZCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmFfZGV2aWNlX3N0YXR1c190PihuZXdfc3RhdHVzKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZSgKKyAgICAgICAgY29uc3Qgc3RydWN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzKiBjYWxsYmFja3MsCisgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYV9pZCwKKyAgICAgICAgaW50IG5ld19zdGF0dXMpIHsKKyAgICBpZiAoIWNhbGxiYWNrcyB8fCAhY2FtZXJhX2lkKSB7CisgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHBhcmFtZXRlcnMuIGNhbGxiYWNrcyAlcCwgY2FtZXJhX2lkICVwIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGNhbGxiYWNrcywgY2FtZXJhX2lkKTsKKyAgICB9CisgICAgc3A8Q2FtZXJhU2VydmljZT4gY3MgPSBjb25zdF9jYXN0PENhbWVyYVNlcnZpY2UqPigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQ2FtZXJhU2VydmljZSo+KGNhbGxiYWNrcykpOwogCi0gICAgY3MtPm9uRGV2aWNlU3RhdHVzQ2hhbmdlZCgKLSAgICAgICAgY2FtZXJhX2lkLAotICAgICAgICBuZXdfc3RhdHVzKTsKKyAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUb3JjaFN0YXR1cyBzdGF0dXM7CisgICAgc3dpdGNoIChuZXdfc3RhdHVzKSB7CisgICAgICAgIGNhc2UgVE9SQ0hfTU9ERV9TVEFUVVNfTk9UX0FWQUlMQUJMRToKKyAgICAgICAgICAgIHN0YXR1cyA9IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRPUkNIX1NUQVRVU19OT1RfQVZBSUxBQkxFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09GRjoKKyAgICAgICAgICAgIHN0YXR1cyA9IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRPUkNIX1NUQVRVU19BVkFJTEFCTEVfT0ZGOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09OOgorICAgICAgICAgICAgc3RhdHVzID0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VE9SQ0hfU1RBVFVTX0FWQUlMQUJMRV9PTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVua25vd24gdG9yY2ggc3RhdHVzICVkIiwgbmV3X3N0YXR1cyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY3MtPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKAorICAgICAgICBTdHJpbmc4KGNhbWVyYV9pZCksCisgICAgICAgIHN0YXR1cyk7CiB9CiB9IC8vIGV4dGVybiAiQyIKIApAQCAtOTQsMTM0ICsxMjQsMjk0IEBACiAvLyBzaG91bGQgYmUgb2sgZm9yIG5vdy4KIHN0YXRpYyBDYW1lcmFTZXJ2aWNlICpnQ2FtZXJhU2VydmljZTsKIAotQ2FtZXJhU2VydmljZTo6Q2FtZXJhU2VydmljZSgpCi0gICAgOm1Tb3VuZFJlZigwKSwgbU1vZHVsZSgwKQoteworQ2FtZXJhU2VydmljZTo6Q2FtZXJhU2VydmljZSgpIDogbUV2ZW50TG9nKERFRkFVTFRfRVZFTlRfTE9HX0xFTkdUSCksIG1BbGxvd2VkVXNlcnMoKSwKKyAgICAgICAgbVNvdW5kUmVmKDApLCBtTW9kdWxlKDApLCBtRmxhc2hsaWdodCgwKSB7CiAgICAgQUxPR0koIkNhbWVyYVNlcnZpY2Ugc3RhcnRlZCAocGlkPSVkKSIsIGdldHBpZCgpKTsKICAgICBnQ2FtZXJhU2VydmljZSA9IHRoaXM7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9DQU1FUkFTOyArK2kpIHsKLSAgICAgICAgbVN0YXR1c0xpc3RbaV0gPSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVDsKLSAgICB9Ci0KICAgICB0aGlzLT5jYW1lcmFfZGV2aWNlX3N0YXR1c19jaGFuZ2UgPSBhbmRyb2lkOjpjYW1lcmFfZGV2aWNlX3N0YXR1c19jaGFuZ2U7CisgICAgdGhpcy0+dG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlID0gYW5kcm9pZDo6dG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlOworCisgICAgbVNlcnZpY2VMb2NrV3JhcHBlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8V2FpdGFibGVNdXRleFdyYXBwZXI+KCZtU2VydmljZUxvY2spOwogfQogCiB2b2lkIENhbWVyYVNlcnZpY2U6Om9uRmlyc3RSZWYoKQogewotICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6Om9uRmlyc3RSZWYiKTsKKyAgICBBTE9HSSgiQ2FtZXJhU2VydmljZSBwcm9jZXNzIHN0YXJ0aW5nIik7CiAKICAgICBCbkNhbWVyYVNlcnZpY2U6Om9uRmlyc3RSZWYoKTsKIAotICAgIGlmIChod19nZXRfbW9kdWxlKENBTUVSQV9IQVJEV0FSRV9NT0RVTEVfSUQsCi0gICAgICAgICAgICAgICAgKGNvbnN0IGh3X21vZHVsZV90ICoqKSZtTW9kdWxlKSA8IDApIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBsb2FkIGNhbWVyYSBIQUwgbW9kdWxlIik7CisgICAgLy8gVXBkYXRlIGJhdHRlcnkgbGlmZSB0cmFja2luZyBpZiBzZXJ2aWNlIGlzIHJlc3RhcnRpbmcKKyAgICBCYXR0ZXJ5Tm90aWZpZXImIG5vdGlmaWVyKEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKSk7CisgICAgbm90aWZpZXIubm90ZVJlc2V0Q2FtZXJhKCk7CisgICAgbm90aWZpZXIubm90ZVJlc2V0Rmxhc2hsaWdodCgpOworCisgICAgY2FtZXJhX21vZHVsZV90ICpyYXdNb2R1bGU7CisgICAgaW50IGVyciA9IGh3X2dldF9tb2R1bGUoQ0FNRVJBX0hBUkRXQVJFX01PRFVMRV9JRCwKKyAgICAgICAgICAgIChjb25zdCBod19tb2R1bGVfdCAqKikmcmF3TW9kdWxlKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGxvYWQgY2FtZXJhIEhBTCBtb2R1bGU6ICVkICglcykiLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKKyAgICAgICAgbG9nU2VydmljZUVycm9yKCJDb3VsZCBub3QgbG9hZCBjYW1lcmEgSEFMIG1vZHVsZSIsIGVycik7CiAgICAgICAgIG1OdW1iZXJPZkNhbWVyYXMgPSAwOworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGVsc2UgewotICAgICAgICBBTE9HSSgiTG9hZGVkIFwiJXNcIiBjYW1lcmEgbW9kdWxlIiwgbU1vZHVsZS0+Y29tbW9uLm5hbWUpOwotICAgICAgICBtTnVtYmVyT2ZDYW1lcmFzID0gbU1vZHVsZS0+Z2V0X251bWJlcl9vZl9jYW1lcmFzKCk7Ci0gICAgICAgIGlmIChtTnVtYmVyT2ZDYW1lcmFzID4gTUFYX0NBTUVSQVMpIHsKLSAgICAgICAgICAgIEFMT0dFKCJOdW1iZXIgb2YgY2FtZXJhcyglZCkgPiBNQVhfQ0FNRVJBUyglZCkuIiwKLSAgICAgICAgICAgICAgICAgICAgbU51bWJlck9mQ2FtZXJhcywgTUFYX0NBTUVSQVMpOwotICAgICAgICAgICAgbU51bWJlck9mQ2FtZXJhcyA9IE1BWF9DQU1FUkFTOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mQ2FtZXJhczsgaSsrKSB7Ci0gICAgICAgICAgICBzZXRDYW1lcmFGcmVlKGkpOwotICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24gPj0KLSAgICAgICAgICAgICAgICBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMSkgewotICAgICAgICAgICAgbU1vZHVsZS0+c2V0X2NhbGxiYWNrcyh0aGlzKTsKLSAgICAgICAgfQorICAgIG1Nb2R1bGUgPSBuZXcgQ2FtZXJhTW9kdWxlKHJhd01vZHVsZSk7CisgICAgQUxPR0koIkxvYWRlZCBcIiVzXCIgY2FtZXJhIG1vZHVsZSIsIG1Nb2R1bGUtPmdldE1vZHVsZU5hbWUoKSk7CisgICAgZXJyID0gbU1vZHVsZS0+aW5pdCgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBpbml0aWFsaXplIGNhbWVyYSBIQUwgbW9kdWxlOiAlZCAoJXMpIiwgZXJyLAorICAgICAgICAgICAgc3RyZXJyb3IoLWVycikpOworICAgICAgICBsb2dTZXJ2aWNlRXJyb3IoIkNvdWxkIG5vdCBpbml0aWFsaXplIGNhbWVyYSBIQUwgbW9kdWxlIiwgZXJyKTsKIAotICAgICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjbGVhckdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKLQotICAgICAgICBpZiAobU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbiA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMikgewotICAgICAgICAgICAgc2V0VXBWZW5kb3JUYWdzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBDYW1lcmFEZXZpY2VGYWN0b3J5OjpyZWdpc3RlclNlcnZpY2UodGhpcyk7CisgICAgICAgIG1OdW1iZXJPZkNhbWVyYXMgPSAwOworICAgICAgICBkZWxldGUgbU1vZHVsZTsKKyAgICAgICAgbU1vZHVsZSA9IG51bGxwdHI7CisgICAgICAgIHJldHVybjsKICAgICB9Ci19CiAKLUNhbWVyYVNlcnZpY2U6On5DYW1lcmFTZXJ2aWNlKCkgeworICAgIG1OdW1iZXJPZkNhbWVyYXMgPSBtTW9kdWxlLT5nZXROdW1iZXJPZkNhbWVyYXMoKTsKKyAgICBtTnVtYmVyT2ZOb3JtYWxDYW1lcmFzID0gbU51bWJlck9mQ2FtZXJhczsKKworICAgIG1GbGFzaGxpZ2h0ID0gbmV3IENhbWVyYUZsYXNobGlnaHQoKm1Nb2R1bGUsICp0aGlzKTsKKyAgICBzdGF0dXNfdCByZXMgPSBtRmxhc2hsaWdodC0+ZmluZEZsYXNoVW5pdHMoKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIC8vIGltcG9zc2libGUgYmVjYXVzZSB3ZSBoYXZlbid0IG9wZW4gYW55IGNhbWVyYSBkZXZpY2VzLgorICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZpbmQgZmxhc2ggdW5pdHMuIik7CisgICAgfQorCisgICAgaW50IGxhdGVzdFN0cmFuZ2VDYW1lcmFJZCA9IElOVF9NQVg7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZDYW1lcmFzOyBpKyspIHsKLSAgICAgICAgaWYgKG1CdXN5W2ldKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY2FtZXJhICVkIGlzIHN0aWxsIGluIHVzZSBpbiBkZXN0cnVjdG9yISIsIGkpOworICAgICAgICBTdHJpbmc4IGNhbWVyYUlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGkpOworCisgICAgICAgIC8vIEdldCBjYW1lcmEgaW5mbworCisgICAgICAgIHN0cnVjdCBjYW1lcmFfaW5mbyBpbmZvOworICAgICAgICBib29sIGhhdmVJbmZvID0gdHJ1ZTsKKyAgICAgICAgc3RhdHVzX3QgcmMgPSBtTW9kdWxlLT5nZXRDYW1lcmFJbmZvKGksICZpbmZvKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFJlY2VpdmVkIGVycm9yIGxvYWRpbmcgY2FtZXJhIGluZm8gZm9yIGRldmljZSAlZCwgY29zdCBhbmQiCisgICAgICAgICAgICAgICAgICAgICIgY29uZmxpY3RpbmcgZGV2aWNlcyBmaWVsZHMgc2V0IHRvIGRlZmF1bHRzIGZvciB0aGlzIGRldmljZS4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGkpOworICAgICAgICAgICAgaGF2ZUluZm8gPSBmYWxzZTsKICAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBzdXBwb3J0CisgICAgICAgIGlmIChoYXZlSW5mbykgeworICAgICAgICAgICAgaWYgKGNoZWNrQ2FtZXJhQ2FwYWJpbGl0aWVzKGksIGluZm8sICZsYXRlc3RTdHJhbmdlQ2FtZXJhSWQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlIG1Nb2R1bGU7CisgICAgICAgICAgICAgICAgbU1vZHVsZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRGVmYXVsdHMgdG8gdXNlIGZvciBjb3N0IGFuZCBjb25mbGljdGluZyBkZXZpY2VzCisgICAgICAgIGludCBjb3N0ID0gMTAwOworICAgICAgICBjaGFyKiogY29uZmxpY3RpbmdfZGV2aWNlcyA9IG51bGxwdHI7CisgICAgICAgIHNpemVfdCBjb25mbGljdGluZ19kZXZpY2VzX2xlbmd0aCA9IDA7CisKKyAgICAgICAgLy8gSWYgdXNpbmcgcG9zdC0yLjQgbW9kdWxlIHZlcnNpb24sIHF1ZXJ5IHRoZSBjb3N0ICsgY29uZmxpY3RpbmcgZGV2aWNlcyBmcm9tIHRoZSBIQUwKKyAgICAgICAgaWYgKG1Nb2R1bGUtPmdldE1vZHVsZUFwaVZlcnNpb24oKSA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfNCAmJiBoYXZlSW5mbykgeworICAgICAgICAgICAgY29zdCA9IGluZm8ucmVzb3VyY2VfY29zdDsKKyAgICAgICAgICAgIGNvbmZsaWN0aW5nX2RldmljZXMgPSBpbmZvLmNvbmZsaWN0aW5nX2RldmljZXM7CisgICAgICAgICAgICBjb25mbGljdGluZ19kZXZpY2VzX2xlbmd0aCA9IGluZm8uY29uZmxpY3RpbmdfZGV2aWNlc19sZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNldDxTdHJpbmc4PiBjb25mbGljdGluZzsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25mbGljdGluZ19kZXZpY2VzX2xlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb25mbGljdGluZy5lbXBsYWNlKFN0cmluZzgoY29uZmxpY3RpbmdfZGV2aWNlc1tpXSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSBmb3IgZWFjaCBjYW1lcmEgZGV2aWNlCisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKKyAgICAgICAgICAgIG1DYW1lcmFTdGF0ZXMuZW1wbGFjZShjYW1lcmFJZCwgc3RkOjptYWtlX3NoYXJlZDxDYW1lcmFTdGF0ZT4oY2FtZXJhSWQsIGNvc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUZsYXNobGlnaHQtPmhhc0ZsYXNoVW5pdChjYW1lcmFJZCkpIHsKKyAgICAgICAgICAgIG1Ub3JjaFN0YXR1c01hcC5hZGQoY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRPUkNIX1NUQVRVU19BVkFJTEFCTEVfT0ZGKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtTW9kdWxlLT5nZXRNb2R1bGVBcGlWZXJzaW9uKCkgPj0gQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzEpIHsKKyAgICAgICAgbU1vZHVsZS0+c2V0Q2FsbGJhY2tzKHRoaXMpOwogICAgIH0KIAogICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNsZWFyR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOwotICAgIGdDYW1lcmFTZXJ2aWNlID0gTlVMTDsKKworICAgIGlmIChtTW9kdWxlLT5nZXRNb2R1bGVBcGlWZXJzaW9uKCkgPj0gQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzIpIHsKKyAgICAgICAgc2V0VXBWZW5kb3JUYWdzKCk7CisgICAgfQorCisgICAgQ2FtZXJhRGV2aWNlRmFjdG9yeTo6cmVnaXN0ZXJTZXJ2aWNlKHRoaXMpOworCisgICAgQ2FtZXJhU2VydmljZTo6cGluZ0NhbWVyYVNlcnZpY2VQcm94eSgpOwogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6Om9uRGV2aWNlU3RhdHVzQ2hhbmdlZChpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdHVzKQotewordm9pZCBDYW1lcmFTZXJ2aWNlOjpwaW5nQ2FtZXJhU2VydmljZVByb3h5KCkgeworICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuY2FtZXJhLnByb3h5IikpOworICAgIGlmIChiaW5kZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPElDYW1lcmFTZXJ2aWNlUHJveHk+IHByb3h5QmluZGVyID0gaW50ZXJmYWNlX2Nhc3Q8SUNhbWVyYVNlcnZpY2VQcm94eT4oYmluZGVyKTsKKyAgICBwcm94eUJpbmRlci0+cGluZ0ZvclVzZXJVcGRhdGUoKTsKK30KKworQ2FtZXJhU2VydmljZTo6fkNhbWVyYVNlcnZpY2UoKSB7CisgICAgaWYgKG1Nb2R1bGUpIHsKKyAgICAgICAgZGVsZXRlIG1Nb2R1bGU7CisgICAgICAgIG1Nb2R1bGUgPSBudWxscHRyOworICAgIH0KKyAgICBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjbGVhckdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKyAgICBnQ2FtZXJhU2VydmljZSA9IG51bGxwdHI7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6b25EZXZpY2VTdGF0dXNDaGFuZ2VkKGNhbWVyYV9kZXZpY2Vfc3RhdHVzX3QgIGNhbWVyYUlkLAorICAgICAgICBjYW1lcmFfZGV2aWNlX3N0YXR1c190IG5ld1N0YXR1cykgewogICAgIEFMT0dJKCIlczogU3RhdHVzIGNoYW5nZWQgZm9yIGNhbWVyYUlkPSVkLCBuZXdTdGF0dXM9JWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgY2FtZXJhSWQsIG5ld1N0YXR1cyk7CiAKLSAgICBpZiAoY2FtZXJhSWQgPCAwIHx8IGNhbWVyYUlkID49IE1BWF9DQU1FUkFTKSB7CisgICAgU3RyaW5nOCBpZCA9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPENhbWVyYVN0YXRlPiBzdGF0ZSA9IGdldENhbWVyYVN0YXRlKGlkKTsKKworICAgIGlmIChzdGF0ZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogQmFkIGNhbWVyYSBJRCAlZCIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKChpbnQpZ2V0U3RhdHVzKGNhbWVyYUlkKSA9PSBuZXdTdGF0dXMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBTdGF0ZSB0cmFuc2l0aW9uIHRvIHRoZSBzYW1lIHN0YXR1cyAweCV4IG5vdCBhbGxvd2VkIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAodWludDMyX3QpbmV3U3RhdHVzKTsKKyAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgb2xkU3RhdHVzID0gc3RhdGUtPmdldFN0YXR1cygpOworCisgICAgaWYgKG9sZFN0YXR1cyA9PSBzdGF0aWNfY2FzdDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXM+KG5ld1N0YXR1cykpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdGF0ZSB0cmFuc2l0aW9uIHRvIHRoZSBzYW1lIHN0YXR1cyAlI3ggbm90IGFsbG93ZWQiLCBfX0ZVTkNUSU9OX18sIG5ld1N0YXR1cyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvKiBkb24ndCBkbyB0aGlzIGluIHVwZGF0ZVN0YXR1cwotICAgICAgIHNpbmNlIGl0IGlzIGFsc28gY2FsbGVkIGZyb20gY29ubmVjdCBhbmQgd2UgY291bGQgZ2V0IGludG8gYSBkZWFkbG9jayAqLwogICAgIGlmIChuZXdTdGF0dXMgPT0gQ0FNRVJBX0RFVklDRV9TVEFUVVNfTk9UX1BSRVNFTlQpIHsKLSAgICAgICAgVmVjdG9yPHNwPEJhc2ljQ2xpZW50PiA+IGNsaWVudHNUb0Rpc2Nvbm5lY3Q7CisgICAgICAgIGxvZ0RldmljZVJlbW92ZWQoaWQsIFN0cmluZzg6OmZvcm1hdCgiRGV2aWNlIHN0YXR1cyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLCBvbGRTdGF0dXMsCisgICAgICAgICAgICAgICAgbmV3U3RhdHVzKSk7CisgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnRUb0Rpc2Nvbm5lY3Q7CiAgICAgICAgIHsKLSAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1TZXJ2aWNlTG9jayk7CisgICAgICAgICAgICAvLyBEb24ndCBkbyB0aGlzIGluIHVwZGF0ZVN0YXR1cyB0byBhdm9pZCBkZWFkbG9jayBvdmVyIG1TZXJ2aWNlTG9jaworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKIAotICAgICAgICAgICAvKiBSZW1vdmUgY2FjaGVkIHBhcmFtZXRlcnMgZnJvbSBzaGltIGNhY2hlICovCi0gICAgICAgICAgIG1TaGltUGFyYW1zLnJlbW92ZUl0ZW0oY2FtZXJhSWQpOworICAgICAgICAgICAgLy8gU2V0IHRoZSBkZXZpY2Ugc3RhdHVzIHRvIE5PVF9QUkVTRU5ULCBjbGllbnRzIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gY29ubmVjdAorICAgICAgICAgICAgLy8gdG8gdGhpcyBkZXZpY2UgdW50aWwgdGhlIHN0YXR1cyBjaGFuZ2VzCisgICAgICAgICAgICB1cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9QUkVTRU5ULCBpZCk7CiAKLSAgICAgICAgICAgLyogRmluZCBhbGwgY2xpZW50cyB0aGF0IHdlIG5lZWQgdG8gZGlzY29ubmVjdCAqLwotICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50ID0gbUNsaWVudFtjYW1lcmFJZF0ucHJvbW90ZSgpOwotICAgICAgICAgICBpZiAoY2xpZW50LmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgIGNsaWVudHNUb0Rpc2Nvbm5lY3QucHVzaF9iYWNrKGNsaWVudCk7Ci0gICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFJlbW92ZSBjYWNoZWQgc2hpbSBwYXJhbWV0ZXJzCisgICAgICAgICAgICBzdGF0ZS0+c2V0U2hpbVBhcmFtcyhDYW1lcmFQYXJhbWV0ZXJzKCkpOwogCi0gICAgICAgICAgIGludCBpID0gY2FtZXJhSWQ7Ci0gICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbVByb0NsaWVudExpc3RbaV0uc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgICAgIHNwPFByb0NsaWVudD4gY2wgPSBtUHJvQ2xpZW50TGlzdFtpXVtqXS5wcm9tb3RlKCk7Ci0gICAgICAgICAgICAgICBpZiAoY2wgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgIGNsaWVudHNUb0Rpc2Nvbm5lY3QucHVzaF9iYWNrKGNsKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBjbGllbnQgZnJvbSB0aGUgbGlzdCBvZiBhY3RpdmUgY2xpZW50cworICAgICAgICAgICAgY2xpZW50VG9EaXNjb25uZWN0ID0gcmVtb3ZlQ2xpZW50TG9ja2VkKGlkKTsKKworICAgICAgICAgICAgLy8gTm90aWZ5IHRoZSBjbGllbnQgb2YgZGlzY29ubmVjdGlvbgorICAgICAgICAgICAgY2xpZW50VG9EaXNjb25uZWN0LT5ub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVELAorICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFze30pOwogICAgICAgICB9CiAKLSAgICAgICAgLyogbm93IGRpc2Nvbm5lY3QgdGhlbS4gZG9uJ3QgaG9sZCB0aGUgbG9jawotICAgICAgICAgICBvciB3ZSBjYW4gZ2V0IGludG8gYSBkZWFkbG9jayAqLworICAgICAgICBBTE9HSSgiJXM6IENsaWVudCBmb3IgY2FtZXJhIElEICVzIGV2aWN0ZWQgZHVlIHRvIGRldmljZSBzdGF0dXMgY2hhbmdlIGZyb20gSEFMIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKIAotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNsaWVudHNUb0Rpc2Nvbm5lY3Quc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnQgPSBjbGllbnRzVG9EaXNjb25uZWN0W2ldOwotCi0gICAgICAgICAgICBjbGllbnQtPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIHJlbW90ZSBhcHAgd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byBjYWxsIG1ldGhvZHMgb24gdGhlCi0gICAgICAgICAgICAgKiBjbGllbnQgc2luY2UgdGhlIGNsaWVudCBQSUQgd2lsbCBiZSByZXNldCB0byAwCi0gICAgICAgICAgICAgKi8KKyAgICAgICAgLy8gRGlzY29ubmVjdCBjbGllbnQKKyAgICAgICAgaWYgKGNsaWVudFRvRGlzY29ubmVjdC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBFbnN1cmUgbm90IGluIGJpbmRlciBSUEMgc28gY2xpZW50IGRpc2Nvbm5lY3QgUElEIGNoZWNrcyB3b3JrIGNvcnJlY3RseQorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCksCisgICAgICAgICAgICAgICAgICAgICJvbkRldmljZVN0YXR1c0NoYW5nZWQgbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgY2FtZXJhIHNlcnZpY2UgcHJvY2VzcyEiKTsKKyAgICAgICAgICAgIGNsaWVudFRvRGlzY29ubmVjdC0+ZGlzY29ubmVjdCgpOwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR1YoIiVzOiBBZnRlciB1bnBsdWcsIGRpc2Nvbm5lY3RlZCAlenUgY2xpZW50cyIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2xpZW50c1RvRGlzY29ubmVjdC5zaXplKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChvbGRTdGF0dXMgPT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQpIHsKKyAgICAgICAgICAgIGxvZ0RldmljZUFkZGVkKGlkLCBTdHJpbmc4Ojpmb3JtYXQoIkRldmljZSBzdGF0dXMgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwgb2xkU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICBuZXdTdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVTdGF0dXMoc3RhdGljX2Nhc3Q8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzPihuZXdTdGF0dXMpLCBpZCk7CiAgICAgfQogCi0gICAgdXBkYXRlU3RhdHVzKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzPihuZXdTdGF0dXMpLCBjYW1lcmFJZCk7Ci0KIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjpvblRvcmNoU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMgbmV3U3RhdHVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaFN0YXR1c011dGV4KTsKKyAgICBvblRvcmNoU3RhdHVzQ2hhbmdlZExvY2tlZChjYW1lcmFJZCwgbmV3U3RhdHVzKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpvblRvcmNoU3RhdHVzQ2hhbmdlZExvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMgbmV3U3RhdHVzKSB7CisgICAgQUxPR0koIiVzOiBUb3JjaCBzdGF0dXMgY2hhbmdlZCBmb3IgY2FtZXJhSWQ9JXMsIG5ld1N0YXR1cz0lZCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpLCBuZXdTdGF0dXMpOworCisgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMgc3RhdHVzOworICAgIHN0YXR1c190IHJlcyA9IGdldFRvcmNoU3RhdHVzTG9ja2VkKGNhbWVyYUlkLCAmc3RhdHVzKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGdldCB0b3JjaCBzdGF0dXMgb2YgY2FtZXJhICVzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IG5ld1N0YXR1cykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmVzID0gc2V0VG9yY2hTdGF0dXNMb2NrZWQoY2FtZXJhSWQsIG5ld1N0YXR1cyk7CisgICAgaWYgKHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzZXQgdGhlIHRvcmNoIHN0YXR1cyIsIF9fRlVOQ1RJT05fXywgKHVpbnQzMl90KW5ld1N0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIFVwZGF0ZSBiYXR0ZXJ5IGxpZmUgbG9nZ2luZyBmb3IgZmxhc2hsaWdodAorICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoVWlkTWFwTXV0ZXgpOworICAgICAgICBhdXRvIGl0ZXIgPSBtVG9yY2hVaWRNYXAuZmluZChjYW1lcmFJZCk7CisgICAgICAgIGlmIChpdGVyICE9IG1Ub3JjaFVpZE1hcC5lbmQoKSkgeworICAgICAgICAgICAgaW50IG9sZFVpZCA9IGl0ZXItPnNlY29uZC5zZWNvbmQ7CisgICAgICAgICAgICBpbnQgbmV3VWlkID0gaXRlci0+c2Vjb25kLmZpcnN0OworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyJiBub3RpZmllcihCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkpOworICAgICAgICAgICAgaWYgKG9sZFVpZCAhPSBuZXdVaWQpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgVUlEIGhhcyBjaGFuZ2VkLCBsb2cgdGhlIHN0YXR1cyBhbmQgdXBkYXRlIGN1cnJlbnQgVUlEIGluIG1Ub3JjaFVpZE1hcAorICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VE9SQ0hfU1RBVFVTX0FWQUlMQUJMRV9PTikgeworICAgICAgICAgICAgICAgICAgICBub3RpZmllci5ub3RlRmxhc2hsaWdodE9mZihjYW1lcmFJZCwgb2xkVWlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXR1cyA9PSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUT1JDSF9TVEFUVVNfQVZBSUxBQkxFX09OKSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVyLm5vdGVGbGFzaGxpZ2h0T24oY2FtZXJhSWQsIG5ld1VpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGl0ZXItPnNlY29uZC5zZWNvbmQgPSBuZXdVaWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBVSUQgaGFzIG5vdCBjaGFuZ2VkLCBsb2cgdGhlIHN0YXR1cworICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0dXMgPT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VE9SQ0hfU1RBVFVTX0FWQUlMQUJMRV9PTikgeworICAgICAgICAgICAgICAgICAgICBub3RpZmllci5ub3RlRmxhc2hsaWdodE9uKGNhbWVyYUlkLCBvbGRVaWQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVyLm5vdGVGbGFzaGxpZ2h0T2ZmKGNhbWVyYUlkLCBvbGRVaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xpc3RlbmVyTG9jayk7CisgICAgICAgIGZvciAoYXV0byYgaSA6IG1MaXN0ZW5lckxpc3QpIHsKKyAgICAgICAgICAgIGktPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKG5ld1N0YXR1cywgU3RyaW5nMTZ7Y2FtZXJhSWR9KTsKKyAgICAgICAgfQorICAgIH0KK30KKwogaW50MzJfdCBDYW1lcmFTZXJ2aWNlOjpnZXROdW1iZXJPZkNhbWVyYXMoKSB7Ci0gICAgcmV0dXJuIG1OdW1iZXJPZkNhbWVyYXM7CisgICAgcmV0dXJuIGdldE51bWJlck9mQ2FtZXJhcyhDQU1FUkFfVFlQRV9CQUNLV0FSRF9DT01QQVRJQkxFKTsKK30KKworaW50MzJfdCBDYW1lcmFTZXJ2aWNlOjpnZXROdW1iZXJPZkNhbWVyYXMoaW50IHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBDQU1FUkFfVFlQRV9CQUNLV0FSRF9DT01QQVRJQkxFOgorICAgICAgICAgICAgcmV0dXJuIG1OdW1iZXJPZk5vcm1hbENhbWVyYXM7CisgICAgICAgIGNhc2UgQ0FNRVJBX1RZUEVfQUxMOgorICAgICAgICAgICAgcmV0dXJuIG1OdW1iZXJPZkNhbWVyYXM7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiJXM6IFVua25vd24gY2FtZXJhIHR5cGUgJWQsIHJldHVybmluZyAwIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0eXBlKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhSW5mbyhpbnQgY2FtZXJhSWQsCkBAIC0yMzYsMTIgKzQyNiwyMSBAQAogCiAgICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87CiAgICAgc3RhdHVzX3QgcmMgPSBmaWx0ZXJHZXRJbmZvRXJyb3JDb2RlKAotICAgICAgICBtTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oY2FtZXJhSWQsICZpbmZvKSk7CisgICAgICAgIG1Nb2R1bGUtPmdldENhbWVyYUluZm8oY2FtZXJhSWQsICZpbmZvKSk7CiAgICAgY2FtZXJhSW5mby0+ZmFjaW5nID0gaW5mby5mYWNpbmc7CiAgICAgY2FtZXJhSW5mby0+b3JpZW50YXRpb24gPSBpbmZvLm9yaWVudGF0aW9uOwogICAgIHJldHVybiByYzsKIH0KIAoraW50IENhbWVyYVNlcnZpY2U6OmNhbWVyYUlkVG9JbnQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpIHsKKyAgICBlcnJubyA9IDA7CisgICAgc2l6ZV90IHBvcyA9IDA7CisgICAgaW50IHJldCA9IHN0b2koc3RkOjpzdHJpbmd7Y2FtZXJhSWQuc3RyaW5nKCl9LCAmcG9zKTsKKyAgICBpZiAoZXJybm8gIT0gMCB8fCBwb3MgIT0gY2FtZXJhSWQuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2VuZXJhdGVTaGltTWV0YWRhdGEoaW50IGNhbWVyYUlkLCAvKm91dCovQ2FtZXJhTWV0YWRhdGEqIGNhbWVyYUluZm8pIHsKICAgICBzdGF0dXNfdCByZXQgPSBPSzsKQEAgLTM0Nyw3ICs1NDYsNyBAQAogCiAgICAgaW50IGZhY2luZzsKICAgICBzdGF0dXNfdCByZXQgPSBPSzsKLSAgICBpZiAobU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbiA8IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8wIHx8CisgICAgaWYgKG1Nb2R1bGUtPmdldE1vZHVsZUFwaVZlcnNpb24oKSA8IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8wIHx8CiAgICAgICAgICAgICBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAmZmFjaW5nKSA8PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMSApIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG1vZGUgZm9yIG9sZCBIQUxzOgpAQCAtMzY4LDEzICs1NjcsMzkgQEAKICAgICAgICAgICogTm9ybWFsIEhBTCAyLjErIGNvZGVwYXRoLgogICAgICAgICAgKi8KICAgICAgICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87Ci0gICAgICAgIHJldCA9IGZpbHRlckdldEluZm9FcnJvckNvZGUobU1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKGNhbWVyYUlkLCAmaW5mbykpOworICAgICAgICByZXQgPSBmaWx0ZXJHZXRJbmZvRXJyb3JDb2RlKG1Nb2R1bGUtPmdldENhbWVyYUluZm8oY2FtZXJhSWQsICZpbmZvKSk7CiAgICAgICAgICpjYW1lcmFJbmZvID0gaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljczsKICAgICB9CiAKICAgICByZXR1cm4gcmV0OwogfQogCitpbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FsbGluZ1BpZCgpIHsKKyAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworfQorCitpbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FsbGluZ1VpZCgpIHsKKyAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworfQorCitTdHJpbmc4IENhbWVyYVNlcnZpY2U6OmdldEZvcm1hdHRlZEN1cnJlbnRUaW1lKCkgeworICAgIHRpbWVfdCBub3cgPSB0aW1lKG51bGxwdHIpOworICAgIGNoYXIgZm9ybWF0dGVkVGltZVs2NF07CisgICAgc3RyZnRpbWUoZm9ybWF0dGVkVGltZSwgc2l6ZW9mKGZvcm1hdHRlZFRpbWUpLCAiJW0tJWQgJUg6JU06JVMiLCBsb2NhbHRpbWUoJm5vdykpOworICAgIHJldHVybiBTdHJpbmc4KGZvcm1hdHRlZFRpbWUpOworfQorCitpbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhUHJpb3JpdHlGcm9tUHJvY1N0YXRlKGludCBwcm9jU3RhdGUpIHsKKyAgICAvLyBGaW5kIHRoZSBwcmlvcml0eSBmb3IgdGhlIGNhbWVyYSB1c2FnZSBiYXNlZCBvbiB0aGUgcHJvY2VzcyBzdGF0ZS4gIEhpZ2hlciBwcmlvcml0eSBjbGllbnRzCisgICAgLy8gd2luIGZvciBldmljdGlvbnMuCisgICAgaWYgKHByb2NTdGF0ZSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBSZWNlaXZlZCBpbnZhbGlkIHByb2Nlc3Mgc3RhdGUgJWQgZnJvbSBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlISIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBwcm9jU3RhdGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBJTlRfTUFYIC0gcHJvY1N0YXRlOworfQorCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFWZW5kb3JUYWdEZXNjcmlwdG9yKC8qb3V0Ki9zcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzYykgewogICAgIGlmICghbU1vZHVsZSkgewogICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBoYXJkd2FyZSBtb2R1bGUgZG9lc24ndCBleGlzdCIsIF9fRlVOQ1RJT05fXyk7CkBAIC0zODcsMTIgKzYxMiwxMiBAQAogCiBpbnQgQ2FtZXJhU2VydmljZTo6Z2V0RGV2aWNlVmVyc2lvbihpbnQgY2FtZXJhSWQsIGludCogZmFjaW5nKSB7CiAgICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87Ci0gICAgaWYgKG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhjYW1lcmFJZCwgJmluZm8pICE9IE9LKSB7CisgICAgaWYgKG1Nb2R1bGUtPmdldENhbWVyYUluZm8oY2FtZXJhSWQsICZpbmZvKSAhPSBPSykgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCiAgICAgaW50IGRldmljZVZlcnNpb247Ci0gICAgaWYgKG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24gPj0gQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzApIHsKKyAgICBpZiAobU1vZHVsZS0+Z2V0TW9kdWxlQXBpVmVyc2lvbigpID49IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8wKSB7CiAgICAgICAgIGRldmljZVZlcnNpb24gPSBpbmZvLmRldmljZV92ZXJzaW9uOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRldmljZVZlcnNpb24gPSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDsKQEAgLTQwNSwxOSArNjMwLDYgQEAKICAgICByZXR1cm4gZGV2aWNlVmVyc2lvbjsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6ZmlsdGVyT3BlbkVycm9yQ29kZShzdGF0dXNfdCBlcnIpIHsKLSAgICBzd2l0Y2goZXJyKSB7Ci0gICAgICAgIGNhc2UgTk9fRVJST1I6Ci0gICAgICAgIGNhc2UgLUVCVVNZOgotICAgICAgICBjYXNlIC1FSU5WQUw6Ci0gICAgICAgIGNhc2UgLUVVU0VSUzoKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIC1FTk9ERVY7Ci19Ci0KIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmZpbHRlckdldEluZm9FcnJvckNvZGUoc3RhdHVzX3QgZXJyKSB7CiAgICAgc3dpdGNoKGVycikgewogICAgICAgICBjYXNlIE5PX0VSUk9SOgpAQCAtNDMzLDEzICs2NDUsMTMgQEAKICAgICB2ZW5kb3JfdGFnX29wc190IHZPcHMgPSB2ZW5kb3JfdGFnX29wc190KCk7CiAKICAgICAvLyBDaGVjayBpZiB2ZW5kb3Igb3BlcmF0aW9ucyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQKLSAgICBpZiAobU1vZHVsZS0+Z2V0X3ZlbmRvcl90YWdfb3BzID09IE5VTEwpIHsKKyAgICBpZiAoIW1Nb2R1bGUtPmlzVmVuZG9yVGFnRGVmaW5lZCgpKSB7CiAgICAgICAgIEFMT0dJKCIlczogTm8gdmVuZG9yIHRhZ3MgZGVmaW5lZCBmb3IgdGhpcyBkZXZpY2UuIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIEFUUkFDRV9CRUdJTigiY2FtZXJhMy0+Z2V0X21ldGFkYXRhX3ZlbmRvcl90YWdfb3BzIik7Ci0gICAgbU1vZHVsZS0+Z2V0X3ZlbmRvcl90YWdfb3BzKCZ2T3BzKTsKKyAgICBtTW9kdWxlLT5nZXRWZW5kb3JUYWdPcHMoJnZPcHMpOwogICAgIEFUUkFDRV9FTkQoKTsKIAogICAgIC8vIEVuc3VyZSBhbGwgdmVuZG9yIG9wZXJhdGlvbnMgYXJlIHByZXNlbnQKQEAgLTQ2Nyw1NCArNjc5LDEwNCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjppbml0aWFsaXplU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCkgewotICAgIGludCBwaWQgPSBnZXRDYWxsaW5nUGlkKCk7Ci0gICAgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKLSAgICBzdGF0dXNfdCByZXQgPSB2YWxpZGF0ZUNvbm5lY3QoY2FtZXJhSWQsIHVpZCk7Ci0gICAgaWYgKHJldCAhPSBPSykgewotICAgICAgICAvLyBFcnJvciBhbHJlYWR5IGxvZ2dlZCBieSBjYWxsZWUKLSAgICAgICAgcmV0dXJuIHJldDsKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6Om1ha2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCisgICAgICAgIGNvbnN0IHNwPElJbnRlcmZhY2U+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgaW50IGZhY2luZywgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLCBpbnQgc2VydmljZVBpZCwgYm9vbCBsZWdhY3lNb2RlLAorICAgICAgICBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAorICAgICAgICAvKm91dCovc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQpIHsKKworICAgIC8vIFRPRE86IFVwZGF0ZSBDYW1lcmFDbGllbnRzICsgSEFMIGludGVyZmFjZSB0byB1c2Ugc3RyaW5ncyBmb3IgQ2FtZXJhIElEcworICAgIGludCBpZCA9IGNhbWVyYUlkVG9JbnQoY2FtZXJhSWQpOworICAgIGlmIChpZCA9PSAtMSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY2FtZXJhIElEICVzLCBjYW5ub3QgY29udmVydCB0byBpbnRlZ2VyLiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgYm9vbCBuZWVkc05ld0NsaWVudCA9IGZhbHNlOwotICAgIHNwPENsaWVudD4gY2xpZW50OworICAgIGlmIChoYWxWZXJzaW9uIDwgMCB8fCBoYWxWZXJzaW9uID09IGRldmljZVZlcnNpb24pIHsKKyAgICAgICAgLy8gRGVmYXVsdCBwYXRoOiBIQUwgdmVyc2lvbiBpcyB1bnNwZWNpZmllZCBieSBjYWxsZXIsIGNyZWF0ZSBDYW1lcmFDbGllbnQKKyAgICAgICAgLy8gYmFzZWQgb24gZGV2aWNlIHZlcnNpb24gcmVwb3J0ZWQgYnkgdGhlIEhBTC4KKyAgICAgICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgorICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IEFQSV8xKSB7ICAvLyBDYW1lcmExIEFQSSByb3V0ZQorICAgICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IHRtcCA9IHN0YXRpY19jYXN0PElDYW1lcmFDbGllbnQqPihjYW1lcmFDYi5nZXQoKSk7CisgICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwgaWQsIGZhY2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBDYW1lcmEyIEFQSSByb3V0ZQorICAgICAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgdXNpbmcgb2xkIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOworICAgICAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMToKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zOgorICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IEFQSV8xKSB7IC8vIENhbWVyYTEgQVBJIHJvdXRlCisgICAgICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKKyAgICAgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwgaWQsIGZhY2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIENhbWVyYTIgQVBJIHJvdXRlCisgICAgICAgICAgICAgICAgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrcz4gdG1wID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PElDYW1lcmFEZXZpY2VDYWxsYmFja3MqPihjYW1lcmFDYi5nZXQoKSk7CisgICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFEZXZpY2VDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBTaG91bGQgbm90IGJlIHJlYWNoYWJsZQorICAgICAgICAgICAgQUxPR0UoIlVua25vd24gY2FtZXJhIGRldmljZSBIQUwgdmVyc2lvbjogJWQiLCBkZXZpY2VWZXJzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEEgcGFydGljdWxhciBIQUwgdmVyc2lvbiBpcyByZXF1ZXN0ZWQgYnkgY2FsbGVyLiBDcmVhdGUgQ2FtZXJhQ2xpZW50CisgICAgICAgIC8vIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgSEFMIHZlcnNpb24uCisgICAgICAgIGlmIChkZXZpY2VWZXJzaW9uID4gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzAgJiYKKyAgICAgICAgICAgIGhhbFZlcnNpb24gPT0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzApIHsKKyAgICAgICAgICAgIC8vIE9ubHkgc3VwcG9ydCBoaWdoZXIgSEFMIHZlcnNpb24gZGV2aWNlIG9wZW5lZCBhcyBIQUwxLjAgZGV2aWNlLgorICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKKyAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsIGlkLCBmYWNpbmcsCisgICAgICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE90aGVyIGNvbWJpbmF0aW9ucyAoZS5nLiBIQUwzLnggb3BlbiBhcyBIQUwyLngpIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4KKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNhbWVyYSBIQUwgdmVyc2lvbiAleDogSEFMICV4IGRldmljZSBjYW4gb25seSBiZSIKKyAgICAgICAgICAgICAgICAgICAgIiBvcGVuZWQgYXMgSEFMICV4IGRldmljZSIsIGhhbFZlcnNpb24sIGRldmljZVZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK1N0cmluZzggQ2FtZXJhU2VydmljZTo6dG9TdHJpbmcoc3RkOjpzZXQ8dXNlcmlkX3Q+IGludFNldCkgeworICAgIFN0cmluZzggcygiIik7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh1c2VyaWRfdCBpIDogaW50U2V0KSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgcy5hcHBlbmRGb3JtYXQoIiVkIiwgaSk7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy5hcHBlbmRGb3JtYXQoIiwgJWQiLCBpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gczsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6aW5pdGlhbGl6ZVNoaW1NZXRhZGF0YShpbnQgY2FtZXJhSWQpIHsKKyAgICBpbnQgdWlkID0gZ2V0Q2FsbGluZ1VpZCgpOwogCiAgICAgU3RyaW5nMTYgaW50ZXJuYWxQYWNrYWdlTmFtZSgibWVkaWEiKTsKLSAgICB7ICAgLy8gU2NvcGUgZm9yIHNlcnZpY2UgbG9jawotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwotICAgICAgICBpZiAobUNsaWVudFtjYW1lcmFJZF0gIT0gTlVMTCkgewotICAgICAgICAgICAgY2xpZW50ID0gc3RhdGljX2Nhc3Q8Q2xpZW50Kj4obUNsaWVudFtjYW1lcmFJZF0ucHJvbW90ZSgpLmdldCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xpZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgIG5lZWRzTmV3Q2xpZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldCA9IGNvbm5lY3RIZWxwZXJMb2NrZWQoLypvdXQqL2NsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjYW1lcmFDbGllbnQqL05VTEwsIC8vIEVtcHR5IGJpbmRlciBjYWxsYmFja3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkKTsKLQotICAgICAgICAgICAgaWYgKHJldCAhPSBPSykgewotICAgICAgICAgICAgICAgIC8vIEVycm9yIGFscmVhZHkgbG9nZ2VkIGJ5IGNhbGxlZQotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2xpZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGNvbm5lY3QgdG8gY2xpZW50IGNhbWVyYSBkZXZpY2UuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmc4IHJhd1BhcmFtcyA9IGNsaWVudC0+Z2V0UGFyYW1ldGVycygpOwotICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhyYXdQYXJhbXMpOwotICAgICAgICBtU2hpbVBhcmFtcy5hZGQoY2FtZXJhSWQsIHBhcmFtcyk7CisgICAgU3RyaW5nOCBpZCA9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCk7CisgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CisgICAgc3A8Q2xpZW50PiB0bXAgPSBudWxscHRyOworICAgIGlmICgocmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oc3A8SUNhbWVyYUNsaWVudD57bnVsbHB0cn0sIGlkLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVEKSwgaW50ZXJuYWxQYWNrYWdlTmFtZSwgdWlkLCBBUElfMSwKKyAgICAgICAgICAgIGZhbHNlLCB0cnVlLCB0bXApKSAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yICVkICglcykgaW5pdGlhbGl6aW5nIHNoaW0gbWV0YWRhdGEuIiwgX19GVU5DVElPTl9fLCByZXQsIHN0cmVycm9yKHJldCkpOworICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KLQotICAgIC8vIENsb3NlIGNsaWVudCBpZiBvbmUgd2FzIG9wZW5lZCBzb2xlbHkgZm9yIHRoaXMgY2FsbAotICAgIGlmIChuZWVkc05ld0NsaWVudCkgewotICAgICAgICBjbGllbnQtPmRpc2Nvbm5lY3QoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0TGVnYWN5UGFyYW1ldGVyc0xhenkoaW50IGNhbWVyYUlkLApAQCAtNTMwLDQyICs3OTIsNTUgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzc2l6ZV90IGluZGV4ID0gLTE7Ci0gICAgeyAgIC8vIFNjb3BlIGZvciBzZXJ2aWNlIGxvY2sKKyAgICBTdHJpbmc4IGlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKTsKKworICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBwYXJhbWV0ZXJzCisgICAgeworICAgICAgICAvLyBTY29wZSBmb3Igc2VydmljZSBsb2NrCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7Ci0gICAgICAgIGluZGV4ID0gbVNoaW1QYXJhbXMuaW5kZXhPZktleShjYW1lcmFJZCk7Ci0gICAgICAgIC8vIFJlbGVhc2Ugc2VydmljZSBsb2NrIHNvIGluaXRpYWxpemVTaGltTWV0YWRhdGEgY2FuIGJlIGNhbGxlZCBjb3JyZWN0bHkuCi0KLSAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICpwYXJhbWV0ZXJzID0gbVNoaW1QYXJhbXNbaW5kZXhdOworICAgICAgICBhdXRvIGNhbWVyYVN0YXRlID0gZ2V0Q2FtZXJhU3RhdGUoaWQpOworICAgICAgICBpZiAoY2FtZXJhU3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBJRDogJXMiLCBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBwID0gY2FtZXJhU3RhdGUtPmdldFNoaW1QYXJhbXMoKTsKKyAgICAgICAgaWYgKCFwLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgKnBhcmFtZXRlcnMgPSBwOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgcmV0ID0gaW5pdGlhbGl6ZVNoaW1NZXRhZGF0YShjYW1lcmFJZCk7Ci0gICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwotICAgICAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgICAgICAvLyBFcnJvciBhbHJlYWR5IGxvZ2dlZCBieSBjYWxsZWUKLSAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgcmV0ID0gaW5pdGlhbGl6ZVNoaW1NZXRhZGF0YShjYW1lcmFJZCk7CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAvLyBFcnJvciBhbHJlYWR5IGxvZ2dlZCBieSBjYWxsZWUKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBDaGVjayBmb3IgcGFyYW1ldGVycyBhZ2FpbgorICAgIHsKKyAgICAgICAgLy8gU2NvcGUgZm9yIHNlcnZpY2UgbG9jaworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOworICAgICAgICBhdXRvIGNhbWVyYVN0YXRlID0gZ2V0Q2FtZXJhU3RhdGUoaWQpOworICAgICAgICBpZiAoY2FtZXJhU3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBJRDogJXMiLCBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLQotICAgICAgICB7ICAgLy8gU2NvcGUgZm9yIHNlcnZpY2UgbG9jawotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICAgICAgICAgIGluZGV4ID0gbVNoaW1QYXJhbXMuaW5kZXhPZktleShjYW1lcmFJZCk7Ci0KLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPCAwLCAiaW5kZXggc2hvdWxkIGhhdmUgYmVlbiBpbml0aWFsaXplZCIpOwotCi0gICAgICAgICAgICAqcGFyYW1ldGVycyA9IG1TaGltUGFyYW1zW2luZGV4XTsKKyAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBwID0gY2FtZXJhU3RhdGUtPmdldFNoaW1QYXJhbXMoKTsKKyAgICAgICAgaWYgKCFwLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgKnBhcmFtZXRlcnMgPSBwOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIEFMT0dFKCIlczogUGFyYW1ldGVycyB3ZXJlIG5vdCBpbml0aWFsaXplZCwgb3Igd2VyZSBlbXB0eS4gIERldmljZSBtYXkgbm90IGJlIHByZXNlbnQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjp2YWxpZGF0ZUNvbm5lY3QoaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppbm91dCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGNsaWVudFVpZCkgY29uc3Qgeworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6dmFsaWRhdGVDb25uZWN0TG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCAvKmlub3V0Ki9pbnQmIGNsaWVudFVpZCkKKyAgICAgICAgY29uc3QgewogCiAgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CiAKQEAgLTU3NCwxNjAgKzg0OSwyNzggQEAKICAgICB9IGVsc2UgewogICAgICAgICAvLyBXZSBvbmx5IHRydXN0IG91ciBvd24gcHJvY2VzcyB0byBmb3J3YXJkIGNsaWVudCBVSURzCiAgICAgICAgIGlmIChjYWxsaW5nUGlkICE9IGdldHBpZCgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChwaWQgJWQpIHJlamVjdGVkIChkb24ndCB0cnVzdCBjbGllbnRVaWQpIiwKLSAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCk7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChkb24ndCB0cnVzdCBjbGllbnRVaWQgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwgY2xpZW50VWlkKTsKICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmICghbU1vZHVsZSkgewotICAgICAgICBBTE9HRSgiQ2FtZXJhIEhBTCBtb2R1bGUgbm90IGxvYWRlZCIpOworICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChjYW1lcmEgSEFMIG1vZHVsZSBub3QgbG9hZGVkKSIsCisgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCk7CiAgICAgICAgIHJldHVybiAtRU5PREVWOwogICAgIH0KIAotICAgIGlmIChjYW1lcmFJZCA8IDAgfHwgY2FtZXJhSWQgPj0gbU51bWJlck9mQ2FtZXJhcykgewotICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChwaWQgJWQpIHJlamVjdGVkIChpbnZhbGlkIGNhbWVyYUlkICVkKS4iLAotICAgICAgICAgICAgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOworICAgIGlmIChnZXRDYW1lcmFTdGF0ZShjYW1lcmFJZCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChpbnZhbGlkIGNhbWVyYSBJRCAlcykiLCBjYWxsaW5nUGlkLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CiAgICAgfQogCisgICAgLy8gQ2hlY2sgZGV2aWNlIHBvbGljeSBmb3IgdGhpcyBjYW1lcmEKICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgcHJvcGVydHlfZ2V0KCJzeXMuc2VjcG9saWN5LmNhbWVyYS5kaXNhYmxlZCIsIHZhbHVlLCAiMCIpOworICAgIGNoYXIga2V5W1BST1BFUlRZX0tFWV9NQVhdOworICAgIHVzZXJpZF90IGNsaWVudFVzZXJJZCA9IG11bHRpdXNlcl9nZXRfdXNlcl9pZChjbGllbnRVaWQpOworICAgIHNucHJpbnRmKGtleSwgUFJPUEVSVFlfS0VZX01BWCwgInN5cy5zZWNwb2xpY3kuY2FtZXJhLm9mZl8lZCIsIGNsaWVudFVzZXJJZCk7CisgICAgcHJvcGVydHlfZ2V0KGtleSwgdmFsdWUsICIwIik7CiAgICAgaWYgKHN0cmNtcCh2YWx1ZSwgIjEiKSA9PSAwKSB7CiAgICAgICAgIC8vIENhbWVyYSBpcyBkaXNhYmxlZCBieSBEZXZpY2VQb2xpY3lNYW5hZ2VyLgotICAgICAgICBBTE9HSSgiQ2FtZXJhIGlzIGRpc2FibGVkLiBjb25uZWN0IFggKHBpZCAlZCkgcmVqZWN0ZWQiLCBjYWxsaW5nUGlkKTsKKyAgICAgICAgQUxPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSByZWplY3RlZCAoY2FtZXJhICVzIGlzIGRpc2FibGVkIGJ5IGRldmljZSAiCisgICAgICAgICAgICAgICAgInBvbGljeSkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiAtRUFDQ0VTOwogICAgIH0KIAotICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBjdXJyZW50U3RhdHVzID0gZ2V0U3RhdHVzKGNhbWVyYUlkKTsKKyAgICAvLyBPbmx5IGFsbG93IGNsaWVudHMgd2hvIGFyZSBiZWluZyB1c2VkIGJ5IHRoZSBjdXJyZW50IGZvcmVncm91bmQgZGV2aWNlIHVzZXIsIHVubGVzcyBjYWxsaW5nCisgICAgLy8gZnJvbSBvdXIgb3duIHByb2Nlc3MuCisgICAgaWYgKGNhbGxpbmdQaWQgIT0gZ2V0cGlkKCkgJiYgKG1BbGxvd2VkVXNlcnMuZmluZChjbGllbnRVc2VySWQpID09IG1BbGxvd2VkVXNlcnMuZW5kKCkpKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKFBJRCAlZCkgcmVqZWN0ZWQgKGNhbm5vdCBjb25uZWN0IGZyb20gIgorICAgICAgICAgICAgICAgICJkZXZpY2UgdXNlciAlZCwgY3VycmVudGx5IGFsbG93ZWQgZGV2aWNlIHVzZXJzOiAlcykiLCBjYWxsaW5nUGlkLCBjbGllbnRVc2VySWQsCisgICAgICAgICAgICAgICAgdG9TdHJpbmcobUFsbG93ZWRVc2Vycykuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGNoZWNrSWZEZXZpY2VJc1VzYWJsZShjYW1lcmFJZCk7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmNoZWNrSWZEZXZpY2VJc1VzYWJsZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgY29uc3QgeworICAgIGF1dG8gY2FtZXJhU3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShjYW1lcmFJZCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaWYgKGNhbWVyYVN0YXRlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSByZWplY3RlZCAoaW52YWxpZCBjYW1lcmEgSUQgJXMpIiwgY2FsbGluZ1BpZCwKKyAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBjdXJyZW50U3RhdHVzID0gY2FtZXJhU3RhdGUtPmdldFN0YXR1cygpOwogICAgIGlmIChjdXJyZW50U3RhdHVzID09IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfUFJFU0VOVCkgewotICAgICAgICBBTE9HSSgiQ2FtZXJhIGlzIG5vdCBwbHVnZ2VkIGluLCIKLSAgICAgICAgICAgICAgICIgY29ubmVjdCBYIChwaWQgJWQpIHJlamVjdGVkIiwgY2FsbGluZ1BpZCk7CisgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKFBJRCAlZCkgcmVqZWN0ZWQgKGNhbWVyYSAlcyBpcyBub3QgY29ubmVjdGVkKSIsCisgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwgY2FtZXJhSWQuc3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gLUVOT0RFVjsKICAgICB9IGVsc2UgaWYgKGN1cnJlbnRTdGF0dXMgPT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX0VOVU1FUkFUSU5HKSB7Ci0gICAgICAgIEFMT0dJKCJDYW1lcmEgaXMgZW51bWVyYXRpbmcsIgotICAgICAgICAgICAgICAgIiBjb25uZWN0IFggKHBpZCAlZCkgcmVqZWN0ZWQiLCBjYWxsaW5nUGlkKTsKKyAgICAgICAgQUxPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSByZWplY3RlZCwgKGNhbWVyYSAlcyBpcyBpbml0aWFsaXppbmcpIiwKKyAgICAgICAgICAgICAgICBjYWxsaW5nUGlkLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiAtRUJVU1k7CiAgICAgfQotICAgIC8vIEVsc2UgZG9uJ3QgY2hlY2sgZm9yIFNUQVRVU19OT1RfQVZBSUxBQkxFLgotICAgIC8vICAtLSBJdCdzIGRvbmUgaW1wbGljaXRseSBpbiBjYW5Db25uZWN0VW5zYWZlIC93IHRoZSBtQnVzeSBhcnJheQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYm9vbCBDYW1lcmFTZXJ2aWNlOjpjYW5Db25uZWN0VW5zYWZlKGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiAmY2xpZW50KSB7Ci0gICAgU3RyaW5nOCBjbGllbnROYW1lOChjbGllbnRQYWNrYWdlTmFtZSk7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7Cit2b2lkIENhbWVyYVNlcnZpY2U6OmZpbmlzaENvbm5lY3RMb2NrZWQoY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiBjbGllbnQsCisgICAgICAgIGNvbnN0IENhbWVyYVNlcnZpY2U6OkRlc2NyaXB0b3JQdHImIGRlc2MpIHsKIAotICAgIGlmIChtQ2xpZW50W2NhbWVyYUlkXSAhPSAwKSB7Ci0gICAgICAgIGNsaWVudCA9IG1DbGllbnRbY2FtZXJhSWRdLnByb21vdGUoKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAocmVtb3RlQ2FsbGJhY2sgPT0gY2xpZW50LT5nZXRSZW1vdGUoKSkgewotICAgICAgICAgICAgICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAocGlkICVkKSAodGhlIHNhbWUgY2xpZW50KSIsCi0gICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ET1NDOiBuZWVkIHRvIHN1cHBvcnQgMSByZWd1bGFyIGNsaWVudCwKLSAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBzaGFyZWQgY2xpZW50cyBoZXJlCi0gICAgICAgICAgICAgICAgQUxPR1coIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAocGlkICVkKSByZWplY3RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAiIChleGlzdGluZyBjbGllbnQpLiIsIGNhbGxpbmdQaWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBNYWtlIGEgZGVzY3JpcHRvciBmb3IgdGhlIGluY29taW5nIGNsaWVudAorICAgIGF1dG8gY2xpZW50RGVzY3JpcHRvciA9IENhbWVyYVNlcnZpY2U6OkNhbWVyYUNsaWVudE1hbmFnZXI6Om1ha2VDbGllbnREZXNjcmlwdG9yKGNsaWVudCwgZGVzYyk7CisgICAgYXV0byBldmljdGVkID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIuYWRkQW5kRXZpY3QoY2xpZW50RGVzY3JpcHRvcik7CisKKyAgICBsb2dDb25uZWN0ZWQoZGVzYy0+Z2V0S2V5KCksIHN0YXRpY19jYXN0PGludD4oZGVzYy0+Z2V0T3duZXJJZCgpKSwKKyAgICAgICAgICAgIFN0cmluZzgoY2xpZW50LT5nZXRQYWNrYWdlTmFtZSgpKSk7CisKKyAgICBpZiAoZXZpY3RlZC5zaXplKCkgPiAwKSB7CisgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAtIGNsaWVudHMgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIHJlbW92ZWQgaW4gZGlzY29ubmVjdAorICAgICAgICBmb3IgKGF1dG8mIGkgOiBldmljdGVkKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgc3RhdGU6IENsaWVudCBmb3IgY2FtZXJhICVzIHdhcyBub3QgcmVtb3ZlZCBpbiBkaXNjb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpLT5nZXRLZXkoKS5zdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogSW52YWxpZCBzdGF0ZSBmb3IgQ2FtZXJhU2VydmljZSwgY2xpZW50cyBub3QgZXZpY3RlZCBwcm9wZXJseSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICB9Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmhhbmRsZUV2aWN0aW9uc0xvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50IGNsaWVudFBpZCwKKyAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGNvbnN0IHNwPElCaW5kZXI+JiByZW1vdGVDYWxsYmFjaywgY29uc3QgU3RyaW5nOCYgcGFja2FnZU5hbWUsCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwgc3A8QmFzaWNDbGllbnQ+Pj4qIHBhcnRpYWwpIHsKKworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworICAgIHN0ZDo6dmVjdG9yPERlc2NyaXB0b3JQdHI+IGV2aWN0ZWRDbGllbnRzOworICAgIERlc2NyaXB0b3JQdHIgY2xpZW50RGVzY3JpcHRvcjsKKyAgICB7CisgICAgICAgIGlmIChlZmZlY3RpdmVBcGlMZXZlbCA9PSBBUElfMSkgeworICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIEFQSTEsIGFueSBleGlzdGluZyBjbGllbnQgZm9yIHRoaXMgY2FtZXJhIElEIHdpdGggdGhlIHNhbWUgcmVtb3RlCisgICAgICAgICAgICAvLyBzaG91bGQgYmUgcmV0dXJuZWQgcmF0aGVyIHRoYW4gZXZpY3RlZCB0byBhbGxvdyBNZWRpYVJlY29yZGVyIHRvIHdvcmsgcHJvcGVybHkuCisKKyAgICAgICAgICAgIGF1dG8gY3VycmVudCA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldChjYW1lcmFJZCk7CisgICAgICAgICAgICBpZiAoY3VycmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgYXV0byBjbGllbnRTcCA9IGN1cnJlbnQtPmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudFNwLmdldCgpICE9IG51bGxwdHIpIHsgLy8gc2hvdWxkIG5ldmVyIGJlIG5lZWRlZAorICAgICAgICAgICAgICAgICAgICBpZiAoIWNsaWVudFNwLT5jYW5DYXN0VG9BcGlDbGllbnQoZWZmZWN0aXZlQXBpTGV2ZWwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiQ2FtZXJhU2VydmljZSBjb25uZWN0IGNhbGxlZCBmcm9tIHNhbWUgY2xpZW50LCBidXQgd2l0aCBhIGRpZmZlcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBUEkgbGV2ZWwsIGV2aWN0aW5nIHByaW9yIGNsaWVudC4uLiIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNsaWVudFNwLT5nZXRSZW1vdGUoKSA9PSByZW1vdGVDYWxsYmFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSAoc2Vjb25kIGNhbGwgZnJvbSBzYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFwcCBiaW5kZXIsIHJldHVybmluZyB0aGUgc2FtZSBjbGllbnQpIiwgY2xpZW50UGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjbGllbnQgPSBjbGllbnRTcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtQ2xpZW50W2NhbWVyYUlkXS5jbGVhcigpOwotICAgIH0KIAotICAgIC8qCi0gICAgbUJ1c3kgaXMgc2V0IHRvIGZhbHNlIGFzIHRoZSBsYXN0IHN0ZXAgb2YgdGhlIENsaWVudCBkZXN0cnVjdG9yLAotICAgIGFmdGVyIHdoaWNoIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUgQ2xpZW50IGRlc3RydWN0b3IgaGFzIGZpbmlzaGVkICgKLSAgICBpbmNsdWRpbmcgYW55IGluaGVyaXRlZCBkZXN0cnVjdG9ycykKKyAgICAgICAgLy8gUmV0dXJuIGVycm9yIGlmIHRoZSBkZXZpY2Ugd2FzIHVucGx1Z2dlZCBvciByZW1vdmVkIGJ5IHRoZSBIQUwgZm9yIHNvbWUgcmVhc29uCisgICAgICAgIGlmICgocmV0ID0gY2hlY2tJZkRldmljZUlzVXNhYmxlKGNhbWVyYUlkKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KIAotICAgIFdlIG9ubHkgbmVlZCB0aGlzIGZvciBhIENsaWVudCBzdWJjbGFzc2VzIHNpbmNlIHdlIGRvbid0IGFsbG93Ci0gICAgbXVsdGlwbGUgQ2xlbnRzIHRvIGJlIG9wZW5lZCBjb25jdXJyZW50bHksIGJ1dCBtdWx0aXBsZSBCYXNpY0NsaWVudAotICAgIHdvdWxkIGJlIGZpbmUKLSAgICAqLwotICAgIGlmIChtQnVzeVtjYW1lcmFJZF0pIHsKLSAgICAgICAgQUxPR1coIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAocGlkICVkLCBcIiVzXCIpIHJlamVjdGVkIgotICAgICAgICAgICAgICAgICIgKGNhbWVyYSAlZCBpcyBzdGlsbCBidXN5KS4iLCBjYWxsaW5nUGlkLAotICAgICAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjYW1lcmFJZCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisgICAgICAgIC8vIEdldCBjdXJyZW50IGFjdGl2ZSBjbGllbnQgUElEcworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IG93bmVyUGlkcyhtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXRBbGxPd25lcnMoKSk7CisgICAgICAgIG93bmVyUGlkcy5wdXNoX2JhY2soY2xpZW50UGlkKTsKIAotICAgIHJldHVybiB0cnVlOwotfQorICAgICAgICAvLyBVc2UgdGhlIHZhbHVlICtQUk9DRVNTX1NUQVRFX05PTkVYSVNURU5ULCB0byBhdm9pZCB0YWtpbmcKKyAgICAgICAgLy8gYWRkcmVzcyBvZiBQUk9DRVNTX1NUQVRFX05PTkVYSVNURU5UIGFzIGEgcmVmZXJlbmNlIGFyZ3VtZW50CisgICAgICAgIC8vIGZvciB0aGUgdmVjdG9yIGNvbnN0cnVjdG9yLiBQUk9DRVNTX1NUQVRFX05PTkVYSVNURU5UIGRvZXMKKyAgICAgICAgLy8gbm90IGhhdmUgYW4gb3V0LW9mLWNsYXNzIGRlZmluaXRpb24uCisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gcHJpb3JpdGllcyhvd25lclBpZHMuc2l6ZSgpLCArUFJPQ0VTU19TVEFURV9OT05FWElTVEVOVCk7CiAKLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OmNvbm5lY3RIZWxwZXJMb2NrZWQoCi0gICAgICAgIC8qb3V0Ki8KLSAgICAgICAgc3A8Q2xpZW50PiYgY2xpZW50LAotICAgICAgICAvKmluKi8KLSAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKLSAgICAgICAgaW50IGNhbWVyYUlkLAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgIGludCBjYWxsaW5nUGlkLAotICAgICAgICBpbnQgaGFsVmVyc2lvbiwKLSAgICAgICAgYm9vbCBsZWdhY3lNb2RlKSB7CisgICAgICAgIC8vIEdldCBwcmlvcml0ZXMgb2YgYWxsIGFjdGl2ZSBQSURzCisgICAgICAgIFByb2Nlc3NJbmZvU2VydmljZTo6Z2V0UHJvY2Vzc1N0YXRlc0Zyb21QaWRzKG93bmVyUGlkcy5zaXplKCksICZvd25lclBpZHNbMF0sCisgICAgICAgICAgICAgICAgLypvdXQqLyZwcmlvcml0aWVzWzBdKTsKIAotICAgIGludCBmYWNpbmcgPSAtMTsKLSAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpOworICAgICAgICAvLyBVcGRhdGUgYWxsIGFjdGl2ZSBjbGllbnRzJyBwcmlvcml0aWVzCisgICAgICAgIHN0ZDo6bWFwPGludCxpbnQ+IHBpZFRvUHJpb3JpdHlNYXA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3duZXJQaWRzLnNpemUoKSAtIDE7IGkrKykgeworICAgICAgICAgICAgcGlkVG9Qcmlvcml0eU1hcC5lbXBsYWNlKG93bmVyUGlkc1tpXSwgZ2V0Q2FtZXJhUHJpb3JpdHlGcm9tUHJvY1N0YXRlKHByaW9yaXRpZXNbaV0pKTsKKyAgICAgICAgfQorICAgICAgICBtQWN0aXZlQ2xpZW50TWFuYWdlci51cGRhdGVQcmlvcml0aWVzKHBpZFRvUHJpb3JpdHlNYXApOwogCi0gICAgaWYgKGhhbFZlcnNpb24gPCAwIHx8IGhhbFZlcnNpb24gPT0gZGV2aWNlVmVyc2lvbikgewotICAgICAgICAvLyBEZWZhdWx0IHBhdGg6IEhBTCB2ZXJzaW9uIGlzIHVuc3BlY2lmaWVkIGJ5IGNhbGxlciwgY3JlYXRlIENhbWVyYUNsaWVudAotICAgICAgICAvLyBiYXNlZCBvbiBkZXZpY2UgdmVyc2lvbiByZXBvcnRlZCBieSB0aGUgSEFMLgotICAgICAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgewotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6Ci0gICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KHRoaXMsIGNhbWVyYUNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNhbGxpbmdQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCksIGxlZ2FjeU1vZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMDoKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgotICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQodGhpcywgY2FtZXJhQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIC0xOgotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIGlkICVkIiwgY2FtZXJhSWQpOworICAgICAgICAvLyBHZXQgc3RhdGUgZm9yIHRoZSBnaXZlbiBjYW1lcmFJZAorICAgICAgICBhdXRvIHN0YXRlID0gZ2V0Q2FtZXJhU3RhdGUoY2FtZXJhSWQpOworICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSByZWplY3RlZCAobm8gY2FtZXJhIGRldmljZSB3aXRoIElEICVzKSIsCisgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiVW5rbm93biBjYW1lcmEgZGV2aWNlIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQSBwYXJ0aWN1bGFyIEhBTCB2ZXJzaW9uIGlzIHJlcXVlc3RlZCBieSBjYWxsZXIuIENyZWF0ZSBDYW1lcmFDbGllbnQKLSAgICAgICAgLy8gYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBIQUwgdmVyc2lvbi4KLSAgICAgICAgaWYgKGRldmljZVZlcnNpb24gPiBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCAmJgotICAgICAgICAgICAgaGFsVmVyc2lvbiA9PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCkgewotICAgICAgICAgICAgLy8gT25seSBzdXBwb3J0IGhpZ2hlciBIQUwgdmVyc2lvbiBkZXZpY2Ugb3BlbmVkIGFzIEhBTDEuMCBkZXZpY2UuCi0gICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KHRoaXMsIGNhbWVyYUNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNhbGxpbmdQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCksIGxlZ2FjeU1vZGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gT3RoZXIgY29tYmluYXRpb25zIChlLmcuIEhBTDMueCBvcGVuIGFzIEhBTDIueCkgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIEhBTCB2ZXJzaW9uICV4OiBIQUwgJXggZGV2aWNlIGNhbiBvbmx5IGJlIgotICAgICAgICAgICAgICAgICAgICAiIG9wZW5lZCBhcyBIQUwgJXggZGV2aWNlIiwgaGFsVmVyc2lvbiwgZGV2aWNlVmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzApOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgICAgIC8vIE1ha2UgZGVzY3JpcHRvciBmb3IgaW5jb21pbmcgY2xpZW50CisgICAgICAgIGNsaWVudERlc2NyaXB0b3IgPSBDYW1lcmFDbGllbnRNYW5hZ2VyOjptYWtlQ2xpZW50RGVzY3JpcHRvcihjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICBzcDxCYXNpY0NsaWVudD57bnVsbHB0cn0sIHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXRlLT5nZXRDb3N0KCkpLAorICAgICAgICAgICAgICAgIHN0YXRlLT5nZXRDb25mbGljdGluZygpLAorICAgICAgICAgICAgICAgIGdldENhbWVyYVByaW9yaXR5RnJvbVByb2NTdGF0ZShwcmlvcml0aWVzW3ByaW9yaXRpZXMuc2l6ZSgpIC0gMV0pLCBjbGllbnRQaWQpOworCisgICAgICAgIC8vIEZpbmQgY2xpZW50cyB0aGF0IHdvdWxkIGJlIGV2aWN0ZWQKKyAgICAgICAgYXV0byBldmljdGVkID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIud291bGRFdmljdChjbGllbnREZXNjcmlwdG9yKTsKKworICAgICAgICAvLyBJZiB0aGUgaW5jb21pbmcgY2xpZW50IHdhcyAnZXZpY3RlZCwnIGhpZ2hlciBwcmlvcml0eSBjbGllbnRzIGhhdmUgdGhlIGNhbWVyYSBpbiB0aGUKKyAgICAgICAgLy8gYmFja2dyb3VuZCwgc28gd2UgY2Fubm90IGRvIGV2aWN0aW9ucworICAgICAgICBpZiAoc3RkOjpmaW5kKGV2aWN0ZWQuYmVnaW4oKSwgZXZpY3RlZC5lbmQoKSwgY2xpZW50RGVzY3JpcHRvcikgIT0gZXZpY3RlZC5lbmQoKSkgeworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSByZWplY3RlZCAoZXhpc3RpbmcgY2xpZW50KHMpIHdpdGggaGlnaGVyIgorICAgICAgICAgICAgICAgICAgICAiIHByaW9yaXR5KS4iLCBjbGllbnRQaWQpOworCisgICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50U3AgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRWYWx1ZSgpOworICAgICAgICAgICAgU3RyaW5nOCBjdXJUaW1lID0gZ2V0Rm9ybWF0dGVkQ3VycmVudFRpbWUoKTsKKyAgICAgICAgICAgIGF1dG8gaW5jb21wYXRpYmxlQ2xpZW50cyA9CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEluY29tcGF0aWJsZUNsaWVudHMoY2xpZW50RGVzY3JpcHRvcik7CisKKyAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCIlcyA6IERFTklFRCBjb25uZWN0IGRldmljZSAlcyBjbGllbnQgZm9yIHBhY2thZ2UgJXMgIgorICAgICAgICAgICAgICAgICAgICAiKFBJRCAlZCwgcHJpb3JpdHkgJWQpIGR1ZSB0byBldmljdGlvbiBwb2xpY3kiLCBjdXJUaW1lLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgcGFja2FnZU5hbWUuc3RyaW5nKCksIGNsaWVudFBpZCwKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhUHJpb3JpdHlGcm9tUHJvY1N0YXRlKHByaW9yaXRpZXNbcHJpb3JpdGllcy5zaXplKCkgLSAxXSkpOworCisgICAgICAgICAgICBmb3IgKGF1dG8mIGkgOiBpbmNvbXBhdGlibGVDbGllbnRzKSB7CisgICAgICAgICAgICAgICAgbXNnLmFwcGVuZEZvcm1hdCgiXG4gICAtIEJsb2NrZWQgYnkgZXhpc3RpbmcgZGV2aWNlICVzIGNsaWVudCBmb3IgcGFja2FnZSAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICIoUElEICUiIFBSSWQzMiAiLCBwcmlvcml0eSAlIiBQUklkMzIgIikiLCBpLT5nZXRLZXkoKS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzh7aS0+Z2V0VmFsdWUoKS0+Z2V0UGFja2FnZU5hbWUoKX0uc3RyaW5nKCksIGktPmdldE93bmVySWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGktPmdldFByaW9yaXR5KCkpOworICAgICAgICAgICAgICAgIEFMT0dFKCIgICBDb25mbGljdHMgd2l0aDogRGV2aWNlICVzLCBjbGllbnQgcGFja2FnZSAlcyAoUElEICUiCisgICAgICAgICAgICAgICAgICAgICAgICBQUklkMzIgIiwgcHJpb3JpdHkgJSIgUFJJZDMyICIpIiwgaS0+Z2V0S2V5KCkuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4e2ktPmdldFZhbHVlKCktPmdldFBhY2thZ2VOYW1lKCl9LnN0cmluZygpLCBpLT5nZXRPd25lcklkKCksCisgICAgICAgICAgICAgICAgICAgICAgICBpLT5nZXRQcmlvcml0eSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTG9nIHRoZSBjbGllbnQncyBhdHRlbXB0CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9nTG9jayk7CisgICAgICAgICAgICBtRXZlbnRMb2cuYWRkKG1zZyk7CisKKyAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIGkgOiBldmljdGVkKSB7CisgICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50U3AgPSBpLT5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKGNsaWVudFNwLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgc3RhdGU6IE51bGwgY2xpZW50IGluIGFjdGl2ZSBjbGllbnQgbGlzdC4iLCBfX0ZVTkNUSU9OX18pOworCisgICAgICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogSW52YWxpZCBzdGF0ZSBmb3IgQ2FtZXJhU2VydmljZSwgbnVsbCBjbGllbnQgaW4gYWN0aXZlIGxpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZlQ2xpZW50TWFuYWdlci5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IGV2aWN0aW5nIGNvbmZsaWN0aW5nIGNsaWVudCBmb3IgY2FtZXJhIElEICVzIiwKKyAgICAgICAgICAgICAgICAgICAgaS0+Z2V0S2V5KCkuc3RyaW5nKCkpOworICAgICAgICAgICAgZXZpY3RlZENsaWVudHMucHVzaF9iYWNrKGkpOworCisgICAgICAgICAgICAvLyBMb2cgdGhlIGNsaWVudHMgZXZpY3RlZAorICAgICAgICAgICAgbG9nRXZlbnQoU3RyaW5nODo6Zm9ybWF0KCJFVklDVCBkZXZpY2UgJXMgY2xpZW50IGhlbGQgYnkgcGFja2FnZSAlcyAoUElEIgorICAgICAgICAgICAgICAgICAgICAiICUiIFBSSWQzMiAiLCBwcmlvcml0eSAlIiBQUklkMzIgIilcbiAgIC0gRXZpY3RlZCBieSBkZXZpY2UgJXMgY2xpZW50IGZvciIKKyAgICAgICAgICAgICAgICAgICAgIiBwYWNrYWdlICVzIChQSUQgJWQsIHByaW9yaXR5ICUiIFBSSWQzMiAiKSIsCisgICAgICAgICAgICAgICAgICAgIGktPmdldEtleSgpLnN0cmluZygpLCBTdHJpbmc4e2NsaWVudFNwLT5nZXRQYWNrYWdlTmFtZSgpfS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgaS0+Z2V0T3duZXJJZCgpLCBpLT5nZXRQcmlvcml0eSgpLCBjYW1lcmFJZC5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUuc3RyaW5nKCksIGNsaWVudFBpZCwKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhUHJpb3JpdHlGcm9tUHJvY1N0YXRlKHByaW9yaXRpZXNbcHJpb3JpdGllcy5zaXplKCkgLSAxXSkpKTsKKworICAgICAgICAgICAgLy8gTm90aWZ5IHRoZSBjbGllbnQgb2YgZGlzY29ubmVjdGlvbgorICAgICAgICAgICAgY2xpZW50U3AtPm5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQsCisgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMoKSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0RmluaXNoVW5zYWZlKGNsaWVudCwgY2xpZW50LT5nZXRSZW1vdGUoKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICAvLyB0aGlzIGlzIHByb2JhYmx5IG5vdCByZWNvdmVyYWJsZS4uIG1heWJlIHRoZSBjbGllbnQgY2FuIHRyeSBhZ2FpbgotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIC8vIERvIG5vdCBob2xkIG1TZXJ2aWNlTG9jayB3aGlsZSBkaXNjb25uZWN0aW5nIGNsaWVudHMsIGJ1dCByZXRhaW4gdGhlIGNvbmRpdGlvbiBibG9ja2luZworICAgIC8vIG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nIGluIG1TZXJ2aWNlTG9ja1dyYXBwZXIgaWYgaGVsZAorICAgIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKKworICAgIC8vIENsZWFyIGNhbGxlciBpZGVudGl0eSB0ZW1wb3JhcmlseSBzbyBjbGllbnQgZGlzY29ubmVjdCBQSUQgY2hlY2tzIHdvcmsgY29ycmVjdGx5CisgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisKKyAgICAvLyBEZXN0cm95IGV2aWN0ZWQgY2xpZW50cworICAgIGZvciAoYXV0byYgaSA6IGV2aWN0ZWRDbGllbnRzKSB7CisgICAgICAgIC8vIERpc2Nvbm5lY3QgaXMgYmxvY2tpbmcsIGFuZCBzaG91bGQgb25seSBoYXZlIHJldHVybmVkIHdoZW4gSEFMIGhhcyBjbGVhbmVkIHVwCisgICAgICAgIGktPmdldFZhbHVlKCktPmRpc2Nvbm5lY3QoKTsgLy8gQ2xpZW50cyB3aWxsIHJlbW92ZSB0aGVtc2VsdmVzIGZyb20gdGhlIGFjdGl2ZSBjbGllbnQgbGlzdAogICAgIH0KIAotICAgIG1DbGllbnRbY2FtZXJhSWRdID0gY2xpZW50OwotICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoaWQgJWQsIHRoaXMgcGlkIGlzICVkKSIsIGNhbWVyYUlkLAotICAgICAgICAgZ2V0cGlkKCkpOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogCi0gICAgcmV0dXJuIE9LOworICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGV2aWN0ZWRDbGllbnRzKSB7CisgICAgICAgIEFMT0dWKCIlczogV2FpdGluZyBmb3IgZGlzY29ubmVjdCB0byBjb21wbGV0ZSBmb3IgY2xpZW50IGZvciBkZXZpY2UgJXMgKFBJRCAlIiBQUklkMzIgIikiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaS0+Z2V0S2V5KCkuc3RyaW5nKCksIGktPmdldE93bmVySWQoKSk7CisgICAgICAgIHJldCA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLndhaXRVbnRpbFJlbW92ZWQoaSwgREVGQVVMVF9ESVNDT05ORUNUX1RJTUVPVVRfTlMpOworICAgICAgICBpZiAocmV0ID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgY2xpZW50IGZvciBkZXZpY2UgJXMgdG8gZGlzY29ubmVjdCwgIgorICAgICAgICAgICAgICAgICAgICAiY3VycmVudCBjbGllbnRzOlxuJXMiLCBfX0ZVTkNUSU9OX18sIGktPmdldEtleSgpLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBtQWN0aXZlQ2xpZW50TWFuYWdlci50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBSZWNlaXZlZCBlcnJvciB3YWl0aW5nIGZvciBjbGllbnQgZm9yIGRldmljZSAlcyB0byBkaXNjb25uZWN0OiAlcyAoJWQpLCAiCisgICAgICAgICAgICAgICAgICAgICJjdXJyZW50IGNsaWVudHM6XG4lcyIsIF9fRlVOQ1RJT05fXywgaS0+Z2V0S2V5KCkuc3RyaW5nKCksIHN0cmVycm9yKC1yZXQpLAorICAgICAgICAgICAgICAgICAgICByZXQsIG1BY3RpdmVDbGllbnRNYW5hZ2VyLnRvU3RyaW5nKCkuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGV2aWN0ZWRDbGllbnRzLmNsZWFyKCk7CisKKyAgICAvLyBPbmNlIGNsaWVudHMgaGF2ZSBiZWVuIGRpc2Nvbm5lY3RlZCwgcmVsb2NrCisgICAgbVNlcnZpY2VMb2NrLmxvY2soKTsKKworICAgIC8vIENoZWNrIGFnYWluIGlmIHRoZSBkZXZpY2Ugd2FzIHVucGx1Z2dlZCBvciBzb21ldGhpbmcgd2hpbGUgd2Ugd2VyZW4ndCBob2xkaW5nIG1TZXJ2aWNlTG9jaworICAgIGlmICgocmV0ID0gY2hlY2tJZkRldmljZUlzVXNhYmxlKGNhbWVyYUlkKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAqcGFydGlhbCA9IGNsaWVudERlc2NyaXB0b3I7CisgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0KApAQCAtNzM4LDQ3ICsxMTMxLDIwIEBACiAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgc3A8SUNhbWVyYT4mIGRldmljZSkgewogCi0gICAgU3RyaW5nOCBjbGllbnROYW1lOChjbGllbnRQYWNrYWdlTmFtZSk7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CisgICAgU3RyaW5nOCBpZCA9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCk7CisgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBudWxscHRyOworICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQsCisgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50VWlkLCBBUElfMSwgZmFsc2UsIGZhbHNlLCAvKm91dCovY2xpZW50KTsKIAotICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgRSAocGlkICVkIFwiJXNcIiwgaWQgJWQpIiwgY2FsbGluZ1BpZCwKLSAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjYW1lcmFJZCk7Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSB2YWxpZGF0ZUNvbm5lY3QoY2FtZXJhSWQsIC8qaW5vdXQqL2NsaWVudFVpZCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIGlmKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBsb2dSZWplY3RlZChpZCwgZ2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKKyAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiVzICglZCkiLCBzdHJlcnJvcigtcmV0KSwgcmV0KSk7CisgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0KLSAgICBzcDxDbGllbnQ+IGNsaWVudDsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7Ci0gICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnRUbXA7Ci0gICAgICAgIGlmICghY2FuQ29ubmVjdFVuc2FmZShjYW1lcmFJZCwgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmFDbGllbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL2NsaWVudFRtcCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUJVU1k7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2xpZW50LmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRldmljZSA9IHN0YXRpY19jYXN0PENsaWVudCo+KGNsaWVudFRtcC5nZXQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXMgPSBjb25uZWN0SGVscGVyTG9ja2VkKC8qb3V0Ki9jbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgfQotICAgIC8vIGltcG9ydGFudDogcmVsZWFzZSB0aGUgbXV0ZXggaGVyZSBzbyB0aGUgY2xpZW50IGNhbiBjYWxsIGJhY2sKLSAgICAvLyAgICBpbnRvIHRoZSBzZXJ2aWNlIGZyb20gaXRzIGRlc3RydWN0b3IgKGNhbiBiZSBhdCB0aGUgZW5kIG9mIHRoZSBjYWxsKQotCiAgICAgZGV2aWNlID0gY2xpZW50OwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmNvbm5lY3RMZWdhY3koCkBAIC03ODksOCArMTE1NSwxMCBAQAogICAgICAgICAvKm91dCovCiAgICAgICAgIHNwPElDYW1lcmE+JiBkZXZpY2UpIHsKIAorICAgIFN0cmluZzggaWQgPSBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpOworICAgIGludCBhcGlWZXJzaW9uID0gbU1vZHVsZS0+Z2V0TW9kdWxlQXBpVmVyc2lvbigpOwogICAgIGlmIChoYWxWZXJzaW9uICE9IENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQgJiYKLSAgICAgICAgICAgIG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24gPCBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMykgeworICAgICAgICAgICAgYXBpVmVyc2lvbiA8IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8zKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIEVpdGhlciB0aGUgSEFMIHZlcnNpb24gaXMgdW5zcGVjaWZpZWQgaW4gd2hpY2ggY2FzZSB0aGlzIGp1c3QgY3JlYXRlcwogICAgICAgICAgKiBhIGNhbWVyYSBjbGllbnQgc2VsZWN0ZWQgYnkgdGhlIGxhdGVzdCBkZXZpY2UgdmVyc2lvbiwgb3IKQEAgLTc5OCwxNDIgKzExNjYsMjUgQEAKICAgICAgICAgICogdGhlIG9wZW5fbGVnYWN5IGNhbGwKICAgICAgICAgICovCiAgICAgICAgIEFMT0dFKCIlczogY2FtZXJhIEhBTCBtb2R1bGUgdmVyc2lvbiAleCBkb2Vzbid0IHN1cHBvcnQgY29ubmVjdGluZyB0byBsZWdhY3kgSEFMIGRldmljZXMhIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24pOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYXBpVmVyc2lvbik7CisgICAgICAgIGxvZ1JlamVjdGVkKGlkLCBnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICAgICAgICAgIFN0cmluZzgoIkhBTCBtb2R1bGUgdmVyc2lvbiBkb2Vzbid0IHN1cHBvcnQgbGVnYWN5IEhBTCBjb25uZWN0aW9ucyIpKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIFN0cmluZzggY2xpZW50TmFtZTgoY2xpZW50UGFja2FnZU5hbWUpOwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworICAgIHNwPENsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKKyAgICByZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PihjYW1lcmFDbGllbnQsIGlkLCBoYWxWZXJzaW9uLCBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIGNsaWVudFVpZCwgQVBJXzEsIHRydWUsIGZhbHNlLCAvKm91dCovY2xpZW50KTsKIAotICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgbGVnYWN5IEUgKHBpZCAlZCBcIiVzXCIsIGlkICVkKSIsIGNhbGxpbmdQaWQsCi0gICAgICAgICAgICBjbGllbnROYW1lOC5zdHJpbmcoKSwgY2FtZXJhSWQpOwotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gdmFsaWRhdGVDb25uZWN0KGNhbWVyYUlkLCAvKmlub3V0Ki9jbGllbnRVaWQpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICBpZihyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCisgICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIlcyAoJWQpIiwgc3RyZXJyb3IoLXJldCksIHJldCkpOworICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIHNwPENsaWVudD4gY2xpZW50OwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudFRtcDsKLSAgICAgICAgaWYgKCFjYW5Db25uZWN0VW5zYWZlKGNhbWVyYUlkLCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGNhbWVyYUNsaWVudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovY2xpZW50VG1wKSkgewotICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICAgICAgfSBlbHNlIGlmIChjbGllbnQuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICAgICAgZGV2aWNlID0gc3RhdGljX2Nhc3Q8Q2xpZW50Kj4oY2xpZW50VG1wLmdldCgpKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1cyA9IGNvbm5lY3RIZWxwZXJMb2NrZWQoLypvdXQqL2NsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsVmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxlZ2FjeU1vZGUqL3RydWUpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgLy8gaW1wb3J0YW50OiByZWxlYXNlIHRoZSBtdXRleCBoZXJlIHNvIHRoZSBjbGllbnQgY2FuIGNhbGwgYmFjawotICAgIC8vICAgIGludG8gdGhlIHNlcnZpY2UgZnJvbSBpdHMgZGVzdHJ1Y3RvciAoY2FuIGJlIGF0IHRoZSBlbmQgb2YgdGhlIGNhbGwpCi0KICAgICBkZXZpY2UgPSBjbGllbnQ7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0RmluaXNoVW5zYWZlKGNvbnN0IHNwPEJhc2ljQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgcmVtb3RlQ2FsbGJhY2spIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBjbGllbnQtPmluaXRpYWxpemUobU1vZHVsZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBpbml0aWFsaXplIGNsaWVudCBmcm9tIEhBTCBtb2R1bGUuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgaWYgKHJlbW90ZUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgcmVtb3RlQ2FsbGJhY2stPmxpbmtUb0RlYXRoKHRoaXMpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y29ubmVjdFBybygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiYgY2FtZXJhQ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJUHJvQ2FtZXJhVXNlcj4mIGRldmljZSkKLXsKLSAgICBpZiAoY2FtZXJhQ2IgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IENhbGxiYWNrIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIFN0cmluZzggY2xpZW50TmFtZTgoY2xpZW50UGFja2FnZU5hbWUpOwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwotCi0gICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdFBybyBFIChwaWQgJWQgXCIlc1wiLCBpZCAlZCkiLCBjYWxsaW5nUGlkLAotICAgICAgICAgICAgY2xpZW50TmFtZTguc3RyaW5nKCksIGNhbWVyYUlkKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSB2YWxpZGF0ZUNvbm5lY3QoY2FtZXJhSWQsIC8qaW5vdXQqL2NsaWVudFVpZCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHNwPFByb0NsaWVudD4gY2xpZW50OwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudDsKLSAgICAgICAgICAgIGlmICghY2FuQ29ubmVjdFVuc2FmZShjYW1lcmFJZCwgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhQ2IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCBmYWNpbmcgPSAtMTsKLSAgICAgICAgaW50IGRldmljZVZlcnNpb24gPSBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAmZmFjaW5nKTsKLQotICAgICAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgewotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6Ci0gICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGlkICVkIHVzZXMgSEFMdjEsIGRvZXNuJ3Qgc3VwcG9ydCBQcm9DYW1lcmEiLAotICAgICAgICAgICAgICAgICAgY2FtZXJhSWQpOwotICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMDoKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgotICAgICAgICAgICAgY2xpZW50ID0gbmV3IFByb0NhbWVyYTJDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgLTE6Ci0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjYW1lcmEgaWQgJWQiLCBjYW1lcmFJZCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiVW5rbm93biBjYW1lcmEgZGV2aWNlIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY29ubmVjdEZpbmlzaFVuc2FmZShjbGllbnQsIGNsaWVudC0+Z2V0UmVtb3RlKCkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgbVByb0NsaWVudExpc3RbY2FtZXJhSWRdLnB1c2goY2xpZW50KTsKLQotICAgICAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0UHJvIFggKGlkICVkLCB0aGlzIHBpZCBpcyAlZCkiLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBnZXRwaWQoKSk7Ci0gICAgfQotICAgIC8vIGltcG9ydGFudDogcmVsZWFzZSB0aGUgbXV0ZXggaGVyZSBzbyB0aGUgY2xpZW50IGNhbiBjYWxsIGJhY2sKLSAgICAvLyAgICBpbnRvIHRoZSBzZXJ2aWNlIGZyb20gaXRzIGRlc3RydWN0b3IgKGNhbiBiZSBhdCB0aGUgZW5kIG9mIHRoZSBjYWxsKQotICAgIGRldmljZSA9IGNsaWVudDsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0RGV2aWNlKApAQCAtOTQyLDExMCArMTE5MywxNzggQEAKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICBpbnQgY2xpZW50VWlkLAogICAgICAgICAvKm91dCovCi0gICAgICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiYgZGV2aWNlKQoteworICAgICAgICBzcDxJQ2FtZXJhRGV2aWNlVXNlcj4mIGRldmljZSkgewogCi0gICAgU3RyaW5nOCBjbGllbnROYW1lOChjbGllbnRQYWNrYWdlTmFtZSk7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CisgICAgU3RyaW5nOCBpZCA9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCk7CisgICAgc3A8Q2FtZXJhRGV2aWNlQ2xpZW50PiBjbGllbnQgPSBudWxscHRyOworICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYURldmljZUNhbGxiYWNrcyxDYW1lcmFEZXZpY2VDbGllbnQ+KGNhbWVyYUNiLCBpZCwKKyAgICAgICAgICAgIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQsIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQsIEFQSV8yLCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICAvKm91dCovY2xpZW50KTsKIAotICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3REZXZpY2UgRSAocGlkICVkIFwiJXNcIiwgaWQgJWQpIiwgY2FsbGluZ1BpZCwKLSAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjYW1lcmFJZCk7Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSB2YWxpZGF0ZUNvbm5lY3QoY2FtZXJhSWQsIC8qaW5vdXQqL2NsaWVudFVpZCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIGlmKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBsb2dSZWplY3RlZChpZCwgZ2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKKyAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiVzICglZCkiLCBzdHJlcnJvcigtcmV0KSwgcmV0KSk7CisgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgc3A8Q2FtZXJhRGV2aWNlQ2xpZW50PiBjbGllbnQ7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwotICAgICAgICB7Ci0gICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50OwotICAgICAgICAgICAgaWYgKCFjYW5Db25uZWN0VW5zYWZlKGNhbWVyYUlkLCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmFDYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL2NsaWVudCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZhY2luZyA9IC0xOwotICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpOwotCi0gICAgICAgIHN3aXRjaChkZXZpY2VWZXJzaW9uKSB7Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKLSAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgdXNpbmcgb2xkIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOwotICAgICAgICAgICAvLyBUT0RPOiBkb24ndCBhbGxvdyAyLjAgIE9ubHkgYWxsb3cgMi4xIGFuZCBoaWdoZXIKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzE6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6Ci0gICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FtZXJhRGV2aWNlQ2xpZW50KHRoaXMsIGNhbWVyYUNiLCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIC0xOgotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIGlkICVkIiwgY2FtZXJhSWQpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIlVua25vd24gY2FtZXJhIGRldmljZSBIQUwgdmVyc2lvbjogJWQiLCBkZXZpY2VWZXJzaW9uKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RGaW5pc2hVbnNhZmUoY2xpZW50LCBjbGllbnQtPmdldFJlbW90ZSgpKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICAgICAgLy8gdGhpcyBpcyBwcm9iYWJseSBub3QgcmVjb3ZlcmFibGUuLiBtYXliZSB0aGUgY2xpZW50IGNhbiB0cnkgYWdhaW4KLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0RGV2aWNlIFggKGlkICVkLCB0aGlzIHBpZCBpcyAlZCkiLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBnZXRwaWQoKSk7Ci0KLSAgICAgICAgbUNsaWVudFtjYW1lcmFJZF0gPSBjbGllbnQ7Ci0gICAgfQotICAgIC8vIGltcG9ydGFudDogcmVsZWFzZSB0aGUgbXV0ZXggaGVyZSBzbyB0aGUgY2xpZW50IGNhbiBjYWxsIGJhY2sKLSAgICAvLyAgICBpbnRvIHRoZSBzZXJ2aWNlIGZyb20gaXRzIGRlc3RydWN0b3IgKGNhbiBiZSBhdCB0aGUgZW5kIG9mIHRoZSBjYWxsKQotCiAgICAgZGV2aWNlID0gY2xpZW50OworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6c2V0VG9yY2hNb2RlKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwgYm9vbCBlbmFibGVkLAorICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgY2xpZW50QmluZGVyKSB7CisgICAgaWYgKGVuYWJsZWQgJiYgY2xpZW50QmluZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0b3JjaCBjbGllbnQgYmluZGVyIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBTdHJpbmc4IGlkID0gU3RyaW5nOChjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKKworICAgIC8vIHZlcmlmeSBpZCBpcyB2YWxpZC4KKyAgICBhdXRvIHN0YXRlID0gZ2V0Q2FtZXJhU3RhdGUoaWQpOworICAgIGlmIChzdGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogY2FtZXJhIGlkIGlzIGludmFsaWQgJXMiLCBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIGNhbWVyYVN0YXR1cyA9IHN0YXRlLT5nZXRTdGF0dXMoKTsKKyAgICBpZiAoY2FtZXJhU3RhdHVzICE9IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19QUkVTRU5UICYmCisgICAgICAgICAgICBjYW1lcmFTdGF0dXMgIT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9BVkFJTEFCTEUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgaWQgaXMgaW52YWxpZCAlcyIsIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtVG9yY2hTdGF0dXNNdXRleCk7CisgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRvcmNoU3RhdHVzIHN0YXR1czsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gZ2V0VG9yY2hTdGF0dXNMb2NrZWQoaWQsICZzdGF0dXMpOworICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGdldHRpbmcgY3VycmVudCB0b3JjaCBzdGF0dXMgZmFpbGVkIGZvciBjYW1lcmEgJXMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUT1JDSF9TVEFUVVNfTk9UX0FWQUlMQUJMRSkgeworICAgICAgICAgICAgaWYgKGNhbWVyYVN0YXR1cyA9PSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX0FWQUlMQUJMRSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogdG9yY2ggbW9kZSBvZiBjYW1lcmEgJXMgaXMgbm90IGF2YWlsYWJsZSBiZWNhdXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW1lcmEgaXMgaW4gdXNlIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB0b3JjaCBtb2RlIG9mIGNhbWVyYSAlcyBpcyBub3QgYXZhaWxhYmxlIGR1ZSB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdWZmaWNpZW50IHJlc291cmNlcyIsIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiAtRVVTRVJTOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICAvLyBVcGRhdGUgVUlEIG1hcCAtIHRoaXMgaXMgdXNlZCBpbiB0aGUgdG9yY2ggc3RhdHVzIGNoYW5nZWQgY2FsbGJhY2tzLCBzbyBtdXN0IGJlIGRvbmUKKyAgICAgICAgLy8gYmVmb3JlIHNldFRvcmNoTW9kZQorICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoVWlkTWFwTXV0ZXgpOworICAgICAgICBpZiAobVRvcmNoVWlkTWFwLmZpbmQoaWQpID09IG1Ub3JjaFVpZE1hcC5lbmQoKSkgeworICAgICAgICAgICAgbVRvcmNoVWlkTWFwW2lkXS5maXJzdCA9IHVpZDsKKyAgICAgICAgICAgIG1Ub3JjaFVpZE1hcFtpZF0uc2Vjb25kID0gdWlkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gU2V0IHRoZSBwZW5kaW5nIFVJRAorICAgICAgICAgICAgbVRvcmNoVWlkTWFwW2lkXS5maXJzdCA9IHVpZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1c190IHJlcyA9IG1GbGFzaGxpZ2h0LT5zZXRUb3JjaE1vZGUoaWQsIGVuYWJsZWQpOworCisgICAgaWYgKHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgdG9yY2ggbW9kZSBvZiBjYW1lcmEgJXMgdG8gJWQgZmFpbGVkLiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpLCBlbmFibGVkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIHVwZGF0ZSB0aGUgbGluayB0byBjbGllbnQncyBkZWF0aAorICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoQ2xpZW50TWFwTXV0ZXgpOworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVRvcmNoQ2xpZW50TWFwLmluZGV4T2ZLZXkoaWQpOworICAgICAgICBCYXR0ZXJ5Tm90aWZpZXImIG5vdGlmaWVyKEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKSk7CisgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICBtVG9yY2hDbGllbnRNYXAuYWRkKGlkLCBjbGllbnRCaW5kZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVG9yY2hDbGllbnRNYXAudmFsdWVBdChpbmRleCktPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgICAgICAgICAgbVRvcmNoQ2xpZW50TWFwLnJlcGxhY2VWYWx1ZUF0KGluZGV4LCBjbGllbnRCaW5kZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xpZW50QmluZGVyLT5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgfSBlbHNlIGlmIChpbmRleCAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgbVRvcmNoQ2xpZW50TWFwLnZhbHVlQXQoaW5kZXgpLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6Om5vdGlmeVN5c3RlbUV2ZW50KGludDMyX3QgZXZlbnRJZCwgY29uc3QgaW50MzJfdCogYXJncywgc2l6ZV90IGxlbmd0aCkgeworICAgIHN3aXRjaChldmVudElkKSB7CisgICAgICAgIGNhc2UgSUNhbWVyYVNlcnZpY2U6OlVTRVJfU1dJVENIRUQ6IHsKKyAgICAgICAgICAgIGRvVXNlclN3aXRjaCgvKm5ld1VzZXJJZHMqL2FyZ3MsIC8qbGVuZ3RoKi9sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBJQ2FtZXJhU2VydmljZTo6Tk9fRVZFTlQ6CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogUmVjZWl2ZWQgaW52YWxpZCBzeXN0ZW0gZXZlbnQgZnJvbSBzeXN0ZW1fc2VydmVyOiAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgZXZlbnRJZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KIAotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6YWRkTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6YWRkTGlzdGVuZXIoY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgQUxPR1YoIiVzOiBBZGQgbGlzdGVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIGxpc3RlbmVyLmdldCgpKTsKIAotICAgIGlmIChsaXN0ZW5lciA9PSAwKSB7CisgICAgaWYgKGxpc3RlbmVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBMaXN0ZW5lciBtdXN0IG5vdCBiZSBudWxsIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwogCi0gICAgVmVjdG9yPHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+ID46Oml0ZXJhdG9yIGl0LCBlbmQ7Ci0gICAgZm9yIChpdCA9IG1MaXN0ZW5lckxpc3QuYmVnaW4oKTsgaXQgIT0gbUxpc3RlbmVyTGlzdC5lbmQoKTsgKytpdCkgewotICAgICAgICBpZiAoSUludGVyZmFjZTo6YXNCaW5kZXIoKml0KSA9PSBJSW50ZXJmYWNlOjphc0JpbmRlcihsaXN0ZW5lcikpIHsKLSAgICAgICAgICAgIEFMT0dXKCIlczogVHJpZWQgdG8gYWRkIGxpc3RlbmVyICVwIHdoaWNoIHdhcyBhbHJlYWR5IHN1YnNjcmliZWQiLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBsaXN0ZW5lci5nZXQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKKyAgICAgICAgZm9yIChhdXRvJiBpdCA6IG1MaXN0ZW5lckxpc3QpIHsKKyAgICAgICAgICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcihpdCkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBUcmllZCB0byBhZGQgbGlzdGVuZXIgJXAgd2hpY2ggd2FzIGFscmVhZHkgc3Vic2NyaWJlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBsaXN0ZW5lci5nZXQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgbUxpc3RlbmVyTGlzdC5wdXNoX2JhY2sobGlzdGVuZXIpOwogICAgIH0KIAotICAgIG1MaXN0ZW5lckxpc3QucHVzaF9iYWNrKGxpc3RlbmVyKTsKIAogICAgIC8qIEltbWVkaWF0ZWx5IHNpZ25hbCBjdXJyZW50IHN0YXR1cyB0byB0aGlzIGxpc3RlbmVyIG9ubHkgKi8KICAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBtKG1TdGF0dXNNdXRleCkgOwotICAgICAgICBpbnQgbnVtQ2FtcyA9IGdldE51bWJlck9mQ2FtZXJhcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNhbXM7ICsraSkgewotICAgICAgICAgICAgbGlzdGVuZXItPm9uU3RhdHVzQ2hhbmdlZChtU3RhdHVzTGlzdFtpXSwgaSk7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKKyAgICAgICAgZm9yIChhdXRvJiBpIDogbUNhbWVyYVN0YXRlcykgeworICAgICAgICAgICAgLy8gVE9ETzogVXBkYXRlIGJpbmRlciB0byB1c2UgU3RyaW5nMTYgZm9yIGNhbWVyYSBJRHMgYW5kIHJlbW92ZTsKKyAgICAgICAgICAgIGludCBpZCA9IGNhbWVyYUlkVG9JbnQoaS5maXJzdCk7CisgICAgICAgICAgICBpZiAoaWQgPT0gLTEpIGNvbnRpbnVlOworCisgICAgICAgICAgICBsaXN0ZW5lci0+b25TdGF0dXNDaGFuZ2VkKGkuc2Vjb25kLT5nZXRTdGF0dXMoKSwgaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSW1tZWRpYXRlbHkgc2lnbmFsIGN1cnJlbnQgdG9yY2ggc3RhdHVzIHRvIHRoaXMgbGlzdGVuZXIgb25seSAqLworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaFN0YXR1c011dGV4KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVG9yY2hTdGF0dXNNYXAuc2l6ZSgpOyBpKysgKSB7CisgICAgICAgICAgICBTdHJpbmcxNiBpZCA9IFN0cmluZzE2KG1Ub3JjaFN0YXR1c01hcC5rZXlBdChpKS5zdHJpbmcoKSk7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25Ub3JjaFN0YXR1c0NoYW5nZWQobVRvcmNoU3RhdHVzTWFwLnZhbHVlQXQoaSksIGlkKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OnJlbW92ZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6cmVtb3ZlTGlzdGVuZXIoY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgQUxPR1YoIiVzOiBSZW1vdmUgbGlzdGVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIGxpc3RlbmVyLmdldCgpKTsKIAogICAgIGlmIChsaXN0ZW5lciA9PSAwKSB7CkBAIC0xMDU1LDExICsxMzc0LDEzIEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwogCi0gICAgVmVjdG9yPHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+ID46Oml0ZXJhdG9yIGl0OwotICAgIGZvciAoaXQgPSBtTGlzdGVuZXJMaXN0LmJlZ2luKCk7IGl0ICE9IG1MaXN0ZW5lckxpc3QuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKCppdCkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXJMaXN0LmVyYXNlKGl0KTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtTGlzdGVuZXJMaXN0LmJlZ2luKCk7IGl0ICE9IG1MaXN0ZW5lckxpc3QuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcigqaXQpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgeworICAgICAgICAgICAgICAgIG1MaXN0ZW5lckxpc3QuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTA2OSwxMCArMTM5MCw3IEBACiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0TGVnYWN5UGFyYW1ldGVycygKLSAgICAgICAgICAgIGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgIFN0cmluZzE2KiBwYXJhbWV0ZXJzKSB7CitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRMZWdhY3lQYXJhbWV0ZXJzKGludCBjYW1lcmFJZCwgLypvdXQqL1N0cmluZzE2KiBwYXJhbWV0ZXJzKSB7CiAgICAgQUxPR1YoIiVzOiBmb3IgY2FtZXJhIElEID0gJWQiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKIAogICAgIGlmIChwYXJhbWV0ZXJzID09IE5VTEwpIHsKQEAgLTExMjcsNiArMTQ0NSw3IEBACiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CisgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zOgogICAgICAgICBBTE9HVigiJXM6IENhbWVyYSBpZCAlZCB1c2VzIEhBTDMuMiBvciBuZXdlciwgc3VwcG9ydHMgYXBpMS9hcGkyIGRpcmVjdGx5IiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKICAgICAgICAgcmV0dXJuIE9LOwpAQCAtMTE0MSwxNDAgKzE0NjAsMjgxIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6OnJlbW92ZUNsaWVudEJ5UmVtb3RlKGNvbnN0IHdwPElCaW5kZXI+JiByZW1vdGVCaW5kZXIpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKLSAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpyZW1vdmVDbGllbnRCeVJlbW90ZSBFIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7Ci0KLSAgICAvLyBEZWNsYXJlIHRoaXMgYmVmb3JlIHRoZSBsb2NrIHRvIG1ha2UgYWJzb2x1dGVseSBzdXJlIHRoZQotICAgIC8vIGRlc3RydWN0b3Igd29uJ3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZC4KK3ZvaWQgQ2FtZXJhU2VydmljZTo6cmVtb3ZlQnlDbGllbnQoY29uc3QgQmFzaWNDbGllbnQqIGNsaWVudCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7Ci0KLSAgICBpbnQgb3V0SW5kZXg7Ci0gICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudCA9IGZpbmRDbGllbnRVbnNhZmUocmVtb3RlQmluZGVyLCBvdXRJbmRleCk7Ci0KLSAgICBpZiAoY2xpZW50ICE9IDApIHsKLSAgICAgICAgLy8gRm91bmQgb3VyIGNhbWVyYSwgY2xlYXIgYW5kIGxlYXZlLgotICAgICAgICBMT0cxKCJyZW1vdmVDbGllbnQ6IGNsZWFyIGNhbWVyYSAlZCIsIG91dEluZGV4KTsKLQotICAgICAgICBzcDxJQmluZGVyPiByZW1vdGUgPSBjbGllbnQtPmdldFJlbW90ZSgpOwotICAgICAgICBpZiAocmVtb3RlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHJlbW90ZS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1DbGllbnRbb3V0SW5kZXhdLmNsZWFyKCk7Ci0gICAgfSBlbHNlIHsKLQotICAgICAgICBzcDxQcm9DbGllbnQ+IGNsaWVudFBybyA9IGZpbmRQcm9DbGllbnRVbnNhZmUocmVtb3RlQmluZGVyKTsKLQotICAgICAgICBpZiAoY2xpZW50UHJvICE9IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIEZvdW5kIG91ciBjYW1lcmEsIGNsZWFyIGFuZCBsZWF2ZS4KLSAgICAgICAgICAgIExPRzEoInJlbW92ZUNsaWVudDogY2xlYXIgcHJvICVwIiwgY2xpZW50UHJvLmdldCgpKTsKLQotICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50UHJvLT5nZXRSZW1vdGVDYWxsYmFjaygpKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICBmb3IgKGF1dG8mIGkgOiBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXRBbGwoKSkgeworICAgICAgICBhdXRvIGNsaWVudFNwID0gaS0+Z2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKGNsaWVudFNwLmdldCgpID09IGNsaWVudCkgeworICAgICAgICAgICAgbUFjdGl2ZUNsaWVudE1hbmFnZXIucmVtb3ZlKGkpOwogICAgICAgICB9CiAgICAgfQotCi0gICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6cmVtb3ZlQ2xpZW50QnlSZW1vdGUgWCAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwogfQogCi1zcDxDYW1lcmFTZXJ2aWNlOjpQcm9DbGllbnQ+IENhbWVyYVNlcnZpY2U6OmZpbmRQcm9DbGllbnRVbnNhZmUoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxJQmluZGVyPiYgY2FtZXJhQ2FsbGJhY2tzUmVtb3RlKQotewotICAgIHNwPFByb0NsaWVudD4gY2xpZW50UHJvOworYm9vbCBDYW1lcmFTZXJ2aWNlOjpldmljdENsaWVudElkQnlSZW1vdGUoY29uc3Qgd3A8SUJpbmRlcj4mIHJlbW90ZSkgeworICAgIGNvbnN0IGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBzZXJ2aWNlUGlkID0gZ2V0cGlkKCk7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIC8vIEFjcXVpcmUgbVNlcnZpY2VMb2NrIGFuZCBwcmV2ZW50IG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBdXRvQ29uZGl0aW9uTG9jaz4gbG9jayA9CisgICAgICAgICAgICAgICAgQXV0b0NvbmRpdGlvbkxvY2s6OndhaXRBbmRBY3F1aXJlKG1TZXJ2aWNlTG9ja1dyYXBwZXIpOwogCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZDYW1lcmFzOyArK2kpIHsKLSAgICAgICAgVmVjdG9yPHNpemVfdD4gcmVtb3ZlSWR4OwogCi0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbVByb0NsaWVudExpc3RbaV0uc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgIHdwPFByb0NsaWVudD4gY2wgPSBtUHJvQ2xpZW50TGlzdFtpXVtqXTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3A8QmFzaWNDbGllbnQ+PiBldmljdGVkOworICAgICAgICBmb3IgKGF1dG8mIGkgOiBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXRBbGwoKSkgeworICAgICAgICAgICAgYXV0byBjbGllbnRTcCA9IGktPmdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoY2xpZW50U3AuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRGVhZCBjbGllbnQgc3RpbGwgaW4gbUFjdGl2ZUNsaWVudE1hbmFnZXIuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZlQ2xpZW50TWFuYWdlci5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVtb3RlID09IGNsaWVudFNwLT5nZXRSZW1vdGUoKSAmJiAoY2FsbGluZ1BpZCA9PSBzZXJ2aWNlUGlkIHx8CisgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQgPT0gY2xpZW50U3AtPmdldENsaWVudFBpZCgpKSkgeworICAgICAgICAgICAgICAgIG1BY3RpdmVDbGllbnRNYW5hZ2VyLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICBldmljdGVkLnB1c2hfYmFjayhjbGllbnRTcCk7CiAKLSAgICAgICAgICAgIHNwPFByb0NsaWVudD4gY2xTdHJvbmcgPSBjbC5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAoY2xTdHJvbmcgIT0gTlVMTCAmJiBjbFN0cm9uZy0+Z2V0UmVtb3RlKCkgPT0gY2FtZXJhQ2FsbGJhY2tzUmVtb3RlKSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50UHJvID0gY2xTdHJvbmc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNsU3Ryb25nID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvLyBtYXJrIHRvIGNsZWFuIHVwIGRlYWQgcHRyCi0gICAgICAgICAgICAgICAgcmVtb3ZlSWR4LnB1c2goaik7CisgICAgICAgICAgICAgICAgLy8gTm90aWZ5IHRoZSBjbGllbnQgb2YgZGlzY29ubmVjdGlvbgorICAgICAgICAgICAgICAgIGNsaWVudFNwLT5ub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIHJlbW92ZSBzdGFsZSBwdHJzIChpbiByZXZlcnNlIHNvIHRoZSBpbmRpY2VzIGRvbnQgY2hhbmdlKQotICAgICAgICBmb3IgKHNzaXplX3QgaiA9IChzc2l6ZV90KXJlbW92ZUlkeC5zaXplKCkgLSAxOyBqID49IDA7IC0taikgewotICAgICAgICAgICAgbVByb0NsaWVudExpc3RbaV0ucmVtb3ZlQXQocmVtb3ZlSWR4W2pdKTsKKyAgICAgICAgLy8gRG8gbm90IGhvbGQgbVNlcnZpY2VMb2NrIHdoaWxlIGRpc2Nvbm5lY3RpbmcgY2xpZW50cywgYnV0IHJldGFpbiB0aGUgY29uZGl0aW9uIGJsb2NraW5nCisgICAgICAgIC8vIG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nIGluIG1TZXJ2aWNlTG9ja1dyYXBwZXIgaWYgaGVsZAorICAgICAgICBtU2VydmljZUxvY2sudW5sb2NrKCk7CisKKyAgICAgICAgLy8gRG8gbm90IGNsZWFyIGNhbGxlciBpZGVudGl0eSwgcmVtb3RlIGNhbGxlciBzaG91bGQgYmUgY2xpZW50IHByb2NjZXNzCisKKyAgICAgICAgZm9yIChhdXRvJiBpIDogZXZpY3RlZCkgeworICAgICAgICAgICAgaWYgKGkuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGktPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICB9CisgICAgICAgIC8vIFJlYWNxdWlyZSBtU2VydmljZUxvY2sKKyAgICAgICAgbVNlcnZpY2VMb2NrLmxvY2soKTsKIAotICAgIHJldHVybiBjbGllbnRQcm87CisgICAgfSAvLyBsb2NrIGlzIGRlc3Ryb3llZCwgYWxsb3cgZnVydGhlciBjb25uZWN0IGNhbGxzCisKKyAgICByZXR1cm4gcmV0OwogfQogCi1zcDxDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudD4gQ2FtZXJhU2VydmljZTo6ZmluZENsaWVudFVuc2FmZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPElCaW5kZXI+JiBjYW1lcmFDbGllbnQsIGludCYgb3V0SW5kZXgpIHsKLSAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50OwogCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZDYW1lcmFzOyBpKyspIHsKKy8qKgorICogQ2hlY2sgY2FtZXJhIGNhcGFiaWxpdGllcywgc3VjaCBhcyBzdXBwb3J0IGZvciBiYXNpYyBjb2xvciBvcGVyYXRpb24KKyAqLworaW50IENhbWVyYVNlcnZpY2U6OmNoZWNrQ2FtZXJhQ2FwYWJpbGl0aWVzKGludCBpZCwgY2FtZXJhX2luZm8gaW5mbywgaW50ICpsYXRlc3RTdHJhbmdlQ2FtZXJhSWQpIHsKIAotICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBoYXZlIGFscmVhZHkgZGlzY29ubmVjdGVkIChvciB0aGlzIGlzCi0gICAgICAgIC8vIGp1c3QgYW5vdGhlciB1bnVzZWQgY2FtZXJhKS4KLSAgICAgICAgaWYgKG1DbGllbnRbaV0gPT0gMCkgY29udGludWU7CisgICAgLy8gQXNzdW1lIGFsbCBkZXZpY2VzIHByZS12My4zIGFyZSBiYWNrd2FyZC1jb21wYXRpYmxlCisgICAgYm9vbCBpc0JhY2t3YXJkQ29tcGF0aWJsZSA9IHRydWU7CisgICAgaWYgKG1Nb2R1bGUtPmdldE1vZHVsZUFwaVZlcnNpb24oKSA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMAorICAgICAgICAgICAgJiYgaW5mby5kZXZpY2VfdmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMykgeworICAgICAgICBpc0JhY2t3YXJkQ29tcGF0aWJsZSA9IGZhbHNlOworICAgICAgICBzdGF0dXNfdCByZXM7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGNhcHM7CisgICAgICAgIHJlcyA9IGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KAorICAgICAgICAgICAgaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljcywKKyAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTLAorICAgICAgICAgICAgJmNhcHMpOworICAgICAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogVW5hYmxlIHRvIGZpbmQgY2FtZXJhIGNhcGFiaWxpdGllcyBmb3IgY2FtZXJhIGRldmljZSAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQpOworICAgICAgICAgICAgY2Fwcy5jb3VudCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBzLmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjYXBzLmRhdGEudThbaV0gPT0KKyAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQkFDS1dBUkRfQ09NUEFUSUJMRSkgeworICAgICAgICAgICAgICAgIGlzQmFja3dhcmRDb21wYXRpYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotICAgICAgICAvLyBQcm9tb3RlIG1DbGllbnQuIEl0IGNhbiBmYWlsIGlmIHdlIGFyZSBjYWxsZWQgZnJvbSB0aGlzIHBhdGg6Ci0gICAgICAgIC8vIENsaWVudDo6fkNsaWVudCgpIC0+IGRpc2Nvbm5lY3QoKSAtPiByZW1vdmVDbGllbnRCeVJlbW90ZSgpLgotICAgICAgICBjbGllbnQgPSBtQ2xpZW50W2ldLnByb21vdGUoKTsKKyAgICBpZiAoIWlzQmFja3dhcmRDb21wYXRpYmxlKSB7CisgICAgICAgIG1OdW1iZXJPZk5vcm1hbENhbWVyYXMtLTsKKyAgICAgICAgKmxhdGVzdFN0cmFuZ2VDYW1lcmFJZCA9IGlkOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpZCA+ICpsYXRlc3RTdHJhbmdlQ2FtZXJhSWQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTm9ybWFsIGNhbWVyYSBJRCAlZCBoaWdoZXIgdGhhbiBzdHJhbmdlIGNhbWVyYSBJRCAlZC4gIgorICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBub3QgYWxsb3dlZCBkdWUgYmFja3dhcmQtY29tcGF0aWJpbGl0eSByZXF1aXJlbWVudHMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLCAqbGF0ZXN0U3RyYW5nZUNhbWVyYUlkKTsKKyAgICAgICAgICAgIGxvZ1NlcnZpY2VFcnJvcigiSW52YWxpZCBvcmRlciBvZiBjYW1lcmEgZGV2aWNlcyIsIEVOT0RFVik7CisgICAgICAgICAgICBtTnVtYmVyT2ZDYW1lcmFzID0gMDsKKyAgICAgICAgICAgIG1OdW1iZXJPZk5vcm1hbENhbWVyYXMgPSAwOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KIAotICAgICAgICAvLyBDbGVhbiB1cCBzdGFsZSBjbGllbnQgZW50cnkKLSAgICAgICAgaWYgKGNsaWVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtQ2xpZW50W2ldLmNsZWFyKCk7CitzdGQ6OnNoYXJlZF9wdHI8Q2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU+IENhbWVyYVNlcnZpY2U6OmdldENhbWVyYVN0YXRlKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgY29uc3QgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDYW1lcmFTdGF0ZT4gc3RhdGU7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtQ2FtZXJhU3RhdGVzTG9jayk7CisgICAgICAgIGF1dG8gaXRlciA9IG1DYW1lcmFTdGF0ZXMuZmluZChjYW1lcmFJZCk7CisgICAgICAgIGlmIChpdGVyICE9IG1DYW1lcmFTdGF0ZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHN0YXRlID0gaXRlci0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0ZTsKK30KKworc3A8Q2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ+IENhbWVyYVNlcnZpY2U6OnJlbW92ZUNsaWVudExvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgeworICAgIC8vIFJlbW92ZSBmcm9tIGFjdGl2ZSBjbGllbnRzIGxpc3QKKyAgICBhdXRvIGNsaWVudERlc2NyaXB0b3JQdHIgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5yZW1vdmUoY2FtZXJhSWQpOworICAgIGlmIChjbGllbnREZXNjcmlwdG9yUHRyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBDb3VsZCBub3QgZXZpY3QgY2xpZW50LCBubyBjbGllbnQgZm9yIGNhbWVyYSBJRCAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBzcDxCYXNpY0NsaWVudD57bnVsbHB0cn07CisgICAgfQorCisgICAgcmV0dXJuIGNsaWVudERlc2NyaXB0b3JQdHItPmdldFZhbHVlKCk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6ZG9Vc2VyU3dpdGNoKGNvbnN0IGludDMyX3QqIG5ld1VzZXJJZCwgc2l6ZV90IGxlbmd0aCkgeworICAgIC8vIEFjcXVpcmUgbVNlcnZpY2VMb2NrIGFuZCBwcmV2ZW50IG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nCisgICAgc3RkOjp1bmlxdWVfcHRyPEF1dG9Db25kaXRpb25Mb2NrPiBsb2NrID0KKyAgICAgICAgICAgIEF1dG9Db25kaXRpb25Mb2NrOjp3YWl0QW5kQWNxdWlyZShtU2VydmljZUxvY2tXcmFwcGVyKTsKKworICAgIHN0ZDo6c2V0PHVzZXJpZF90PiBuZXdBbGxvd2VkVXNlcnM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBpZiAobmV3VXNlcklkW2ldIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBCYWQgdXNlciBJRCAlZCBnaXZlbiBkdXJpbmcgdXNlciBzd2l0Y2gsIGlnbm9yaW5nLiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbmV3VXNlcklkW2ldKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBuZXdBbGxvd2VkVXNlcnMuaW5zZXJ0KHN0YXRpY19jYXN0PHVzZXJpZF90PihuZXdVc2VySWRbaV0pKTsKKyAgICB9CisKKworICAgIGlmIChuZXdBbGxvd2VkVXNlcnMgPT0gbUFsbG93ZWRVc2VycykgeworICAgICAgICBBTE9HVygiJXM6IFJlY2VpdmVkIG5vdGlmaWNhdGlvbiBvZiB1c2VyIHN3aXRjaCB3aXRoIG5vIHVwZGF0ZWQgdXNlciBJRHMuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxvZ1VzZXJTd2l0Y2gobUFsbG93ZWRVc2VycywgbmV3QWxsb3dlZFVzZXJzKTsKKworICAgIG1BbGxvd2VkVXNlcnMgPSBzdGQ6Om1vdmUobmV3QWxsb3dlZFVzZXJzKTsKKworICAgIC8vIEN1cnJlbnQgdXNlciBoYXMgc3dpdGNoZWQsIGV2aWN0IGFsbCBjdXJyZW50IGNsaWVudHMuCisgICAgc3RkOjp2ZWN0b3I8c3A8QmFzaWNDbGllbnQ+PiBldmljdGVkOworICAgIGZvciAoYXV0byYgaSA6IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpKSB7CisgICAgICAgIGF1dG8gY2xpZW50U3AgPSBpLT5nZXRWYWx1ZSgpOworCisgICAgICAgIGlmIChjbGllbnRTcC5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IERlYWQgY2xpZW50IHN0aWxsIGluIG1BY3RpdmVDbGllbnRNYW5hZ2VyLiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChjYW1lcmFDbGllbnQgPT0gY2xpZW50LT5nZXRSZW1vdGUoKSkgewotICAgICAgICAgICAgLy8gRm91bmQgb3VyIGNhbWVyYQotICAgICAgICAgICAgb3V0SW5kZXggPSBpOwotICAgICAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICAgICAgLy8gRG9uJ3QgZXZpY3QgY2xpZW50cyB0aGF0IGFyZSBzdGlsbCBhbGxvd2VkLgorICAgICAgICB1aWRfdCBjbGllbnRVaWQgPSBjbGllbnRTcC0+Z2V0Q2xpZW50VWlkKCk7CisgICAgICAgIHVzZXJpZF90IGNsaWVudFVzZXJJZCA9IG11bHRpdXNlcl9nZXRfdXNlcl9pZChjbGllbnRVaWQpOworICAgICAgICBpZiAobUFsbG93ZWRVc2Vycy5maW5kKGNsaWVudFVzZXJJZCkgIT0gbUFsbG93ZWRVc2Vycy5lbmQoKSkgeworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKworICAgICAgICBldmljdGVkLnB1c2hfYmFjayhjbGllbnRTcCk7CisKKyAgICAgICAgU3RyaW5nOCBjdXJUaW1lID0gZ2V0Rm9ybWF0dGVkQ3VycmVudFRpbWUoKTsKKworICAgICAgICBBTE9HRSgiRXZpY3RpbmcgY29uZmxpY3RpbmcgY2xpZW50IGZvciBjYW1lcmEgSUQgJXMgZHVlIHRvIHVzZXIgY2hhbmdlIiwKKyAgICAgICAgICAgICAgICBpLT5nZXRLZXkoKS5zdHJpbmcoKSk7CisKKyAgICAgICAgLy8gTG9nIHRoZSBjbGllbnRzIGV2aWN0ZWQKKyAgICAgICAgbG9nRXZlbnQoU3RyaW5nODo6Zm9ybWF0KCJFVklDVCBkZXZpY2UgJXMgY2xpZW50IGhlbGQgYnkgcGFja2FnZSAlcyAoUElEICUiCisgICAgICAgICAgICAgICAgUFJJZDMyICIsIHByaW9yaXR5ICUiIFBSSWQzMiAiKVxuICAgLSBFdmljdGVkIGR1ZSB0byB1c2VyIHN3aXRjaC4iLAorICAgICAgICAgICAgICAgIGktPmdldEtleSgpLnN0cmluZygpLCBTdHJpbmc4e2NsaWVudFNwLT5nZXRQYWNrYWdlTmFtZSgpfS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBpLT5nZXRPd25lcklkKCksIGktPmdldFByaW9yaXR5KCkpKTsKKwogICAgIH0KIAotICAgIG91dEluZGV4ID0gLTE7Ci0gICAgcmV0dXJuIE5VTEw7CisgICAgLy8gRG8gbm90IGhvbGQgbVNlcnZpY2VMb2NrIHdoaWxlIGRpc2Nvbm5lY3RpbmcgY2xpZW50cywgYnV0IHJldGFpbiB0aGUgY29uZGl0aW9uCisgICAgLy8gYmxvY2tpbmcgb3RoZXIgY2xpZW50cyBmcm9tIGNvbm5lY3RpbmcgaW4gbVNlcnZpY2VMb2NrV3JhcHBlciBpZiBoZWxkLgorICAgIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKKworICAgIC8vIENsZWFyIGNhbGxlciBpZGVudGl0eSB0ZW1wb3JhcmlseSBzbyBjbGllbnQgZGlzY29ubmVjdCBQSUQgY2hlY2tzIHdvcmsgY29ycmVjdGx5CisgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisKKyAgICBmb3IgKGF1dG8mIGkgOiBldmljdGVkKSB7CisgICAgICAgIGktPmRpc2Nvbm5lY3QoKTsKKyAgICB9CisKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKworICAgIC8vIFJlYWNxdWlyZSBtU2VydmljZUxvY2sKKyAgICBtU2VydmljZUxvY2subG9jaygpOwogfQogCi1DYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudCogQ2FtZXJhU2VydmljZTo6Z2V0Q2xpZW50QnlJZFVuc2FmZShpbnQgY2FtZXJhSWQpIHsKLSAgICBpZiAoY2FtZXJhSWQgPCAwIHx8IGNhbWVyYUlkID49IG1OdW1iZXJPZkNhbWVyYXMpIHJldHVybiBOVUxMOwotICAgIHJldHVybiBtQ2xpZW50W2NhbWVyYUlkXS51bnNhZmVfZ2V0KCk7Cit2b2lkIENhbWVyYVNlcnZpY2U6OmxvZ0V2ZW50KGNvbnN0IGNoYXIqIGV2ZW50KSB7CisgICAgU3RyaW5nOCBjdXJUaW1lID0gZ2V0Rm9ybWF0dGVkQ3VycmVudFRpbWUoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9nTG9jayk7CisgICAgbUV2ZW50TG9nLmFkZChTdHJpbmc4Ojpmb3JtYXQoIiVzIDogJXMiLCBjdXJUaW1lLnN0cmluZygpLCBldmVudCkpOwogfQogCi1NdXRleCogQ2FtZXJhU2VydmljZTo6Z2V0Q2xpZW50TG9ja0J5SWQoaW50IGNhbWVyYUlkKSB7Ci0gICAgaWYgKGNhbWVyYUlkIDwgMCB8fCBjYW1lcmFJZCA+PSBtTnVtYmVyT2ZDYW1lcmFzKSByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gJm1DbGllbnRMb2NrW2NhbWVyYUlkXTsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6bG9nRGlzY29ubmVjdGVkKGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBpbnQgY2xpZW50UGlkLAorICAgICAgICBjb25zdCBjaGFyKiBjbGllbnRQYWNrYWdlKSB7CisgICAgLy8gTG9nIHRoZSBjbGllbnRzIGV2aWN0ZWQKKyAgICBsb2dFdmVudChTdHJpbmc4Ojpmb3JtYXQoIkRJU0NPTk5FQ1QgZGV2aWNlICVzIGNsaWVudCBmb3IgcGFja2FnZSAlcyAoUElEICVkKSIsIGNhbWVyYUlkLAorICAgICAgICAgICAgY2xpZW50UGFja2FnZSwgY2xpZW50UGlkKSk7CiB9CiAKLXNwPENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50PiBDYW1lcmFTZXJ2aWNlOjpnZXRDbGllbnRCeVJlbW90ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUJpbmRlcj4mIGNhbWVyYUNsaWVudCkgewotCi0gICAgLy8gRGVjbGFyZSB0aGlzIGJlZm9yZSB0aGUgbG9jayB0byBtYWtlIGFic29sdXRlbHkgc3VyZSB0aGUKLSAgICAvLyBkZXN0cnVjdG9yIHdvbid0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQuCi0gICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudDsKLQotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7Ci0KLSAgICBpbnQgb3V0SW5kZXg7Ci0gICAgY2xpZW50ID0gZmluZENsaWVudFVuc2FmZShjYW1lcmFDbGllbnQsIG91dEluZGV4KTsKLQotICAgIHJldHVybiBjbGllbnQ7Cit2b2lkIENhbWVyYVNlcnZpY2U6OmxvZ0Nvbm5lY3RlZChjb25zdCBjaGFyKiBjYW1lcmFJZCwgaW50IGNsaWVudFBpZCwKKyAgICAgICAgY29uc3QgY2hhciogY2xpZW50UGFja2FnZSkgeworICAgIC8vIExvZyB0aGUgY2xpZW50cyBldmljdGVkCisgICAgbG9nRXZlbnQoU3RyaW5nODo6Zm9ybWF0KCJDT05ORUNUIGRldmljZSAlcyBjbGllbnQgZm9yIHBhY2thZ2UgJXMgKFBJRCAlZCkiLCBjYW1lcmFJZCwKKyAgICAgICAgICAgIGNsaWVudFBhY2thZ2UsIGNsaWVudFBpZCkpOwogfQogCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6bG9nUmVqZWN0ZWQoY29uc3QgY2hhciogY2FtZXJhSWQsIGludCBjbGllbnRQaWQsCisgICAgICAgIGNvbnN0IGNoYXIqIGNsaWVudFBhY2thZ2UsIGNvbnN0IGNoYXIqIHJlYXNvbikgeworICAgIC8vIExvZyB0aGUgY2xpZW50IHJlamVjdGVkCisgICAgbG9nRXZlbnQoU3RyaW5nODo6Zm9ybWF0KCJSRUpFQ1QgZGV2aWNlICVzIGNsaWVudCBmb3IgcGFja2FnZSAlcyAoUElEICVkKSwgcmVhc29uOiAoJXMpIiwKKyAgICAgICAgICAgIGNhbWVyYUlkLCBjbGllbnRQYWNrYWdlLCBjbGllbnRQaWQsIHJlYXNvbikpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OmxvZ1VzZXJTd2l0Y2goY29uc3Qgc3RkOjpzZXQ8dXNlcmlkX3Q+JiBvbGRVc2VySWRzLAorICAgICAgICBjb25zdCBzdGQ6OnNldDx1c2VyaWRfdD4mIG5ld1VzZXJJZHMpIHsKKyAgICBTdHJpbmc4IG5ld1VzZXJzID0gdG9TdHJpbmcobmV3VXNlcklkcyk7CisgICAgU3RyaW5nOCBvbGRVc2VycyA9IHRvU3RyaW5nKG9sZFVzZXJJZHMpOworICAgIC8vIExvZyB0aGUgbmV3IGFuZCBvbGQgdXNlcnMKKyAgICBsb2dFdmVudChTdHJpbmc4Ojpmb3JtYXQoIlVTRVJfU1dJVENIIHByZXZpb3VzIGFsbG93ZWQgdXNlcnM6ICVzICwgY3VycmVudCBhbGxvd2VkIHVzZXJzOiAlcyIsCisgICAgICAgICAgICBvbGRVc2Vycy5zdHJpbmcoKSwgbmV3VXNlcnMuc3RyaW5nKCkpKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpsb2dEZXZpY2VSZW1vdmVkKGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBjb25zdCBjaGFyKiByZWFzb24pIHsKKyAgICAvLyBMb2cgdGhlIGRldmljZSByZW1vdmFsCisgICAgbG9nRXZlbnQoU3RyaW5nODo6Zm9ybWF0KCJSRU1PVkUgZGV2aWNlICVzLCByZWFzb246ICglcykiLCBjYW1lcmFJZCwgcmVhc29uKSk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6bG9nRGV2aWNlQWRkZWQoY29uc3QgY2hhciogY2FtZXJhSWQsIGNvbnN0IGNoYXIqIHJlYXNvbikgeworICAgIC8vIExvZyB0aGUgZGV2aWNlIHJlbW92YWwKKyAgICBsb2dFdmVudChTdHJpbmc4Ojpmb3JtYXQoIkFERCBkZXZpY2UgJXMsIHJlYXNvbjogKCVzKSIsIGNhbWVyYUlkLCByZWFzb24pKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpsb2dDbGllbnREaWVkKGludCBjbGllbnRQaWQsIGNvbnN0IGNoYXIqIHJlYXNvbikgeworICAgIC8vIExvZyB0aGUgZGV2aWNlIHJlbW92YWwKKyAgICBsb2dFdmVudChTdHJpbmc4Ojpmb3JtYXQoIkRJRUQgY2xpZW50KHMpIHdpdGggUElEICVkLCByZWFzb246ICglcykiLCBjbGllbnRQaWQsIHJlYXNvbikpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OmxvZ1NlcnZpY2VFcnJvcihjb25zdCBjaGFyKiBtc2csIGludCBlcnJvckNvZGUpIHsKKyAgICBTdHJpbmc4IGN1clRpbWUgPSBnZXRGb3JtYXR0ZWRDdXJyZW50VGltZSgpOworICAgIGxvZ0V2ZW50KFN0cmluZzg6OmZvcm1hdCgiU0VSVklDRSBFUlJPUjogJXMgOiAlZCAoJXMpIiwgbXNnLCBlcnJvckNvZGUsIHN0cmVycm9yKGVycm9yQ29kZSkpKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6b25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksCisgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisKKyAgICBjb25zdCBpbnQgcGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBzZWxmUGlkID0gZ2V0cGlkKCk7CisKICAgICAvLyBQZXJtaXNzaW9uIGNoZWNrcwogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVDoKLSAgICAgICAgY2FzZSBCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1RfUFJPOgogICAgICAgICBjYXNlIEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVF9ERVZJQ0U6Ci0gICAgICAgIGNhc2UgQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUX0xFR0FDWToKLSAgICAgICAgICAgIGNvbnN0IGludCBwaWQgPSBnZXRDYWxsaW5nUGlkKCk7Ci0gICAgICAgICAgICBjb25zdCBpbnQgc2VsZl9waWQgPSBnZXRwaWQoKTsKLSAgICAgICAgICAgIGlmIChwaWQgIT0gc2VsZl9waWQpIHsKKyAgICAgICAgY2FzZSBCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1RfTEVHQUNZOiB7CisgICAgICAgICAgICBpZiAocGlkICE9IHNlbGZQaWQpIHsKICAgICAgICAgICAgICAgICAvLyB3ZSdyZSBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCBwcm9jZXNzLCBkbyB0aGUgcmVhbCBjaGVjawogICAgICAgICAgICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBIikpKSB7CkBAIC0xMjg1LDI5ICsxNzQ1LDI2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBCbkNhbWVyYVNlcnZpY2U6Ok5PVElGWV9TWVNURU1fRVZFTlQ6IHsKKyAgICAgICAgICAgIGlmIChwaWQgIT0gc2VsZlBpZCkgeworICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB3ZSdyZSBiZWluZyBjYWxsZWQgYnkgc3lzdGVtX3NlcnZlciwgb3Igc2ltaWxhciBwcm9jZXNzIHdpdGgKKyAgICAgICAgICAgICAgICAvLyBwZXJtaXNzaW9ucyB0byBub3RpZnkgdGhlIGNhbWVyYSBzZXJ2aWNlIGFib3V0IHN5c3RlbSBldmVudHMKKyAgICAgICAgICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW5ub3Qgc2VuZCB1cGRhdGVzIHRvIGNhbWVyYSBzZXJ2aWNlIGFib3V0IHN5c3RlbSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGV2ZW50cyBmcm9tIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gQm5DYW1lcmFTZXJ2aWNlOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiB9CiAKLS8vIFRoZSByZWFzb24gd2UgbmVlZCB0aGlzIGJ1c3kgYml0IGlzIGEgbmV3IENhbWVyYVNlcnZpY2U6OmNvbm5lY3QoKSByZXF1ZXN0Ci0vLyBtYXkgY29tZSBpbiB3aGlsZSB0aGUgcHJldmlvdXMgQ2xpZW50J3MgZGVzdHJ1Y3RvciBoYXMgbm90IGJlZW4gcnVuIG9yIGlzCi0vLyBzdGlsbCBydW5uaW5nLiBJZiB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlIG9mIHRoZSBwcmV2aW91cyBDbGllbnQgaXMgZ29uZQotLy8gYnV0IHRoZSBkZXN0cnVjdG9yIGhhcyBub3QgYmVlbiBmaW5pc2hlZCwgd2Ugc2hvdWxkIG5vdCBhbGxvdyB0aGUgbmV3IENsaWVudAotLy8gdG8gYmUgY3JlYXRlZCBiZWNhdXNlIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHByZXZpb3VzIENsaWVudCB0byB0ZWFyIGRvd24KLS8vIHRoZSBoYXJkd2FyZSBmaXJzdC4KLXZvaWQgQ2FtZXJhU2VydmljZTo6c2V0Q2FtZXJhQnVzeShpbnQgY2FtZXJhSWQpIHsKLSAgICBhbmRyb2lkX2F0b21pY193cml0ZSgxLCAmbUJ1c3lbY2FtZXJhSWRdKTsKLQotICAgIEFMT0dWKCJzZXRDYW1lcmFCdXN5IGNhbWVyYUlkPSVkIiwgY2FtZXJhSWQpOwotfQotCi12b2lkIENhbWVyYVNlcnZpY2U6OnNldENhbWVyYUZyZWUoaW50IGNhbWVyYUlkKSB7Ci0gICAgYW5kcm9pZF9hdG9taWNfd3JpdGUoMCwgJm1CdXN5W2NhbWVyYUlkXSk7Ci0KLSAgICBBTE9HVigic2V0Q2FtZXJhRnJlZSBjYW1lcmFJZD0lZCIsIGNhbWVyYUlkKTsKLX0KLQogLy8gV2Ugc2hhcmUgdGhlIG1lZGlhIHBsYXllcnMgZm9yIHNodXR0ZXIgYW5kIHJlY29yZGluZyBzb3VuZCBmb3IgYWxsIGNsaWVudHMuCiAvLyBBIHJlZmVyZW5jZSBjb3VudCBpcyBrZXB0IHRvIGRldGVybWluZSB3aGVuIHdlIHdpbGwgYWN0dWFsbHkgcmVsZWFzZSB0aGUKIC8vIG1lZGlhIHBsYXllcnMuCkBAIC0xMzc2LDcgKzE4MzMsNiBAQAogCiAgICAgbVJlbW90ZUNhbGxiYWNrID0gY2FtZXJhQ2xpZW50OwogCi0gICAgY2FtZXJhU2VydmljZS0+c2V0Q2FtZXJhQnVzeShjYW1lcmFJZCk7CiAgICAgY2FtZXJhU2VydmljZS0+bG9hZFNvdW5kKCk7CiAKICAgICBMT0cxKCJDbGllbnQ6OkNsaWVudCBYIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIGNhbWVyYUlkKTsKQEAgLTEzOTgsNyArMTg1NCw3IEBACiAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCk6Ci0gICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZShjbGllbnRQYWNrYWdlTmFtZSkKKyAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lKGNsaWVudFBhY2thZ2VOYW1lKSwgbURpc2Nvbm5lY3RlZChmYWxzZSkKIHsKICAgICBtQ2FtZXJhU2VydmljZSA9IGNhbWVyYVNlcnZpY2U7CiAgICAgbVJlbW90ZUJpbmRlciA9IHJlbW90ZUNhbGxiYWNrOwpAQCAtMTQxNywxMCArMTg3MywyNSBAQAogfQogCiB2b2lkIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpkaXNjb25uZWN0KCkgewotICAgIEFMT0dWKCJCYXNpY0NsaWVudDo6ZGlzY29ubmVjdCIpOwotICAgIG1DYW1lcmFTZXJ2aWNlLT5yZW1vdmVDbGllbnRCeVJlbW90ZShtUmVtb3RlQmluZGVyKTsKKyAgICBpZiAobURpc2Nvbm5lY3RlZCkgeworICAgICAgICBBTE9HRSgiJXM6IERpc2Nvbm5lY3QgY2FsbGVkIG9uIGFscmVhZHkgZGlzY29ubmVjdGVkIGNsaWVudCBmb3IgZGV2aWNlICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG1DYW1lcmFJZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbURpc2Nvbm5lY3RlZCA9IHRydWU7OworCisgICAgbUNhbWVyYVNlcnZpY2UtPnJlbW92ZUJ5Q2xpZW50KHRoaXMpOworICAgIG1DYW1lcmFTZXJ2aWNlLT5sb2dEaXNjb25uZWN0ZWQoU3RyaW5nODo6Zm9ybWF0KCIlZCIsIG1DYW1lcmFJZCksIG1DbGllbnRQaWQsCisgICAgICAgICAgICBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkpOworCisgICAgc3A8SUJpbmRlcj4gcmVtb3RlID0gZ2V0UmVtb3RlKCk7CisgICAgaWYgKHJlbW90ZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJlbW90ZS0+dW5saW5rVG9EZWF0aChtQ2FtZXJhU2VydmljZSk7CisgICAgfQogCiAgICAgZmluaXNoQ2FtZXJhT3BzKCk7CisgICAgQUxPR0koIiVzOiBEaXNjb25uZWN0ZWQgY2xpZW50IGZvciBjYW1lcmEgJWQgZm9yIFBJRCAlZCIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBtQ2xpZW50UGlkKTsKKwogICAgIC8vIGNsaWVudCBzaG91bGRuJ3QgYmUgYWJsZSB0byBjYWxsIGludG8gdXMgYW55bW9yZQogICAgIG1DbGllbnRQaWQgPSAwOwogfQpAQCAtMTQzMyw2ICsxOTA0LDI0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitTdHJpbmcxNiBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6Z2V0UGFja2FnZU5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1DbGllbnRQYWNrYWdlTmFtZTsKK30KKworCitpbnQgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OmdldENsaWVudFBpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNsaWVudFBpZDsKK30KKwordWlkX3QgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OmdldENsaWVudFVpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNsaWVudFVpZDsKK30KKworYm9vbCBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6Y2FuQ2FzdFRvQXBpQ2xpZW50KGFwaUxldmVsIGxldmVsKSBjb25zdCB7CisgICAgLy8gRGVmYXVsdHMgdG8gQVBJMi4KKyAgICByZXR1cm4gbGV2ZWwgPT0gQVBJXzI7Cit9CisKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpzdGFydENhbWVyYU9wcygpIHsKICAgICBpbnQzMl90IHJlczsKICAgICAvLyBOb3RpZnkgYXBwIG9wcyB0aGF0IHRoZSBjYW1lcmEgaXMgbm90IGF2YWlsYWJsZQpAQCAtMTQ0OCwxNyArMTkzNywyNCBAQAogICAgIHJlcyA9IG1BcHBPcHNNYW5hZ2VyLnN0YXJ0T3AoQXBwT3BzTWFuYWdlcjo6T1BfQ0FNRVJBLAogICAgICAgICAgICAgbUNsaWVudFVpZCwgbUNsaWVudFBhY2thZ2VOYW1lKTsKIAotICAgIGlmIChyZXMgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7CisgICAgaWYgKHJlcyA9PSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0VSUk9SRUQpIHsKICAgICAgICAgQUxPR0koIkNhbWVyYSAlZDogQWNjZXNzIGZvciBcIiVzXCIgaGFzIGJlZW4gcmV2b2tlZCIsCiAgICAgICAgICAgICAgICAgbUNhbWVyYUlkLCBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCisgICAgaWYgKHJlcyA9PSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0lHTk9SRUQpIHsKKyAgICAgICAgQUxPR0koIkNhbWVyYSAlZDogQWNjZXNzIGZvciBcIiVzXCIgaGFzIGJlZW4gcmVzdHJpY3RlZCIsCisgICAgICAgICAgICAgICAgbUNhbWVyYUlkLCBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCkpOworICAgICAgICAvLyBSZXR1cm4gdGhlIHNhbWUgZXJyb3IgYXMgZm9yIGRldmljZSBwb2xpY3kgbWFuYWdlciByZWplY3Rpb24KKyAgICAgICAgcmV0dXJuIC1FQUNDRVM7CisgICAgfQorCiAgICAgbU9wc0FjdGl2ZSA9IHRydWU7CiAKICAgICAvLyBUcmFuc2l0aW9uIGRldmljZSBhdmFpbGFiaWxpdHkgbGlzdGVuZXJzIGZyb20gUFJFU0VOVCAtPiBOT1RfQVZBSUxBQkxFCiAgICAgbUNhbWVyYVNlcnZpY2UtPnVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX0FWQUlMQUJMRSwKLSAgICAgICAgICAgIG1DYW1lcmFJZCk7CisgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgbUNhbWVyYUlkKSk7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNDcxLDE5ICsxOTY3LDE2IEBACiAgICAgICAgICAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lKTsKICAgICAgICAgbU9wc0FjdGl2ZSA9IGZhbHNlOwogCi0gICAgICAgIC8vIE5vdGlmeSBkZXZpY2UgYXZhaWxhYmlsaXR5IGxpc3RlbmVycyB0aGF0IHRoaXMgY2FtZXJhIGlzIGF2YWlsYWJsZQotICAgICAgICAvLyBhZ2FpbgorICAgICAgICBhdXRvIHJlamVjdGVkID0ge0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfUFJFU0VOVCwKKyAgICAgICAgICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfRU5VTUVSQVRJTkd9OwogCi0gICAgICAgIFN0YXR1c1ZlY3RvciByZWplY3RTb3VyY2VTdGF0ZXM7Ci0gICAgICAgIHJlamVjdFNvdXJjZVN0YXRlcy5wdXNoX2JhY2soSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9QUkVTRU5UKTsKLSAgICAgICAgcmVqZWN0U291cmNlU3RhdGVzLnB1c2hfYmFjayhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfRU5VTUVSQVRJTkcpOwotCi0gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gUFJFU0VOVCBpZiB0aGUgY2FtZXJhIGlzIG5vdCBpbiBlaXRoZXIgb2YgYWJvdmUgMgotICAgICAgICAvLyBzdGF0ZXMKKyAgICAgICAgLy8gVHJhbnNpdGlvbiB0byBQUkVTRU5UIGlmIHRoZSBjYW1lcmEgaXMgbm90IGluIGVpdGhlciBvZiB0aGUgcmVqZWN0ZWQgc3RhdGVzCiAgICAgICAgIG1DYW1lcmFTZXJ2aWNlLT51cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQsCi0gICAgICAgICAgICAgICAgbUNhbWVyYUlkLAotICAgICAgICAgICAgICAgICZyZWplY3RTb3VyY2VTdGF0ZXMpOworICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBtQ2FtZXJhSWQpLCByZWplY3RlZCk7CiAKKyAgICAgICAgLy8gTm90aWZ5IGZsYXNobGlnaHQgdGhhdCBhIGNhbWVyYSBkZXZpY2UgaXMgY2xvc2VkLgorICAgICAgICBtQ2FtZXJhU2VydmljZS0+bUZsYXNobGlnaHQtPmRldmljZUNsb3NlZCgKKyAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgbUNhbWVyYUlkKSk7CiAgICAgfQogICAgIC8vIEFsd2F5cyBzdG9wIHdhdGNoaW5nLCBldmVuIGlmIG5vIGNhbWVyYSBvcCBpcyBhY3RpdmUKICAgICBpZiAobU9wc0NhbGxiYWNrICE9IE5VTEwpIHsKQEAgLTE1MjYsMjYgKzIwMTksMTUgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1NdXRleCogQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpnZXRDbGllbnRMb2NrRnJvbUNvb2tpZSh2b2lkKiB1c2VyKSB7Ci0gICAgcmV0dXJuIGdDYW1lcmFTZXJ2aWNlLT5nZXRDbGllbnRMb2NrQnlJZCgoaW50KShpbnRwdHJfdCkgdXNlcik7Ci19Ci0KLS8vIFByb3ZpZGUgY2xpZW50IHBvaW50ZXIgZm9yIGNhbGxiYWNrcy4gQ2xpZW50IGxvY2sgcmV0dXJuZWQgZnJvbSBnZXRDbGllbnRMb2NrRnJvbUNvb2tpZSBzaG91bGQKLS8vIGJlIGFjcXVpcmVkIGZvciB0aGlzIHRvIGJlIHNhZmUKLUNhbWVyYVNlcnZpY2U6OkNsaWVudCogQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpnZXRDbGllbnRGcm9tQ29va2llKHZvaWQqIHVzZXIpIHsKLSAgICBCYXNpY0NsaWVudCAqYmFzaWNDbGllbnQgPSBnQ2FtZXJhU2VydmljZS0+Z2V0Q2xpZW50QnlJZFVuc2FmZSgoaW50KShpbnRwdHJfdCkgdXNlcik7Ci0gICAgLy8gT0s6IG9ubHkgQ2FtZXJhQ2xpZW50IGNhbGxzIHRoaXMsIGFuZCB0aGV5IGFscmVhZHkgY2FzdCBhbnl3YXkuCi0gICAgQ2xpZW50KiBjbGllbnQgPSBzdGF0aWNfY2FzdDxDbGllbnQqPihiYXNpY0NsaWVudCk7Ci0KLSAgICAvLyBUaGlzIGNvdWxkIGhhcHBlbiBpZiB0aGUgQ2xpZW50IGlzIGluIHRoZSBwcm9jZXNzIG9mIHNodXR0aW5nIGRvd24gKHRoZQotICAgIC8vIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSBpcyBnb25lLCBidXQgdGhlIGRlc3RydWN0b3IgaGFzbid0IGZpbmlzaGVkCi0gICAgLy8gc3RvcHBpbmcgdGhlIGhhcmR3YXJlKS4KLSAgICBpZiAoY2xpZW50ID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgLy8gZGVzdHJ1Y3Rpb24gYWxyZWFkeSBzdGFydGVkLCBzbyBzaG91bGQgbm90IGJlIGFjY2Vzc2VkCi0gICAgaWYgKGNsaWVudC0+bURlc3RydWN0aW9uU3RhcnRlZCkgcmV0dXJuIE5VTEw7Ci0KLSAgICByZXR1cm4gY2xpZW50OworLy8gUHJvdmlkZSBjbGllbnQgc3Ryb25nIHBvaW50ZXIgZm9yIGNhbGxiYWNrcy4KK3NwPENhbWVyYVNlcnZpY2U6OkNsaWVudD4gQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpnZXRDbGllbnRGcm9tQ29va2llKHZvaWQqIHVzZXIpIHsKKyAgICBTdHJpbmc4IGNhbWVyYUlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIChpbnQpKGludHB0cl90KSB1c2VyKTsKKyAgICBhdXRvIGNsaWVudERlc2NyaXB0b3IgPSBnQ2FtZXJhU2VydmljZS0+bUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0KGNhbWVyYUlkKTsKKyAgICBpZiAoY2xpZW50RGVzY3JpcHRvciAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBzcDxDbGllbnQ+eworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENsaWVudCo+KGNsaWVudERlc2NyaXB0b3ItPmdldFZhbHVlKCkuZ2V0KCkpfTsKKyAgICB9CisgICAgcmV0dXJuIHNwPENsaWVudD57bnVsbHB0cn07CiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojpub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLApAQCAtMTU1Nyw3ICsyMDM5LDEwIEBACiB2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6ZGlzY29ubmVjdCgpIHsKICAgICBBTE9HVigiQ2xpZW50OjpkaXNjb25uZWN0Iik7CiAgICAgQmFzaWNDbGllbnQ6OmRpc2Nvbm5lY3QoKTsKLSAgICBtQ2FtZXJhU2VydmljZS0+c2V0Q2FtZXJhRnJlZShtQ2FtZXJhSWQpOworfQorCitib29sIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Y2FuQ2FzdFRvQXBpQ2xpZW50KGFwaUxldmVsIGxldmVsKSBjb25zdCB7CisgICAgcmV0dXJuIGxldmVsID09IEFQSV8xOwogfQogCiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6Ok9wc0NhbGxiYWNrOjpPcHNDYWxsYmFjayh3cDxCYXNpY0NsaWVudD4gY2xpZW50KToKQEAgLTE1NzMsMzAgKzIwNTgsMTM4IEBACiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICAgICAgICAgICAgICAgICAgSVByb0NhbWVyYQorLy8gICAgICAgICAgICAgICAgICBDYW1lcmFTdGF0ZQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1DYW1lcmFTZXJ2aWNlOjpQcm9DbGllbnQ6OlByb0NsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKLSAgICAgICAgY29uc3Qgc3A8SVByb0NhbWVyYUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGludCBjYW1lcmFJZCwKLSAgICAgICAgaW50IGNhbWVyYUZhY2luZywKLSAgICAgICAgaW50IGNsaWVudFBpZCwKLSAgICAgICAgdWlkX3QgY2xpZW50VWlkLAotICAgICAgICBpbnQgc2VydmljZVBpZCkKLSAgICAgICAgOiBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudChjYW1lcmFTZXJ2aWNlLCBJSW50ZXJmYWNlOjphc0JpbmRlcihyZW1vdGVDYWxsYmFjayksCi0gICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsCi0gICAgICAgICAgICAgICAgY2xpZW50UGlkLCAgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKQotewotICAgIG1SZW1vdGVDYWxsYmFjayA9IHJlbW90ZUNhbGxiYWNrOworQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6OkNhbWVyYVN0YXRlKGNvbnN0IFN0cmluZzgmIGlkLCBpbnQgY29zdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nKSA6IG1JZChpZCksCisgICAgICAgIG1TdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQpLCBtQ29zdChjb3N0KSwgbUNvbmZsaWN0aW5nKGNvbmZsaWN0aW5nKSB7fQorCitDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6fkNhbWVyYVN0YXRlKCkge30KKworSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjpnZXRTdGF0dXMoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xvY2spOworICAgIHJldHVybiBtU3RhdHVzOwogfQogCi1DYW1lcmFTZXJ2aWNlOjpQcm9DbGllbnQ6On5Qcm9DbGllbnQoKSB7CitDYW1lcmFQYXJhbWV0ZXJzIENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjpnZXRTaGltUGFyYW1zKCkgY29uc3QgeworICAgIHJldHVybiBtU2hpbVBhcmFtczsKIH0KIAotdm9pZCBDYW1lcmFTZXJ2aWNlOjpQcm9DbGllbnQ6Om5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCi0gICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgewotICAgIG1SZW1vdGVDYWxsYmFjay0+bm90aWZ5Q2FsbGJhY2soQ0FNRVJBX01TR19FUlJPUiwgQ0FNRVJBX0VSUk9SX1JFTEVBU0VELCAwKTsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6OnNldFNoaW1QYXJhbXMoY29uc3QgQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKSB7CisgICAgbVNoaW1QYXJhbXMgPSBwYXJhbXM7Cit9CisKK2ludCBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6Z2V0Q29zdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNvc3Q7Cit9CisKK3N0ZDo6c2V0PFN0cmluZzg+IENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjpnZXRDb25mbGljdGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNvbmZsaWN0aW5nOworfQorCitTdHJpbmc4IENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjpnZXRJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUlkOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgICAgIENsaWVudEV2ZW50TGlzdGVuZXIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnRFdmVudExpc3RlbmVyOjpvbkNsaWVudEFkZGVkKAorICAgICAgICBjb25zdCByZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwKKyAgICAgICAgc3A8Q2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ+PiYgZGVzY3JpcHRvcikgeworICAgIGF1dG8gYmFzaWNDbGllbnQgPSBkZXNjcmlwdG9yLmdldFZhbHVlKCk7CisgICAgaWYgKGJhc2ljQ2xpZW50LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgQmF0dGVyeU5vdGlmaWVyJiBub3RpZmllcihCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkpOworICAgICAgICBub3RpZmllci5ub3RlU3RhcnRDYW1lcmEoZGVzY3JpcHRvci5nZXRLZXkoKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGJhc2ljQ2xpZW50LT5nZXRDbGllbnRVaWQoKSkpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnRFdmVudExpc3RlbmVyOjpvbkNsaWVudFJlbW92ZWQoCisgICAgICAgIGNvbnN0IHJlc291cmNlX3BvbGljeTo6Q2xpZW50RGVzY3JpcHRvcjxTdHJpbmc4LAorICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudD4+JiBkZXNjcmlwdG9yKSB7CisgICAgYXV0byBiYXNpY0NsaWVudCA9IGRlc2NyaXB0b3IuZ2V0VmFsdWUoKTsKKyAgICBpZiAoYmFzaWNDbGllbnQuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBCYXR0ZXJ5Tm90aWZpZXImIG5vdGlmaWVyKEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKSk7CisgICAgICAgIG5vdGlmaWVyLm5vdGVTdG9wQ2FtZXJhKGRlc2NyaXB0b3IuZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihiYXNpY0NsaWVudC0+Z2V0Q2xpZW50VWlkKCkpKTsKKyAgICB9Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgICAgICBDYW1lcmFDbGllbnRNYW5hZ2VyCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NhbWVyYVNlcnZpY2U6OkNhbWVyYUNsaWVudE1hbmFnZXI6OkNhbWVyYUNsaWVudE1hbmFnZXIoKSB7CisgICAgc2V0TGlzdGVuZXIoc3RkOjptYWtlX3NoYXJlZDxDbGllbnRFdmVudExpc3RlbmVyPigpKTsKK30KKworQ2FtZXJhU2VydmljZTo6Q2FtZXJhQ2xpZW50TWFuYWdlcjo6fkNhbWVyYUNsaWVudE1hbmFnZXIoKSB7fQorCitzcDxDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudD4gQ2FtZXJhU2VydmljZTo6Q2FtZXJhQ2xpZW50TWFuYWdlcjo6Z2V0Q2FtZXJhQ2xpZW50KAorICAgICAgICBjb25zdCBTdHJpbmc4JiBpZCkgY29uc3QgeworICAgIGF1dG8gZGVzY3JpcHRvciA9IGdldChpZCk7CisgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gc3A8QmFzaWNDbGllbnQ+e251bGxwdHJ9OworICAgIH0KKyAgICByZXR1cm4gZGVzY3JpcHRvci0+Z2V0VmFsdWUoKTsKK30KKworU3RyaW5nOCBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFDbGllbnRNYW5hZ2VyOjp0b1N0cmluZygpIGNvbnN0IHsKKyAgICBhdXRvIGFsbCA9IGdldEFsbCgpOworICAgIFN0cmluZzggcmV0KCJbIik7CisgICAgYm9vbCBoYXNBbnkgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8mIGkgOiBhbGwpIHsKKyAgICAgICAgaGFzQW55ID0gdHJ1ZTsKKyAgICAgICAgU3RyaW5nOCBrZXkgPSBpLT5nZXRLZXkoKTsKKyAgICAgICAgaW50MzJfdCBjb3N0ID0gaS0+Z2V0Q29zdCgpOworICAgICAgICBpbnQzMl90IHBpZCA9IGktPmdldE93bmVySWQoKTsKKyAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IGktPmdldFByaW9yaXR5KCk7CisgICAgICAgIGF1dG8gY29uZmxpY3RpbmcgPSBpLT5nZXRDb25mbGljdGluZygpOworICAgICAgICBhdXRvIGNsaWVudFNwID0gaS0+Z2V0VmFsdWUoKTsKKyAgICAgICAgU3RyaW5nOCBwYWNrYWdlTmFtZTsKKyAgICAgICAgdXNlcmlkX3QgY2xpZW50VXNlcklkID0gMDsKKyAgICAgICAgaWYgKGNsaWVudFNwLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gU3RyaW5nOHtjbGllbnRTcC0+Z2V0UGFja2FnZU5hbWUoKX07CisgICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQgPSBjbGllbnRTcC0+Z2V0Q2xpZW50VWlkKCk7CisgICAgICAgICAgICBjbGllbnRVc2VySWQgPSBtdWx0aXVzZXJfZ2V0X3VzZXJfaWQoY2xpZW50VWlkKTsKKyAgICAgICAgfQorICAgICAgICByZXQuYXBwZW5kRm9ybWF0KCJcbihDYW1lcmEgSUQ6ICVzLCBDb3N0OiAlIiBQUklkMzIgIiwgUElEOiAlIiBQUklkMzIgIiwgUHJpb3JpdHk6ICUiCisgICAgICAgICAgICAgICAgUFJJZDMyICIsICIsIGtleS5zdHJpbmcoKSwgY29zdCwgcGlkLCBwcmlvcml0eSk7CisKKyAgICAgICAgaWYgKGNsaWVudFNwLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldC5hcHBlbmRGb3JtYXQoIlVzZXIgSWQ6ICVkLCAiLCBjbGllbnRVc2VySWQpOworICAgICAgICB9CisgICAgICAgIGlmIChwYWNrYWdlTmFtZS5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgcmV0LmFwcGVuZEZvcm1hdCgiQ2xpZW50IFBhY2thZ2UgTmFtZTogJXMiLCBwYWNrYWdlTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXQuYXBwZW5kKCIsIENvbmZsaWN0aW5nIENsaWVudCBEZXZpY2VzOiB7Iik7CisgICAgICAgIGZvciAoYXV0byYgaiA6IGNvbmZsaWN0aW5nKSB7CisgICAgICAgICAgICByZXQuYXBwZW5kRm9ybWF0KCIlcywgIiwgai5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0LmFwcGVuZCgifSkiKTsKKyAgICB9CisgICAgaWYgKGhhc0FueSkgcmV0LmFwcGVuZCgiXG4iKTsKKyAgICByZXQuYXBwZW5kKCJdXG4iKTsKKyAgICByZXR1cm4gcmV0OworfQorCitDYW1lcmFTZXJ2aWNlOjpEZXNjcmlwdG9yUHRyIENhbWVyYVNlcnZpY2U6OkNhbWVyYUNsaWVudE1hbmFnZXI6Om1ha2VDbGllbnREZXNjcmlwdG9yKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IHNwPEJhc2ljQ2xpZW50PiYgdmFsdWUsIGludDMyX3QgY29zdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nS2V5cywgaW50MzJfdCBwcmlvcml0eSwgaW50MzJfdCBvd25lcklkKSB7CisKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwgc3A8QmFzaWNDbGllbnQ+Pj4oCisgICAgICAgICAgICBrZXksIHZhbHVlLCBjb3N0LCBjb25mbGljdGluZ0tleXMsIHByaW9yaXR5LCBvd25lcklkKTsKK30KKworQ2FtZXJhU2VydmljZTo6RGVzY3JpcHRvclB0ciBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFDbGllbnRNYW5hZ2VyOjptYWtlQ2xpZW50RGVzY3JpcHRvcigKKyAgICAgICAgY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiB2YWx1ZSwgY29uc3QgQ2FtZXJhU2VydmljZTo6RGVzY3JpcHRvclB0ciYgcGFydGlhbCkgeworICAgIHJldHVybiBtYWtlQ2xpZW50RGVzY3JpcHRvcihwYXJ0aWFsLT5nZXRLZXkoKSwgdmFsdWUsIHBhcnRpYWwtPmdldENvc3QoKSwKKyAgICAgICAgICAgIHBhcnRpYWwtPmdldENvbmZsaWN0aW5nKCksIHBhcnRpYWwtPmdldFByaW9yaXR5KCksIHBhcnRpYWwtPmdldE93bmVySWQoKSk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE2MTgsNyArMjIxMSw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7Ci0gICAgU3RyaW5nOCByZXN1bHQ7CisgICAgU3RyaW5nOCByZXN1bHQoIkR1bXAgb2YgdGhlIENhbWVyYSBTZXJ2aWNlOlxuIik7CiAgICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIikpID09IGZhbHNlKSB7CiAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlBlcm1pc3Npb24gRGVuaWFsOiAiCiAgICAgICAgICAgICAgICAgImNhbid0IGR1bXAgQ2FtZXJhU2VydmljZSBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLApAQCAtMTYzNywxOSArMjIzMCwyMiBAQAogICAgICAgICBpZiAoIW1Nb2R1bGUpIHsKICAgICAgICAgICAgIHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiTm8gY2FtZXJhIG1vZHVsZSBhdmFpbGFibGUhXG4iKTsKICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgICAgICAgICAvLyBEdW1wIGV2ZW50IGxvZyBmb3IgZXJyb3IgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGR1bXBFdmVudExvZyhmZCk7CisKICAgICAgICAgICAgIGlmIChsb2NrZWQpIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhIG1vZHVsZSBIQUwgQVBJIHZlcnNpb246IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgbU1vZHVsZS0+Y29tbW9uLmhhbF9hcGlfdmVyc2lvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYSBtb2R1bGUgQVBJIHZlcnNpb246IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgbU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYSBtb2R1bGUgbmFtZTogJXNcbiIsCi0gICAgICAgICAgICAgICAgbU1vZHVsZS0+Y29tbW9uLm5hbWUpOwotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDYW1lcmEgbW9kdWxlIGF1dGhvcjogJXNcbiIsCi0gICAgICAgICAgICAgICAgbU1vZHVsZS0+Y29tbW9uLmF1dGhvcik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIk51bWJlciBvZiBjYW1lcmEgZGV2aWNlczogJWRcblxuIiwgbU51bWJlck9mQ2FtZXJhcyk7CisgICAgICAgIHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhIG1vZHVsZSBIQUwgQVBJIHZlcnNpb246IDB4JXhcbiIsIG1Nb2R1bGUtPmdldEhhbEFwaVZlcnNpb24oKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYSBtb2R1bGUgQVBJIHZlcnNpb246IDB4JXhcbiIsIG1Nb2R1bGUtPmdldE1vZHVsZUFwaVZlcnNpb24oKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYSBtb2R1bGUgbmFtZTogJXNcbiIsIG1Nb2R1bGUtPmdldE1vZHVsZU5hbWUoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYSBtb2R1bGUgYXV0aG9yOiAlc1xuIiwgbU1vZHVsZS0+Z2V0TW9kdWxlQXV0aG9yKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJOdW1iZXIgb2YgY2FtZXJhIGRldmljZXM6ICVkXG4iLCBtTnVtYmVyT2ZDYW1lcmFzKTsKKyAgICAgICAgU3RyaW5nOCBhY3RpdmVDbGllbnRTdHJpbmcgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci50b1N0cmluZygpOworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJBY3RpdmUgQ2FtZXJhIENsaWVudHM6XG4lcyIsIGFjdGl2ZUNsaWVudFN0cmluZy5zdHJpbmcoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkFsbG93ZWQgdXNlcnM6XG4lc1xuIiwgdG9TdHJpbmcobUFsbG93ZWRVc2Vycykuc3RyaW5nKCkpOwogCiAgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2MgPSBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CiAgICAgICAgIGlmIChkZXNjID09IE5VTEwpIHsKQEAgLTE2NjQsMTEgKzIyNjAsMjEgQEAKICAgICAgICAgICAgIGRlc2MtPmR1bXAoZmQsIC8qdmVyYm9zaXR5Ki8yLCAvKmluZGVudGF0aW9uKi80KTsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mQ2FtZXJhczsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlZCBzdGF0aWMgaW5mb3JtYXRpb246XG4iLCBpKTsKKyAgICAgICAgZHVtcEV2ZW50TG9nKGZkKTsKKworICAgICAgICBib29sIHN0YXRlTG9ja2VkID0gdHJ5TG9jayhtQ2FtZXJhU3RhdGVzTG9jayk7CisgICAgICAgIGlmICghc3RhdGVMb2NrZWQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhU3RhdGVzIGluIHVzZSwgbWF5IGJlIGRlYWRsb2NrZWRcbiIpOworICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIHN0YXRlIDogbUNhbWVyYVN0YXRlcykgeworICAgICAgICAgICAgU3RyaW5nOCBjYW1lcmFJZCA9IHN0YXRlLmZpcnN0OworICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXMgaW5mb3JtYXRpb246XG4iLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICBjYW1lcmFfaW5mbyBpbmZvOwogCi0gICAgICAgICAgICBzdGF0dXNfdCByYyA9IG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhpLCAmaW5mbyk7CisgICAgICAgICAgICAvLyBUT0RPOiBDaGFuZ2UgZ2V0Q2FtZXJhSW5mbyArIEhBTCB0byB1c2UgU3RyaW5nIGNhbWVyYUlkcworICAgICAgICAgICAgc3RhdHVzX3QgcmMgPSBtTW9kdWxlLT5nZXRDYW1lcmFJbmZvKGNhbWVyYUlkVG9JbnQoY2FtZXJhSWQpLCAmaW5mbyk7CiAgICAgICAgICAgICBpZiAocmMgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIEVycm9yIHJlYWRpbmcgc3RhdGljIGluZm9ybWF0aW9uIVxuIik7CiAgICAgICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CkBAIC0xNjc3LDEzICsyMjgzLDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmZhY2luZyA9PSBDQU1FUkFfRkFDSU5HX0JBQ0sgPyAiQkFDSyIgOiAiRlJPTlQiKTsKICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIE9yaWVudGF0aW9uOiAlZFxuIiwgaW5mby5vcmllbnRhdGlvbik7CiAgICAgICAgICAgICAgICAgaW50IGRldmljZVZlcnNpb247Ci0gICAgICAgICAgICAgICAgaWYgKG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24gPAotICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzApIHsKKyAgICAgICAgICAgICAgICBpZiAobU1vZHVsZS0+Z2V0TW9kdWxlQXBpVmVyc2lvbigpIDwgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzApIHsKICAgICAgICAgICAgICAgICAgICAgZGV2aWNlVmVyc2lvbiA9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGRldmljZVZlcnNpb24gPSBpbmZvLmRldmljZV92ZXJzaW9uOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIERldmljZSB2ZXJzaW9uOiAweCV4XG4iLCBkZXZpY2VWZXJzaW9uKTsKKworICAgICAgICAgICAgICAgIGF1dG8gY29uZmxpY3RpbmcgPSBzdGF0ZS5zZWNvbmQtPmdldENvbmZsaWN0aW5nKCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBSZXNvdXJjZSBDb3N0OiAlZFxuIiwgc3RhdGUuc2Vjb25kLT5nZXRDb3N0KCkpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgQ29uZmxpY3RpbmcgRGV2aWNlczoiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGlkIDogY29uZmxpY3RpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICVzIiwgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29uZmxpY3Rpbmcuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiIE5PTkUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiXG4iKTsKKworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgRGV2aWNlIHZlcnNpb246ICUjeFxuIiwgZGV2aWNlVmVyc2lvbik7CiAgICAgICAgICAgICAgICAgaWYgKGRldmljZVZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzApIHsKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBEZXZpY2Ugc3RhdGljIG1ldGFkYXRhOlxuIik7CiAgICAgICAgICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwpAQCAtMTY5MiwxOSArMjMwOSwzOCBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgcCA9IHN0YXRlLnNlY29uZC0+Z2V0U2hpbVBhcmFtcygpOworICAgICAgICAgICAgICAgIGlmICghcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgIENhbWVyYTEgQVBJIHNoaW0gaXMgdXNpbmcgcGFyYW1ldGVyczpcbiAgICAgICAgIik7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBwLmR1bXAoZmQsIGFyZ3MpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudCA9IG1DbGllbnRbaV0ucHJvbW90ZSgpOwotICAgICAgICAgICAgaWYgKGNsaWVudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgIERldmljZSBpcyBjbG9zZWQsIG5vIGNsaWVudCBpbnN0YW5jZVxuIik7CisgICAgICAgICAgICBhdXRvIGNsaWVudERlc2NyaXB0b3IgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXQoY2FtZXJhSWQpOworICAgICAgICAgICAgaWYgKGNsaWVudERlc2NyaXB0b3IgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiICBEZXZpY2UgJXMgaXMgY2xvc2VkLCBubyBjbGllbnQgaW5zdGFuY2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBoYXNDbGllbnQgPSB0cnVlOwotICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgIERldmljZSBpcyBvcGVuLiBDbGllbnQgaW5zdGFuY2UgZHVtcDpcbiIpOworICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgIERldmljZSAlcyBpcyBvcGVuLiBDbGllbnQgaW5zdGFuY2UgZHVtcDpcblxuIiwKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2xpZW50IHByaW9yaXR5IGxldmVsOiAlZFxuIiwgY2xpZW50RGVzY3JpcHRvci0+Z2V0UHJpb3JpdHkoKSk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDbGllbnQgUElEOiAlZFxuIiwgY2xpZW50RGVzY3JpcHRvci0+Z2V0T3duZXJJZCgpKTsKKworICAgICAgICAgICAgYXV0byBjbGllbnQgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRWYWx1ZSgpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2xpZW50IHBhY2thZ2U6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNsaWVudC0+Z2V0UGFja2FnZU5hbWUoKSkuc3RyaW5nKCkpOwogICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKICAgICAgICAgICAgIGNsaWVudC0+ZHVtcENsaWVudChmZCwgYXJncyk7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdGVMb2NrZWQpIG1DYW1lcmFTdGF0ZXNMb2NrLnVubG9jaygpOworCiAgICAgICAgIGlmICghaGFzQ2xpZW50KSB7CiAgICAgICAgICAgICByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIlxuTm8gYWN0aXZlIGNhbWVyYSBjbGllbnRzIHlldC5cbiIpOwogICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CkBAIC0xNzI4LDExMiArMjM2NCwxNDMgQEAKICAgICAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotLyp2aXJ0dWFsKi92b2lkIENhbWVyYVNlcnZpY2U6OmJpbmRlckRpZWQoCi0gICAgY29uc3Qgd3A8SUJpbmRlcj4gJndobykgewordm9pZCBDYW1lcmFTZXJ2aWNlOjpkdW1wRXZlbnRMb2coaW50IGZkKSB7CisgICAgU3RyaW5nOCByZXN1bHQgPSBTdHJpbmc4KCJcblByaW9yIGNsaWVudCBldmVudHMgKG1vc3QgcmVjZW50IGF0IHRvcCk6XG4iKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2dMb2NrKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IG1FdmVudExvZykgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICVzXG4iLCBtc2cuc3RyaW5nKCkpOworICAgIH0KKworICAgIGlmIChtRXZlbnRMb2cuc2l6ZSgpID09IERFRkFVTFRfRVZFTlRfTE9HX0xFTkdUSCkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCIgIC4uLlxuIik7CisgICAgfSBlbHNlIGlmIChtRXZlbnRMb2cuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBbbm8gZXZlbnRzIHlldF1cbiIpOworICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6aGFuZGxlVG9yY2hDbGllbnRCaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoQ2xpZW50TWFwTXV0ZXgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRvcmNoQ2xpZW50TWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtVG9yY2hDbGllbnRNYXBbaV0gPT0gd2hvKSB7CisgICAgICAgICAgICAvLyB0dXJuIG9mZiB0aGUgdG9yY2ggbW9kZSB0aGF0IHdhcyB0dXJuZWQgb24gYnkgZGVhZCBjbGllbnQKKyAgICAgICAgICAgIFN0cmluZzggY2FtZXJhSWQgPSBtVG9yY2hDbGllbnRNYXAua2V5QXQoaSk7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBtRmxhc2hsaWdodC0+c2V0VG9yY2hNb2RlKGNhbWVyYUlkLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB0b3JjaCBjbGllbnQgZGllZCBidXQgY291bGRuJ3QgdHVybiBvZmYgdG9yY2g6ICIKKyAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Ub3JjaENsaWVudE1hcC5yZW1vdmVJdGVtc0F0KGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qdmlydHVhbCovdm9pZCBDYW1lcmFTZXJ2aWNlOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pIHsKIAogICAgIC8qKgotICAgICAgKiBXaGlsZSB0ZW1wdGluZyB0byBwcm9tb3RlIHRoZSB3cDxJQmluZGVyPiBpbnRvIGEgc3AsCi0gICAgICAqIGl0J3MgYWN0dWFsbHkgbm90IHN1cHBvcnRlZCBieSB0aGUgYmluZGVyIGRyaXZlcgorICAgICAgKiBXaGlsZSB0ZW1wdGluZyB0byBwcm9tb3RlIHRoZSB3cDxJQmluZGVyPiBpbnRvIGEgc3AsIGl0J3MgYWN0dWFsbHkgbm90IHN1cHBvcnRlZCBieSB0aGUKKyAgICAgICogYmluZGVyIGRyaXZlcgogICAgICAgKi8KIAotICAgIEFMT0dWKCJqYXZhIGNsaWVudHMnIGJpbmRlciBkaWVkIik7CisgICAgbG9nQ2xpZW50RGllZChnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoIkJpbmRlciBkaWVkIHVuZXhwZWN0ZWRseSIpKTsKIAotICAgIHNwPEJhc2ljQ2xpZW50PiBjYW1lcmFDbGllbnQgPSBnZXRDbGllbnRCeVJlbW90ZSh3aG8pOworICAgIC8vIGNoZWNrIHRvcmNoIGNsaWVudAorICAgIGhhbmRsZVRvcmNoQ2xpZW50QmluZGVyRGllZCh3aG8pOwogCi0gICAgaWYgKGNhbWVyYUNsaWVudCA9PSAwKSB7Ci0gICAgICAgIEFMT0dWKCJqYXZhIGNsaWVudHMnIGJpbmRlciBkZWF0aCBhbHJlYWR5IGNsZWFuZWQgdXAgKG5vcm1hbCBjYXNlKSIpOworICAgIC8vIGNoZWNrIGNhbWVyYSBkZXZpY2UgY2xpZW50CisgICAgaWYoIWV2aWN0Q2xpZW50SWRCeVJlbW90ZSh3aG8pKSB7CisgICAgICAgIEFMT0dWKCIlczogSmF2YSBjbGllbnQncyBiaW5kZXIgZGVhdGggYWxyZWFkeSBjbGVhbmVkIHVwIChub3JtYWwgY2FzZSkiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQUxPR1coIkRpc2Nvbm5lY3RpbmcgY2FtZXJhIGNsaWVudCAlcCBzaW5jZSB0aGUgYmluZGVyIGZvciBpdCAiCi0gICAgICAgICAgImRpZWQgKHRoaXMgcGlkICVkKSIsIGNhbWVyYUNsaWVudC5nZXQoKSwgZ2V0Q2FsbGluZ1BpZCgpKTsKLQotICAgIGNhbWVyYUNsaWVudC0+ZGlzY29ubmVjdCgpOwotCisgICAgQUxPR0UoIiVzOiBKYXZhIGNsaWVudCdzIGJpbmRlciBkaWVkLCByZW1vdmluZyBpdCBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZSBjbGllbnRzIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6dXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzVmVjdG9yICpyZWplY3RTb3VyY2VTdGF0ZXMpIHsKLSAgICAvLyBkbyBub3QgbG9jayBtU2VydmljZUxvY2sgaGVyZSBvciBjYW4gZ2V0IGludG8gYSBkZWFkbG9jayBmcm9tCi0gICAgLy8gIGNvbm5lY3QoKSAtPiBQcm9DbGllbnQ6OmRpc2Nvbm5lY3QgLT4gdXBkYXRlU3RhdHVzCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c011dGV4KTsKLQotICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBvbGRTdGF0dXMgPSBtU3RhdHVzTGlzdFtjYW1lcmFJZF07Ci0KLSAgICBtU3RhdHVzTGlzdFtjYW1lcmFJZF0gPSBzdGF0dXM7Ci0KLSAgICBpZiAob2xkU3RhdHVzICE9IHN0YXR1cykgewotICAgICAgICBBTE9HVigiJXM6IFN0YXR1cyBoYXMgY2hhbmdlZCBmb3IgY2FtZXJhIElEICVkIGZyb20gMHgleCB0byAweCV4IiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwgKHVpbnQzMl90KW9sZFN0YXR1cywgKHVpbnQzMl90KXN0YXR1cyk7Ci0KLSAgICAgICAgaWYgKG9sZFN0YXR1cyA9PSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX1BSRVNFTlQgJiYKLSAgICAgICAgICAgIChzdGF0dXMgIT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQgJiYKLSAgICAgICAgICAgICBzdGF0dXMgIT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX0VOVU1FUkFUSU5HKSkgewotCi0gICAgICAgICAgICBBTE9HVygiJXM6IEZyb20gTk9UX1BSRVNFTlQgY2FuIG9ubHkgdHJhbnNpdGlvbiBpbnRvIFBSRVNFTlQiCi0gICAgICAgICAgICAgICAgICAiIG9yIEVOVU1FUkFUSU5HIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIG1TdGF0dXNMaXN0W2NhbWVyYUlkXSA9IG9sZFN0YXR1czsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZWplY3RTb3VyY2VTdGF0ZXMgIT0gTlVMTCkgewotICAgICAgICAgICAgY29uc3QgU3RhdHVzVmVjdG9yICZyZWplY3RMaXN0ID0gKnJlamVjdFNvdXJjZVN0YXRlczsKLSAgICAgICAgICAgIFN0YXR1c1ZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZWplY3RMaXN0LmJlZ2luKCk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogU29tZXRpbWVzIHdlIHdhbnQgdG8gY29uZGl0aW9uYWxseSBkbyBhIHRyYW5zaXRpb24uCi0gICAgICAgICAgICAgKiBGb3IgZXhhbXBsZSBpZiBhIGNsaWVudCBkaXNjb25uZWN0cywgd2Ugd2FudCB0byBnbyB0byBQUkVTRU5UCi0gICAgICAgICAgICAgKiBvbmx5IGlmIHdlIHdlcmVuJ3QgYWxyZWFkeSBpbiBOT1RfUFJFU0VOVCBvciBFTlVNRVJBVElORy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZm9yICg7IGl0ICE9IHJlamVjdExpc3QuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgICAgICBpZiAob2xkU3RhdHVzID09ICppdCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IFJlamVjdGluZyBzdGF0dXMgdHJhbnNpdGlvbiBmb3IgQ2FtZXJhIElEICVkLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgc2luY2UgdGhlIHNvdXJjZSBzdGF0ZSB3YXMgd2FzIGluIG9uZSBvZiB0aGUgYmFkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzdGF0ZXMuIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0dXNMaXN0W2NhbWVyYUlkXSA9IG9sZFN0YXR1czsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogUHJvQ2xpZW50cyBsb3NlIHRoZWlyIGV4Y2x1c2l2ZSBsb2NrLgotICAgICAgICAgICogLSBEb25lIGJlZm9yZSB0aGUgQ2FtZXJhQ2xpZW50IGNhbiBpbml0aWFsaXplIHRoZSBIQUwgZGV2aWNlLAotICAgICAgICAgICogICBzaW5jZSB3ZSB3YW50IHRvIGJlIGFibGUgdG8gY2xvc2UgaXQgYmVmb3JlIHRoZXkgZ2V0IHRvIGluaXRpYWxpemUKLSAgICAgICAgICAqLwotICAgICAgICBpZiAoc3RhdHVzID09IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfQVZBSUxBQkxFKSB7Ci0gICAgICAgICAgICBWZWN0b3I8d3A8UHJvQ2xpZW50PiA+IHByb0NsaWVudHMobVByb0NsaWVudExpc3RbY2FtZXJhSWRdKTsKLSAgICAgICAgICAgIFZlY3Rvcjx3cDxQcm9DbGllbnQ+ID46OmNvbnN0X2l0ZXJhdG9yIGl0OwotCi0gICAgICAgICAgICBmb3IgKGl0ID0gcHJvQ2xpZW50cy5iZWdpbigpOyBpdCAhPSBwcm9DbGllbnRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgc3A8UHJvQ2xpZW50PiBwcm9DbCA9IGl0LT5wcm9tb3RlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb0NsLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvQ2wtPm9uRXhjbHVzaXZlTG9ja1N0b2xlbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFZlY3RvcjxzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiA+Ojpjb25zdF9pdGVyYXRvciBpdDsKLSAgICAgICAgZm9yIChpdCA9IG1MaXN0ZW5lckxpc3QuYmVnaW4oKTsgaXQgIT0gbUxpc3RlbmVyTGlzdC5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgKCppdCktPm9uU3RhdHVzQ2hhbmdlZChzdGF0dXMsIGNhbWVyYUlkKTsKLSAgICAgICAgfQotICAgIH0KK3ZvaWQgQ2FtZXJhU2VydmljZTo6dXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBzdGF0dXMsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CisgICAgdXBkYXRlU3RhdHVzKHN0YXR1cywgY2FtZXJhSWQsIHt9KTsKIH0KIAotSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIENhbWVyYVNlcnZpY2U6OmdldFN0YXR1cyhpbnQgY2FtZXJhSWQpIGNvbnN0IHsKLSAgICBpZiAoY2FtZXJhSWQgPCAwIHx8IGNhbWVyYUlkID49IE1BWF9DQU1FUkFTKSB7Ci0gICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKLSAgICAgICAgcmV0dXJuIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19VTktOT1dOOwordm9pZCBDYW1lcmFTZXJ2aWNlOjp1cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIHN0YXR1cywgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXM+IHJlamVjdFNvdXJjZVN0YXRlcykgeworICAgIC8vIERvIG5vdCBsb2NrIG1TZXJ2aWNlTG9jayBoZXJlIG9yIGNhbiBnZXQgaW50byBhIGRlYWRsb2NrIGZyb20KKyAgICAvLyBjb25uZWN0KCkgLT4gZGlzY29ubmVjdCAtPiB1cGRhdGVTdGF0dXMKKworICAgIGF1dG8gc3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShjYW1lcmFJZCk7CisKKyAgICBpZiAoc3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXM6IENvdWxkIG5vdCB1cGRhdGUgdGhlIHN0YXR1cyBmb3IgJXMsIG5vIHN1Y2ggZGV2aWNlIGV4aXN0cyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgYWwobVN0YXR1c011dGV4KTsKLSAgICByZXR1cm4gbVN0YXR1c0xpc3RbY2FtZXJhSWRdOworICAgIC8vIFVwZGF0ZSB0aGUgc3RhdHVzIGZvciB0aGlzIGNhbWVyYSBzdGF0ZSwgdGhlbiBzZW5kIHRoZSBvblN0YXR1c0NoYW5nZWRDYWxsYmFja3MgdG8gZWFjaAorICAgIC8vIG9mIHRoZSBsaXN0ZW5lcnMgd2l0aCBib3RoIHRoZSBtU3RhdHVzU3RhdHVzIGFuZCBtU3RhdHVzTGlzdGVuZXJMb2NrIGhlbGQKKyAgICBzdGF0ZS0+dXBkYXRlU3RhdHVzKHN0YXR1cywgY2FtZXJhSWQsIHJlamVjdFNvdXJjZVN0YXRlcywgW3RoaXNdCisgICAgICAgICAgICAoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBzdGF0dXMpIHsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfRU5VTUVSQVRJTkcpIHsKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdG9yY2ggc3RhdHVzIGlmIGl0IGhhcyBhIGZsYXNoIHVuaXQuCisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaFN0YXR1c011dGV4KTsKKyAgICAgICAgICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUb3JjaFN0YXR1cyB0b3JjaFN0YXR1czsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0VG9yY2hTdGF0dXNMb2NrZWQoY2FtZXJhSWQsICZ0b3JjaFN0YXR1cykgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgIE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICAgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRvcmNoU3RhdHVzIG5ld1RvcmNoU3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRPUkNIX1NUQVRVU19BVkFJTEFCTEVfT0ZGIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUT1JDSF9TVEFUVVNfTk9UX0FWQUlMQUJMRTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRvcmNoU3RhdHVzICE9IG5ld1RvcmNoU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvblRvcmNoU3RhdHVzQ2hhbmdlZExvY2tlZChjYW1lcmFJZCwgbmV3VG9yY2hTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKKworICAgICAgICAgICAgZm9yIChhdXRvJiBsaXN0ZW5lciA6IG1MaXN0ZW5lckxpc3QpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZWZhY3RvciBzdGF0dXMgbGlzdGVuZXJzIHRvIHVzZSBzdHJpbmdzIGZvciBDYW1lcmEgSURzIGFuZCByZW1vdmUgdGhpcy4KKyAgICAgICAgICAgICAgICBpbnQgaWQgPSBjYW1lcmFJZFRvSW50KGNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICBpZiAoaWQgIT0gLTEpIGxpc3RlbmVyLT5vblN0YXR1c0NoYW5nZWQoc3RhdHVzLCBpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRUb3JjaFN0YXR1c0xvY2tlZCgKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRvcmNoU3RhdHVzICpzdGF0dXMpIGNvbnN0IHsKKyAgICBpZiAoIXN0YXR1cykgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzc2l6ZV90IGluZGV4ID0gbVRvcmNoU3RhdHVzTWFwLmluZGV4T2ZLZXkoY2FtZXJhSWQpOworICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAvLyBpbnZhbGlkIGNhbWVyYSBJRCBvciB0aGUgY2FtZXJhIGRvZXNuJ3QgaGF2ZSBhIGZsYXNoIHVuaXQKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgICpzdGF0dXMgPSBtVG9yY2hTdGF0dXNNYXAudmFsdWVBdChpbmRleCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpzZXRUb3JjaFN0YXR1c0xvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMgc3RhdHVzKSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1Ub3JjaFN0YXR1c01hcC5pbmRleE9mS2V5KGNhbWVyYUlkKTsKKyAgICBpZiAoaW5kZXggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMmIGl0ZW0gPQorICAgICAgICAgICAgbVRvcmNoU3RhdHVzTWFwLmVkaXRWYWx1ZUF0KGluZGV4KTsKKyAgICBpdGVtID0gc3RhdHVzOworCisgICAgcmV0dXJuIE9LOwogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCmluZGV4IGZkMmEyZWUuLjM5MDVkNjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFTRVJWSUNFX0gKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFTRVJWSUNFX0gKIAorI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+CkBAIC0yNyw4ICsyOCw2IEBACiAKICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYS5oPgogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8Y2FtZXJhL0lQcm9DYW1lcmFVc2VyLmg+Ci0jaW5jbHVkZSA8Y2FtZXJhL0lQcm9DYW1lcmFDYWxsYmFja3MuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlIDxjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oPgpAQCAtMzYsOSArMzUsMTggQEAKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgogCiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKyNpbmNsdWRlICJDYW1lcmFGbGFzaGxpZ2h0LmgiCiAKLS8qIFRoaXMgbmVlZHMgdG8gYmUgaW5jcmVhc2VkIGlmIHdlIGNhbiBoYXZlIG1vcmUgY2FtZXJhcyAqLwotI2RlZmluZSBNQVhfQ0FNRVJBUyAyCisjaW5jbHVkZSAiY29tbW9uL0NhbWVyYU1vZHVsZS5oIgorI2luY2x1ZGUgIm1lZGlhL1JpbmdCdWZmZXIuaCIKKyNpbmNsdWRlICJ1dGlscy9BdXRvQ29uZGl0aW9uTG9jay5oIgorI2luY2x1ZGUgInV0aWxzL0NsaWVudE1hbmFnZXIuaCIKKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTU4LDYgKzY2LDI0IEBACiAgICAgY2xhc3MgQ2xpZW50OwogICAgIGNsYXNzIEJhc2ljQ2xpZW50OwogCisgICAgLy8gVGhlIGVmZmVjdGl2ZSBBUEkgbGV2ZWwuICBUaGUgQ2FtZXJhMiBBUEkgcnVubmluZyBpbiBMRUdBQ1kgbW9kZSBjb3VudHMgYXMgQVBJXzEuCisgICAgZW51bSBhcGlMZXZlbCB7CisgICAgICAgIEFQSV8xID0gMSwKKyAgICAgICAgQVBJXzIgPSAyCisgICAgfTsKKworICAgIC8vIFByb2Nlc3Mgc3RhdGUgKG1pcnJvcnMgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXIuamF2YSkKKyAgICBzdGF0aWMgY29uc3QgaW50IFBST0NFU1NfU1RBVEVfTk9ORVhJU1RFTlQgPSAtMTsKKworICAgIC8vIDMgc2Vjb25kIGJ1c3kgdGltZW91dCB3aGVuIG90aGVyIGNsaWVudHMgYXJlIGNvbm5lY3RpbmcKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBERUZBVUxUX0NPTk5FQ1RfVElNRU9VVF9OUyA9IDMwMDAwMDAwMDA7CisKKyAgICAvLyAxIHNlY29uZCBidXN5IHRpbWVvdXQgd2hlbiBvdGhlciBjbGllbnRzIGFyZSBkaXNjb25uZWN0aW5nCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgREVGQVVMVF9ESVNDT05ORUNUX1RJTUVPVVRfTlMgPSAxMDAwMDAwMDAwOworCisgICAgLy8gRGVmYXVsdCBudW1iZXIgb2YgbWVzc2FnZXMgdG8gc3RvcmUgaW4gZXZpY3Rpb24gbG9nCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBERUZBVUxUX0VWRU5UX0xPR19MRU5HVEggPSAxMDA7CisKICAgICAvLyBFdmVudCBsb2cgSUQKICAgICBzdGF0aWMgY29uc3QgaW50IFNOX0VWRU5UX0xPR19JRCA9IDB4NTM0ZTQ1NTQ7CiAKQEAgLTY5LDEyICs5NSwxNyBAQAogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gSEFMIENhbGxiYWNrcwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25EZXZpY2VTdGF0dXNDaGFuZ2VkKGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdHVzKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uRGV2aWNlU3RhdHVzQ2hhbmdlZChjYW1lcmFfZGV2aWNlX3N0YXR1c190IGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9kZXZpY2Vfc3RhdHVzX3QgbmV3U3RhdHVzKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXR1cyk7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAvLyBJQ2FtZXJhU2VydmljZQorICAgIHZpcnR1YWwgaW50MzJfdCAgICAgZ2V0TnVtYmVyT2ZDYW1lcmFzKGludCB0eXBlKTsKICAgICB2aXJ0dWFsIGludDMyX3QgICAgIGdldE51bWJlck9mQ2FtZXJhcygpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRDYW1lcmFJbmZvKGludCBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGludCBjYW1lcmFJZCwKQEAgLTkxLDExICsxMjIsNiBAQAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8SUNhbWVyYT4mIGRldmljZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3RQcm8oY29uc3Qgc3A8SVByb0NhbWVyYUNhbGxiYWNrcz4mIGNhbWVyYUNiLAotICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGludCBjbGllbnRVaWQsCi0gICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICBzcDxJUHJvQ2FtZXJhVXNlcj4mIGRldmljZSk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3REZXZpY2UoCiAgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgY2FtZXJhQ2IsCiAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsCkBAIC0xMTMsNiArMTM5LDExIEBACiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBTdHJpbmcxNiogcGFyYW1ldGVycyk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFRvcmNoTW9kZShjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsIGJvb2wgZW5hYmxlZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBjbGllbnRCaW5kZXIpOworCisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVN5c3RlbUV2ZW50KGludDMyX3QgZXZlbnRJZCwgY29uc3QgaW50MzJfdCogYXJncywgc2l6ZV90IGxlbmd0aCk7CisKICAgICAvLyBPSyA9IHN1cHBvcnRzIGFwaSBvZiB0aGF0IHZlcnNpb24sIC1FT1BOT1RTVVBQID0gZG9lcyBub3Qgc3VwcG9ydAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3VwcG9ydHNDYW1lcmFBcGkoCiAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsIGludCBhcGlWZXJzaW9uKTsKQEAgLTEyNSw3ICsxNTYsNiBAQAogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gQ2xpZW50IGZ1bmN0aW9uYWxpdHkKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbW92ZUNsaWVudEJ5UmVtb3RlKGNvbnN0IHdwPElCaW5kZXI+JiByZW1vdGVCaW5kZXIpOwogCiAgICAgZW51bSBzb3VuZF9raW5kIHsKICAgICAgICAgU09VTkRfU0hVVFRFUiA9IDAsCkBAIC0xNDMsMjcgKzE3MywyMSBAQAogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gU2hhcmVkIHV0aWxpdGllcwotICAgIHN0YXRpYyBzdGF0dXNfdCAgICAgZmlsdGVyT3BlbkVycm9yQ29kZShzdGF0dXNfdCBlcnIpOwogICAgIHN0YXRpYyBzdGF0dXNfdCAgICAgZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShzdGF0dXNfdCBlcnIpOwogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gQ2FtZXJhQ2xpZW50IGZ1bmN0aW9uYWxpdHkKIAotICAgIC8vIHJldHVybnMgcGxhaW4gcG9pbnRlciBvZiBjbGllbnQuIE5vdGUgdGhhdCBtQ2xpZW50TG9jayBzaG91bGQgYmUgYWNxdWlyZWQgdG8KLSAgICAvLyBwcmV2ZW50IHRoZSBjbGllbnQgZnJvbSBkZXN0cnVjdGlvbi4gVGhlIHJlc3VsdCBjYW4gYmUgTlVMTC4KLSAgICB2aXJ0dWFsIEJhc2ljQ2xpZW50KiBnZXRDbGllbnRCeUlkVW5zYWZlKGludCBjYW1lcmFJZCk7Ci0gICAgdmlydHVhbCBNdXRleCogICAgICBnZXRDbGllbnRMb2NrQnlJZChpbnQgY2FtZXJhSWQpOwotCiAgICAgY2xhc3MgQmFzaWNDbGllbnQgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkgPSAwOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRpYWxpemUoQ2FtZXJhTW9kdWxlICptb2R1bGUpID0gMDsKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBkaXNjb25uZWN0KCk7CiAKICAgICAgICAgLy8gYmVjYXVzZSB3ZSBjYW4ndCB2aXJ0dWFsbHkgaW5oZXJpdCBJSW50ZXJmYWNlLCB3aGljaCBicmVha3MKICAgICAgICAgLy8gdmlydHVhbCBpbmhlcml0YW5jZQogICAgICAgICB2aXJ0dWFsIHNwPElCaW5kZXI+IGFzQmluZGVyV3JhcHBlcigpID0gMDsKIAotICAgICAgICAvLyBSZXR1cm4gdGhlIHJlbW90ZSBjYWxsYmFjayBiaW5kZXIgb2JqZWN0IChlLmcuIElQcm9DYW1lcmFDYWxsYmFja3MpCisgICAgICAgIC8vIFJldHVybiB0aGUgcmVtb3RlIGNhbGxiYWNrIGJpbmRlciBvYmplY3QgKGUuZy4gSUNhbWVyYURldmljZUNhbGxiYWNrcykKICAgICAgICAgc3A8SUJpbmRlcj4gICAgICAgICBnZXRSZW1vdGUoKSB7CiAgICAgICAgICAgICByZXR1cm4gbVJlbW90ZUJpbmRlcjsKICAgICAgICAgfQpAQCAtMTczLDYgKzE5NywyMiBAQAogICAgICAgICAvLyBJbnRlcm5hbCBkdW1wIG1ldGhvZCB0byBiZSBjYWxsZWQgYnkgQ2FtZXJhU2VydmljZQogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZHVtcENsaWVudChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpID0gMDsKIAorICAgICAgICAvLyBSZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSBmb3IgdGhpcyBjbGllbnQKKyAgICAgICAgdmlydHVhbCBTdHJpbmcxNiBnZXRQYWNrYWdlTmFtZSgpIGNvbnN0OworCisgICAgICAgIC8vIE5vdGlmeSBjbGllbnQgYWJvdXQgYSBmYXRhbCBlcnJvcgorICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKKworICAgICAgICAvLyBHZXQgdGhlIFVJRCBvZiB0aGUgYXBwbGljYXRpb24gY2xpZW50IHVzaW5nIHRoaXMKKyAgICAgICAgdmlydHVhbCB1aWRfdCBnZXRDbGllbnRVaWQoKSBjb25zdDsKKworICAgICAgICAvLyBHZXQgdGhlIFBJRCBvZiB0aGUgYXBwbGljYXRpb24gY2xpZW50IHVzaW5nIHRoaXMKKyAgICAgICAgdmlydHVhbCBpbnQgZ2V0Q2xpZW50UGlkKCkgY29uc3Q7CisKKyAgICAgICAgLy8gQ2hlY2sgd2hhdCBBUEkgbGV2ZWwgaXMgdXNlZCBmb3IgdGhpcyBjbGllbnQuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2gKKyAgICAgICAgLy8gc3VwZXJjbGFzcyB0aGlzIGNhbiBiZSBjYXN0IHRvLgorICAgICAgICB2aXJ0dWFsIGJvb2wgY2FuQ2FzdFRvQXBpQ2xpZW50KGFwaUxldmVsIGxldmVsKSBjb25zdDsKICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgIEJhc2ljQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiByZW1vdGVDYWxsYmFjaywKQEAgLTE5OSw2ICsyMzksNyBAQAogICAgICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRQaWQ7CiAgICAgICAgIHVpZF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFVpZDsgICAgICAvLyBpbW11dGFibGUgYWZ0ZXIgY29uc3RydWN0b3IKICAgICAgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZVBpZDsgICAgIC8vIGltbXV0YWJsZSBhZnRlciBjb25zdHJ1Y3RvcgorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EaXNjb25uZWN0ZWQ7CiAKICAgICAgICAgLy8gLSBUaGUgYXBwLXNpZGUgQmluZGVyIGludGVyZmFjZSB0byByZWNlaXZlIGNhbGxiYWNrcyBmcm9tIHVzCiAgICAgICAgIHNwPElCaW5kZXI+ICAgICAgICAgICAgICAgICAgICAgbVJlbW90ZUJpbmRlcjsgICAvLyBpbW11dGFibGUgYWZ0ZXIgY29uc3RydWN0b3IKQEAgLTIwNywxMCArMjQ4LDYgQEAKICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgICAgICAgICBzdGFydENhbWVyYU9wcygpOwogICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaENhbWVyYU9wcygpOwogCi0gICAgICAgIC8vIE5vdGlmeSBjbGllbnQgYWJvdXQgYSBmYXRhbCBlcnJvcgotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKAotICAgICAgICAgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCi0gICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSA9IDA7CiAgICAgcHJpdmF0ZToKICAgICAgICAgQXBwT3BzTWFuYWdlciAgICAgICAgICAgICAgICAgICBtQXBwT3BzTWFuYWdlcjsKIApAQCAtMjgyLDE0ICszMTksMTYgQEAKICAgICAgICAgICAgIHJldHVybiBhc0JpbmRlcih0aGlzKTsKICAgICAgICAgfQogCi0gICAgcHJvdGVjdGVkOgotICAgICAgICBzdGF0aWMgTXV0ZXgqICAgICAgICBnZXRDbGllbnRMb2NrRnJvbUNvb2tpZSh2b2lkKiB1c2VyKTsKLSAgICAgICAgLy8gY29udmVydCBjbGllbnQgZnJvbSBjb29raWUuIENsaWVudCBsb2NrIHNob3VsZCBiZSBhY3F1aXJlZCBiZWZvcmUgZ2V0dGluZyBDbGllbnQuCi0gICAgICAgIHN0YXRpYyBDbGllbnQqICAgICAgIGdldENsaWVudEZyb21Db29raWUodm9pZCogdXNlcik7Ci0KICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgbm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKIAorICAgICAgICAvLyBDaGVjayB3aGF0IEFQSSBsZXZlbCBpcyB1c2VkIGZvciB0aGlzIGNsaWVudC4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaAorICAgICAgICAvLyBzdXBlcmNsYXNzIHRoaXMgY2FuIGJlIGNhc3QgdG8uCisgICAgICAgIHZpcnR1YWwgYm9vbCBjYW5DYXN0VG9BcGlDbGllbnQoYXBpTGV2ZWwgbGV2ZWwpIGNvbnN0OworICAgIHByb3RlY3RlZDoKKyAgICAgICAgLy8gQ29udmVydCBjbGllbnQgZnJvbSBjb29raWUuCisgICAgICAgIHN0YXRpYyBzcDxDYW1lcmFTZXJ2aWNlOjpDbGllbnQ+IGdldENsaWVudEZyb21Db29raWUodm9pZCogdXNlcik7CisKICAgICAgICAgLy8gSW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IKIAogICAgICAgICAvLyAtIFRoZSBhcHAtc2lkZSBCaW5kZXIgaW50ZXJmYWNlIHRvIHJlY2VpdmUgY2FsbGJhY2tzIGZyb20gdXMKQEAgLTI5Nyw5MiArMzM2LDI5NCBAQAogCiAgICAgfTsgLy8gY2xhc3MgQ2xpZW50CiAKLSAgICBjbGFzcyBQcm9DbGllbnQgOiBwdWJsaWMgQm5Qcm9DYW1lcmFVc2VyLCBwdWJsaWMgQmFzaWNDbGllbnQgeworICAgIC8qKgorICAgICAqIEEgbGlzdGVuZXIgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBMSVNURU5FUiBpbnRlcmZhY2UgZm9yIHVzZSB3aXRoIGEgQ2xpZW50TWFuYWdlciwgYW5kCisgICAgICogaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisgICAgICogICAgdm9pZCBvbkNsaWVudFJlbW92ZWQoY29uc3QgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPiYgZGVzY3JpcHRvcik7CisgICAgICogICAgdm9pZCBvbkNsaWVudEFkZGVkKGNvbnN0IENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4mIGRlc2NyaXB0b3IpOworICAgICAqLworICAgIGNsYXNzIENsaWVudEV2ZW50TGlzdGVuZXIgewogICAgIHB1YmxpYzoKLSAgICAgICAgdHlwZWRlZiBJUHJvQ2FtZXJhQ2FsbGJhY2tzIFRDYW1DYWxsYmFja3M7CisgICAgICAgIHZvaWQgb25DbGllbnRBZGRlZChjb25zdCByZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwKKyAgICAgICAgICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudD4+JiBkZXNjcmlwdG9yKTsKKyAgICAgICAgdm9pZCBvbkNsaWVudFJlbW92ZWQoY29uc3QgcmVzb3VyY2VfcG9saWN5OjpDbGllbnREZXNjcmlwdG9yPFN0cmluZzgsCisgICAgICAgICAgICAgICAgc3A8Q2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ+PiYgZGVzY3JpcHRvcik7CisgICAgfTsgLy8gY2xhc3MgQ2xpZW50RXZlbnRMaXN0ZW5lcgogCi0gICAgICAgIFByb0NsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAotICAgICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCi0gICAgICAgICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKKyAgICB0eXBlZGVmIHN0ZDo6c2hhcmVkX3B0cjxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwKKyAgICAgICAgICAgIHNwPENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50Pj4+IERlc2NyaXB0b3JQdHI7CiAKLSAgICAgICAgdmlydHVhbCB+UHJvQ2xpZW50KCk7CisgICAgLyoqCisgICAgICogQSBjb250YWluZXIgY2xhc3MgZm9yIG1hbmFnaW5nIGFjdGl2ZSBjYW1lcmEgY2xpZW50cyB0aGF0IGFyZSB1c2luZyBIQUwgZGV2aWNlcy4gIEFjdGl2ZQorICAgICAqIGNsaWVudHMgYXJlIHJlcHJlc2VudGVkIGJ5IENsaWVudERlc2NyaXB0b3Igb2JqZWN0cyB0aGF0IGNvbnRhaW4gc3Ryb25nIHBvaW50ZXJzIHRvIHRoZQorICAgICAqIGFjdHVhbCBCYXNpY0NsaWVudCBzdWJjbGFzcyBiaW5kZXIgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSBldmljdGlvbiBiZWhhdmlvciBmb3IgdGhlIGNhbWVyYSBjbGllbnRzLiAgU2VlIHRoZSBwYXJlbnQgY2xhc3MKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBpbiB1dGlscy9DbGllbnRNYW5hZ2VyIGZvciB0aGUgc3BlY2lmaWNzIG9mIHRoaXMgYmVoYXZpb3IuCisgICAgICovCisgICAgY2xhc3MgQ2FtZXJhQ2xpZW50TWFuYWdlciA6IHB1YmxpYyByZXNvdXJjZV9wb2xpY3k6OkNsaWVudE1hbmFnZXI8U3RyaW5nOCwKKyAgICAgICAgICAgIHNwPENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50PiwgQ2xpZW50RXZlbnRMaXN0ZW5lcj4geworICAgIHB1YmxpYzoKKyAgICAgICAgQ2FtZXJhQ2xpZW50TWFuYWdlcigpOworICAgICAgICB2aXJ0dWFsIH5DYW1lcmFDbGllbnRNYW5hZ2VyKCk7CiAKLSAgICAgICAgY29uc3Qgc3A8SVByb0NhbWVyYUNhbGxiYWNrcz4mIGdldFJlbW90ZUNhbGxiYWNrKCkgewotICAgICAgICAgICAgcmV0dXJuIG1SZW1vdGVDYWxsYmFjazsKLSAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIGEgc3Ryb25nIHBvaW50ZXIgdG8gdGhlIGFjdGl2ZSBCYXNpY0NsaWVudCBmb3IgdGhpcyBjYW1lcmEgSUQsIG9yIGFuIGVtcHR5CisgICAgICAgICAqIGlmIG5vbmUgZXhpc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgc3A8Q2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ+IGdldENhbWVyYUNsaWVudChjb25zdCBTdHJpbmc4JiBpZCkgY29uc3Q7CiAKLSAgICAgICAgLyoqKgotICAgICAgICAgICAgSVByb0NhbWVyYSBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgKioqLwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgY29ubmVjdChjb25zdCBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiYgY2FsbGJhY2tzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGV4Y2x1c2l2ZVRyeUxvY2soKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBleGNsdXNpdmVMb2NrKCkgPSAwOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZXhjbHVzaXZlVW5sb2NrKCkgPSAwOworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGN1cnJlbnQgc3RhdGUuCisgICAgICAgICAqLworICAgICAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7CiAKLSAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgIGhhc0V4Y2x1c2l2ZUxvY2soKSA9IDA7CisgICAgICAgIC8qKgorICAgICAgICAgKiBNYWtlIGEgQ2xpZW50RGVzY3JpcHRvciBvYmplY3Qgd3JhcHBpbmcgdGhlIGdpdmVuIEJhc2ljQ2xpZW50IHN0cm9uZyBwb2ludGVyLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIERlc2NyaXB0b3JQdHIgbWFrZUNsaWVudERlc2NyaXB0b3IoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBzcDxCYXNpY0NsaWVudD4mIHZhbHVlLAorICAgICAgICAgICAgICAgIGludDMyX3QgY29zdCwgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nS2V5cywgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICBpbnQzMl90IG93bmVySWQpOwogCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgY2FsbGVlIGdldHMgYSBjb3B5IG9mIHRoZSBtZXRhZGF0YS4KLSAgICAgICAgdmlydHVhbCBpbnQgICAgICAgICAgIHN1Ym1pdFJlcXVlc3QoY2FtZXJhX21ldGFkYXRhX3QqIG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGZhbHNlKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBjYW5jZWxSZXF1ZXN0KGludCByZXF1ZXN0SWQpID0gMDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1ha2UgYSBDbGllbnREZXNjcmlwdG9yIG9iamVjdCB3cmFwcGluZyB0aGUgZ2l2ZW4gQmFzaWNDbGllbnQgc3Ryb25nIHBvaW50ZXIgd2l0aAorICAgICAgICAgKiB2YWx1ZXMgaW50aWFsaXplZCBmcm9tIGEgcHJpb3IgQ2xpZW50RGVzY3JpcHRvci4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBEZXNjcmlwdG9yUHRyIG1ha2VDbGllbnREZXNjcmlwdG9yKGNvbnN0IHNwPEJhc2ljQ2xpZW50PiYgdmFsdWUsCisgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhU2VydmljZTo6RGVzY3JpcHRvclB0ciYgcGFydGlhbCk7CiAKLSAgICAgICAgLy8gQ2FsbGJhY2tzIGZyb20gY2FtZXJhIHNlcnZpY2UKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG9uRXhjbHVzaXZlTG9ja1N0b2xlbigpID0gMDsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOwotCi0gICAgICAgIHNwPElQcm9DYW1lcmFDYWxsYmFja3M+IG1SZW1vdGVDYWxsYmFjazsKLSAgICB9OyAvLyBjbGFzcyBQcm9DbGllbnQKKyAgICB9OyAvLyBjbGFzcyBDYW1lcmFDbGllbnRNYW5hZ2VyCiAKIHByaXZhdGU6CiAKKyAgICAvKioKKyAgICAgKiBDb250YWluZXIgY2xhc3MgZm9yIHRoZSBzdGF0ZSBvZiBlYWNoIGxvZ2ljYWwgY2FtZXJhIGRldmljZSwgaW5jbHVkaW5nOiBJRCwgc3RhdHVzLCBhbmQKKyAgICAgKiBkZXBlbmRlbmNpZXMgb24gb3RoZXIgZGV2aWNlcy4gIFRoZSBtYXBwaW5nIG9mIGNhbWVyYSBJRCAtPiBzdGF0ZSBzYXZlZCBpbiBtQ2FtZXJhU3RhdGVzCisgICAgICogcmVwcmVzZW50cyB0aGUgY2FtZXJhIGRldmljZXMgYWR2ZXJ0aXNlZCBieSB0aGUgSEFMIChhbmQgYW55IFVTQiBkZXZpY2VzLCB3aGVuIHdlIGFkZAorICAgICAqIHRob3NlKS4KKyAgICAgKgorICAgICAqIFRoaXMgY29udGFpbmVyIGRvZXMgTk9UIHJlcHJlc2VudCBhbiBhY3RpdmUgY2FtZXJhIGNsaWVudC4gIFRoZXNlIGFyZSByZXByZXNlbnRlZCB1c2luZworICAgICAqIHRoZSBDbGllbnREZXNjcmlwdG9ycyBzdG9yZWQgaW4gbUFjdGl2ZUNsaWVudE1hbmFnZXIuCisgICAgICovCisgICAgY2xhc3MgQ2FtZXJhU3RhdGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1ha2UgYSBuZXcgQ2FtZXJhU3RhdGUgYW5kIHNldCB0aGUgSUQsIGNvc3QsIGFuZCBjb25mbGljdGluZyBkZXZpY2VzIHVzaW5nIHRoZSB2YWx1ZXMKKyAgICAgICAgICogcmV0dXJuZWQgaW4gdGhlIEhBTCdzIGNhbWVyYV9pbmZvIHN0cnVjdCBmb3IgZWFjaCBkZXZpY2UuCisgICAgICAgICAqLworICAgICAgICBDYW1lcmFTdGF0ZShjb25zdCBTdHJpbmc4JiBpZCwgaW50IGNvc3QsIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBjb25mbGljdGluZyk7CisgICAgICAgIHZpcnR1YWwgfkNhbWVyYVN0YXRlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgc3RhdHVzIGZvciB0aGlzIGRldmljZS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBtZXRob2QgYWNxdWlyZXMgbVN0YXR1c0xvY2suCisgICAgICAgICAqLworICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgZ2V0U3RhdHVzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgc3RhdHVzIGZvciB0aGlzIGNhbWVyYSBkZXZpY2UsIHVubGVzcyB0aGUgZ2l2ZW4gc3RhdHVzCisgICAgICAgICAqIGlzIGluIHRoZSBnaXZlbiBsaXN0IG9mIHJlamVjdGVkIHN0YXR1cyBzdGF0ZXMsIGFuZCBleGVjdXRlIHRoZSBmdW5jdGlvbiBwYXNzZWQgaW4KKyAgICAgICAgICogd2l0aCBhIHNpZ25hdHVyZSBvblN0YXR1c1VwZGF0ZUxvY2tlZChjb25zdCBTdHJpbmc4JiwgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzKQorICAgICAgICAgKiBpZiB0aGUgc3RhdHVzIGhhcyBjaGFuZ2VkLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LCBhbmQgd2lsbCBub3QgcmVzdWx0IGluIHRoZSBmdW5jdGlvbiBwYXNzZWQgdG8KKyAgICAgICAgICogb25TdGF0dXNVcGRhdGVMb2NrZWQgYmVpbmcgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGZvciB0aGUgc2FtZSBhcmd1bWVudHMuCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGFxdWlyZXMgbVN0YXR1c0xvY2suCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBGdW5jPgorICAgICAgICB2b2lkIHVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgc3RhdHVzLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzPiByZWplY3RTb3VyY2VTdGF0ZXMsCisgICAgICAgICAgICAgICAgRnVuYyBvblN0YXR1c1VwZGF0ZWRMb2NrZWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGxhc3Qgc2V0IENhbWVyYVBhcmFtZXRlcnMgb2JqZWN0IGdlbmVyYXRlZCBmcm9tIHRoZSBpbmZvcm1hdGlvbiByZXR1cm5lZCBieQorICAgICAgICAgKiB0aGUgSEFMIGZvciB0aGlzIGRldmljZSAob3IgYW4gZW1wdHkgQ2FtZXJhUGFyYW1ldGVycyBvYmplY3QgaWYgbm9uZSBoYXMgYmVlbiBzZXQpLgorICAgICAgICAgKi8KKyAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBnZXRTaGltUGFyYW1zKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgQ2FtZXJhUGFyYW1ldGVycyBmb3IgdGhpcyBkZXZpY2UuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHNldFNoaW1QYXJhbXMoY29uc3QgQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSByZXNvdXJjZV9jb3N0IGFkdmVydGlzZWQgYnkgdGhlIEhBTCBmb3IgdGhpcyBkZXZpY2UuCisgICAgICAgICAqLworICAgICAgICBpbnQgZ2V0Q29zdCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gYSBzZXQgb2YgdGhlIElEcyBvZiBjb25mbGljdGluZyBkZXZpY2VzIGFkdmVydGlzZWQgYnkgdGhlIEhBTCBmb3IgdGhpcyBkZXZpY2UuCisgICAgICAgICAqLworICAgICAgICBzdGQ6OnNldDxTdHJpbmc4PiBnZXRDb25mbGljdGluZygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIElEIG9mIHRoaXMgY2FtZXJhIGRldmljZS4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZzggZ2V0SWQoKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IFN0cmluZzggbUlkOworICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgbVN0YXR1czsgLy8gcHJvdGVjdGVkIGJ5IG1TdGF0dXNMb2NrCisgICAgICAgIGNvbnN0IGludCBtQ29zdDsKKyAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4gbUNvbmZsaWN0aW5nOworICAgICAgICBtdXRhYmxlIE11dGV4IG1TdGF0dXNMb2NrOworICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIG1TaGltUGFyYW1zOworICAgIH07IC8vIGNsYXNzIENhbWVyYVN0YXRlCisKICAgICAvLyBEZWxheS1sb2FkIHRoZSBDYW1lcmEgSEFMIG1vZHVsZQogICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7CiAKLSAgICAvLyBTdGVwIDEuIENoZWNrIGlmIHdlIGNhbiBjb25uZWN0LCBiZWZvcmUgd2UgYWNxdWlyZSB0aGUgc2VydmljZSBsb2NrLgotICAgIHN0YXR1c190ICAgICAgICAgICAgdmFsaWRhdGVDb25uZWN0KGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlub3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGNsaWVudFVpZCkgY29uc3Q7CisgICAgLy8gQ2hlY2sgaWYgd2UgY2FuIGNvbm5lY3QsIGJlZm9yZSB3ZSBhY3F1aXJlIHRoZSBzZXJ2aWNlIGxvY2suCisgICAgc3RhdHVzX3QgdmFsaWRhdGVDb25uZWN0TG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCAvKmlub3V0Ki9pbnQmIGNsaWVudFVpZCkgY29uc3Q7CiAKLSAgICAvLyBTdGVwIDIuIENoZWNrIGlmIHdlIGNhbiBjb25uZWN0LCBhZnRlciB3ZSBhY3F1aXJlIHRoZSBzZXJ2aWNlIGxvY2suCi0gICAgYm9vbCAgICAgICAgICAgICAgICBjYW5Db25uZWN0VW5zYWZlKGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgcmVtb3RlQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QmFzaWNDbGllbnQ+ICZjbGllbnQpOworICAgIC8vIEhhbmRsZSBhY3RpdmUgY2xpZW50IGV2aWN0aW9ucywgYW5kIHVwZGF0ZSBzZXJ2aWNlIHN0YXRlLgorICAgIC8vIE9ubHkgY2FsbCB3aXRoIHdpdGggbVNlcnZpY2VMb2NrIGhlbGQuCisgICAgc3RhdHVzX3QgaGFuZGxlRXZpY3Rpb25zTG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQgY2xpZW50UGlkLAorICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrLCBjb25zdCBTdHJpbmc4JiBwYWNrYWdlTmFtZSwKKyAgICAgICAgLypvdXQqLworICAgICAgICBzcDxCYXNpY0NsaWVudD4qIGNsaWVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHJlc291cmNlX3BvbGljeTo6Q2xpZW50RGVzY3JpcHRvcjxTdHJpbmc4LCBzcDxCYXNpY0NsaWVudD4+PiogcGFydGlhbCk7CiAKLSAgICAvLyBXaGVuIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgaW5pdGlhbGl6ZSBjbGllbnQgYW5kIHRyYWNrIGl0cyBkZWF0aAotICAgIHN0YXR1c190ICAgICAgICAgICAgY29ubmVjdEZpbmlzaFVuc2FmZShjb25zdCBzcDxCYXNpY0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrKTsKKyAgICAvLyBTaW5nbGUgaW1wbGVtZW50YXRpb24gc2hhcmVkIGJldHdlZW4gdGhlIHZhcmlvdXMgY29ubmVjdCBjYWxscworICAgIHRlbXBsYXRlPGNsYXNzIENBTExCQUNLLCBjbGFzcyBDTElFTlQ+CisgICAgc3RhdHVzX3QgY29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGludCBjbGllbnRVaWQsIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAorICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlLCBib29sIHNoaW1VcGRhdGVPbmx5LCAvKm91dCovc3A8Q0xJRU5UPiYgZGV2aWNlKTsKIAotICAgIHZpcnR1YWwgc3A8QmFzaWNDbGllbnQ+ICBnZXRDbGllbnRCeVJlbW90ZShjb25zdCB3cDxJQmluZGVyPiYgY2FtZXJhQ2xpZW50KTsKLQorICAgIC8vIExvY2sgZ3VhcmRpbmcgY2FtZXJhIHNlcnZpY2Ugc3RhdGUKICAgICBNdXRleCAgICAgICAgICAgICAgIG1TZXJ2aWNlTG9jazsKLSAgICAvLyBlaXRoZXIgYSBDbGllbnQgb3IgQ2FtZXJhRGV2aWNlQ2xpZW50Ci0gICAgd3A8QmFzaWNDbGllbnQ+ICAgICBtQ2xpZW50W01BWF9DQU1FUkFTXTsgIC8vIHByb3RlY3RlZCBieSBtU2VydmljZUxvY2sKLSAgICBNdXRleCAgICAgICAgICAgICAgIG1DbGllbnRMb2NrW01BWF9DQU1FUkFTXTsgLy8gcHJldmVudCBDbGllbnQgZGVzdHJ1Y3Rpb24gaW5zaWRlIGNhbGxiYWNrcworCisgICAgLy8gQ29uZGl0aW9uIHRvIHVzZSB3aXRoIG1TZXJ2aWNlTG9jaywgdXNlZCB0byBoYW5kbGUgc2ltdWx0YW5lb3VzIGNvbm5lY3QgY2FsbHMgZnJvbSBjbGllbnRzCisgICAgc3RkOjpzaGFyZWRfcHRyPFdhaXRhYmxlTXV0ZXhXcmFwcGVyPiBtU2VydmljZUxvY2tXcmFwcGVyOworCisgICAgLy8gUmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBkZXZpY2Ugd2l0aCBhIGdpdmUgSUQgY2FuIGJlIGNvbm5lY3RlZCB0bworICAgIHN0YXR1c190IGNoZWNrSWZEZXZpY2VJc1VzYWJsZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgY29uc3Q7CisKKyAgICAvLyBDb250YWluZXIgZm9yIG1hbmFnaW5nIGN1cnJlbnRseSBhY3RpdmUgYXBwbGljYXRpb24tbGF5ZXIgY2xpZW50cworICAgIENhbWVyYUNsaWVudE1hbmFnZXIgbUFjdGl2ZUNsaWVudE1hbmFnZXI7CisKKyAgICAvLyBNYXBwaW5nIGZyb20gY2FtZXJhIElEIC0+IHN0YXRlIGZvciBlYWNoIGRldmljZSwgbWFwIGlzIHByb3RlY3RlZCBieSBtQ2FtZXJhU3RhdGVzTG9jaworICAgIHN0ZDo6bWFwPFN0cmluZzgsIHN0ZDo6c2hhcmVkX3B0cjxDYW1lcmFTdGF0ZT4+IG1DYW1lcmFTdGF0ZXM7CisKKyAgICAvLyBNdXRleCBndWFyZGluZyBtQ2FtZXJhU3RhdGVzIG1hcAorICAgIG11dGFibGUgTXV0ZXggbUNhbWVyYVN0YXRlc0xvY2s7CisKKyAgICAvLyBDaXJjdWxhciBidWZmZXIgZm9yIHN0b3JpbmcgZXZlbnQgbG9nZ2luZyBmb3IgZHVtcHMKKyAgICBSaW5nQnVmZmVyPFN0cmluZzg+IG1FdmVudExvZzsKKyAgICBNdXRleCBtTG9nTG9jazsKKworICAgIC8vIEN1cnJlbnRseSBhbGxvd2VkIHVzZXIgSURzCisgICAgc3RkOjpzZXQ8dXNlcmlkX3Q+IG1BbGxvd2VkVXNlcnM7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBjYW1lcmEgY2FwYWJpbGl0aWVzLCBzdWNoIGFzIHN1cHBvcnQgZm9yIGJhc2ljIGNvbG9yIG9wZXJhdGlvbgorICAgICAqLworICAgIGludCBjaGVja0NhbWVyYUNhcGFiaWxpdGllcyhpbnQgaWQsIGNhbWVyYV9pbmZvIGluZm8sIGludCAqbGF0ZXN0U3RyYW5nZUNhbWVyYUlkKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2FtZXJhIHN0YXRlIGZvciBhIGdpdmVuIGNhbWVyYSBpZC4KKyAgICAgKgorICAgICAqIFRoaXMgYWNxdWlyZXMgbUNhbWVyYVN0YXRlc0xvY2suCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlPiBnZXRDYW1lcmFTdGF0ZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBFdmljdCBjbGllbnQgd2hvJ3MgcmVtb3RlIGJpbmRlciBoYXMgZGllZC4gIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNsaWVudCB3YXMgaW4gdGhlIGFjdGl2ZQorICAgICAqIGxpc3QgYW5kIHdhcyBkaXNjb25uZWN0ZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBhY3F1aXJlcyBtU2VydmljZUxvY2suCisgICAgICovCisgICAgYm9vbCBldmljdENsaWVudElkQnlSZW1vdGUoY29uc3Qgd3A8SUJpbmRlcj4mIGNhbWVyYUNsaWVudCk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGNsaWVudCBmcm9tIHRoZSBhY3RpdmUgY2xpZW50cyBsaXN0OyBkb2VzIG5vdCBkaXNjb25uZWN0IHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBhY3F1aXJlcyBtU2VydmljZUxvY2suCisgICAgICovCisgICAgdm9pZCByZW1vdmVCeUNsaWVudChjb25zdCBCYXNpY0NsaWVudCogY2xpZW50KTsKKworICAgIC8qKgorICAgICAqIEFkZCBuZXcgY2xpZW50IHRvIGFjdGl2ZSBjbGllbnRzIGxpc3QgYWZ0ZXIgY29uZmxpY3RpbmcgY2xpZW50cyBoYXZlIGRpc2Nvbm5lY3RlZCB1c2luZyB0aGUKKyAgICAgKiB2YWx1ZXMgc2V0IGluIHRoZSBwYXJ0aWFsIGRlc2NyaXB0b3IgcGFzc2VkIGluIHRvIGNvbnN0cnVjdCB0aGUgYWN0dWFsIGNsaWVudCBkZXNjcmlwdG9yLgorICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IGNhbGxlZCBhdCB0aGUgZW5kIG9mIGEgY29ubmVjdCBjYWxsLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgd2l0aCBtU2VydmljZUxvY2sgaGVsZC4KKyAgICAgKi8KKyAgICB2b2lkIGZpbmlzaENvbm5lY3RMb2NrZWQoY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiBjbGllbnQsIGNvbnN0IERlc2NyaXB0b3JQdHImIGRlc2MpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBjYW1lcmEgSUQgc3RyaW5nLCBvciAtMSBvbiBmYWlsdXJlLgorICAgICAqLworICAgIHN0YXRpYyBpbnQgY2FtZXJhSWRUb0ludChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBzaW5nbGUgY2xpZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGNhbWVyYSBpZCBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZSBjbGllbnRzLgorICAgICAqIElmIG5vbmUgZXhpc3RzLCByZXR1cm4gYW4gZW1wdHkgc3Ryb25ncG9pbnRlci4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHdpdGggbVNlcnZpY2VMb2NrIGhlbGQuCisgICAgICovCisgICAgc3A8Q2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ+IHJlbW92ZUNsaWVudExvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgY3VycmVudCBkZXZpY2UgdXNlciBoYXMgY2hhbmdlZC4KKyAgICAgKi8KKyAgICB2b2lkIGRvVXNlclN3aXRjaChjb25zdCBpbnQzMl90KiBuZXdVc2VySWQsIHNpemVfdCBsZW5ndGgpOworCisgICAgLyoqCisgICAgICogQWRkIGFuIGV2ZW50IGxvZyBtZXNzYWdlLgorICAgICAqLworICAgIHZvaWQgbG9nRXZlbnQoY29uc3QgY2hhciogZXZlbnQpOworCisgICAgLyoqCisgICAgICogQWRkIGFuIGV2ZW50IGxvZyBtZXNzYWdlIHRoYXQgYSBjbGllbnQgaGFzIGJlZW4gZGlzY29ubmVjdGVkLgorICAgICAqLworICAgIHZvaWQgbG9nRGlzY29ubmVjdGVkKGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBpbnQgY2xpZW50UGlkLCBjb25zdCBjaGFyKiBjbGllbnRQYWNrYWdlKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBldmVudCBsb2cgbWVzc2FnZSB0aGF0IGEgY2xpZW50IGhhcyBiZWVuIGNvbm5lY3RlZC4KKyAgICAgKi8KKyAgICB2b2lkIGxvZ0Nvbm5lY3RlZChjb25zdCBjaGFyKiBjYW1lcmFJZCwgaW50IGNsaWVudFBpZCwgY29uc3QgY2hhciogY2xpZW50UGFja2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZXZlbnQgbG9nIG1lc3NhZ2UgdGhhdCBhIGNsaWVudCdzIGNvbm5lY3QgYXR0ZW1wdCBoYXMgYmVlbiByZWplY3RlZC4KKyAgICAgKi8KKyAgICB2b2lkIGxvZ1JlamVjdGVkKGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBpbnQgY2xpZW50UGlkLCBjb25zdCBjaGFyKiBjbGllbnRQYWNrYWdlLAorICAgICAgICAgICAgY29uc3QgY2hhciogcmVhc29uKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBldmVudCBsb2cgbWVzc2FnZSB0aGF0IHRoZSBjdXJyZW50IGRldmljZSB1c2VyIGhhcyBiZWVuIHN3aXRjaGVkLgorICAgICAqLworICAgIHZvaWQgbG9nVXNlclN3aXRjaChjb25zdCBzdGQ6OnNldDx1c2VyaWRfdD4mIG9sZFVzZXJJZHMsCisgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHVzZXJpZF90PiYgbmV3VXNlcklkcyk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZXZlbnQgbG9nIG1lc3NhZ2UgdGhhdCBhIGRldmljZSBoYXMgYmVlbiByZW1vdmVkIGJ5IHRoZSBIQUwKKyAgICAgKi8KKyAgICB2b2lkIGxvZ0RldmljZVJlbW92ZWQoY29uc3QgY2hhciogY2FtZXJhSWQsIGNvbnN0IGNoYXIqIHJlYXNvbik7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZXZlbnQgbG9nIG1lc3NhZ2UgdGhhdCBhIGRldmljZSBoYXMgYmVlbiBhZGRlZCBieSB0aGUgSEFMCisgICAgICovCisgICAgdm9pZCBsb2dEZXZpY2VBZGRlZChjb25zdCBjaGFyKiBjYW1lcmFJZCwgY29uc3QgY2hhciogcmVhc29uKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBldmVudCBsb2cgbWVzc2FnZSB0aGF0IGEgY2xpZW50IGhhcyB1bmV4cGVjdGVkbHkgZGllZC4KKyAgICAgKi8KKyAgICB2b2lkIGxvZ0NsaWVudERpZWQoaW50IGNsaWVudFBpZCwgY29uc3QgY2hhciogcmVhc29uKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIGV2ZW50IGxvZyBtZXNzYWdlIHRoYXQgYSBzZXJpb3VzIHNlcnZpY2UtbGV2ZWwgZXJyb3IgaGFzIG9jY3VyZWQKKyAgICAgKi8KKyAgICB2b2lkIGxvZ1NlcnZpY2VFcnJvcihjb25zdCBjaGFyKiBtc2csIGludCBlcnJvckNvZGUpOworCisgICAgLyoqCisgICAgICogRHVtcCB0aGUgZXZlbnQgbG9nIHRvIGFuIEZECisgICAgICovCisgICAgdm9pZCBkdW1wRXZlbnRMb2coaW50IGZkKTsKKwogICAgIGludCAgICAgICAgICAgICAgICAgbU51bWJlck9mQ2FtZXJhczsKLQotICAgIHR5cGVkZWYgd3A8UHJvQ2xpZW50PiB3ZWFrX3Byb19jbGllbnRfcHRyOwotICAgIFZlY3Rvcjx3ZWFrX3Byb19jbGllbnRfcHRyPiBtUHJvQ2xpZW50TGlzdFtNQVhfQ0FNRVJBU107Ci0KLSAgICAvLyBuZWVkcyB0byBiZSBjYWxsZWQgd2l0aCBtU2VydmljZUxvY2sgaGVsZAotICAgIHNwPEJhc2ljQ2xpZW50PiAgICAgZmluZENsaWVudFVuc2FmZShjb25zdCB3cDxJQmluZGVyPiYgY2FtZXJhQ2xpZW50LCBpbnQmIG91dEluZGV4KTsKLSAgICBzcDxQcm9DbGllbnQ+ICAgICAgIGZpbmRQcm9DbGllbnRVbnNhZmUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUJpbmRlcj4mIGNhbWVyYUNhbGxiYWNrc1JlbW90ZSk7Ci0KLSAgICAvLyBhdG9taWNzIHRvIHJlY29yZCB3aGV0aGVyIHRoZSBoYXJkd2FyZSBpcyBhbGxvY2F0ZWQgdG8gc29tZSBjbGllbnQuCi0gICAgdm9sYXRpbGUgaW50MzJfdCAgICBtQnVzeVtNQVhfQ0FNRVJBU107Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBzZXRDYW1lcmFCdXN5KGludCBjYW1lcmFJZCk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBzZXRDYW1lcmFGcmVlKGludCBjYW1lcmFJZCk7CisgICAgaW50ICAgICAgICAgICAgICAgICBtTnVtYmVyT2ZOb3JtYWxDYW1lcmFzOwogCiAgICAgLy8gc291bmRzCiAgICAgTWVkaWFQbGF5ZXIqICAgICAgICBuZXdNZWRpYVBsYXllcihjb25zdCBjaGFyICpmaWxlKTsKQEAgLTM5MSw0NSArNjMyLDY0IEBACiAgICAgc3A8TWVkaWFQbGF5ZXI+ICAgICBtU291bmRQbGF5ZXJbTlVNX1NPVU5EU107CiAgICAgaW50ICAgICAgICAgICAgICAgICBtU291bmRSZWY7ICAvLyByZWZlcmVuY2UgY291bnQgKHJlbGVhc2UgYWxsIE1lZGlhUGxheWVyIHdoZW4gMCkKIAotICAgIGNhbWVyYV9tb2R1bGVfdCAqbU1vZHVsZTsKKyAgICBDYW1lcmFNb2R1bGUqICAgICBtTW9kdWxlOwogCi0gICAgVmVjdG9yPHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+ID4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lckxpc3Q7CisgICAgLy8gR3VhcmRlZCBieSBtU3RhdHVzTGlzdGVuZXJNdXRleAorICAgIHN0ZDo6dmVjdG9yPHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+PiBtTGlzdGVuZXJMaXN0OworICAgIE11dGV4ICAgICAgIG1TdGF0dXNMaXN0ZW5lckxvY2s7CiAKLSAgICAvLyBndWFyZCBvbmx5IG1TdGF0dXNMaXN0IGFuZCB0aGUgYnJvYWRjYXN0aW5nIG9mIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXIKLSAgICBtdXRhYmxlIE11dGV4ICAgICAgIG1TdGF0dXNNdXRleDsKLSAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNMaXN0W01BWF9DQU1FUkFTXTsKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIHN0YXR1cyBmb3IgdGhlIGdpdmVuIGNhbWVyYSBpZCAoaWYgdGhhdCBkZXZpY2UgZXhpc3RzKSwgYW5kIGJyb2FkY2FzdCB0aGUKKyAgICAgKiBzdGF0dXMgdXBkYXRlIHRvIGFsbCBjdXJyZW50IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXJzIGlmIHRoZSBzdGF0dXMgaGFzIGNoYW5nZWQuICBBbnkKKyAgICAgKiBzdGF0dXNlcyBpbiByZWplY3RlZFNvdXJjZVN0YXRlcyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGlkZW1wb3RlbnQuCisgICAgICogVGhpcyBtZXRob2QgYWNxdWlyZXMgbVN0YXR1c0xvY2sgYW5kIG1TdGF0dXNMaXN0ZW5lckxvY2suCisgICAgICovCisgICAgdm9pZCB1cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIHN0YXR1cywgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzPiByZWplY3RlZFNvdXJjZVN0YXRlcyk7CisgICAgdm9pZCB1cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIHN0YXR1cywgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpOwogCi0gICAgLy8gUmVhZCB0aGUgY3VycmVudCBzdGF0dXMgKGxvY2tzIG1TdGF0dXNNdXRleCkKLSAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0YXR1cyhpbnQgY2FtZXJhSWQpIGNvbnN0OworICAgIC8vIGZsYXNobGlnaHQgY29udHJvbAorICAgIHNwPENhbWVyYUZsYXNobGlnaHQ+IG1GbGFzaGxpZ2h0OworICAgIC8vIGd1YXJkIG1Ub3JjaFN0YXR1c01hcAorICAgIE11dGV4ICAgICAgICAgICAgICAgIG1Ub3JjaFN0YXR1c011dGV4OworICAgIC8vIGd1YXJkIG1Ub3JjaENsaWVudE1hcAorICAgIE11dGV4ICAgICAgICAgICAgICAgIG1Ub3JjaENsaWVudE1hcE11dGV4OworICAgIC8vIGd1YXJkIG1Ub3JjaFVpZE1hcAorICAgIE11dGV4ICAgICAgICAgICAgICAgIG1Ub3JjaFVpZE1hcE11dGV4OworICAgIC8vIGNhbWVyYSBpZCAtPiB0b3JjaCBzdGF0dXMKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUb3JjaFN0YXR1cz4gbVRvcmNoU3RhdHVzTWFwOworICAgIC8vIGNhbWVyYSBpZCAtPiB0b3JjaCBjbGllbnQgYmluZGVyCisgICAgLy8gb25seSBzdG9yZSB0aGUgbGFzdCBjbGllbnQgdGhhdCB0dXJucyBvbiBlYWNoIGNhbWVyYSdzIHRvcmNoIG1vZGUKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBzcDxJQmluZGVyPj4gbVRvcmNoQ2xpZW50TWFwOworICAgIC8vIGNhbWVyYSBpZCAtPiBbaW5jb21pbmcgdWlkLCBjdXJyZW50IHVpZF0gcGFpcgorICAgIHN0ZDo6bWFwPFN0cmluZzgsIHN0ZDo6cGFpcjxpbnQsIGludD4+IG1Ub3JjaFVpZE1hcDsKIAotICAgIHR5cGVkZWYgVmVjdG9yPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cz4gU3RhdHVzVmVjdG9yOwotICAgIC8vIEJyb2FkY2FzdCB0aGUgbmV3IHN0YXR1cyBpZiBpdCBjaGFuZ2VkIChsb2NrcyB0aGUgc2VydmljZSBtdXRleCkKLSAgICB2b2lkICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzVmVjdG9yICpyZWplY3RTb3VyY2VTdGF0ZXMgPSBOVUxMKTsKKyAgICAvLyBjaGVjayBhbmQgaGFuZGxlIGlmIHRvcmNoIGNsaWVudCdzIHByb2Nlc3MgaGFzIGRpZWQKKyAgICB2b2lkIGhhbmRsZVRvcmNoQ2xpZW50QmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKTsKKworICAgIC8vIGhhbmRsZSB0b3JjaCBtb2RlIHN0YXR1cyBjaGFuZ2UgYW5kIGludm9rZSBjYWxsYmFja3MuIG1Ub3JjaFN0YXR1c011dGV4CisgICAgLy8gc2hvdWxkIGJlIGxvY2tlZC4KKyAgICB2b2lkIG9uVG9yY2hTdGF0dXNDaGFuZ2VkTG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMgbmV3U3RhdHVzKTsKKworICAgIC8vIGdldCBhIGNhbWVyYSdzIHRvcmNoIHN0YXR1cy4gbVRvcmNoU3RhdHVzTXV0ZXggc2hvdWxkIGJlIGxvY2tlZC4KKyAgICBzdGF0dXNfdCBnZXRUb3JjaFN0YXR1c0xvY2tlZChjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCwKKyAgICAgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRvcmNoU3RhdHVzICpzdGF0dXMpIGNvbnN0OworCisgICAgLy8gc2V0IGEgY2FtZXJhJ3MgdG9yY2ggc3RhdHVzLiBtVG9yY2hTdGF0dXNNdXRleCBzaG91bGQgYmUgbG9ja2VkLgorICAgIHN0YXR1c190IHNldFRvcmNoU3RhdHVzTG9ja2VkKGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLAorICAgICAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMgc3RhdHVzKTsKIAogICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IGltcGxlbWVudGF0aW9uCiAgICAgdmlydHVhbCB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOwogCiAgICAgLy8gSGVscGVycwogCi0gICAgYm9vbCAgICAgICAgICAgICAgICBpc1ZhbGlkQ2FtZXJhSWQoaW50IGNhbWVyYUlkKTsKLQogICAgIGJvb2wgICAgICAgICAgICAgICAgc2V0VXBWZW5kb3JUYWdzKCk7CiAKICAgICAvKioKLSAgICAgKiBBIG1hcHBpbmcgb2YgY2FtZXJhIGlkcyB0byBDYW1lcmFQYXJhbWV0ZXJzIHJldHVybmVkIGJ5IHRoYXQgY2FtZXJhIGRldmljZS4KLSAgICAgKgotICAgICAqIFRoaXMgY2FjaGUgaXMgdXNlZCB0byBnZW5lcmF0ZSBDYW1lcmFDaGFyYWN0ZXJpc3RpYyBtZXRhZGF0YSB3aGVuIHVzaW5nCi0gICAgICogdGhlIEhBTDEgc2hpbS4KLSAgICAgKi8KLSAgICBLZXllZFZlY3RvcjxpbnQsIENhbWVyYVBhcmFtZXRlcnM+ICAgIG1TaGltUGFyYW1zOwotCi0gICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZSBhbmQgY2FjaGUgdGhlIG1ldGFkYXRhIHVzZWQgYnkgdGhlIEhBTDEgc2hpbSBmb3IgYSBnaXZlbiBjYW1lcmFJZC4KICAgICAgKgogICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgpAQCAtNDUyLDI1ICs3MTIsMTk5IEBACiAgICAgICovCiAgICAgc3RhdHVzX3QgICAgICAgICAgICBnZW5lcmF0ZVNoaW1NZXRhZGF0YShpbnQgY2FtZXJhSWQsIC8qb3V0Ki9DYW1lcmFNZXRhZGF0YSogY2FtZXJhSW5mbyk7CiAKKyAgICBzdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKTsKKworICAgIHN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1VpZCgpOworCiAgICAgLyoqCi0gICAgICogQ29ubmVjdCBhIG5ldyBjYW1lcmEgY2xpZW50LiAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIHdoaWxlIGhvbGRpbmcgdGhlCi0gICAgICogbXV0ZXggZm9yIG1TZXJ2aWNlTG9jay4KLSAgICAgKgotICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAqIEdldCB0aGUgY3VycmVudCBzeXN0ZW0gdGltZSBhcyBhIGZvcm1hdHRlZCBzdHJpbmcuCiAgICAgICovCi0gICAgc3RhdHVzX3QgICAgICAgICAgICBjb25uZWN0SGVscGVyTG9ja2VkKAotICAgICAgICAgICAgLypvdXQqLwotICAgICAgICAgICAgc3A8Q2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgLyppbiovCi0gICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAotICAgICAgICAgICAgaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGludCBjYWxsaW5nUGlkLAotICAgICAgICAgICAgaW50IGhhbFZlcnNpb24gPSBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELAotICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlID0gZmFsc2UpOworICAgIHN0YXRpYyBTdHJpbmc4IGdldEZvcm1hdHRlZEN1cnJlbnRUaW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNhbWVyYSBldmljdGlvbiBwcmlvcml0eSBmcm9tIHRoZSBjdXJyZW50IHByb2Nlc3Mgc3RhdGUgZ2l2ZW4gYnkgQWN0aXZpdHlNYW5hZ2VyLgorICAgICAqLworICAgIHN0YXRpYyBpbnQgZ2V0Q2FtZXJhUHJpb3JpdHlGcm9tUHJvY1N0YXRlKGludCBwcm9jU3RhdGUpOworCisgICAgc3RhdGljIHN0YXR1c190IG1ha2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICBpbnQgZmFjaW5nLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLCBib29sIGxlZ2FjeU1vZGUsCisgICAgICAgICAgICBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAorICAgICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KTsKKworICAgIHN0YXR1c190IGNoZWNrQ2FtZXJhQWNjZXNzKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKTsKKworICAgIHN0YXRpYyBTdHJpbmc4IHRvU3RyaW5nKHN0ZDo6c2V0PHVzZXJpZF90PiBpbnRTZXQpOworCisgICAgc3RhdGljIHZvaWQgcGluZ0NhbWVyYVNlcnZpY2VQcm94eSgpOworCiB9OwogCit0ZW1wbGF0ZTxjbGFzcyBGdW5jPgordm9pZCBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6dXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBzdGF0dXMsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzPiByZWplY3RTb3VyY2VTdGF0ZXMsCisgICAgICAgIEZ1bmMgb25TdGF0dXNVcGRhdGVkTG9ja2VkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xvY2spOworICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBvbGRTdGF0dXMgPSBtU3RhdHVzOworICAgIG1TdGF0dXMgPSBzdGF0dXM7CisKKyAgICBpZiAob2xkU3RhdHVzID09IHN0YXR1cykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBTdGF0dXMgaGFzIGNoYW5nZWQgZm9yIGNhbWVyYSBJRCAlcyBmcm9tICUjeCB0byAlI3giLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgb2xkU3RhdHVzLCBzdGF0dXMpOworCisgICAgaWYgKG9sZFN0YXR1cyA9PSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX1BSRVNFTlQgJiYKKyAgICAgICAgKHN0YXR1cyAhPSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVCAmJgorICAgICAgICAgc3RhdHVzICE9IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19FTlVNRVJBVElORykpIHsKKworICAgICAgICBBTE9HVygiJXM6IEZyb20gTk9UX1BSRVNFTlQgY2FuIG9ubHkgdHJhbnNpdGlvbiBpbnRvIFBSRVNFTlQgb3IgRU5VTUVSQVRJTkciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIG1TdGF0dXMgPSBvbGRTdGF0dXM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTb21ldGltZXMgd2Ugd2FudCB0byBjb25kaXRpb25hbGx5IGRvIGEgdHJhbnNpdGlvbi4KKyAgICAgKiBGb3IgZXhhbXBsZSBpZiBhIGNsaWVudCBkaXNjb25uZWN0cywgd2Ugd2FudCB0byBnbyB0byBQUkVTRU5UCisgICAgICogb25seSBpZiB3ZSB3ZXJlbid0IGFscmVhZHkgaW4gTk9UX1BSRVNFTlQgb3IgRU5VTUVSQVRJTkcuCisgICAgICovCisgICAgZm9yIChhdXRvJiByZWplY3RTdGF0dXMgOiByZWplY3RTb3VyY2VTdGF0ZXMpIHsKKyAgICAgICAgaWYgKG9sZFN0YXR1cyA9PSByZWplY3RTdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogUmVqZWN0aW5nIHN0YXR1cyB0cmFuc2l0aW9uIGZvciBDYW1lcmEgSUQgJXMsICBzaW5jZSB0aGUgc291cmNlICIKKyAgICAgICAgICAgICAgICAgICAgInN0YXRlIHdhcyB3YXMgaW4gb25lIG9mIHRoZSBiYWQgc3RhdGVzLiIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgbVN0YXR1cyA9IG9sZFN0YXR1czsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG9uU3RhdHVzVXBkYXRlZExvY2tlZChjYW1lcmFJZCwgc3RhdHVzKTsKK30KKworCit0ZW1wbGF0ZTxjbGFzcyBDQUxMQkFDSywgY2xhc3MgQ0xJRU5UPgorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgaW50IGhhbFZlcnNpb24sIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKKyAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgbGVnYWN5TW9kZSwgYm9vbCBzaGltVXBkYXRlT25seSwKKyAgICAgICAgLypvdXQqL3NwPENMSUVOVD4mIGRldmljZSkgeworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworICAgIFN0cmluZzggY2xpZW50TmFtZTgoY2xpZW50UGFja2FnZU5hbWUpOworICAgIGludCBjbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisKKyAgICBBTE9HSSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBjYWxsIChQSUQgJWQgXCIlc1wiLCBjYW1lcmEgSUQgJXMpIGZvciBIQUwgdmVyc2lvbiAlcyBhbmQgIgorICAgICAgICAgICAgIkNhbWVyYSBBUEkgdmVyc2lvbiAlZCIsIGNsaWVudFBpZCwgY2xpZW50TmFtZTguc3RyaW5nKCksIGNhbWVyYUlkLnN0cmluZygpLAorICAgICAgICAgICAgKGhhbFZlcnNpb24gPT0gLTEpID8gImRlZmF1bHQiIDogc3RkOjp0b19zdHJpbmcoaGFsVmVyc2lvbikuY19zdHIoKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oZWZmZWN0aXZlQXBpTGV2ZWwpKTsKKworICAgIHNwPENMSUVOVD4gY2xpZW50ID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIC8vIEFjcXVpcmUgbVNlcnZpY2VMb2NrIGFuZCBwcmV2ZW50IG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBdXRvQ29uZGl0aW9uTG9jaz4gbG9jayA9CisgICAgICAgICAgICAgICAgQXV0b0NvbmRpdGlvbkxvY2s6OndhaXRBbmRBY3F1aXJlKG1TZXJ2aWNlTG9ja1dyYXBwZXIsIERFRkFVTFRfQ09OTkVDVF9USU1FT1VUX05TKTsKKworICAgICAgICBpZiAobG9jayA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkICh0b28gbWFueSBvdGhlciBjbGllbnRzIGNvbm5lY3RpbmcpLiIKKyAgICAgICAgICAgICAgICAgICAgLCBjbGllbnRQaWQpOworICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVuZm9yY2UgY2xpZW50IHBlcm1pc3Npb25zIGFuZCBkbyBiYXNpYyBzYW5pdHkgY2hlY2tzCisgICAgICAgIGlmKChyZXQgPSB2YWxpZGF0ZUNvbm5lY3RMb2NrZWQoY2FtZXJhSWQsIC8qaW5vdXQqL2NsaWVudFVpZCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHNoaW0gcGFyYW1ldGVycyBhZnRlciBhY3F1aXJpbmcgbG9jaywgaWYgdGhleSBoYXZlIGFscmVhZHkgYmVlbiB1cGRhdGVkIGFuZAorICAgICAgICAvLyB3ZSB3ZXJlIGRvaW5nIGEgc2hpbSB1cGRhdGUsIHJldHVybiBpbW1lZGlhdGVseQorICAgICAgICBpZiAoc2hpbVVwZGF0ZU9ubHkpIHsKKyAgICAgICAgICAgIGF1dG8gY2FtZXJhU3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShjYW1lcmFJZCk7CisgICAgICAgICAgICBpZiAoY2FtZXJhU3RhdGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGlmICghY2FtZXJhU3RhdGUtPmdldFNoaW1QYXJhbXMoKS5pc0VtcHR5KCkpIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnRUbXAgPSBudWxscHRyOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cmVzb3VyY2VfcG9saWN5OjpDbGllbnREZXNjcmlwdG9yPFN0cmluZzgsIHNwPEJhc2ljQ2xpZW50Pj4+IHBhcnRpYWw7CisgICAgICAgIGlmICgocmV0ID0gaGFuZGxlRXZpY3Rpb25zTG9ja2VkKGNhbWVyYUlkLCBjbGllbnRQaWQsIGVmZmVjdGl2ZUFwaUxldmVsLAorICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGNhbWVyYUNiKSwgY2xpZW50TmFtZTgsIC8qb3V0Ki8mY2xpZW50VG1wLAorICAgICAgICAgICAgICAgIC8qb3V0Ki8mcGFydGlhbCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNsaWVudFRtcC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBBUEkxIE1lZGlhUmVjb3JkZXIgd2hlcmUgdGhlIGV4aXN0aW5nIGNsaWVudCBpcyByZXR1cm5lZAorICAgICAgICAgICAgZGV2aWNlID0gc3RhdGljX2Nhc3Q8Q0xJRU5UKj4oY2xpZW50VG1wLmdldCgpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGdpdmUgZmxhc2hsaWdodCBhIGNoYW5jZSB0byBjbG9zZSBkZXZpY2VzIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgbUZsYXNobGlnaHQtPnByZXBhcmVEZXZpY2VPcGVuKGNhbWVyYUlkKTsKKworICAgICAgICAvLyBUT0RPOiBVcGRhdGUgZ2V0RGV2aWNlVmVyc2lvbiArIEhBTCBpbnRlcmZhY2UgdG8gdXNlIHN0cmluZ3MgZm9yIENhbWVyYSBJRHMKKyAgICAgICAgaW50IGlkID0gY2FtZXJhSWRUb0ludChjYW1lcmFJZCk7CisgICAgICAgIGlmIChpZCA9PSAtMSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBJRCAlcywgY2Fubm90IGdldCBkZXZpY2UgdmVyc2lvbiBmcm9tIEhBTC4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZmFjaW5nID0gLTE7CisgICAgICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihpZCwgLypvdXQqLyZmYWNpbmcpOworICAgICAgICBzcDxCYXNpY0NsaWVudD4gdG1wID0gbnVsbHB0cjsKKyAgICAgICAgaWYoKHJldCA9IG1ha2VDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLCBjYW1lcmFJZCwgZmFjaW5nLCBjbGllbnRQaWQsCisgICAgICAgICAgICAgICAgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSwgaGFsVmVyc2lvbiwgZGV2aWNlVmVyc2lvbiwgZWZmZWN0aXZlQXBpTGV2ZWwsCisgICAgICAgICAgICAgICAgLypvdXQqLyZ0bXApKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBzdGF0aWNfY2FzdDxDTElFTlQqPih0bXAuZ2V0KCkpOworCisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY2xpZW50LmdldCgpID09IG51bGxwdHIsICIlczogQ2FtZXJhU2VydmljZSBpbiBpbnZhbGlkIHN0YXRlIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICAgIGlmICgocmV0ID0gY2xpZW50LT5pbml0aWFsaXplKG1Nb2R1bGUpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgaW5pdGlhbGl6ZSBjbGllbnQgZnJvbSBIQUwgbW9kdWxlLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgc3A8SUJpbmRlcj4gcmVtb3RlQ2FsbGJhY2sgPSBjbGllbnQtPmdldFJlbW90ZSgpOworICAgICAgICBpZiAocmVtb3RlQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmVtb3RlQ2FsbGJhY2stPmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVXBkYXRlIHNoaW0gcGFyZW1ldGVycyBmb3IgbGVnYWN5IGNsaWVudHMKKyAgICAgICAgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IEFQSV8xKSB7CisgICAgICAgICAgICAvLyBBc3N1bWUgd2UgaGF2ZSBhbHdheXMgcmVjZWl2ZWQgYSBDbGllbnQgc3ViY2xhc3MgZm9yIEFQSTEKKyAgICAgICAgICAgIHNwPENsaWVudD4gc2hpbUNsaWVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2xpZW50Kj4oY2xpZW50LmdldCgpKTsKKyAgICAgICAgICAgIFN0cmluZzggcmF3UGFyYW1zID0gc2hpbUNsaWVudC0+Z2V0UGFyYW1ldGVycygpOworICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMocmF3UGFyYW1zKTsKKworICAgICAgICAgICAgYXV0byBjYW1lcmFTdGF0ZSA9IGdldENhbWVyYVN0YXRlKGNhbWVyYUlkKTsKKyAgICAgICAgICAgIGlmIChjYW1lcmFTdGF0ZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgY2FtZXJhU3RhdGUtPnNldFNoaW1QYXJhbXMocGFyYW1zKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgdXBkYXRlIHNoaW0gcGFyYW1ldGVycyBmb3IgY2FtZXJhICVzLCBubyBzdWNoIGRldmljZSBleGlzdHMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNoaW1VcGRhdGVPbmx5KSB7CisgICAgICAgICAgICAvLyBJZiBvbmx5IHVwZGF0aW5nIGxlZ2FjeSBzaGltIHBhcmFtZXRlcnMsIGltbWVkaWF0ZWx5IGRpc2Nvbm5lY3QgY2xpZW50CisgICAgICAgICAgICBtU2VydmljZUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBjbGllbnQtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlTG9jay5sb2NrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGFkZCBjbGllbnQgdG8gYWN0aXZlIGNsaWVudHMgbGlzdAorICAgICAgICAgICAgZmluaXNoQ29ubmVjdExvY2tlZChjbGllbnQsIHBhcnRpYWwpOworICAgICAgICB9CisgICAgfSAvLyBsb2NrIGlzIGRlc3Ryb3llZCwgYWxsb3cgZnVydGhlciBjb25uZWN0IGNhbGxzCisKKyAgICAvLyBJbXBvcnRhbnQ6IHJlbGVhc2UgdGhlIG11dGV4IGhlcmUgc28gdGhlIGNsaWVudCBjYW4gY2FsbCBiYWNrIGludG8gdGhlIHNlcnZpY2UgZnJvbSBpdHMKKyAgICAvLyBkZXN0cnVjdG9yIChjYW4gYmUgYXQgdGhlIGVuZCBvZiB0aGUgY2FsbCkKKyAgICBkZXZpY2UgPSBjbGllbnQ7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKaW5kZXggY2Q4MDhkYi4uMTY5NTMwOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgbUxlZ2FjeU1vZGUgPSBsZWdhY3lNb2RlOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyQ2xpZW50Ojppbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKQorc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6aW5pdGlhbGl6ZShDYW1lcmFNb2R1bGUgKm1vZHVsZSkKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogSW5pdGlhbGl6aW5nIGNsaWVudCBmb3IgY2FtZXJhICVkIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwpAQCAtMTIxLDcgKzEyMSw4IEBACiAgICAgICAgIH0KICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjogeworICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zOiB7CiAgICAgICAgICAgICBzcDxac2xQcm9jZXNzb3IzPiB6c2xQcm9jID0KICAgICAgICAgICAgICAgICAgICAgbmV3IFpzbFByb2Nlc3NvcjModGhpcywgbUNhcHR1cmVTZXF1ZW5jZXIpOwogICAgICAgICAgICAgbVpzbFByb2Nlc3NvciA9IHpzbFByb2M7CkBAIC0xNjcsMTEgKzE2OCw5IEBACiAKIHN0YXR1c190IENhbWVyYTJDbGllbnQ6OmR1bXBDbGllbnQoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CiAgICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2xpZW50MlslZF0gKCVwKSBDbGllbnQ6ICVzIFBJRDogJWQsIGR1bXA6XG4iLAotICAgICAgICAgICAgbUNhbWVyYUlkLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNsaWVudDJbJWRdICglcCkgUElEOiAlZCwgZHVtcDpcbiIsIG1DYW1lcmFJZCwKICAgICAgICAgICAgIChnZXRSZW1vdGVDYWxsYmFjaygpICE9IE5VTEwgPwogICAgICAgICAgICAgICAgICAgICAoSUludGVyZmFjZTo6YXNCaW5kZXIoZ2V0UmVtb3RlQ2FsbGJhY2soKSkuZ2V0KCkpIDogTlVMTCksCi0gICAgICAgICAgICBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCksCiAgICAgICAgICAgICBtQ2xpZW50UGlkKTsKICAgICByZXN1bHQuYXBwZW5kKCIgIFN0YXRlOiAiKTsKICNkZWZpbmUgQ0FTRV9BUFBFTkRfRU5VTSh4KSBjYXNlIHg6IHJlc3VsdC5hcHBlbmQoI3ggIlxuIik7IGJyZWFrOwpAQCAtNTM0LDcgKzUzMyw3IEBACiAgICAgaWYgKCAocmVzID0gY2hlY2tQaWQoX19GVU5DVElPTl9fKSApICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgc3A8SUJpbmRlcj4gYmluZGVyOwotICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdzsKKyAgICBzcDxTdXJmYWNlPiB3aW5kb3c7CiAgICAgaWYgKGJ1ZmZlclByb2R1Y2VyICE9IDApIHsKICAgICAgICAgYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpOwogICAgICAgICAvLyBVc2luZyBjb250cm9sbGVkQnlBcHAgZmxhZyB0byBlbnN1cmUgdGhhdCB0aGUgYnVmZmVyIHF1ZXVlIHJlbWFpbnMgaW4KQEAgLTU0Niw3ICs1NDUsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEyQ2xpZW50OjpzZXRQcmV2aWV3V2luZG93TChjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyLAotICAgICAgICBzcDxBTmF0aXZlV2luZG93PiB3aW5kb3cpIHsKKyAgICAgICAgc3A8U3VyZmFjZT4gd2luZG93KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKQEAgLTY3MSw3ICs2NzAsNyBAQAogICAgIHN0YXR1c190IHJlczsKICAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CiAKLSAgICBzcDxBTmF0aXZlV2luZG93PiB3aW5kb3c7CisgICAgc3A8U3VyZmFjZT4gd2luZG93OwogICAgIGlmIChjYWxsYmFja1Byb2R1Y2VyICE9IDApIHsKICAgICAgICAgd2luZG93ID0gbmV3IFN1cmZhY2UoY2FsbGJhY2tQcm9kdWNlcik7CiAgICAgfQpAQCAtNzY5LDE2ICs3NjgsMjIgQEAKICAgICAvLyBmaXJzdCBjYXB0dXJlIGxhdGVuY3kgb24gSEFMMyBkZXZpY2VzLCBhbmQgcG90ZW50aWFsbHkgb24gc29tZSBIQUwyCiAgICAgLy8gZGV2aWNlcy4gU28gY3JlYXRlIGl0IHVuY29uZGl0aW9uYWxseSBhdCBwcmV2aWV3IHN0YXJ0LiBBcyBhIGRyYXdiYWNrLAogICAgIC8vIHRoaXMgaW5jcmVhc2VzIGdyYWxsb2MgbWVtb3J5IGNvbnN1bXB0aW9uIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndAotICAgIC8vIGV2ZXIgdGFrZSBhIHBpY3R1cmUuCisgICAgLy8gZXZlciB0YWtlIGEgcGljdHVyZS4gRG8gbm90IGVudGVyIHRoaXMgbW9kZSB3aGVuIGpwZWcgc3RyZWFtIHdpbGwgc2xvdworICAgIC8vIGRvd24gcHJldmlldy4KICAgICAvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIGNvbXByb21pc2UsIHRob3VnaCB0aGlzIGxpa2VseSB3b3VsZCBpbnZvbHZlIEhBTAogICAgIC8vIGNoYW5nZXMuCiAgICAgaW50IGxhc3RKcGVnU3RyZWFtSWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKTsKLSAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obUpwZWdQcm9jZXNzb3IsIHBhcmFtcyk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgcHJlLWNvbmZpZ3VyZSBzdGlsbCBpbWFnZSAiCi0gICAgICAgICAgICAgICAgInN0cmVhbTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICByZXR1cm4gcmVzOworICAgIC8vIElmIGpwZWcgc3RyZWFtIHdpbGwgc2xvdyBkb3duIHByZXZpZXcsIG1ha2Ugc3VyZSB3ZSByZW1vdmUgaXQgYmVmb3JlIHN0YXJ0aW5nIHByZXZpZXcKKyAgICBpZiAocGFyYW1zLnNsb3dKcGVnTW9kZSkgeworICAgICAgICBtSnBlZ1Byb2Nlc3Nvci0+ZGVsZXRlU3RyZWFtKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gdXBkYXRlUHJvY2Vzc29yU3RyZWFtKG1KcGVnUHJvY2Vzc29yLCBwYXJhbXMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgcHJlLWNvbmZpZ3VyZSBzdGlsbCBpbWFnZSAiCisgICAgICAgICAgICAgICAgICAgICJzdHJlYW06ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CiAgICAgfQogICAgIGJvb2wganBlZ1N0cmVhbUNoYW5nZWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKSAhPSBsYXN0SnBlZ1N0cmVhbUlkOwogCkBAIC0xNDU4LDkgKzE0NjMsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdGFydGluZyBwaWN0dXJlIGNhcHR1cmUiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7Ci0KICAgICAgICAgaW50IGxhc3RKcGVnU3RyZWFtSWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKTsKLSAgICAgICAgcmVzID0gdXBkYXRlUHJvY2Vzc29yU3RyZWFtKG1KcGVnUHJvY2Vzc29yLCBsLm1QYXJhbWV0ZXJzKTsKKyAgICAgICAgLy8gc2xvd0pwZWdNb2RlIHdpbGwgY3JlYXRlIGpwZWcgc3RyZWFtIGluIENhcHR1cmVTZXF1ZW5jZXIgYmVmb3JlIGNhcHR1cmluZworICAgICAgICBpZiAoIWwubVBhcmFtZXRlcnMuc2xvd0pwZWdNb2RlKSB7CisgICAgICAgICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obUpwZWdQcm9jZXNzb3IsIGwubVBhcmFtZXRlcnMpOworICAgICAgICB9CisKICAgICAgICAgLy8gSWYgdmlkZW8gc25hcHNob3QgZmFpbCB0byBjb25maWd1cmVTdHJlYW0sIHRyeSBvdmVycmlkZSB2aWRlbyBzbmFwc2hvdCBzaXplIHRvCiAgICAgICAgIC8vIHZpZGVvIHNpemUKICAgICAgICAgaWYgKHJlcyA9PSBCQURfVkFMVUUgJiYgbC5tUGFyYW1ldGVycy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpWSURFT19TTkFQU0hPVCkgewpAQCAtMTU2NCw2ICsxNTcyLDkgQEAKICAgICAgICAgICAgIHJldHVybiBjb21tYW5kUGluZ0woKTsKICAgICAgICAgY2FzZSBDQU1FUkFfQ01EX1NFVF9WSURFT19CVUZGRVJfQ09VTlQ6CiAgICAgICAgICAgICByZXR1cm4gY29tbWFuZFNldFZpZGVvQnVmZmVyQ291bnRMKGFyZzEpOworICAgICAgICBjYXNlIENBTUVSQV9DTURfU0VUX1ZJREVPX0ZPUk1BVDoKKyAgICAgICAgICAgIHJldHVybiBjb21tYW5kU2V0VmlkZW9Gb3JtYXRMKGFyZzEsCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihhcmcyKSk7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gY29tbWFuZCAlZCAoYXJndW1lbnRzICVkLCAlZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNtZCwgYXJnMSwgYXJnMik7CkBAIC0xNzE1LDYgKzE3MjYsNTEgQEAKICAgICByZXR1cm4gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+c2V0UmVjb3JkaW5nQnVmZmVyQ291bnQoY291bnQpOwogfQogCitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50Ojpjb21tYW5kU2V0VmlkZW9Gb3JtYXRMKGludCBmb3JtYXQsCisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFzcGFjZSkgeworICAgIGlmIChyZWNvcmRpbmdFbmFibGVkTCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBzZXR0aW5nIHZpZGVvIGZvcm1hdCBhZnRlciAiCisgICAgICAgICAgICAgICAgInJlY29yZGluZyB3YXMgc3RhcnRlZCIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBtU3RyZWFtaW5nUHJvY2Vzc29yLT5zZXRSZWNvcmRpbmdGb3JtYXQoZm9ybWF0LCBkYXRhc3BhY2UpOworfQorCit2b2lkIENhbWVyYTJDbGllbnQ6Om5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIGludDMyX3QgZXJyID0gQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgc3dpdGNoKGVycm9yQ29kZSkgeworICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICBlcnIgPSBDQU1FUkFfRVJST1JfUkVMRUFTRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfREVWSUNFOgorICAgICAgICAgICAgZXJyID0gQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfU0VSVklDRToKKyAgICAgICAgICAgIGVyciA9IENBTUVSQV9FUlJPUl9TRVJWRVJfRElFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNUOgorICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQ6CisgICAgICAgIGNhc2UgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUjoKKyAgICAgICAgICAgIEFMT0dXKCIlczogUmVjZWl2ZWQgcmVjb3ZlcmFibGUgZXJyb3IgJWQgZnJvbSBIQUwgLSBpZ25vcmluZywgcmVxdWVzdElkICUiIFBSSWQzMiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlcnJvckNvZGUsIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyID0gQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBBTE9HRSgiJXM6IEVycm9yIGNvbmRpdGlvbiAlZCByZXBvcnRlZCBieSBIQUwsIHJlcXVlc3RJZCAlIiBQUklkMzIsIF9fRlVOQ1RJT05fXywgZXJyb3JDb2RlLAorICAgICAgICAgICAgICByZXN1bHRFeHRyYXMucmVxdWVzdElkKTsKKworICAgIFNoYXJlZENhbWVyYUNhbGxiYWNrczo6TG9jayBsKG1TaGFyZWRDYW1lcmFDYWxsYmFja3MpOworICAgIGlmIChsLm1SZW1vdGVDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIGwubVJlbW90ZUNhbGxiYWNrLT5ub3RpZnlDYWxsYmFjayhDQU1FUkFfTVNHX0VSUk9SLCBlcnIsIDApOworICAgIH0KK30KKworCiAvKiogRGV2aWNlLXJlbGF0ZWQgbWV0aG9kcyAqLwogdm9pZCBDYW1lcmEyQ2xpZW50Ojpub3RpZnlBdXRvRm9jdXModWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCkgewogICAgIEFMT0dWKCIlczogQXV0b2ZvY3VzIHN0YXRlIG5vdyAlZCwgbGFzdCB0cmlnZ2VyICVkIiwKQEAgLTE4NTIsNiArMTkwOCwxNiBAQAogICAgIG1DYXB0dXJlU2VxdWVuY2VyLT5ub3RpZnlBdXRvRXhwb3N1cmUobmV3U3RhdGUsIHRyaWdnZXJJZCk7CiB9CiAKK3ZvaWQgQ2FtZXJhMkNsaWVudDo6bm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICAodm9pZClyZXN1bHRFeHRyYXM7CisgICAgKHZvaWQpdGltZXN0YW1wOworCisgICAgQUxPR1YoIiVzOiBTaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3IgcmVxdWVzdCBpZCAlIiBQUklkMzIgIiBhdCB0aW1lICUiIFBSSWQ2NCwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgdGltZXN0YW1wKTsKKyAgICBtQ2FwdHVyZVNlcXVlbmNlci0+bm90aWZ5U2h1dHRlcihyZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7Cit9CisKIGNhbWVyYTI6OlNoYXJlZFBhcmFtZXRlcnMmIENhbWVyYTJDbGllbnQ6OmdldFBhcmFtZXRlcnMoKSB7CiAgICAgcmV0dXJuIG1QYXJhbWV0ZXJzOwogfQpAQCAtMTg5MCw2ICsxOTU2LDM5IEBACiAgICAgcmV0dXJuIG1TdHJlYW1pbmdQcm9jZXNzb3ItPnN0b3BTdHJlYW0oKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6Y3JlYXRlSnBlZ1N0cmVhbUwoUGFyYW1ldGVycyAmcGFyYW1zKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgaW50IGxhc3RKcGVnU3RyZWFtSWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKTsKKyAgICBpZiAobGFzdEpwZWdTdHJlYW1JZCAhPSBOT19TVFJFQU0pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJlcyA9IG1TdHJlYW1pbmdQcm9jZXNzb3ItPnRvZ2dsZVBhdXNlU3RyZWFtKC8qcGF1c2UqL3RydWUpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IHBhdXNlIHN0cmVhbWluZzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJlcyA9IG1EZXZpY2UtPmZsdXNoKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIGZsdXNoIGRldmljZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIElkZWFsbHkgd2UgZG9uJ3QgbmVlZCB0aGlzLCBidXQgY3VycmVudCBjYW1lcmEgZGV2aWNlCisgICAgLy8gc3RhdHVzIHRyYWNraW5nIG1lY2hhbmlzbSBkZW1hbmRzIGl0LgorICAgIHJlcyA9IG1EZXZpY2UtPndhaXRVbnRpbERyYWluZWQoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBXYWl0aW5nIGRldmljZSBkcmFpbiBmYWlsZWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisKKyAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obUpwZWdQcm9jZXNzb3IsIHBhcmFtcyk7CisgICAgcmV0dXJuIHJlczsKK30KKwogY29uc3QgaW50MzJfdCBDYW1lcmEyQ2xpZW50OjprUHJldmlld1JlcXVlc3RJZFN0YXJ0OwogY29uc3QgaW50MzJfdCBDYW1lcmEyQ2xpZW50OjprUHJldmlld1JlcXVlc3RJZEVuZDsKIGNvbnN0IGludDMyX3QgQ2FtZXJhMkNsaWVudDo6a1JlY29yZGluZ1JlcXVlc3RJZFN0YXJ0OwpAQCAtMTk2Myw3ICsyMDYyLDcgQEAKICAgICAgICAgICAgIHJldHVybiB3aWR0aCAqIGhlaWdodCAqIDI7CiAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6CiAgICAgICAgICAgICByZXR1cm4gd2lkdGggKiBoZWlnaHQgKiA0OwotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXX1NFTlNPUjoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JBVzE2OgogICAgICAgICAgICAgcmV0dXJuIHdpZHRoICogaGVpZ2h0ICogMjsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBwcmV2aWV3IGZvcm1hdDogJXgiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAppbmRleCBhYmVlNzk3Li43ZTdhMjg0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaApAQCAtNzcsNiArNzcsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKTsKICAgICB2aXJ0dWFsIFN0cmluZzggICAgICAgICBnZXRQYXJhbWV0ZXJzKCkgY29uc3Q7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2VuZENvbW1hbmQoaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CiAKICAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgdXNlZCBieSBDYW1lcmFTZXJ2aWNlCkBAIC05NCw3ICs5Niw3IEBACiAKICAgICB2aXJ0dWFsIH5DYW1lcmEyQ2xpZW50KCk7CiAKLSAgICBzdGF0dXNfdCBpbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKTsKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplKENhbWVyYU1vZHVsZSAqbW9kdWxlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCkBAIC0xMDYsNiArMTA4LDggQEAKIAogICAgIHZpcnR1YWwgdm9pZCBub3RpZnlBdXRvRm9jdXModWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCk7CiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUF1dG9FeHBvc3VyZSh1aW50OF90IG5ld1N0YXRlLCBpbnQgdHJpZ2dlcklkKTsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOwogCiAgICAgLyoqCiAgICAgICogSW50ZXJmYWNlIHVzZWQgYnkgaW5kZXBlbmRlbnQgY29tcG9uZW50cyBvZiBDYW1lcmEyQ2xpZW50LgpAQCAtMTI3LDYgKzEzMSw5IEBACiAKICAgICBzdGF0dXNfdCBzdG9wU3RyZWFtKCk7CiAKKyAgICAvLyBGb3IgdGhlIHNsb3dKcGVnTW9kZSB0byBjcmVhdGUganBlZyBzdHJlYW0gd2hlbiBwcmVjYXB0dXJlIHNlcXVlbmNlIGlzIGRvbmUKKyAgICBzdGF0dXNfdCBjcmVhdGVKcGVnU3RyZWFtTChjYW1lcmEyOjpQYXJhbWV0ZXJzICZwYXJhbXMpOworCiAgICAgc3RhdGljIHNpemVfdCBjYWxjdWxhdGVCdWZmZXJTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgIGludCBmb3JtYXQsIGludCBzdHJpZGUpOwogCkBAIC0xNDMsMTIgKzE1MCwxNSBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQXV0b2ZvY3VzTGFiZWw7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtUYWtlcGljdHVyZUxhYmVsOwogCisgICAgLy8gVXNlZCB3aXRoIHN0cmVhbSBJRHMKKyAgICBzdGF0aWMgY29uc3QgaW50IE5PX1NUUkVBTSA9IC0xOworCiBwcml2YXRlOgogICAgIC8qKiBJQ2FtZXJhIGludGVyZmFjZS1yZWxhdGVkIHByaXZhdGUgbWVtYmVycyAqLwogICAgIHR5cGVkZWYgY2FtZXJhMjo6UGFyYW1ldGVycyBQYXJhbWV0ZXJzOwogCiAgICAgc3RhdHVzX3Qgc2V0UHJldmlld1dpbmRvd0woY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlciwKLSAgICAgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdyk7CisgICAgICAgICAgICBzcDxTdXJmYWNlPiB3aW5kb3cpOwogICAgIHN0YXR1c190IHN0YXJ0UHJldmlld0woUGFyYW1ldGVycyAmcGFyYW1zLCBib29sIHJlc3RhcnQpOwogICAgIHZvaWQgICAgIHN0b3BQcmV2aWV3TCgpOwogICAgIHN0YXR1c190IHN0YXJ0UmVjb3JkaW5nTChQYXJhbWV0ZXJzICZwYXJhbXMsIGJvb2wgcmVzdGFydCk7CkBAIC0xNjUsNiArMTc1LDcgQEAKICAgICBzdGF0dXNfdCBjb21tYW5kRW5hYmxlRm9jdXNNb3ZlTXNnTChib29sIGVuYWJsZSk7CiAgICAgc3RhdHVzX3QgY29tbWFuZFBpbmdMKCk7CiAgICAgc3RhdHVzX3QgY29tbWFuZFNldFZpZGVvQnVmZmVyQ291bnRMKHNpemVfdCBjb3VudCk7CisgICAgc3RhdHVzX3QgY29tbWFuZFNldFZpZGVvRm9ybWF0TChpbnQgZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UpOwogCiAgICAgLy8gQ3VycmVudCBjYW1lcmEgZGV2aWNlIGNvbmZpZ3VyYXRpb24KICAgICBjYW1lcmEyOjpTaGFyZWRQYXJhbWV0ZXJzIG1QYXJhbWV0ZXJzOwpAQCAtMTc0LDkgKzE4NSw2IEBACiAgICAgdm9pZCAgICAgc2V0UHJldmlld0NhbGxiYWNrRmxhZ0woUGFyYW1ldGVycyAmcGFyYW1zLCBpbnQgZmxhZyk7CiAgICAgc3RhdHVzX3QgdXBkYXRlUmVxdWVzdHMoUGFyYW1ldGVycyAmcGFyYW1zKTsKIAotICAgIC8vIFVzZWQgd2l0aCBzdHJlYW0gSURzCi0gICAgc3RhdGljIGNvbnN0IGludCBOT19TVFJFQU0gPSAtMTsKLQogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9jZXNzb3JUPgogICAgIHN0YXR1c190IHVwZGF0ZVByb2Nlc3NvclN0cmVhbShzcDxQcm9jZXNzb3JUPiBwcm9jZXNzb3IsIFBhcmFtZXRlcnMgcGFyYW1zKTsKICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvY2Vzc29yVCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAppbmRleCBkMWI5MjllLi45ZTZlZDRlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCkBAIC01OSw3ICs1OSw3IEBACiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQgWCAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZCk7CiB9CiAKLXN0YXR1c190IENhbWVyYUNsaWVudDo6aW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkgeworc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojppbml0aWFsaXplKENhbWVyYU1vZHVsZSAqbW9kdWxlKSB7CiAgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogCkBAIC03NSw3ICs3NSw3IEBACiAgICAgc25wcmludGYoY2FtZXJhX2RldmljZV9uYW1lLCBzaXplb2YoY2FtZXJhX2RldmljZV9uYW1lKSwgIiVkIiwgbUNhbWVyYUlkKTsKIAogICAgIG1IYXJkd2FyZSA9IG5ldyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZShjYW1lcmFfZGV2aWNlX25hbWUpOwotICAgIHJlcyA9IG1IYXJkd2FyZS0+aW5pdGlhbGl6ZSgmbW9kdWxlLT5jb21tb24pOworICAgIHJlcyA9IG1IYXJkd2FyZS0+aW5pdGlhbGl6ZShtb2R1bGUpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IHVuYWJsZSB0byBpbml0aWFsaXplIGRldmljZTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtOTksMTIgKzk5LDcgQEAKIAogLy8gdGVhciBkb3duIHRoZSBjbGllbnQKIENhbWVyYUNsaWVudDo6fkNhbWVyYUNsaWVudCgpIHsKLSAgICAvLyB0aGlzIGxvY2sgc2hvdWxkIG5ldmVyIGJlIE5VTEwKLSAgICBNdXRleCogbG9jayA9IG1DYW1lcmFTZXJ2aWNlLT5nZXRDbGllbnRMb2NrQnlJZChtQ2FtZXJhSWQpOwotICAgIGxvY2stPmxvY2soKTsKICAgICBtRGVzdHJ1Y3Rpb25TdGFydGVkID0gdHJ1ZTsKLSAgICAvLyBjbGllbnQgd2lsbCBub3QgYmUgYWNjZXNzZWQgZnJvbSBjYWxsYmFjay4gc2hvdWxkIHVubG9jayB0byBwcmV2ZW50IGRlYWQtbG9jayBpbiBkaXNjb25uZWN0Ci0gICAgbG9jay0+dW5sb2NrKCk7CiAgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50Ojp+Q2FtZXJhQ2xpZW50IEUgKHBpZCAlZCwgdGhpcyAlcCkiLCBjYWxsaW5nUGlkLCB0aGlzKTsKIApAQCAtMTIwLDExICsxMTUsMTEgQEAKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKIAotICAgIHNpemVfdCBsZW4gPSBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDbGllbnRbJWRdICglcCkgUElEOiAlZFxuIiwKKyAgICBzaXplX3QgbGVuID0gc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ2xpZW50WyVkXSAoJXApIHdpdGggVUlEICVkXG4iLAogICAgICAgICAgICAgbUNhbWVyYUlkLAogICAgICAgICAgICAgKGdldFJlbW90ZUNhbGxiYWNrKCkgIT0gTlVMTCA/CiAgICAgICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGdldFJlbW90ZUNhbGxiYWNrKCkpLmdldCgpIDogTlVMTCksCi0gICAgICAgICAgICBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgIG1DbGllbnRVaWQpOwogICAgIGxlbiA9IChsZW4gPiBTSVpFIC0gMSkgPyBTSVpFIC0gMSA6IGxlbjsKICAgICB3cml0ZShmZCwgYnVmZmVyLCBsZW4pOwogCkBAIC02ODEsNiArNjc2LDEzIEBACiAgICAgICAgICAgICAgICAgTE9HMSgibG9ja0lmTWVzc2FnZVdhbnRlZCglZCk6IHdhaXRlZCBmb3IgJWQgbXMiLAogICAgICAgICAgICAgICAgICAgICBtc2dUeXBlLCBzbGVlcENvdW50ICogQ0hFQ0tfTUVTU0FHRV9JTlRFUlZBTCk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIG1lc3NhZ2VzIGFyZSBubyBsb25nZXIgZW5hYmxlZCBhZnRlciBhY3F1aXJpbmcgbG9jaywgcmVsZWFzZSBhbmQgZHJvcCBtZXNzYWdlCisgICAgICAgICAgICBpZiAoKG1Nc2dFbmFibGVkICYgbXNnVHlwZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoc2xlZXBDb3VudCsrID09IDApIHsKQEAgLTcwNiwyNiArNzA4LDEzIEBACiAvLyAgICAgIChvdGhlcnMpICAgICAgICAgICAgICAgICAgICAgICAgYy0+ZGF0YUNhbGxiYWNrCiAvLyBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAKIC8vICAgICAgKG90aGVycykgICAgICAgICAgICAgICAgICAgICAgICBjLT5kYXRhQ2FsbGJhY2tUaW1lc3RhbXAKLS8vCi0vLyBOT1RFOiB0aGUgKkNhbGxiYWNrIGZ1bmN0aW9ucyBncmFiIG1Mb2NrIG9mIHRoZSBjbGllbnQgYmVmb3JlIHBhc3NpbmcKLS8vIGNvbnRyb2wgdG8gaGFuZGxlKiBmdW5jdGlvbnMuIFNvIHRoZSBoYW5kbGUqIGZ1bmN0aW9ucyBtdXN0IHJlbGVhc2UgdGhlCi0vLyBsb2NrIGJlZm9yZSBjYWxsaW5nIHRoZSBJQ2FtZXJhQ2xpZW50J3MgY2FsbGJhY2tzLCBzbyB0aG9zZSBjYWxsYmFja3MgY2FuCi0vLyBpbnZva2UgbWV0aG9kcyBpbiB0aGUgQ2xpZW50IGNsYXNzIGFnYWluIChGb3IgZXhhbXBsZSwgdGhlIHByZXZpZXcgZnJhbWUKLS8vIGNhbGxiYWNrIG1heSB3YW50IHRvIHJlbGVhc2VSZWNvcmRpbmdGcmFtZSkuIFRoZSBoYW5kbGUqIGZ1bmN0aW9ucyBtdXN0Ci0vLyByZWxlYXNlIHRoZSBsb2NrIGFmdGVyIGFsbCBhY2Nlc3NlcyB0byBtZW1iZXIgdmFyaWFibGVzLCBzbyBpdCBtdXN0IGJlCi0vLyBoYW5kbGVkIHZlcnkgY2FyZWZ1bGx5LgogCiB2b2lkIENhbWVyYUNsaWVudDo6bm90aWZ5Q2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsCiAgICAgICAgIGludDMyX3QgZXh0Miwgdm9pZCogdXNlcikgewogICAgIExPRzIoIm5vdGlmeUNhbGxiYWNrKCVkKSIsIG1zZ1R5cGUpOwogCi0gICAgTXV0ZXgqIGxvY2sgPSBnZXRDbGllbnRMb2NrRnJvbUNvb2tpZSh1c2VyKTsKLSAgICBpZiAobG9jayA9PSBOVUxMKSByZXR1cm47Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGFsb2NrKCpsb2NrKTsKLQotICAgIENhbWVyYUNsaWVudCogY2xpZW50ID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUNsaWVudCo+KGdldENsaWVudEZyb21Db29raWUodXNlcikpOwotICAgIGlmIChjbGllbnQgPT0gTlVMTCkgcmV0dXJuOworICAgIHNwPENhbWVyYUNsaWVudD4gY2xpZW50ID0gc3RhdGljX2Nhc3Q8Q2FtZXJhQ2xpZW50Kj4oZ2V0Q2xpZW50RnJvbUNvb2tpZSh1c2VyKS5nZXQoKSk7CisgICAgaWYgKGNsaWVudC5nZXQoKSA9PSBudWxscHRyKSByZXR1cm47CiAKICAgICBpZiAoIWNsaWVudC0+bG9ja0lmTWVzc2FnZVdhbnRlZChtc2dUeXBlKSkgcmV0dXJuOwogCkBAIC03NDQsMTMgKzczMyw4IEBACiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLCBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEsIHZvaWQqIHVzZXIpIHsKICAgICBMT0cyKCJkYXRhQ2FsbGJhY2soJWQpIiwgbXNnVHlwZSk7CiAKLSAgICBNdXRleCogbG9jayA9IGdldENsaWVudExvY2tGcm9tQ29va2llKHVzZXIpOwotICAgIGlmIChsb2NrID09IE5VTEwpIHJldHVybjsKLSAgICBNdXRleDo6QXV0b2xvY2sgYWxvY2soKmxvY2spOwotCi0gICAgQ2FtZXJhQ2xpZW50KiBjbGllbnQgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhQ2xpZW50Kj4oZ2V0Q2xpZW50RnJvbUNvb2tpZSh1c2VyKSk7Ci0gICAgaWYgKGNsaWVudCA9PSBOVUxMKSByZXR1cm47CisgICAgc3A8Q2FtZXJhQ2xpZW50PiBjbGllbnQgPSBzdGF0aWNfY2FzdDxDYW1lcmFDbGllbnQqPihnZXRDbGllbnRGcm9tQ29va2llKHVzZXIpLmdldCgpKTsKKyAgICBpZiAoY2xpZW50LmdldCgpID09IG51bGxwdHIpIHJldHVybjsKIAogICAgIGlmICghY2xpZW50LT5sb2NrSWZNZXNzYWdlV2FudGVkKG1zZ1R5cGUpKSByZXR1cm47CiAgICAgaWYgKGRhdGFQdHIgPT0gMCAmJiBtZXRhZGF0YSA9PSBOVUxMKSB7CkBAIC03ODIsMTMgKzc2Niw4IEBACiAgICAgICAgIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsIHZvaWQqIHVzZXIpIHsKICAgICBMT0cyKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoJWQpIiwgbXNnVHlwZSk7CiAKLSAgICBNdXRleCogbG9jayA9IGdldENsaWVudExvY2tGcm9tQ29va2llKHVzZXIpOwotICAgIGlmIChsb2NrID09IE5VTEwpIHJldHVybjsKLSAgICBNdXRleDo6QXV0b2xvY2sgYWxvY2soKmxvY2spOwotCi0gICAgQ2FtZXJhQ2xpZW50KiBjbGllbnQgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhQ2xpZW50Kj4oZ2V0Q2xpZW50RnJvbUNvb2tpZSh1c2VyKSk7Ci0gICAgaWYgKGNsaWVudCA9PSBOVUxMKSByZXR1cm47CisgICAgc3A8Q2FtZXJhQ2xpZW50PiBjbGllbnQgPSBzdGF0aWNfY2FzdDxDYW1lcmFDbGllbnQqPihnZXRDbGllbnRGcm9tQ29va2llKHVzZXIpLmdldCgpKTsKKyAgICBpZiAoY2xpZW50LmdldCgpID09IG51bGxwdHIpIHJldHVybjsKIAogICAgIGlmICghY2xpZW50LT5sb2NrSWZNZXNzYWdlV2FudGVkKG1zZ1R5cGUpKSByZXR1cm47CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCmluZGV4IGVkYTFhOWYuLjE3OTk5YTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaApAQCAtNjgsNyArNjgsNyBAQAogICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlID0gZmFsc2UpOwogICAgIH5DYW1lcmFDbGllbnQoKTsKIAotICAgIHN0YXR1c190IGluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpOworICAgIHN0YXR1c190IGluaXRpYWxpemUoQ2FtZXJhTW9kdWxlICptb2R1bGUpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwCmluZGV4IGVhZGFhMDAuLjVmNGZiMjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcApAQCAtNTUsNyArNTUsNyBAQAogfQogCiBzdGF0dXNfdCBDYWxsYmFja1Byb2Nlc3Nvcjo6c2V0Q2FsbGJhY2tXaW5kb3coCi0gICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IGNhbGxiYWNrV2luZG93KSB7CisgICAgICAgIHNwPFN1cmZhY2U+IGNhbGxiYWNrV2luZG93KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOwogICAgICAgICBtQ2FsbGJhY2tDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwga0NhbGxiYWNrSGVhcENvdW50KTsKICAgICAgICAgbUNhbGxiYWNrQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIG1DYWxsYmFja0NvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTJDbGllbnQ6OkNhbGxiYWNrQ29uc3VtZXIiKSk7CisgICAgICAgIG1DYWxsYmFja0NvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTItQ2FsbGJhY2tDb25zdW1lciIpKTsKICAgICAgICAgbUNhbGxiYWNrV2luZG93ID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOwogICAgIH0KIApAQCAtMTIzLDcgKzEyMyw3IEBACiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCiAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCwgY3VycmVudEZvcm1hdDsKICAgICAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1DYWxsYmFja1N0cmVhbUlkLAotICAgICAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAmY3VycmVudEZvcm1hdCk7CisgICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsICZjdXJyZW50Rm9ybWF0LCAwKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIGNhbGxiYWNrIG91dHB1dCBzdHJlYW0gaW5mbzogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLApAQCAtMTU0LDggKzE1NCw4IEBACiAgICAgICAgICAgICAgICAgcGFyYW1zLnByZXZpZXdXaWR0aCwgcGFyYW1zLnByZXZpZXdIZWlnaHQsCiAgICAgICAgICAgICAgICAgY2FsbGJhY2tGb3JtYXQsIHBhcmFtcy5wcmV2aWV3Rm9ybWF0KTsKICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obUNhbGxiYWNrV2luZG93LAotICAgICAgICAgICAgICAgIHBhcmFtcy5wcmV2aWV3V2lkdGgsIHBhcmFtcy5wcmV2aWV3SGVpZ2h0LAotICAgICAgICAgICAgICAgIGNhbGxiYWNrRm9ybWF0LCAmbUNhbGxiYWNrU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIHBhcmFtcy5wcmV2aWV3V2lkdGgsIHBhcmFtcy5wcmV2aWV3SGVpZ2h0LCBjYWxsYmFja0Zvcm1hdCwKKyAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX0pGSUYsIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsICZtQ2FsbGJhY2tTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSBmb3IgY2FsbGJhY2tzOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCkBAIC0zOTUsNyArMzk1LDcgQEAKIAogICAgICAgICBoZWFwSWR4ID0gbUNhbGxiYWNrSGVhcEhlYWQ7CiAKLSAgICAgICAgbUNhbGxiYWNrSGVhcEhlYWQgPSAobUNhbGxiYWNrSGVhcEhlYWQgKyAxKSAmIGtDYWxsYmFja0hlYXBDb3VudDsKKyAgICAgICAgbUNhbGxiYWNrSGVhcEhlYWQgPSAobUNhbGxiYWNrSGVhcEhlYWQgKyAxKSAlIGtDYWxsYmFja0hlYXBDb3VudDsKICAgICAgICAgbUNhbGxiYWNrSGVhcEZyZWUtLTsKIAogICAgICAgICAvLyBUT0RPOiBHZXQgcmlkIG9mIHRoaXMgY29weSBieSBwYXNzaW5nIHRoZSBncmFsbG9jIHF1ZXVlIGFsbCB0aGUgd2F5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5oCmluZGV4IDdmZGMzMjkuLmEyOTA1MzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5oCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pOwogCiAgICAgLy8gU2V0IHRvIE5VTEwgdG8gZGlzYWJsZSB0aGUgZGlyZWN0LXRvLWFwcCBjYWxsYmFjayB3aW5kb3cKLSAgICBzdGF0dXNfdCBzZXRDYWxsYmFja1dpbmRvdyhzcDxBTmF0aXZlV2luZG93PiBjYWxsYmFja1dpbmRvdyk7CisgICAgc3RhdHVzX3Qgc2V0Q2FsbGJhY2tXaW5kb3coc3A8U3VyZmFjZT4gY2FsbGJhY2tXaW5kb3cpOwogICAgIHN0YXR1c190IHVwZGF0ZVN0cmVhbShjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpOwogICAgIHN0YXR1c190IGRlbGV0ZVN0cmVhbSgpOwogICAgIGludCBnZXRTdHJlYW1JZCgpIGNvbnN0OwpAQCAtNzMsNyArNzMsNyBAQAogICAgIGludCBtQ2FsbGJhY2tTdHJlYW1JZDsKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtDYWxsYmFja0hlYXBDb3VudCA9IDY7CiAgICAgc3A8Q3B1Q29uc3VtZXI+ICAgIG1DYWxsYmFja0NvbnN1bWVyOwotICAgIHNwPEFOYXRpdmVXaW5kb3c+ICBtQ2FsbGJhY2tXaW5kb3c7CisgICAgc3A8U3VyZmFjZT4gICAgICAgIG1DYWxsYmFja1dpbmRvdzsKICAgICBzcDxDYW1lcmEySGVhcD4gICAgbUNhbGxiYWNrSGVhcDsKICAgICBpbnQgbUNhbGxiYWNrSGVhcElkOwogICAgIHNpemVfdCBtQ2FsbGJhY2tIZWFwSGVhZCwgbUNhbGxiYWNrSGVhcEZyZWU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKaW5kZXggOTg0OWY0ZC4uNWY3ZmQ3NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcApAQCAtNDMsNiArNDMsOCBAQAogICAgICAgICBtTmV3RnJhbWVSZWNlaXZlZChmYWxzZSksCiAgICAgICAgIG1OZXdDYXB0dXJlUmVjZWl2ZWQoZmFsc2UpLAogICAgICAgICBtU2h1dHRlck5vdGlmaWVkKGZhbHNlKSwKKyAgICAgICAgbUhhbE5vdGlmaWVkU2h1dHRlcihmYWxzZSksCisgICAgICAgIG1TaHV0dGVyQ2FwdHVyZUlkKC0xKSwKICAgICAgICAgbUNsaWVudChjbGllbnQpLAogICAgICAgICBtQ2FwdHVyZVN0YXRlKElETEUpLAogICAgICAgICBtU3RhdGVUcmFuc2l0aW9uQ291bnQoMCksCkBAIC0xMDYsNiArMTA4LDE2IEBACiAgICAgfQogfQogCit2b2lkIENhcHR1cmVTZXF1ZW5jZXI6Om5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CisgICAgaWYgKCFtSGFsTm90aWZpZWRTaHV0dGVyICYmIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQgPT0gbVNodXR0ZXJDYXB0dXJlSWQpIHsKKyAgICAgICAgbUhhbE5vdGlmaWVkU2h1dHRlciA9IHRydWU7CisgICAgICAgIG1TaHV0dGVyTm90aWZ5U2lnbmFsLnNpZ25hbCgpOworICAgIH0KK30KKwogdm9pZCBDYXB0dXJlU2VxdWVuY2VyOjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogTmV3IHJlc3VsdCBhdmFpbGFibGUuIiwgX19GVU5DVElPTl9fKTsKQEAgLTMzNSw2ICszNDcsMTEgQEAKICAgICB9IGVsc2UgewogICAgICAgICBuZXh0U3RhdGUgPSBTVEFOREFSRF9TVEFSVDsKICAgICB9CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CisgICAgICAgIG1TaHV0dGVyQ2FwdHVyZUlkID0gbUNhcHR1cmVJZDsKKyAgICAgICAgbUhhbE5vdGlmaWVkU2h1dHRlciA9IGZhbHNlOworICAgIH0KICAgICBtU2h1dHRlck5vdGlmaWVkID0gZmFsc2U7CiAKICAgICByZXR1cm4gbmV4dFN0YXRlOwpAQCAtNDg3LDYgKzUwNCwxNyBAQAogICAgICAqICAtIHJlY29yZGluZyAoaWYgcmVjb3JkaW5nIGVuYWJsZWQpCiAgICAgICovCiAgICAgb3V0cHV0U3RyZWFtcy5wdXNoKGNsaWVudC0+Z2V0UHJldmlld1N0cmVhbUlkKCkpOworCisgICAgaW50IGNhcHR1cmVTdHJlYW1JZCA9IGNsaWVudC0+Z2V0Q2FwdHVyZVN0cmVhbUlkKCk7CisgICAgaWYgKGNhcHR1cmVTdHJlYW1JZCA9PSBDYW1lcmEyQ2xpZW50OjpOT19TVFJFQU0pIHsKKyAgICAgICAgcmVzID0gY2xpZW50LT5jcmVhdGVKcGVnU3RyZWFtTChsLm1QYXJhbWV0ZXJzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSyB8fCBjbGllbnQtPmdldENhcHR1cmVTdHJlYW1JZCgpID09IENhbWVyYTJDbGllbnQ6Ok5PX1NUUkVBTSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IGNhbm5vdCBjcmVhdGUganBlZyBzdHJlYW0gZm9yIHNsb3dKcGVnIG1vZGU6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjbGllbnQtPmdldENhbWVyYUlkKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIERPTkU7CisgICAgICAgIH0KKyAgICB9CisKICAgICBvdXRwdXRTdHJlYW1zLnB1c2goY2xpZW50LT5nZXRDYXB0dXJlU3RyZWFtSWQoKSk7CiAKICAgICBpZiAobC5tUGFyYW1ldGVycy5wcmV2aWV3Q2FsbGJhY2tGbGFncyAmCkBAIC01NDEsNiArNTY5LDcgQEAKICAgICAgICAgICAgIHJldHVybiBET05FOwogICAgICAgICB9CiAgICAgfQorCiAgICAgLy8gVE9ETzogQ2FwdHVyZSBzaG91bGQgYmUgYXRvbWljIHdpdGggc2V0U3RyZWFtaW5nUmVxdWVzdCBoZXJlCiAgICAgcmVzID0gY2xpZW50LT5nZXRDYW1lcmFEZXZpY2UoKS0+Y2FwdHVyZShjYXB0dXJlQ29weSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtNTYwLDYgKzU4OSwzMSBAQAogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwogCisKKyAgICAvLyBXYWl0IGZvciBzaHV0dGVyIGNhbGxiYWNrCisgICAgd2hpbGUgKCFtSGFsTm90aWZpZWRTaHV0dGVyKSB7CisgICAgICAgIGlmIChtVGltZW91dENvdW50IDw9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJlcyA9IG1TaHV0dGVyTm90aWZ5U2lnbmFsLndhaXRSZWxhdGl2ZShtSW5wdXRNdXRleCwga1dhaXREdXJhdGlvbik7CisgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICBtVGltZW91dENvdW50LS07CisgICAgICAgICAgICByZXR1cm4gU1RBTkRBUkRfQ0FQVFVSRV9XQUlUOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1IYWxOb3RpZmllZFNodXR0ZXIpIHsKKyAgICAgICAgaWYgKCFtU2h1dHRlck5vdGlmaWVkKSB7CisgICAgICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwoY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCkpOworICAgICAgICAgICAgLyogd2FybmluZzogdGhpcyBhbHNvIGxvY2tzIGEgU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzICovCisgICAgICAgICAgICBzaHV0dGVyTm90aWZ5TG9ja2VkKGwubVBhcmFtZXRlcnMsIGNsaWVudCwgbU1zZ1R5cGUpOworICAgICAgICAgICAgbVNodXR0ZXJOb3RpZmllZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1UaW1lb3V0Q291bnQgPD0gMCkgeworICAgICAgICBBTE9HVygiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHNodXR0ZXIgbm90aWZpY2F0aW9uIik7CisgICAgICAgIHJldHVybiBET05FOworICAgIH0KKwogICAgIC8vIFdhaXQgZm9yIG5ldyBtZXRhZGF0YSByZXN1bHQgKG1OZXdGcmFtZSkKICAgICB3aGlsZSAoIW1OZXdGcmFtZVJlY2VpdmVkKSB7CiAgICAgICAgIHJlcyA9IG1OZXdGcmFtZVNpZ25hbC53YWl0UmVsYXRpdmUobUlucHV0TXV0ZXgsIGtXYWl0RHVyYXRpb24pOwpAQCAtNTY5LDE1ICs2MjMsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gQXBwcm94aW1hdGlvbiBvZiB0aGUgc2h1dHRlciBiZWluZyBjbG9zZWQKLSAgICAvLyAtIFRPRE86IHVzZSB0aGUgaGFsMyBleHBvc3VyZSBjYWxsYmFjayBpbiBDYW1lcmEzRGV2aWNlIGluc3RlYWQKLSAgICBpZiAobU5ld0ZyYW1lUmVjZWl2ZWQgJiYgIW1TaHV0dGVyTm90aWZpZWQpIHsKLSAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKGNsaWVudC0+Z2V0UGFyYW1ldGVycygpKTsKLSAgICAgICAgLyogd2FybmluZzogdGhpcyBhbHNvIGxvY2tzIGEgU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzICovCi0gICAgICAgIHNodXR0ZXJOb3RpZnlMb2NrZWQobC5tUGFyYW1ldGVycywgY2xpZW50LCBtTXNnVHlwZSk7Ci0gICAgICAgIG1TaHV0dGVyTm90aWZpZWQgPSB0cnVlOwotICAgIH0KLQogICAgIC8vIFdhaXQgdW50aWwganBlZyB3YXMgY2FwdHVyZWQgYnkgSnBlZ1Byb2Nlc3NvcgogICAgIHdoaWxlIChtTmV3RnJhbWVSZWNlaXZlZCAmJiAhbU5ld0NhcHR1cmVSZWNlaXZlZCkgewogICAgICAgICByZXMgPSBtTmV3Q2FwdHVyZVNpZ25hbC53YWl0UmVsYXRpdmUobUlucHV0TXV0ZXgsIGtXYWl0RHVyYXRpb24pOwpAQCAtNTkxLDYgKzYzNiw3IEBACiAgICAgICAgIHJldHVybiBET05FOwogICAgIH0KICAgICBpZiAobU5ld0ZyYW1lUmVjZWl2ZWQgJiYgbU5ld0NhcHR1cmVSZWNlaXZlZCkgeworCiAgICAgICAgIGlmIChtTmV3RnJhbWVJZCAhPSBtQ2FwdHVyZUlkKSB7CiAgICAgICAgICAgICBBTE9HVygiTWlzbWF0Y2hlZCBjYXB0dXJlIGZyYW1lIElEczogRXhwZWN0ZWQgJWQsIGdvdCAlZCIsCiAgICAgICAgICAgICAgICAgICAgIG1DYXB0dXJlSWQsIG1OZXdGcmFtZUlkKTsKQEAgLTY2Nyw3ICs3MTMsNiBAQAogICAgICAgICBzcDxDYW1lcmEyQ2xpZW50PiAmLypjbGllbnQqLykgewogICAgIHN0YXR1c190IHJlczsKICAgICBBVFJBQ0VfQ0FMTCgpOwotCiAgICAgd2hpbGUgKCFtTmV3Q2FwdHVyZVJlY2VpdmVkKSB7CiAgICAgICAgIHJlcyA9IG1OZXdDYXB0dXJlU2lnbmFsLndhaXRSZWxhdGl2ZShtSW5wdXRNdXRleCwga1dhaXREdXJhdGlvbik7CiAgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaAppbmRleCBkNDJhYjEzLi4xMDI1MmZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKQEAgLTYyLDYgKzYyLDEwIEBACiAgICAgLy8gTm90aWZpY2F0aW9ucyBhYm91dCBBRSBzdGF0ZSBjaGFuZ2VzCiAgICAgdm9pZCBub3RpZnlBdXRvRXhwb3N1cmUodWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCk7CiAKKyAgICAvLyBOb3RpZmljYXRpb25zIGFib3V0IHNodXR0ZXIgKGNhcHR1cmUgc3RhcnQpCisgICAgdm9pZCBub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworCiAgICAgLy8gTm90aWZpY2F0aW9uIGZyb20gdGhlIGZyYW1lIHByb2Nlc3NvcgogICAgIHZpcnR1YWwgdm9pZCBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpOwogCkBAIC05NSw3ICs5OSwxMCBAQAogICAgIHNwPE1lbW9yeUJhc2U+IG1DYXB0dXJlQnVmZmVyOwogICAgIENvbmRpdGlvbiBtTmV3Q2FwdHVyZVNpZ25hbDsKIAotICAgIGJvb2wgbVNodXR0ZXJOb3RpZmllZDsKKyAgICBib29sIG1TaHV0dGVyTm90aWZpZWQ7IC8vIEhhcyBDYXB0dXJlU2VxdWVuY2VyIHNlbnQgc2h1dHRlciB0byBDbGllbnQKKyAgICBib29sIG1IYWxOb3RpZmllZFNodXR0ZXI7IC8vIEhhcyBIQUwgc2VudCBzaHV0dGVyIHRvIENhcHR1cmVTZXF1ZW5jZXIKKyAgICBpbnQzMl90IG1TaHV0dGVyQ2FwdHVyZUlkOyAvLyBUaGUgY2FwdHVyZUlkIHdoaWNoIGlzIHdhaXRpbmcgZm9yIHNodXR0ZXIgbm90aWZpY2F0aW9uCisgICAgQ29uZGl0aW9uIG1TaHV0dGVyTm90aWZ5U2lnbmFsOwogCiAgICAgLyoqCiAgICAgICogSW50ZXJuYWwgdG8gQ2FwdHVyZVNlcXVlbmNlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCmluZGV4IDI3NzIyNjcuLmJkOTc4NmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKICAgICAgICAgbUNhcHR1cmVDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwgMSk7CiAgICAgICAgIG1DYXB0dXJlQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIG1DYXB0dXJlQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMkNsaWVudDo6Q2FwdHVyZUNvbnN1bWVyIikpOworICAgICAgICBtQ2FwdHVyZUNvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTItSnBlZ0NvbnN1bWVyIikpOwogICAgICAgICBtQ2FwdHVyZVdpbmRvdyA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKICAgICB9CiAKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgICAgICAvLyBDaGVjayBpZiBzdHJlYW0gcGFyYW1ldGVycyBoYXZlIHRvIGNoYW5nZQogICAgICAgICB1aW50MzJfdCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQ7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtQ2FwdHVyZVN0cmVhbUlkLAotICAgICAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAwKTsKKyAgICAgICAgICAgICAgICAmY3VycmVudFdpZHRoLCAmY3VycmVudEhlaWdodCwgMCwgMCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBxdWVyeWluZyBjYXB0dXJlIG91dHB1dCBzdHJlYW0gaW5mbzogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKQEAgLTE0NSw3ICsxNDUsOCBAQAogICAgICAgICAvLyBDcmVhdGUgc3RyZWFtIGZvciBIQUwgcHJvZHVjdGlvbgogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtQ2FwdHVyZVdpbmRvdywKICAgICAgICAgICAgICAgICBwYXJhbXMucGljdHVyZVdpZHRoLCBwYXJhbXMucGljdHVyZUhlaWdodCwKLSAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0JMT0IsICZtQ2FwdHVyZVN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0JMT0IsIEhBTF9EQVRBU1BBQ0VfSkZJRiwKKyAgICAgICAgICAgICAgICBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCAmbUNhcHR1cmVTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSBmb3IgY2FwdHVyZTogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmgKaW5kZXggMjA0MGIzMC4uZmJkYWUxMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5oCkBAIC03MCw4ICs3MCw4IEBACiAKICAgICBpbnQgbUNhcHR1cmVTdHJlYW1JZDsKICAgICBzcDxDcHVDb25zdW1lcj4gICAgbUNhcHR1cmVDb25zdW1lcjsKLSAgICBzcDxBTmF0aXZlV2luZG93PiAgbUNhcHR1cmVXaW5kb3c7Ci0gICAgc3A8TWVtb3J5SGVhcEJhc2U+ICAgIG1DYXB0dXJlSGVhcDsKKyAgICBzcDxTdXJmYWNlPiAgICAgICAgbUNhcHR1cmVXaW5kb3c7CisgICAgc3A8TWVtb3J5SGVhcEJhc2U+IG1DYXB0dXJlSGVhcDsKIAogICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAppbmRleCA0ZjRjZmIwLi40NDJlYjc1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCkBAIC02NSwxNSArNjUsMjkgQEAKICAgICBjb25zdCBTaXplIE1BWF9QUkVWSUVXX1NJWkUgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKICAgICAvLyBUcmVhdCB0aGUgSC4yNjQgbWF4IHNpemUgYXMgdGhlIG1heCBzdXBwb3J0ZWQgdmlkZW8gc2l6ZS4KICAgICBNZWRpYVByb2ZpbGVzICp2aWRlb0VuY29kZXJQcm9maWxlcyA9IE1lZGlhUHJvZmlsZXM6OmdldEluc3RhbmNlKCk7Ci0gICAgaW50MzJfdCBtYXhWaWRlb1dpZHRoID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmMudmlkLndpZHRoLm1heCIsIFZJREVPX0VOQ09ERVJfSDI2NCk7Ci0gICAgaW50MzJfdCBtYXhWaWRlb0hlaWdodCA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jLnZpZC5oZWlnaHQubWF4IiwgVklERU9fRU5DT0RFUl9IMjY0KTsKLSAgICBjb25zdCBTaXplIE1BWF9WSURFT19TSVpFID0ge21heFZpZGVvV2lkdGgsIG1heFZpZGVvSGVpZ2h0fTsKKyAgICBWZWN0b3I8dmlkZW9fZW5jb2Rlcj4gZW5jb2RlcnMgPSB2aWRlb0VuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVycygpOworICAgIGludDMyX3QgbWF4VmlkZW9XaWR0aCA9IDA7CisgICAgaW50MzJfdCBtYXhWaWRlb0hlaWdodCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbmNvZGVycy5zaXplKCk7IGkrKykgeworICAgICAgICBpbnQgd2lkdGggPSB2aWRlb0VuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgImVuYy52aWQud2lkdGgubWF4IiwgZW5jb2RlcnNbaV0pOworICAgICAgICBpbnQgaGVpZ2h0ID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICJlbmMudmlkLmhlaWdodC5tYXgiLCBlbmNvZGVyc1tpXSk7CisgICAgICAgIC8vIFRyZWF0IHdpZHRoL2hlaWdodCBzZXBhcmF0ZWx5IGhlcmUgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGRpZmZlcmVudAorICAgICAgICAvLyBwcm9maWxlIG1pZ2h0IHJlcG9ydCBtYXggc2l6ZSBvZiBkaWZmZXJlbnQgYXNwZWN0IHJhdGlvCisgICAgICAgIGlmICh3aWR0aCA+IG1heFZpZGVvV2lkdGgpIHsKKyAgICAgICAgICAgIG1heFZpZGVvV2lkdGggPSB3aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGVpZ2h0ID4gbWF4VmlkZW9IZWlnaHQpIHsKKyAgICAgICAgICAgIG1heFZpZGVvSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICB9CisgICAgfQorICAgIC8vIFRoaXMgaXMganVzdCBhbiB1cHBlciBib3VuZCBhbmQgbWF5IG5vdCBiZSBhbiBhY3R1YWxseSB2YWxpZCB2aWRlbyBzaXplCisgICAgY29uc3QgU2l6ZSBWSURFT19TSVpFX1VQUEVSX0JPVU5EID0ge21heFZpZGVvV2lkdGgsIG1heFZpZGVvSGVpZ2h0fTsKIAogICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoTUFYX1BSRVZJRVdfU0laRSwgJmF2YWlsYWJsZVByZXZpZXdTaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKLSAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKE1BWF9WSURFT19TSVpFLCAmYXZhaWxhYmxlVmlkZW9TaXplcyk7CisgICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhWSURFT19TSVpFX1VQUEVSX0JPVU5ELCAmYXZhaWxhYmxlVmlkZW9TaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAogICAgIC8vIFNlbGVjdCBpbml0aWFsIHByZXZpZXcgYW5kIHZpZGVvIHNpemUgdGhhdCdzIHVuZGVyIHRoZSBpbml0aWFsIGJvdW5kIGFuZApAQCAtMTgyLDkgKzE5Niw5IEBACiAgICAgICAgICAgICAgICAgc3VwcG9ydGVkUHJldmlld0Zvcm1hdHMgKz0KICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMFNQOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLy8gTm90IGFkdmVydGl6aW5nIEpQRUcsIFJBV19TRU5TT1IsIGV0YywgZm9yIHByZXZpZXcgZm9ybWF0cworICAgICAgICAgICAgLy8gTm90IGFkdmVydGl6aW5nIEpQRUcsIFJBVzE2LCBldGMsIGZvciBwcmV2aWV3IGZvcm1hdHMKICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOgotICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JBV19TRU5TT1I6CisgICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXMTY6CiAgICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkxPQjoKICAgICAgICAgICAgICAgICBhZGRDb21tYSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtODc1LDE1ICs4ODksMzAgQEAKICAgICBwcmV2aWV3Q2FsbGJhY2tPbmVTaG90ID0gZmFsc2U7CiAgICAgcHJldmlld0NhbGxiYWNrU3VyZmFjZSA9IGZhbHNlOwogCisgICAgU2l6ZSBtYXhKcGVnU2l6ZSA9IGdldE1heFNpemUoZ2V0QXZhaWxhYmxlSnBlZ1NpemVzKCkpOworICAgIGludDY0X3QgbWluRnJhbWVEdXJhdGlvbk5zID0gZ2V0SnBlZ1N0cmVhbU1pbkZyYW1lRHVyYXRpb25OcyhtYXhKcGVnU2l6ZSk7CisKKyAgICBzbG93SnBlZ01vZGUgPSBmYWxzZTsKKyAgICBpZiAobWluRnJhbWVEdXJhdGlvbk5zID4ga1Nsb3dKcGVnTW9kZVRocmVzaG9sZCkgeworICAgICAgICBzbG93SnBlZ01vZGUgPSB0cnVlOworICAgICAgICAvLyBTbG93IGpwZWcgZGV2aWNlcyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIHNuYXBzaG90IHdpdGhvdXQKKyAgICAgICAgLy8gc2xvd2luZyBkb3duIHByZXZpZXcuCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgdmlkZW8gc2l6ZSB2aWRlbyBzbmFwc2hvdCBvbmx5PworICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9WSURFT19TTkFQU0hPVF9TVVBQT1JURUQsCisgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpGQUxTRSk7CisgICAgfQorCiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIHByb3BlcnR5X2dldCgiY2FtZXJhLmRpc2FibGVfenNsX21vZGUiLCB2YWx1ZSwgIjAiKTsKLSAgICBpZiAoIXN0cmNtcCh2YWx1ZSwiMSIpKSB7CisgICAgaWYgKCFzdHJjbXAodmFsdWUsIjEiKSB8fCBzbG93SnBlZ01vZGUpIHsKICAgICAgICAgQUxPR0koIkNhbWVyYSAlZDogRGlzYWJsaW5nIFpTTCBtb2RlIiwgY2FtZXJhSWQpOwogICAgICAgICB6c2xNb2RlID0gZmFsc2U7CiAgICAgfSBlbHNlIHsKICAgICAgICAgenNsTW9kZSA9IHRydWU7CiAgICAgfQogCisgICAgQUxPR0koIiVzOiB6c2xNb2RlOiAlZCBzbG93SnBlZ01vZGUgJWQiLCBfX0ZVTkNUSU9OX18sIHpzbE1vZGUsIHNsb3dKcGVnTW9kZSk7CisKICAgICBsaWdodEZ4ID0gTElHSFRGWF9OT05FOwogCiAgICAgc3RhdGUgPSBTVE9QUEVEOwpAQCAtMjA4NiwxMiArMjExNSw3IEBACiAKICAgICBkZWxldGVbXSByZXFNZXRlcmluZ0FyZWFzOwogCi0gICAgLyogZG9uJ3QgaW5jbHVkZSBqcGVnIHRodW1ibmFpbCBzaXplIC0gaXQncyB2YWxpZCBmb3IKLSAgICAgICBpdCB0byBiZSBzZXQgdG8gKDAsMCksIG1lYW5pbmcgJ25vIHRodW1ibmFpbCcgKi8KLSAgICBDcm9wUmVnaW9uIGNyb3AgPSBjYWxjdWxhdGVDcm9wUmVnaW9uKCAoQ3JvcFJlZ2lvbjo6T3V0cHV0cykoCi0gICAgICAgICAgICBDcm9wUmVnaW9uOjpPVVRQVVRfUFJFVklFVyAgICAgfAotICAgICAgICAgICAgQ3JvcFJlZ2lvbjo6T1VUUFVUX1ZJREVPICAgICAgIHwKLSAgICAgICAgICAgIENyb3BSZWdpb246Ok9VVFBVVF9QSUNUVVJFICAgICkpOworICAgIENyb3BSZWdpb24gY3JvcCA9IGNhbGN1bGF0ZUNyb3BSZWdpb24oLypwcmV2aWV3T25seSovIGZhbHNlKTsKICAgICBpbnQzMl90IHJlcUNyb3BSZWdpb25bNF0gPSB7CiAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGNyb3AubGVmdCksCiAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGNyb3AudG9wKSwKQEAgLTIyNTMsNyArMjI3Nyw3IEBACiAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6ICAgLy8gUkdCQTg4ODgKICAgICAgICAgICAgIGZtdCA9IENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9SR0JBODg4ODsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXX1NFTlNPUjoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JBVzE2OgogICAgICAgICAgICAgQUxPR1coIlJhdyBzZW5zb3IgcHJldmlldyBmb3JtYXQgcmVxdWVzdGVkLiIpOwogICAgICAgICAgICAgZm10ID0gQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX0JBWUVSX1JHR0I7CiAgICAgICAgICAgICBicmVhazsKQEAgLTI1ODksNyArMjYxMyw3IEBACiAgICAgQUxPR19BU1NFUlQoeCA+PSAwLCAiQ3JvcC1yZWxhdGl2ZSBYIGNvb3JkaW5hdGUgPSAnJWQnIGlzIG91dCBvZiBib3VuZHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIihsb3dlciA9IDApIiwgeCk7CiAKLSAgICBDcm9wUmVnaW9uIHByZXZpZXdDcm9wID0gY2FsY3VsYXRlQ3JvcFJlZ2lvbihDcm9wUmVnaW9uOjpPVVRQVVRfUFJFVklFVyk7CisgICAgQ3JvcFJlZ2lvbiBwcmV2aWV3Q3JvcCA9IGNhbGN1bGF0ZUNyb3BSZWdpb24oLypwcmV2aWV3T25seSovIHRydWUpOwogICAgIEFMT0dfQVNTRVJUKHggPCBwcmV2aWV3Q3JvcC53aWR0aCwgIkNyb3AtcmVsYXRpdmUgWCBjb29yZGluYXRlID0gJyVkJyAiCiAgICAgICAgICAgICAgICAgICAgICJpcyBvdXQgb2YgYm91bmRzICh1cHBlciA9ICVmKSIsIHgsIHByZXZpZXdDcm9wLndpZHRoKTsKIApAQCAtMjYwNSw3ICsyNjI5LDcgQEAKICAgICBBTE9HX0FTU0VSVCh5ID49IDAsICJDcm9wLXJlbGF0aXZlIFkgY29vcmRpbmF0ZSA9ICclZCcgaXMgb3V0IG9mIGJvdW5kcyAiCiAgICAgICAgICIobG93ZXIgPSAwKSIsIHkpOwogCi0gICAgQ3JvcFJlZ2lvbiBwcmV2aWV3Q3JvcCA9IGNhbGN1bGF0ZUNyb3BSZWdpb24oQ3JvcFJlZ2lvbjo6T1VUUFVUX1BSRVZJRVcpOworICAgIENyb3BSZWdpb24gcHJldmlld0Nyb3AgPSBjYWxjdWxhdGVDcm9wUmVnaW9uKC8qcHJldmlld09ubHkqLyB0cnVlKTsKICAgICBBTE9HX0FTU0VSVCh5IDwgcHJldmlld0Nyb3AuaGVpZ2h0LCAiQ3JvcC1yZWxhdGl2ZSBZIGNvb3JkaW5hdGUgPSAnJWQnIGlzICIKICAgICAgICAgICAgICAgICAib3V0IG9mIGJvdW5kcyAodXBwZXIgPSAlZikiLCB5LCBwcmV2aWV3Q3JvcC5oZWlnaHQpOwogCkBAIC0yNjIwLDEyICsyNjQ0LDEyIEBACiB9CiAKIGludCBQYXJhbWV0ZXJzOjpub3JtYWxpemVkWFRvQ3JvcChpbnQgeCkgY29uc3QgewotICAgIENyb3BSZWdpb24gcHJldmlld0Nyb3AgPSBjYWxjdWxhdGVDcm9wUmVnaW9uKENyb3BSZWdpb246Ok9VVFBVVF9QUkVWSUVXKTsKKyAgICBDcm9wUmVnaW9uIHByZXZpZXdDcm9wID0gY2FsY3VsYXRlQ3JvcFJlZ2lvbigvKnByZXZpZXdPbmx5Ki8gdHJ1ZSk7CiAgICAgcmV0dXJuICh4ICsgMTAwMCkgKiAocHJldmlld0Nyb3Aud2lkdGggLSAxKSAvIDIwMDA7CiB9CiAKIGludCBQYXJhbWV0ZXJzOjpub3JtYWxpemVkWVRvQ3JvcChpbnQgeSkgY29uc3QgewotICAgIENyb3BSZWdpb24gcHJldmlld0Nyb3AgPSBjYWxjdWxhdGVDcm9wUmVnaW9uKENyb3BSZWdpb246Ok9VVFBVVF9QUkVWSUVXKTsKKyAgICBDcm9wUmVnaW9uIHByZXZpZXdDcm9wID0gY2FsY3VsYXRlQ3JvcFJlZ2lvbigvKnByZXZpZXdPbmx5Ki8gdHJ1ZSk7CiAgICAgcmV0dXJuICh5ICsgMTAwMCkgKiAocHJldmlld0Nyb3AuaGVpZ2h0IC0gMSkgLyAyMDAwOwogfQogCkBAIC0yNzY5LDYgKzI3OTMsMTcgQEAKICAgICByZXR1cm4gbWF4U2l6ZTsKIH0KIAorUGFyYW1ldGVyczo6U2l6ZSBQYXJhbWV0ZXJzOjpnZXRNYXhTaXplKGNvbnN0IFZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiAmc2l6ZXMpIHsKKyAgICBTaXplIG1heFNpemUgPSB7LTEsIC0xfTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChzaXplc1tpXS53aWR0aCA+IG1heFNpemUud2lkdGggfHwKKyAgICAgICAgICAgICAgICAoc2l6ZXNbaV0ud2lkdGggPT0gbWF4U2l6ZS53aWR0aCAmJiBzaXplc1tpXS5oZWlnaHQgPiBtYXhTaXplLmhlaWdodCApKSB7CisgICAgICAgICAgICBtYXhTaXplID0gc2l6ZXNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1heFNpemU7Cit9CisKIFZlY3RvcjxQYXJhbWV0ZXJzOjpTdHJlYW1Db25maWd1cmF0aW9uPiBQYXJhbWV0ZXJzOjpnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpIHsKICAgICBjb25zdCBpbnQgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSA9IDQ7CiAgICAgY29uc3QgaW50IFNUUkVBTV9GT1JNQVRfT0ZGU0VUID0gMDsKQEAgLTI3ODMsNyArMjgxOCw3IEBACiAKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVTdHJlYW1Db25maWdzID0KICAgICAgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMpOwotICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQ7IGkrPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVTdHJlYW1Db25maWdzLmNvdW50OyBpKz0gU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSkgewogICAgICAgICBpbnQzMl90IGZvcm1hdCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKICAgICAgICAgaW50MzJfdCB3aWR0aCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOwogICAgICAgICBpbnQzMl90IGhlaWdodCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKQEAgLTI3OTQsMTEgKzI4MjksNTIgQEAKICAgICByZXR1cm4gc2NzOwogfQogCitpbnQ2NF90IFBhcmFtZXRlcnM6OmdldEpwZWdTdHJlYW1NaW5GcmFtZUR1cmF0aW9uTnMoUGFyYW1ldGVyczo6U2l6ZSBzaXplKSB7CisgICAgaWYgKG1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIGNvbnN0IGludCBTVFJFQU1fRFVSQVRJT05fU0laRSA9IDQ7CisgICAgICAgIGNvbnN0IGludCBTVFJFQU1fRk9STUFUX09GRlNFVCA9IDA7CisgICAgICAgIGNvbnN0IGludCBTVFJFQU1fV0lEVEhfT0ZGU0VUID0gMTsKKyAgICAgICAgY29uc3QgaW50IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMjsKKyAgICAgICAgY29uc3QgaW50IFNUUkVBTV9EVVJBVElPTl9PRkZTRVQgPSAzOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVTdHJlYW1NaW5EdXJhdGlvbnMgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVTdHJlYW1NaW5EdXJhdGlvbnMuY291bnQ7IGkrPSBTVFJFQU1fRFVSQVRJT05fU0laRSkgeworICAgICAgICAgICAgaW50NjRfdCBmb3JtYXQgPSBhdmFpbGFibGVTdHJlYW1NaW5EdXJhdGlvbnMuZGF0YS5pNjRbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDY0X3Qgd2lkdGggPSBhdmFpbGFibGVTdHJlYW1NaW5EdXJhdGlvbnMuZGF0YS5pNjRbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOworICAgICAgICAgICAgaW50NjRfdCBoZWlnaHQgPSBhdmFpbGFibGVTdHJlYW1NaW5EdXJhdGlvbnMuZGF0YS5pNjRbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb24gPSBhdmFpbGFibGVTdHJlYW1NaW5EdXJhdGlvbnMuZGF0YS5pNjRbaSArIFNUUkVBTV9EVVJBVElPTl9PRkZTRVRdOworICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IgJiYgd2lkdGggPT0gc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gc2l6ZS5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZHVyYXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBWZWN0b3I8U2l6ZT4gYXZhaWxhYmxlSnBlZ1NpemVzID0gZ2V0QXZhaWxhYmxlSnBlZ1NpemVzKCk7CisgICAgICAgIHNpemVfdCBzdHJlYW1JZHggPSBhdmFpbGFibGVKcGVnU2l6ZXMuc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZUpwZWdTaXplcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGF2YWlsYWJsZUpwZWdTaXplc1tpXS53aWR0aCA9PSBzaXplLndpZHRoICYmCisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUpwZWdTaXplc1tpXS5oZWlnaHQgPT0gc2l6ZS5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1JZHggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzdHJlYW1JZHggIT0gYXZhaWxhYmxlSnBlZ1NpemVzLnNpemUoKSkgeworICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QganBlZ01pbkR1cmF0aW9ucyA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0pQRUdfTUlOX0RVUkFUSU9OUyk7CisgICAgICAgICAgICBpZiAoc3RyZWFtSWR4IDwganBlZ01pbkR1cmF0aW9ucy5jb3VudCkgeworICAgICAgICAgICAgICAgIHJldHVybiBqcGVnTWluRHVyYXRpb25zLmRhdGEuaTY0W3N0cmVhbUlkeF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0UoIiVzOiBjYW5ub3QgZmluZCBtaW4gZnJhbWUgZHVyYXRpb24gZm9yIGpwZWcgc2l6ZSAlZHglZCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTsKKyAgICByZXR1cm4gLTE7Cit9CisKIFNvcnRlZFZlY3RvcjxpbnQzMl90PiBQYXJhbWV0ZXJzOjpnZXRBdmFpbGFibGVPdXRwdXRGb3JtYXRzKCkgewogICAgIFNvcnRlZFZlY3RvcjxpbnQzMl90PiBvdXRwdXRGb3JtYXRzOyAvLyBOb24tZHVwbGljYXRlZCBvdXRwdXQgZm9ybWF0cwogICAgIGlmIChtRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgewogICAgICAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gc2NzID0gZ2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgc2NzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2NzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBjb25zdCBTdHJlYW1Db25maWd1cmF0aW9uICZzYyA9IHNjc1tpXTsKICAgICAgICAgICAgIGlmIChzYy5pc0lucHV0ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUKSB7CiAgICAgICAgICAgICAgICAgb3V0cHV0Rm9ybWF0cy5hZGQoc2MuZm9ybWF0KTsKQEAgLTI4MDYsNyArMjg4Miw3IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGb3JtYXRzID0gc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUUyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUZvcm1hdHMuY291bnQ7IGkrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZUZvcm1hdHMuY291bnQ7IGkrKykgewogICAgICAgICAgICAgb3V0cHV0Rm9ybWF0cy5hZGQoYXZhaWxhYmxlRm9ybWF0cy5kYXRhLmkzMltpXSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yODE3LDcgKzI4OTMsNyBAQAogICAgIFZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBqcGVnU2l6ZXM7CiAgICAgaWYgKG1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CiAgICAgICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3MgPSBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOwotICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBzY3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzY3Muc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGNvbnN0IFN0cmVhbUNvbmZpZ3VyYXRpb24gJnNjID0gc2NzW2ldOwogICAgICAgICAgICAgaWYgKHNjLmlzSW5wdXQgPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgJiYKICAgICAgICAgICAgICAgICAgICAgc2MuZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgewpAQCAtMjgzMSw3ICsyOTA3LDcgQEAKICAgICAgICAgY29uc3QgaW50IEhFSUdIVF9PRkZTRVQgPSAxOwogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVKcGVnU2l6ZXMgPQogICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfSlBFR19TSVpFUyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUpwZWdTaXplcy5jb3VudDsgaSs9IEpQRUdfU0laRV9FTlRSWV9DT1VOVCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZUpwZWdTaXplcy5jb3VudDsgaSs9IEpQRUdfU0laRV9FTlRSWV9DT1VOVCkgewogICAgICAgICAgICAgaW50IHdpZHRoID0gYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyW2kgKyBXSURUSF9PRkZTRVRdOwogICAgICAgICAgICAgaW50IGhlaWdodCA9IGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpICsgSEVJR0hUX09GRlNFVF07CiAgICAgICAgICAgICBTaXplIHN6ID0ge3dpZHRoLCBoZWlnaHR9OwpAQCAtMjg0MSw4ICsyOTE3LDcgQEAKICAgICByZXR1cm4ganBlZ1NpemVzOwogfQogCi1QYXJhbWV0ZXJzOjpDcm9wUmVnaW9uIFBhcmFtZXRlcnM6OmNhbGN1bGF0ZUNyb3BSZWdpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyczo6Q3JvcFJlZ2lvbjo6T3V0cHV0cyBvdXRwdXRzKSBjb25zdCB7CitQYXJhbWV0ZXJzOjpDcm9wUmVnaW9uIFBhcmFtZXRlcnM6OmNhbGN1bGF0ZUNyb3BSZWdpb24oYm9vbCBwcmV2aWV3T25seSkgY29uc3QgewogCiAgICAgZmxvYXQgem9vbUxlZnQsIHpvb21Ub3AsIHpvb21XaWR0aCwgem9vbUhlaWdodDsKIApAQCAtMjg2Niw5MCArMjk0MSw0NSBAQAogICAgICAgICAgIG1heERpZ2l0YWxab29tLmRhdGEuZlswXSwgem9vbUluY3JlbWVudCwgem9vbVJhdGlvLCBwcmV2aWV3V2lkdGgsCiAgICAgICAgICAgcHJldmlld0hlaWdodCwgZmFzdEluZm8uYXJyYXlXaWR0aCwgZmFzdEluZm8uYXJyYXlIZWlnaHQpOwogCi0gICAgLyoKLSAgICAgKiBBc3N1bXB0aW9uOiBPbiB0aGUgSEFMIHNpZGUgZWFjaCBzdHJlYW0gYnVmZmVyIGNhbGN1bGF0ZXMgaXRzIGNyb3AKLSAgICAgKiByZWN0YW5nbGUgYXMgZm9sbG93czoKLSAgICAgKiAgIGNyb3BSZWN0ID0gKHpvb21MZWZ0LCB6b29tUmlnaHQsCi0gICAgICogICAgICAgICAgICAgICB6b29tV2lkdGgsIHpvb21IZWlnaHQgKiB6b29tV2lkdGggLyBvdXRwdXRXaWR0aCk7Ci0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgaWYgem9vbVdpZHRoID4gYnVmZmVyV2lkdGgsIHRoZSBuZXcgY3JvcEhlaWdodCA+IHpvb21IZWlnaHQKLSAgICAgKiAgICAgICh3ZSBjYW4gdGhlbiBnZXQgaW50byB0cm91YmxlIGlmIHRoZSBjcm9wSGVpZ2h0ID4gYXJyYXlIZWlnaHQpLgotICAgICAqIEJ5IHNlbGVjdGluZyB0aGUgem9vbVJhdGlvIGJhc2VkIG9uIHRoZSBzbWFsbGVzdCBvdXRwdXRSYXRpbywgd2UKLSAgICAgKiBndWFyYW50ZWUgdGhpcyB3aWxsIG5ldmVyIGhhcHBlbi4KLSAgICAgKi8KKyAgICBpZiAocHJldmlld09ubHkpIHsKKyAgICAgICAgLy8gQ2FsY3VsYXRlIGEgdGlnaHQgY3JvcCByZWdpb24gZm9yIHRoZSBwcmV2aWV3IHN0cmVhbSBvbmx5CisgICAgICAgIGZsb2F0IHByZXZpZXdSYXRpbyA9IHN0YXRpY19jYXN0PGZsb2F0PihwcmV2aWV3V2lkdGgpIC8gcHJldmlld0hlaWdodDsKIAotICAgIC8vIEVudW1lcmF0ZSBhbGwgcG9zc2libGUgb3V0cHV0IHNpemVzLCBzZWxlY3QgdGhlIG9uZSB3aXRoIHRoZSBzbWFsbGVzdAotICAgIC8vIGFzcGVjdCByYXRpbwotICAgIGZsb2F0IG1pbk91dHB1dFdpZHRoLCBtaW5PdXRwdXRIZWlnaHQsIG1pbk91dHB1dFJhdGlvOwotICAgIHsKLSAgICAgICAgZmxvYXQgb3V0cHV0U2l6ZXNbXVsyXSA9IHsKLSAgICAgICAgICAgIHsgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHByZXZpZXdXaWR0aCksCi0gICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihwcmV2aWV3SGVpZ2h0KSB9LAotICAgICAgICAgICAgeyBzdGF0aWNfY2FzdDxmbG9hdD4odmlkZW9XaWR0aCksCi0gICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0Pih2aWRlb0hlaWdodCkgfSwKLSAgICAgICAgICAgIHsgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGpwZWdUaHVtYlNpemVbMF0pLAotICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oanBlZ1RodW1iU2l6ZVsxXSkgfSwKLSAgICAgICAgICAgIHsgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBpY3R1cmVXaWR0aCksCi0gICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihwaWN0dXJlSGVpZ2h0KSB9LAotICAgICAgICB9OworICAgICAgICAvKiBFbnN1cmUgdGhhdCB0aGUgd2lkdGgvaGVpZ2h0IG5ldmVyIGdvIG91dCBvZiBib3VuZHMKKyAgICAgICAgICogYnkgc2NhbGluZyBhY3Jvc3MgYSBkaWZmZW50IGRpbWVuc2lvbiBpZiBhbiBvdXQtb2YtYm91bmRzCisgICAgICAgICAqIHBvc3NpYmlsaXR5IGV4aXN0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogZS5nLiBpZiB0aGUgcHJldmlld3JhdGlvIDwgYXJyYXlyYXRpbyBhbmQgZS5nLiB6b29tcmF0aW8gPSAxLjAsIHRoZW4gYnkKKyAgICAgICAgICogY2FsY3VsYXRpbmcgdGhlIHpvb21XaWR0aCBmcm9tIHpvb21IZWlnaHQgd2UnbGwgYWN0dWFsbHkgZ2V0IGEKKyAgICAgICAgICogem9vbWhlaWdodCA+IGFycmF5aGVpZ2h0CisgICAgICAgICAqLworICAgICAgICBmbG9hdCBhcnJheVJhdGlvID0gMS5mICogZmFzdEluZm8uYXJyYXlXaWR0aCAvIGZhc3RJbmZvLmFycmF5SGVpZ2h0OworICAgICAgICBpZiAocHJldmlld1JhdGlvID49IGFycmF5UmF0aW8pIHsKKyAgICAgICAgICAgIC8vIEFkanVzdCB0aGUgaGVpZ2h0IGJhc2VkIG9uIHRoZSB3aWR0aAorICAgICAgICAgICAgem9vbVdpZHRoID0gIGZhc3RJbmZvLmFycmF5V2lkdGggLyB6b29tUmF0aW87CisgICAgICAgICAgICB6b29tSGVpZ2h0ID0gem9vbVdpZHRoICoKKyAgICAgICAgICAgICAgICAgICAgcHJldmlld0hlaWdodCAvIHByZXZpZXdXaWR0aDsKIAotICAgICAgICBtaW5PdXRwdXRXaWR0aCA9IG91dHB1dFNpemVzWzBdWzBdOwotICAgICAgICBtaW5PdXRwdXRIZWlnaHQgPSBvdXRwdXRTaXplc1swXVsxXTsKLSAgICAgICAgbWluT3V0cHV0UmF0aW8gPSBtaW5PdXRwdXRXaWR0aCAvIG1pbk91dHB1dEhlaWdodDsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgaSA8IHNpemVvZihvdXRwdXRTaXplcykgLyBzaXplb2Yob3V0cHV0U2l6ZXNbMF0pOwotICAgICAgICAgICAgICsraSkgewotCi0gICAgICAgICAgICAvLyBza2lwIG92ZXIgb3V0cHV0cyB3ZSBkb24ndCB3YW50IHRvIGNvbnNpZGVyIGZvciB0aGUgY3JvcCByZWdpb24KLSAgICAgICAgICAgIGlmICggISgoMSA8PCBpKSAmIG91dHB1dHMpICkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmbG9hdCBvdXRwdXRXaWR0aCA9IG91dHB1dFNpemVzW2ldWzBdOwotICAgICAgICAgICAgZmxvYXQgb3V0cHV0SGVpZ2h0ID0gb3V0cHV0U2l6ZXNbaV1bMV07Ci0gICAgICAgICAgICBmbG9hdCBvdXRwdXRSYXRpbyA9IG91dHB1dFdpZHRoIC8gb3V0cHV0SGVpZ2h0OwotCi0gICAgICAgICAgICBpZiAobWluT3V0cHV0UmF0aW8gPiBvdXRwdXRSYXRpbykgewotICAgICAgICAgICAgICAgIG1pbk91dHB1dFJhdGlvID0gb3V0cHV0UmF0aW87Ci0gICAgICAgICAgICAgICAgbWluT3V0cHV0V2lkdGggPSBvdXRwdXRXaWR0aDsKLSAgICAgICAgICAgICAgICBtaW5PdXRwdXRIZWlnaHQgPSBvdXRwdXRIZWlnaHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFuZCB0aGVuIHVzZSB0aGlzIG91dHB1dCByYXRpbyBpbnN0ZWFkIG9mIHByZXZpZXcgb3V0cHV0IHJhdGlvCi0gICAgICAgICAgICBBTE9HVigiRW51bWVyYXRpbmcgb3V0cHV0IHJhdGlvICVmID0gJWYgLyAlZiwgbWluIGlzICVmIiwKLSAgICAgICAgICAgICAgICAgIG91dHB1dFJhdGlvLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBtaW5PdXRwdXRSYXRpbyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBBZGp1c3QgdGhlIHdpZHRoIGJhc2VkIG9uIHRoZSBoZWlnaHQKKyAgICAgICAgICAgIHpvb21IZWlnaHQgPSBmYXN0SW5mby5hcnJheUhlaWdodCAvIHpvb21SYXRpbzsKKyAgICAgICAgICAgIHpvb21XaWR0aCA9IHpvb21IZWlnaHQgKgorICAgICAgICAgICAgICAgICAgICBwcmV2aWV3V2lkdGggLyBwcmV2aWV3SGVpZ2h0OwogICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogRW5zdXJlIHRoYXQgdGhlIHdpZHRoL2hlaWdodCBuZXZlciBnbyBvdXQgb2YgYm91bmRzCi0gICAgICogYnkgc2NhbGluZyBhY3Jvc3MgYSBkaWZmZW50IGRpbWVuc2lvbiBpZiBhbiBvdXQtb2YtYm91bmRzCi0gICAgICogcG9zc2liaWxpdHkgZXhpc3RzLgotICAgICAqCi0gICAgICogZS5nLiBpZiB0aGUgcHJldmlld3JhdGlvIDwgYXJyYXlyYXRpbyBhbmQgZS5nLiB6b29tcmF0aW8gPSAxLjAsIHRoZW4gYnkKLSAgICAgKiBjYWxjdWxhdGluZyB0aGUgem9vbVdpZHRoIGZyb20gem9vbUhlaWdodCB3ZSdsbCBhY3R1YWxseSBnZXQgYQotICAgICAqIHpvb21oZWlnaHQgPiBhcnJheWhlaWdodAotICAgICAqLwotICAgIGZsb2F0IGFycmF5UmF0aW8gPSAxLmYgKiBmYXN0SW5mby5hcnJheVdpZHRoIC8gZmFzdEluZm8uYXJyYXlIZWlnaHQ7Ci0gICAgaWYgKG1pbk91dHB1dFJhdGlvID49IGFycmF5UmF0aW8pIHsKLSAgICAgICAgLy8gQWRqdXN0IHRoZSBoZWlnaHQgYmFzZWQgb24gdGhlIHdpZHRoCi0gICAgICAgIHpvb21XaWR0aCA9ICBmYXN0SW5mby5hcnJheVdpZHRoIC8gem9vbVJhdGlvOwotICAgICAgICB6b29tSGVpZ2h0ID0gem9vbVdpZHRoICoKLSAgICAgICAgICAgICAgICBtaW5PdXRwdXRIZWlnaHQgLyBtaW5PdXRwdXRXaWR0aDsKLQogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEFkanVzdCB0aGUgd2lkdGggYmFzZWQgb24gdGhlIGhlaWdodAorICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGdsb2JhbCBjcm9wIHJlZ2lvbiB3aXRoIGEgc2hhcGUgbWF0Y2hpbmcgdGhlIGFjdGl2ZQorICAgICAgICAvLyBhcnJheS4KKyAgICAgICAgem9vbVdpZHRoID0gZmFzdEluZm8uYXJyYXlXaWR0aCAvIHpvb21SYXRpbzsKICAgICAgICAgem9vbUhlaWdodCA9IGZhc3RJbmZvLmFycmF5SGVpZ2h0IC8gem9vbVJhdGlvOwotICAgICAgICB6b29tV2lkdGggPSB6b29tSGVpZ2h0ICoKLSAgICAgICAgICAgICAgICBtaW5PdXRwdXRXaWR0aCAvIG1pbk91dHB1dEhlaWdodDsKICAgICB9Ci0gICAgLy8gY2VudGVyaW5nIHRoZSB6b29tIGFyZWEgd2l0aGluIHRoZSBhY3RpdmUgYXJlYQorCisgICAgLy8gY2VudGVyIHRoZSB6b29tIGFyZWEgd2l0aGluIHRoZSBhY3RpdmUgYXJlYQogICAgIHpvb21MZWZ0ID0gKGZhc3RJbmZvLmFycmF5V2lkdGggLSB6b29tV2lkdGgpIC8gMjsKICAgICB6b29tVG9wID0gKGZhc3RJbmZvLmFycmF5SGVpZ2h0IC0gem9vbUhlaWdodCkgLyAyOwogCiAgICAgQUxPR1YoIkNyb3AgcmVnaW9uIGNhbGN1bGF0ZWQgKHg9JWQseT0lZCx3PSVmLGg9JWYpIGZvciB6b29tPSVkIiwKICAgICAgICAgKGludDMyX3Qpem9vbUxlZnQsIChpbnQzMl90KXpvb21Ub3AsIHpvb21XaWR0aCwgem9vbUhlaWdodCwgdGhpcy0+em9vbSk7CiAKLQogICAgIENyb3BSZWdpb24gY3JvcCA9IHsgem9vbUxlZnQsIHpvb21Ub3AsIHpvb21XaWR0aCwgem9vbUhlaWdodCB9OwogICAgIHJldHVybiBjcm9wOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKaW5kZXggZTYyOGE3ZS4uOTcyZDAwNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCkBAIC0xNjYsNiArMTY2LDkgQEAKICAgICBib29sIHByZXZpZXdDYWxsYmFja1N1cmZhY2U7CiAKICAgICBib29sIHpzbE1vZGU7CisgICAgLy8gV2hldGhlciB0aGUganBlZyBzdHJlYW0gaXMgc2xvd2VyIHRoYW4gMzBGUFMgYW5kIGNhbiBzbG93IGRvd24gcHJldmlldy4KKyAgICAvLyBXaGVuIHNsb3dKcGVnTW9kZSBpcyB0cnVlLCB6c2xNb2RlIG11c3QgYmUgZmFsc2UgdG8gYXZvaWQgc2xvd2luZyBkb3duIHByZXZpZXcuCisgICAgYm9vbCBzbG93SnBlZ01vZGU7CiAKICAgICAvLyBPdmVyYWxsIGNhbWVyYSBzdGF0ZQogICAgIGVudW0gU3RhdGUgewpAQCAtMTkwLDYgKzE5Myw4IEBACiAgICAgc3RhdGljIGNvbnN0IGludCBNQVhfSU5JVElBTF9QUkVWSUVXX0hFSUdIVCA9IDEwODA7CiAgICAgLy8gQXNwZWN0IHJhdGlvIHRvbGVyYW5jZQogICAgIHN0YXRpYyBjb25zdCBDT05TVEVYUFIgZmxvYXQgQVNQRUNUX1JBVElPX1RPTEVSQU5DRSA9IDAuMDAxOworICAgIC8vIFRocmVzaG9sZCBmb3Igc2xvdyBqcGVnIG1vZGUKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrU2xvd0pwZWdNb2RlVGhyZXNob2xkID0gMzM0MDAwMDBMTDsgLy8gMzMuNCBtcwogCiAgICAgLy8gRnVsbCBzdGF0aWMgY2FtZXJhIGluZm8sIG9iamVjdCBvd25lZCBieSBzb21lb25lIGVsc2UsIHN1Y2ggYXMKICAgICAvLyBDYW1lcmEyRGV2aWNlLgpAQCAtMjcxLDIxICsyNzYsMTYgQEAKICAgICAvLyBpZiB2aWRlbyBzbmFwc2hvdCBzaXplIGlzIGN1cnJlbnRseSBvdmVycmlkZGVuCiAgICAgYm9vbCBpc0pwZWdTaXplT3ZlcnJpZGRlbigpOwogCi0gICAgLy8gQ2FsY3VsYXRlIHRoZSBjcm9wIHJlZ2lvbiByZWN0YW5nbGUgYmFzZWQgb24gY3VycmVudCBzdHJlYW0gc2l6ZXMKKyAgICAvLyBDYWxjdWxhdGUgdGhlIGNyb3AgcmVnaW9uIHJlY3RhbmdsZSwgZWl0aGVyIHRpZ2h0bHkgYWJvdXQgdGhlIHByZXZpZXcKKyAgICAvLyByZXNvbHV0aW9uLCBvciBhIHJlZ2lvbiBqdXN0IGJhc2VkIG9uIHRoZSBhY3RpdmUgYXJyYXk7IGJvdGggdGFrZQorICAgIC8vIGludG8gYWNjb3VudCB0aGUgY3VycmVudCB6b29tIGxldmVsLgogICAgIHN0cnVjdCBDcm9wUmVnaW9uIHsKICAgICAgICAgZmxvYXQgbGVmdDsKICAgICAgICAgZmxvYXQgdG9wOwogICAgICAgICBmbG9hdCB3aWR0aDsKICAgICAgICAgZmxvYXQgaGVpZ2h0OwotCi0gICAgICAgIGVudW0gT3V0cHV0cyB7Ci0gICAgICAgICAgICBPVVRQVVRfUFJFVklFVyAgICAgICAgID0gMHgwMSwKLSAgICAgICAgICAgIE9VVFBVVF9WSURFTyAgICAgICAgICAgPSAweDAyLAotICAgICAgICAgICAgT1VUUFVUX0pQRUdfVEhVTUJOQUlMICA9IDB4MDQsCi0gICAgICAgICAgICBPVVRQVVRfUElDVFVSRSAgICAgICAgID0gMHgwOCwKLSAgICAgICAgfTsKICAgICB9OwotICAgIENyb3BSZWdpb24gY2FsY3VsYXRlQ3JvcFJlZ2lvbihDcm9wUmVnaW9uOjpPdXRwdXRzIG91dHB1dHMpIGNvbnN0OworICAgIENyb3BSZWdpb24gY2FsY3VsYXRlQ3JvcFJlZ2lvbihib29sIHByZXZpZXdPbmx5KSBjb25zdDsKIAogICAgIC8vIENhbGN1bGF0ZSB0aGUgZmllbGQgb2YgdmlldyBvZiB0aGUgaGlnaC1yZXNvbHV0aW9uIEpQRUcgY2FwdHVyZQogICAgIHN0YXR1c190IGNhbGN1bGF0ZVBpY3R1cmVGb3ZzKGZsb2F0ICpob3JpekZvdiwgZmxvYXQgKnZlcnRGb3YpIGNvbnN0OwpAQCAtMzgyLDE1ICszODIsMjMgQEAKICAgICAgICAgaW50MzJfdCBoZWlnaHQ7CiAgICAgICAgIGludDMyX3QgaXNJbnB1dDsKICAgICB9OworCiAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIGV4dHJhY3QgYXZhaWxhYmxlIHN0cmVhbSBjb25maWd1cmF0aW9uCiAgICAgLy8gT25seSB2YWxpZCBzaW5jZSBkZXZpY2UgSEFMIHZlcnNpb24gMy4yCiAgICAgLy8gcmV0dXJucyBhbiBlbXB0eSBWZWN0b3IgaWYgZGV2aWNlIEhBTCB2ZXJzaW9uIGRvZXMgc3VwcG9ydCBpdAogICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOwogCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBhIGpwZWcgc2l6ZQorICAgIC8vIHJldHVybiAtMSBpZiBpbnB1dCBqcGVnIHNpemUgY2Fubm90IGJlIGZvdW5kIGluIHN1cHBvcnRlZCBzaXplIGxpc3QKKyAgICBpbnQ2NF90IGdldEpwZWdTdHJlYW1NaW5GcmFtZUR1cmF0aW9uTnMoUGFyYW1ldGVyczo6U2l6ZSBzaXplKTsKKwogICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgbm9uLWR1cGxpY2F0ZWQgYXZhaWxhYmxlIG91dHB1dCBmb3JtYXRzCiAgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IGdldEF2YWlsYWJsZU91dHB1dEZvcm1hdHMoKTsKICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGF2YWlsYWJsZSBvdXRwdXQganBlZyBzaXplcwogICAgIFZlY3RvcjxTaXplPiBnZXRBdmFpbGFibGVKcGVnU2l6ZXMoKTsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IG1heGltdW0gc2l6ZSBpbiBpbnB1dCBTaXplIHZlY3Rvci4KKyAgICAvLyBUaGUgbWF4aW11bSBzaXplIGlzIGRlZmluZWQgYnkgY29tcGFyaW5nIHdpZHRoIGZpcnN0LCB3aGVuIHdpZHRoIHRpZXMgY29tcGFyaW5nIGhlaWdodC4KKyAgICBTaXplIGdldE1heFNpemUoY29uc3QgVmVjdG9yPFNpemU+JiBzaXplcyk7CiAKICAgICBpbnQgbURldmljZVZlcnNpb247CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcAppbmRleCAxNDZkNTcyLi45ZTZjMGRiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcApAQCAtMjUsMTEgKzI1LDEzIEBACiAjZGVmaW5lIEFMT0dWViguLi4pICgodm9pZCkwKQogI2VuZGlmCiAKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgorI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKICNpbmNsdWRlICJhcGkxL0NhbWVyYTJDbGllbnQuaCIKQEAgLTUxLDcgKzUzLDEwIEBACiAgICAgICAgIG1SZWNvcmRpbmdTdHJlYW1JZChOT19TVFJFQU0pLAogICAgICAgICBtUmVjb3JkaW5nRnJhbWVBdmFpbGFibGUoZmFsc2UpLAogICAgICAgICBtUmVjb3JkaW5nSGVhcENvdW50KGtEZWZhdWx0UmVjb3JkaW5nSGVhcENvdW50KSwKLSAgICAgICAgbVJlY29yZGluZ0hlYXBGcmVlKGtEZWZhdWx0UmVjb3JkaW5nSGVhcENvdW50KQorICAgICAgICBtUmVjb3JkaW5nSGVhcEZyZWUoa0RlZmF1bHRSZWNvcmRpbmdIZWFwQ291bnQpLAorICAgICAgICBtUmVjb3JkaW5nRm9ybWF0KGtEZWZhdWx0UmVjb3JkaW5nRm9ybWF0KSwKKyAgICAgICAgbVJlY29yZGluZ0RhdGFTcGFjZShrRGVmYXVsdFJlY29yZGluZ0RhdGFTcGFjZSksCisgICAgICAgIG1SZWNvcmRpbmdHcmFsbG9jVXNhZ2Uoa0RlZmF1bHRSZWNvcmRpbmdHcmFsbG9jVXNhZ2UpCiB7CiB9CiAKQEAgLTYwLDcgKzY1LDcgQEAKICAgICBkZWxldGVSZWNvcmRpbmdTdHJlYW0oKTsKIH0KIAotc3RhdHVzX3QgU3RyZWFtaW5nUHJvY2Vzc29yOjpzZXRQcmV2aWV3V2luZG93KHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdykgeworc3RhdHVzX3QgU3RyZWFtaW5nUHJvY2Vzc29yOjpzZXRQcmV2aWV3V2luZG93KHNwPFN1cmZhY2U+IHdpbmRvdykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogCkBAIC0xNTEsNyArMTU2LDcgQEAKICAgICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHBhcmFtZXRlcnMgaGF2ZSB0byBjaGFuZ2UKICAgICAgICAgdWludDMyX3QgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0OwogICAgICAgICByZXMgPSBkZXZpY2UtPmdldFN0cmVhbUluZm8obVByZXZpZXdTdHJlYW1JZCwKLSAgICAgICAgICAgICAgICAmY3VycmVudFdpZHRoLCAmY3VycmVudEhlaWdodCwgMCk7CisgICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDAsIDApOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRXJyb3IgcXVlcnlpbmcgcHJldmlldyBzdHJlYW0gaW5mbzogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTE4Miw3ICsxODcsOCBAQAogICAgIGlmIChtUHJldmlld1N0cmVhbUlkID09IE5PX1NUUkVBTSkgewogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtUHJldmlld1dpbmRvdywKICAgICAgICAgICAgICAgICBwYXJhbXMucHJldmlld1dpZHRoLCBwYXJhbXMucHJldmlld0hlaWdodCwKLSAgICAgICAgICAgICAgICBDQU1FUkEyX0hBTF9QSVhFTF9GT1JNQVRfT1BBUVVFLCAmbVByZXZpZXdTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgQ0FNRVJBMl9IQUxfUElYRUxfRk9STUFUX09QQVFVRSwgSEFMX0RBVEFTUEFDRV9VTktOT1dOLAorICAgICAgICAgICAgICAgIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsICZtUHJldmlld1N0cmVhbUlkKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBjcmVhdGUgcHJldmlldyBzdHJlYW06ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0yNzksNiArMjg1LDQ2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBTdHJlYW1pbmdQcm9jZXNzb3I6OnNldFJlY29yZGluZ0Zvcm1hdChpbnQgZm9ybWF0LAorICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIG0obU11dGV4KTsKKworICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBOZXcgcmVjb3JkaW5nIGZvcm1hdC9kYXRhc3BhY2UgZnJvbSBlbmNvZGVyOiAlWCwgJVgiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIGZvcm1hdCwgZGF0YVNwYWNlKTsKKworICAgIG1SZWNvcmRpbmdGb3JtYXQgPSBmb3JtYXQ7CisgICAgbVJlY29yZGluZ0RhdGFTcGFjZSA9IGRhdGFTcGFjZTsKKyAgICBpbnQgcHJldkdyYWxsb2NVc2FnZSA9IG1SZWNvcmRpbmdHcmFsbG9jVXNhZ2U7CisgICAgaWYgKG1SZWNvcmRpbmdGb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKSB7CisgICAgICAgIG1SZWNvcmRpbmdHcmFsbG9jVXNhZ2UgPSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVJlY29yZGluZ0dyYWxsb2NVc2FnZSA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTjsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogTmV3IHJlY29yZGluZyBncmFsbG9jIHVzYWdlOiAlMDhYIiwgX19GVU5DVElPTl9fLCBtSWQsCisgICAgICAgICAgICBtUmVjb3JkaW5nR3JhbGxvY1VzYWdlKTsKKworICAgIGlmIChwcmV2R3JhbGxvY1VzYWdlICE9IG1SZWNvcmRpbmdHcmFsbG9jVXNhZ2UpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFJlc2V0dGluZyByZWNvcmRpbmcgY29uc3VtZXIgZm9yIG5ldyB1c2FnZSIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7CisKKyAgICAgICAgaWYgKGlzU3RyZWFtQWN0aXZlKG1BY3RpdmVTdHJlYW1JZHMsIG1SZWNvcmRpbmdTdHJlYW1JZCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDaGFuZ2luZyByZWNvcmRpbmcgZm9ybWF0IHdoZW4gIgorICAgICAgICAgICAgICAgICAgICAicmVjb3JkaW5nIHN0cmVhbSBpcyBhbHJlYWR5IGFjdGl2ZSEiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIG1JZCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgICAgICByZWxlYXNlQWxsUmVjb3JkaW5nRnJhbWVzTG9ja2VkKCk7CisKKyAgICAgICAgbVJlY29yZGluZ0NvbnN1bWVyLmNsZWFyKCk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBTdHJlYW1pbmdQcm9jZXNzb3I6OnVwZGF0ZVJlY29yZGluZ1JlcXVlc3QoY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CkBAIC0zMzksOSArMzg1LDEwIEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICB1aW50MzJfdCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQ7CisgICAgdWludDMyX3QgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCBjdXJyZW50Rm9ybWF0OworICAgIGFuZHJvaWRfZGF0YXNwYWNlIGN1cnJlbnREYXRhU3BhY2U7CiAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1SZWNvcmRpbmdTdHJlYW1JZCwKLSAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAwKTsKKyAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAmY3VycmVudEZvcm1hdCwgJmN1cnJlbnREYXRhU3BhY2UpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIHJlY29yZGluZyBvdXRwdXQgc3RyZWFtIGluZm86ICIKICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLApAQCAtMzQ5LDggKzM5NiwxMSBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIGlmIChtUmVjb3JkaW5nQ29uc3VtZXIgPT0gMCB8fCBjdXJyZW50V2lkdGggIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb1dpZHRoIHx8Ci0gICAgICAgICAgICBjdXJyZW50SGVpZ2h0ICE9ICh1aW50MzJfdClwYXJhbXMudmlkZW9IZWlnaHQpIHsKKyAgICBpZiAobVJlY29yZGluZ0NvbnN1bWVyID09IDAgfHwKKyAgICAgICAgICAgIGN1cnJlbnRXaWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvV2lkdGggfHwKKyAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb0hlaWdodCB8fAorICAgICAgICAgICAgY3VycmVudEZvcm1hdCAhPSAodWludDMyX3QpbVJlY29yZGluZ0Zvcm1hdCB8fAorICAgICAgICAgICAgY3VycmVudERhdGFTcGFjZSAhPSBtUmVjb3JkaW5nRGF0YVNwYWNlKSB7CiAgICAgICAgICpuZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgfQogICAgICpuZWVkc1VwZGF0ZSA9IGZhbHNlOwpAQCAtMzc5LDcgKzQyOSw3IEBACiAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOwogICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOwogICAgICAgICBtUmVjb3JkaW5nQ29uc3VtZXIgPSBuZXcgQnVmZmVySXRlbUNvbnN1bWVyKGNvbnN1bWVyLAotICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiwKKyAgICAgICAgICAgICAgICBtUmVjb3JkaW5nR3JhbGxvY1VzYWdlLAogICAgICAgICAgICAgICAgIG1SZWNvcmRpbmdIZWFwQ291bnQgKyAxKTsKICAgICAgICAgbVJlY29yZGluZ0NvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOwogICAgICAgICBtUmVjb3JkaW5nQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMi1SZWNvcmRpbmdDb25zdW1lciIpKTsKQEAgLTM5MSw4ICs0NDEsMTEgQEAKICAgICBpZiAobVJlY29yZGluZ1N0cmVhbUlkICE9IE5PX1NUUkVBTSkgewogICAgICAgICAvLyBDaGVjayBpZiBzdHJlYW0gcGFyYW1ldGVycyBoYXZlIHRvIGNoYW5nZQogICAgICAgICB1aW50MzJfdCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQ7CisgICAgICAgIHVpbnQzMl90IGN1cnJlbnRGb3JtYXQ7CisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGN1cnJlbnREYXRhU3BhY2U7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtUmVjb3JkaW5nU3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDApOworICAgICAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LAorICAgICAgICAgICAgICAgICZjdXJyZW50Rm9ybWF0LCAmY3VycmVudERhdGFTcGFjZSk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBxdWVyeWluZyByZWNvcmRpbmcgb3V0cHV0IHN0cmVhbSBpbmZvOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCkBAIC00MDAsNyArNDUzLDEwIEBACiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgICAgIGlmIChjdXJyZW50V2lkdGggIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb1dpZHRoIHx8Ci0gICAgICAgICAgICAgICAgY3VycmVudEhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvSGVpZ2h0IHx8IG5ld0NvbnN1bWVyKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvSGVpZ2h0IHx8CisgICAgICAgICAgICAgICAgY3VycmVudEZvcm1hdCAhPSAodWludDMyX3QpbVJlY29yZGluZ0Zvcm1hdCB8fAorICAgICAgICAgICAgICAgIGN1cnJlbnREYXRhU3BhY2UgIT0gbVJlY29yZGluZ0RhdGFTcGFjZSB8fAorICAgICAgICAgICAgICAgIG5ld0NvbnN1bWVyKSB7CiAgICAgICAgICAgICAvLyBUT0RPOiBTaG91bGQgd2FpdCB0byBiZSBzdXJlIHByZXZpb3VzIHJlY29yZGluZyBoYXMgZmluaXNoZWQKICAgICAgICAgICAgIHJlcyA9IGRldmljZS0+ZGVsZXRlU3RyZWFtKG1SZWNvcmRpbmdTdHJlYW1JZCk7CiAKQEAgLTQyMyw3ICs0NzksOCBAQAogICAgICAgICBtUmVjb3JkaW5nRnJhbWVDb3VudCA9IDA7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1SZWNvcmRpbmdXaW5kb3csCiAgICAgICAgICAgICAgICAgcGFyYW1zLnZpZGVvV2lkdGgsIHBhcmFtcy52aWRlb0hlaWdodCwKLSAgICAgICAgICAgICAgICBDQU1FUkEyX0hBTF9QSVhFTF9GT1JNQVRfT1BBUVVFLCAmbVJlY29yZGluZ1N0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBtUmVjb3JkaW5nRm9ybWF0LCBtUmVjb3JkaW5nRGF0YVNwYWNlLAorICAgICAgICAgICAgICAgIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsICZtUmVjb3JkaW5nU3RyZWFtSWQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0gZm9yIHJlY29yZGluZzogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLApAQCAtNzE4LDEyICs3NzUsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtUmVjb3JkaW5nSGVhcCA9PSAwKSB7Ci0gICAgICAgICAgICBjb25zdCBzaXplX3QgYnVmZmVyU2l6ZSA9IDQgKyBzaXplb2YoYnVmZmVyX2hhbmRsZV90KTsKKyAgICAgICAgICAgIHNpemVfdCBwYXlsb2FkU2l6ZSA9IHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKTsKICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBDcmVhdGluZyByZWNvcmRpbmcgaGVhcCB3aXRoICV6dSBidWZmZXJzIG9mICIKICAgICAgICAgICAgICAgICAgICAgInNpemUgJXp1IGJ5dGVzIiwgX19GVU5DVElPTl9fLCBtSWQsCi0gICAgICAgICAgICAgICAgICAgIG1SZWNvcmRpbmdIZWFwQ291bnQsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgICAgICBtUmVjb3JkaW5nSGVhcENvdW50LCBwYXlsb2FkU2l6ZSk7CiAKLSAgICAgICAgICAgIG1SZWNvcmRpbmdIZWFwID0gbmV3IENhbWVyYTJIZWFwKGJ1ZmZlclNpemUsIG1SZWNvcmRpbmdIZWFwQ291bnQsCisgICAgICAgICAgICBtUmVjb3JkaW5nSGVhcCA9IG5ldyBDYW1lcmEySGVhcChwYXlsb2FkU2l6ZSwgbVJlY29yZGluZ0hlYXBDb3VudCwKICAgICAgICAgICAgICAgICAgICAgIkNhbWVyYTJDbGllbnQ6OlJlY29yZGluZ0hlYXAiKTsKICAgICAgICAgICAgIGlmIChtUmVjb3JkaW5nSGVhcC0+bUhlYXAtPmdldFNpemUoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlY29yZGluZyIsCkBAIC03NDYsNyArODAzLDcgQEAKICAgICAgICAgICAgIG1SZWNvcmRpbmdIZWFwRnJlZSA9IG1SZWNvcmRpbmdIZWFwQ291bnQ7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIG1SZWNvcmRpbmdIZWFwRnJlZSA9PSAwKSB7CisgICAgICAgIGlmIChtUmVjb3JkaW5nSGVhcEZyZWUgPT0gMCkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IE5vIGZyZWUgcmVjb3JkaW5nIGJ1ZmZlcnMsIGRyb3BwaW5nIGZyYW1lIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOwogICAgICAgICAgICAgbVJlY29yZGluZ0NvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGltZ0J1ZmZlcik7CkBAIC03NjYsMTMgKzgyMywxOCBAQAogICAgICAgICAgICAgICAgIG1SZWNvcmRpbmdIZWFwLT5tQnVmZmVyc1toZWFwSWR4XS0+Z2V0TWVtb3J5KCZvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSk7CiAKLSAgICAgICAgdWludDhfdCAqZGF0YSA9ICh1aW50OF90KiloZWFwLT5nZXRCYXNlKCkgKyBvZmZzZXQ7Ci0gICAgICAgIHVpbnQzMl90IHR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZTsKLSAgICAgICAgKigodWludDMyX3QqKWRhdGEpID0gdHlwZTsKLSAgICAgICAgKigoYnVmZmVyX2hhbmRsZV90KikoZGF0YSArIDQpKSA9IGltZ0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlOwotICAgICAgICBBTE9HVlYoIiVzOiBDYW1lcmEgJWQ6IFNlbmRpbmcgb3V0IGJ1ZmZlcl9oYW5kbGVfdCAlcCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsCi0gICAgICAgICAgICAgICAgaW1nQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUpOworICAgICAgICBWaWRlb05hdGl2ZU1ldGFkYXRhICpwYXlsb2FkID0gcmVpbnRlcnByZXRfY2FzdDxWaWRlb05hdGl2ZU1ldGFkYXRhKj4oCisgICAgICAgICAgICAodWludDhfdCopaGVhcC0+Z2V0QmFzZSgpICsgb2Zmc2V0KTsKKyAgICAgICAgcGF5bG9hZC0+ZVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyOworICAgICAgICBwYXlsb2FkLT5wQnVmZmVyID0gaW1nQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKTsKKyAgICAgICAgLy8gYi8yODQ2NjcwMQorICAgICAgICBwYXlsb2FkLT5wQnVmZmVyID0gKEFOYXRpdmVXaW5kb3dCdWZmZXIqKSgodWludDhfdCopcGF5bG9hZC0+cEJ1ZmZlciAtCisgICAgICAgICAgICAgICAgSUNhbWVyYVJlY29yZGluZ1Byb3h5OjpnZXRDb21tb25CYXNlQWRkcmVzcygpKTsKKyAgICAgICAgcGF5bG9hZC0+bkZlbmNlRmQgPSAtMTsKKworICAgICAgICBBTE9HVlYoIiVzOiBDYW1lcmEgJWQ6IFNlbmRpbmcgb3V0IEFOV0J1ZmZlciAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHBheWxvYWQtPnBCdWZmZXIpOworCiAgICAgICAgIG1SZWNvcmRpbmdCdWZmZXJzLnJlcGxhY2VBdChpbWdCdWZmZXIsIGhlYXBJZHgpOwogICAgICAgICByZWNvcmRpbmdIZWFwID0gbVJlY29yZGluZ0hlYXA7CiAgICAgfQpAQCAtODA1LDQyICs4NjcsNDYgQEAKICAgICAgICAgICAgICAgICBoZWFwLT5nZXRIZWFwSUQoKSwgbVJlY29yZGluZ0hlYXAtPm1IZWFwLT5nZXRIZWFwSUQoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgdWludDhfdCAqZGF0YSA9ICh1aW50OF90KiloZWFwLT5nZXRCYXNlKCkgKyBvZmZzZXQ7Ci0gICAgdWludDMyX3QgdHlwZSA9ICoodWludDMyX3QqKWRhdGE7Ci0gICAgaWYgKHR5cGUgIT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKKworICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEgKnBheWxvYWQgPSByZWludGVycHJldF9jYXN0PFZpZGVvTmF0aXZlTWV0YWRhdGEqPigKKyAgICAgICAgKHVpbnQ4X3QqKWhlYXAtPmdldEJhc2UoKSArIG9mZnNldCk7CisKKyAgICBpZiAocGF5bG9hZC0+ZVR5cGUgIT0ga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlcikgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogUmVjb3JkaW5nIGZyYW1lIHR5cGUgaW52YWxpZCAoZ290ICV4LCBleHBlY3RlZCAleCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCB0eXBlLAotICAgICAgICAgICAgICAgIGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgcGF5bG9hZC0+ZVR5cGUsCisgICAgICAgICAgICAgICAga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlcik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICAvLyBiLzI4NDY2NzAxCisgICAgcGF5bG9hZC0+cEJ1ZmZlciA9IChBTmF0aXZlV2luZG93QnVmZmVyKikoKCh1aW50OF90KilwYXlsb2FkLT5wQnVmZmVyKSArCisgICAgICAgICAgICBJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OmdldENvbW1vbkJhc2VBZGRyZXNzKCkpOworCiAgICAgLy8gUmVsZWFzZSB0aGUgYnVmZmVyIGJhY2sgdG8gdGhlIHJlY29yZGluZyBxdWV1ZQotCi0gICAgYnVmZmVyX2hhbmRsZV90IGltZ0hhbmRsZSA9ICooYnVmZmVyX2hhbmRsZV90KikoZGF0YSArIDQpOwotCiAgICAgc2l6ZV90IGl0ZW1JbmRleDsKICAgICBmb3IgKGl0ZW1JbmRleCA9IDA7IGl0ZW1JbmRleCA8IG1SZWNvcmRpbmdCdWZmZXJzLnNpemUoKTsgaXRlbUluZGV4KyspIHsKICAgICAgICAgY29uc3QgQnVmZmVySXRlbSBpdGVtID0gbVJlY29yZGluZ0J1ZmZlcnNbaXRlbUluZGV4XTsKICAgICAgICAgaWYgKGl0ZW0ubUJ1ZiAhPSBCdWZmZXJJdGVtQ29uc3VtZXI6OklOVkFMSURfQlVGRkVSX1NMT1QgJiYKLSAgICAgICAgICAgICAgICBpdGVtLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUgPT0gaW1nSGFuZGxlKSB7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpdGVtLm1HcmFwaGljQnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKSA9PSBwYXlsb2FkLT5wQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CisKICAgICBpZiAoaXRlbUluZGV4ID09IG1SZWNvcmRpbmdCdWZmZXJzLnNpemUoKSkgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgZmluZCBidWZmZXJfaGFuZGxlX3QgJXAgaW4gbGlzdCBvZiAiCisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBmaW5kIHJldHVybmVkIEFOVyBCdWZmZXIgJXAgaW4gbGlzdCBvZiAiCiAgICAgICAgICAgICAgICAgIm91dHN0YW5kaW5nIGJ1ZmZlcnMiLCBfX0ZVTkNUSU9OX18sIG1JZCwKLSAgICAgICAgICAgICAgICBpbWdIYW5kbGUpOworICAgICAgICAgICAgICAgIHBheWxvYWQtPnBCdWZmZXIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQUxPR1ZWKCIlczogQ2FtZXJhICVkOiBGcmVlaW5nIGJ1ZmZlcl9oYW5kbGVfdCAlcCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgIG1JZCwgaW1nSGFuZGxlKTsKKyAgICBBTE9HVlYoIiVzOiBDYW1lcmEgJWQ6IEZyZWVpbmcgcmV0dXJuZWQgQU5XIGJ1ZmZlciAlcCBpbmRleCAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIG1JZCwgcGF5bG9hZC0+cEJ1ZmZlciwgaXRlbUluZGV4KTsKIAogICAgIHJlcyA9IG1SZWNvcmRpbmdDb25zdW1lci0+cmVsZWFzZUJ1ZmZlcihtUmVjb3JkaW5nQnVmZmVyc1tpdGVtSW5kZXhdKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gZnJlZSByZWNvcmRpbmcgZnJhbWUgIgotICAgICAgICAgICAgICAgICIoYnVmZmVyX2hhbmRsZV90OiAlcCk6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgbUlkLCBpbWdIYW5kbGUsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICIoUmV0dXJuZWQgQU5XIGJ1ZmZlcjogJXApOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG1JZCwgcGF5bG9hZC0+cEJ1ZmZlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbVJlY29yZGluZ0J1ZmZlcnMucmVwbGFjZUF0KGl0ZW1JbmRleCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmgKaW5kZXggMjQ3NDA2Mi4uZTBjYWQzYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuaApAQCAtNDMsNyArNDMsNyBAQAogICAgIFN0cmVhbWluZ1Byb2Nlc3NvcihzcDxDYW1lcmEyQ2xpZW50PiBjbGllbnQpOwogICAgIH5TdHJlYW1pbmdQcm9jZXNzb3IoKTsKIAotICAgIHN0YXR1c190IHNldFByZXZpZXdXaW5kb3coc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93KTsKKyAgICBzdGF0dXNfdCBzZXRQcmV2aWV3V2luZG93KHNwPFN1cmZhY2U+IHdpbmRvdyk7CiAKICAgICBib29sIGhhdmVWYWxpZFByZXZpZXdXaW5kb3coKSBjb25zdDsKIApAQCAtNTMsNiArNTMsOCBAQAogICAgIGludCBnZXRQcmV2aWV3U3RyZWFtSWQoKSBjb25zdDsKIAogICAgIHN0YXR1c190IHNldFJlY29yZGluZ0J1ZmZlckNvdW50KHNpemVfdCBjb3VudCk7CisgICAgc3RhdHVzX3Qgc2V0UmVjb3JkaW5nRm9ybWF0KGludCBmb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlX3QgZGF0YXNwYWNlKTsKKwogICAgIHN0YXR1c190IHVwZGF0ZVJlY29yZGluZ1JlcXVlc3QoY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zKTsKICAgICAvLyBJZiBuZWVkc1VwZGF0ZSBpcyBzZXQgdG8gdHJ1ZSwgYSB1cGRhdGVSZWNvcmRpbmdTdHJlYW0gY2FsbCB3aXRoIHBhcmFtcyB3aWxsIHJlY3JlYXRlCiAgICAgLy8gcmVjb3JkaW5nIHN0cmVhbQpAQCAtMTA2LDcgKzEwOCw3IEBACiAgICAgaW50MzJfdCBtUHJldmlld1JlcXVlc3RJZDsKICAgICBpbnQgbVByZXZpZXdTdHJlYW1JZDsKICAgICBDYW1lcmFNZXRhZGF0YSBtUHJldmlld1JlcXVlc3Q7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gbVByZXZpZXdXaW5kb3c7CisgICAgc3A8U3VyZmFjZT4gbVByZXZpZXdXaW5kb3c7CiAKICAgICAvLyBSZWNvcmRpbmctcmVsYXRlZCBtZW1iZXJzCiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhaXREdXJhdGlvbiA9IDUwMDAwMDAwOyAvLyA1MCBtcwpAQCAtMTE1LDcgKzExNyw3IEBACiAgICAgaW50IG1SZWNvcmRpbmdTdHJlYW1JZDsKICAgICBpbnQgbVJlY29yZGluZ0ZyYW1lQ291bnQ7CiAgICAgc3A8QnVmZmVySXRlbUNvbnN1bWVyPiBtUmVjb3JkaW5nQ29uc3VtZXI7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gIG1SZWNvcmRpbmdXaW5kb3c7CisgICAgc3A8U3VyZmFjZT4gIG1SZWNvcmRpbmdXaW5kb3c7CiAgICAgQ2FtZXJhTWV0YWRhdGEgbVJlY29yZGluZ1JlcXVlc3Q7CiAgICAgc3A8Y2FtZXJhMjo6Q2FtZXJhMkhlYXA+IG1SZWNvcmRpbmdIZWFwOwogCkBAIC0xMjcsNiArMTI5LDE4IEBACiAgICAgVmVjdG9yPEJ1ZmZlckl0ZW0+IG1SZWNvcmRpbmdCdWZmZXJzOwogICAgIHNpemVfdCBtUmVjb3JkaW5nSGVhcEhlYWQsIG1SZWNvcmRpbmdIZWFwRnJlZTsKIAorICAgIHN0YXRpYyBjb25zdCBpbnQga0RlZmF1bHRSZWNvcmRpbmdGb3JtYXQgPQorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgIGludCBtUmVjb3JkaW5nRm9ybWF0OworCisgICAgc3RhdGljIGNvbnN0IGFuZHJvaWRfZGF0YXNwYWNlIGtEZWZhdWx0UmVjb3JkaW5nRGF0YVNwYWNlID0KKyAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfQlQ3MDk7CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgbVJlY29yZGluZ0RhdGFTcGFjZTsKKworICAgIHN0YXRpYyBjb25zdCBpbnQga0RlZmF1bHRSZWNvcmRpbmdHcmFsbG9jVXNhZ2UgPQorICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSOworICAgIGludCBtUmVjb3JkaW5nR3JhbGxvY1VzYWdlOworCiAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKIAogICAgIHN0YXR1c190IHByb2Nlc3NSZWNvcmRpbmdGcmFtZSgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcAppbmRleCAxODZjZTZjLi4wYjc5YjMxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcApAQCAtMTM5LDcgKzEzOSw3IEBACiAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0wsCiAgICAgICAgICAgICBrWnNsQnVmZmVyRGVwdGgpOwogICAgICAgICBtWnNsQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIG1ac2xDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEyQ2xpZW50Ojpac2xDb25zdW1lciIpKTsKKyAgICAgICAgbVpzbENvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTItWnNsQ29uc3VtZXIiKSk7CiAgICAgICAgIG1ac2xXaW5kb3cgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAgICAgfQogCkBAIC0xNDcsNyArMTQ3LDcgQEAKICAgICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHBhcmFtZXRlcnMgaGF2ZSB0byBjaGFuZ2UKICAgICAgICAgdWludDMyX3QgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0OwogICAgICAgICByZXMgPSBkZXZpY2UtPmdldFN0cmVhbUluZm8obVpzbFN0cmVhbUlkLAotICAgICAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAwKTsKKyAgICAgICAgICAgICAgICAmY3VycmVudFdpZHRoLCAmY3VycmVudEhlaWdodCwgMCwgMCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBxdWVyeWluZyBjYXB0dXJlIG91dHB1dCBzdHJlYW0gaW5mbzogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKQEAgLTE4NSw4ICsxODUsOCBAQAogICAgICAgICAgICAgICAgIChpbnQpQ0FNRVJBMl9IQUxfUElYRUxfRk9STUFUX1pTTCA6CiAgICAgICAgICAgICAgICAgKGludClIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1ac2xXaW5kb3csCi0gICAgICAgICAgICAgICAgcGFyYW1zLmZhc3RJbmZvLmFycmF5V2lkdGgsIHBhcmFtcy5mYXN0SW5mby5hcnJheUhlaWdodCwKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCAmbVpzbFN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMuZmFzdEluZm8uYXJyYXlXaWR0aCwgcGFyYW1zLmZhc3RJbmZvLmFycmF5SGVpZ2h0LCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgJm1ac2xTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSBmb3IgWlNMOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgKaW5kZXggNWY1MGQ3Yi4uNTg3MGJkMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaApAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgaW50IG1ac2xTdHJlYW1JZDsKICAgICBpbnQgbVpzbFJlcHJvY2Vzc1N0cmVhbUlkOwogICAgIHNwPEJ1ZmZlckl0ZW1Db25zdW1lcj4gbVpzbENvbnN1bWVyOwotICAgIHNwPEFOYXRpdmVXaW5kb3c+ICAgICAgbVpzbFdpbmRvdzsKKyAgICBzcDxTdXJmYWNlPiAgICAgICAgICAgIG1ac2xXaW5kb3c7CiAKICAgICBzdHJ1Y3QgWnNsUGFpciB7CiAgICAgICAgIEJ1ZmZlckl0ZW0gYnVmZmVyOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuY3BwCmluZGV4IDQ3MGE2ZDYuLjY5NjIwYWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5jcHAKQEAgLTE1MCw3ICsxNTAsNyBAQAogICAgICAgICAvLyBDaGVjayBpZiBzdHJlYW0gcGFyYW1ldGVycyBoYXZlIHRvIGNoYW5nZQogICAgICAgICB1aW50MzJfdCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQ7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtWnNsU3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDApOworICAgICAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAwLCAwKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIGNhcHR1cmUgb3V0cHV0IHN0cmVhbSBpbmZvOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCmluZGV4IDhmMmQzY2MuLjg0YzBjM2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKQEAgLTY1LDEzICs2NSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VydmljZVBpZCkgOgogICAgIENhbWVyYTJDbGllbnRCYXNlKGNhbWVyYVNlcnZpY2UsIHJlbW90ZUNhbGxiYWNrLCBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCisgICAgbUlucHV0U3RyZWFtKCksCiAgICAgbVJlcXVlc3RJZENvdW50ZXIoMCkgewogCiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HSSgiQ2FtZXJhRGV2aWNlQ2xpZW50ICVkOiBPcGVuZWQiLCBjYW1lcmFJZCk7CiB9CiAKLXN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6aW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6aW5pdGlhbGl6ZShDYW1lcmFNb2R1bGUgKm1vZHVsZSkKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKQEAgLTEzNCw2ICsxMzUsMTUgQEAKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBTZW50IG51bGwgcmVxdWVzdC4iLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QtPm1Jc1JlcHJvY2VzcykgeworICAgICAgICAgICAgaWYgKCFtSW5wdXRTdHJlYW0uY29uZmlndXJlZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBubyBpbnB1dCBzdHJlYW0gaXMgY29uZmlndXJlZC4iLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtaW5nKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IHN0cmVhbWluZyByZXByb2Nlc3MgcmVxdWVzdHMgbm90IHN1cHBvcnRlZC4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YShyZXF1ZXN0LT5tTWV0YWRhdGEpOwpAQCAtMTgyLDYgKzE5MiwxMCBAQAogICAgICAgICBtZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TLCAmb3V0cHV0U3RyZWFtSWRzWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtSWRzLnNpemUoKSk7CiAKKyAgICAgICAgaWYgKHJlcXVlc3QtPm1Jc1JlcHJvY2VzcykgeworICAgICAgICAgICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9JTlBVVF9TVFJFQU1TLCAmbUlucHV0U3RyZWFtLmlkLCAxKTsKKyAgICAgICAgfQorCiAgICAgICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSUQsICZyZXF1ZXN0SWQsIC8qc2l6ZSovMSk7CiAgICAgICAgIGxvb3BDb3VudGVyKys7IC8vIGxvb3BDb3VudGVyIHN0YXJ0cyBmcm9tIDEKICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENyZWF0aW5nIHJlcXVlc3Qgd2l0aCBJRCAlZCAoJWQgb2YgJXp1KSIsCkBAIC0yNTUsMTMgKzI2OSwzMyBAQAogCiBzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmJlZ2luQ29uZmlndXJlKCkgewogICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzLgotICAgIEFMT0dFKCIlczogTm90IGltcGxlbWVudGVkIHlldC4iLCBfX0ZVTkNUSU9OX18pOworICAgIEFMT0dWKCIlczogTm90IGltcGxlbWVudGVkIHlldC4iLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjplbmRDb25maWd1cmUoKSB7Ci0gICAgQUxPR1YoIiVzOiBlbmRpbmcgY29uZmlndXJlICglenUgc3RyZWFtcykiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtU3RyZWFtTWFwLnNpemUoKSk7CitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmVuZENvbmZpZ3VyZShib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpIHsKKyAgICBBTE9HVigiJXM6IGVuZGluZyBjb25maWd1cmUgKCVkIGlucHV0IHN0cmVhbSwgJXp1IG91dHB1dCBzdHJlYW1zKSIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JbnB1dFN0cmVhbS5jb25maWd1cmVkID8gMSA6IDAsIG1TdHJlYW1NYXAuc2l6ZSgpKTsKKworICAgIC8vIFNhbml0aXplIHRoZSBoaWdoIHNwZWVkIHNlc3Npb24gYWdhaW5zdCBuZWNlc3NhcnkgY2FwYWJpbGl0eSBiaXQuCisgICAgaWYgKGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpIHsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgc3RhdGljSW5mbyA9IG1EZXZpY2UtPmluZm8oKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgICAgICBib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWRTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5LmRhdGEudThbaV07CisgICAgICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19DT05TVFJBSU5FRF9ISUdIX1NQRUVEX1ZJREVPKSB7CisgICAgICAgICAgICAgICAgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZFN1cHBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpc0NvbnN0cmFpbmVkSGlnaFNwZWVkU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVHJ5IHRvIGNyZWF0ZSBhIGNvbnN0cmFpbmVkIGhpZ2ggc3BlZWQgY29uZmlndXJhdGlvbiBvbiBhIGRldmljZSIKKyAgICAgICAgICAgICAgICAgICAgIiB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBpdC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CiAKICAgICBzdGF0dXNfdCByZXM7CiAgICAgaWYgKCAocmVzID0gY2hlY2tQaWQoX19GVU5DVElPTl9fKSApICE9IE9LKSByZXR1cm4gcmVzOwpAQCAtMjcwLDcgKzMwNCw3IEBACiAKICAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKIAotICAgIHJldHVybiBtRGV2aWNlLT5jb25maWd1cmVTdHJlYW1zKCk7CisgICAgcmV0dXJuIG1EZXZpY2UtPmNvbmZpZ3VyZVN0cmVhbXMoaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCk7CiB9CiAKIHN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6ZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCkgewpAQCAtMjg0LDE5ICszMTgsMjUgQEAKIAogICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOwogCi0gICAgLy8gR3VhcmQgYWdhaW5zdCB0cnlpbmcgdG8gZGVsZXRlIG5vbi1jcmVhdGVkIHN0cmVhbXMKKyAgICBib29sIGlzSW5wdXQgPSBmYWxzZTsKICAgICBzc2l6ZV90IGluZGV4ID0gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtTWFwLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChzdHJlYW1JZCA9PSBtU3RyZWFtTWFwLnZhbHVlQXQoaSkpIHsKLSAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQogCi0gICAgaWYgKGluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVkOiBJbnZhbGlkIHN0cmVhbSBJRCAoJWQpIHNwZWNpZmllZCwgbm8gc3RyZWFtICIKLSAgICAgICAgICAgICAgImNyZWF0ZWQgeWV0IiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVhbUlkKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAobUlucHV0U3RyZWFtLmNvbmZpZ3VyZWQgJiYgbUlucHV0U3RyZWFtLmlkID09IHN0cmVhbUlkKSB7CisgICAgICAgIGlzSW5wdXQgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgdHJ5aW5nIHRvIGRlbGV0ZSBub24tY3JlYXRlZCBzdHJlYW1zCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0cmVhbU1hcC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKHN0cmVhbUlkID09IG1TdHJlYW1NYXAudmFsdWVBdChpKSkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJWQ6IEludmFsaWQgc3RyZWFtIElEICglZCkgc3BlY2lmaWVkLCBubyBzdHJlYW0gIgorICAgICAgICAgICAgICAgICAgImNyZWF0ZWQgeWV0IiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBBbHNvIHJldHVybnMgQkFEX1ZBTFVFIGlmIHN0cmVhbSBJRCB3YXMgbm90IHZhbGlkCkBAIC0zMDcsMjQgKzM0NywyNyBAQAogICAgICAgICAgICAgICAiIGFscmVhZHkgY2hlY2tlZCBhbmQgdGhlIHN0cmVhbSBJRCAoJWQpIHNob3VsZCBiZSB2YWxpZC4iLAogICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZWFtSWQpOwogICAgIH0gZWxzZSBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIG1TdHJlYW1NYXAucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0KKyAgICAgICAgaWYgKGlzSW5wdXQpIHsKKyAgICAgICAgICAgIG1JbnB1dFN0cmVhbS5jb25maWd1cmVkID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3RyZWFtTWFwLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjcmVhdGVTdHJlYW0oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBidWZmZXJQcm9kdWNlcikKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6Y3JlYXRlU3RyZWFtKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm91dHB1dENvbmZpZ3VyYXRpb24pCiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigiJXMgKHcgPSAlZCwgaCA9ICVkLCBmID0gMHgleCkiLCBfX0ZVTkNUSU9OX18sIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CiAKICAgICBzdGF0dXNfdCByZXM7CiAgICAgaWYgKCAocmVzID0gY2hlY2tQaWQoX19GVU5DVElPTl9fKSApICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogCisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlciA9IG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CiAgICAgaWYgKGJ1ZmZlclByb2R1Y2VyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIiVzOiBidWZmZXJQcm9kdWNlciBtdXN0IG5vdCBiZSBudWxsIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTM2OCwyNSArNDExLDMzIEBACiAgICAgICAgICAgICAoY29uc3VtZXJVc2FnZSAmIGFsbG93ZWRGbGFncykgIT0gMDsKIAogICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclByb2R1Y2VyKTsKLSAgICBzcDxBTmF0aXZlV2luZG93PiBhbncgPSBuZXcgU3VyZmFjZShidWZmZXJQcm9kdWNlciwgdXNlQXN5bmMpOworICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBuZXcgU3VyZmFjZShidWZmZXJQcm9kdWNlciwgdXNlQXN5bmMpOworICAgIEFOYXRpdmVXaW5kb3cgKmFudyA9IHN1cmZhY2UuZ2V0KCk7CiAKLSAgICAvLyBUT0RPOiByZW1vdmUgdyxoLGYgc2luY2Ugd2UgYXJlIGlnbm9yaW5nIHRoZW0KKyAgICBpbnQgd2lkdGgsIGhlaWdodCwgZm9ybWF0OworICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZTsKIAotICAgIGlmICgocmVzID0gYW53LT5xdWVyeShhbncuZ2V0KCksIE5BVElWRV9XSU5ET1dfV0lEVEgsICZ3aWR0aCkpICE9IE9LKSB7CisgICAgaWYgKChyZXMgPSBhbnctPnF1ZXJ5KGFudywgTkFUSVZFX1dJTkRPV19XSURUSCwgJndpZHRoKSkgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIHdpZHRoIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICBtQ2FtZXJhSWQpOwogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KLSAgICBpZiAoKHJlcyA9IGFudy0+cXVlcnkoYW53LmdldCgpLCBOQVRJVkVfV0lORE9XX0hFSUdIVCwgJmhlaWdodCkpICE9IE9LKSB7CisgICAgaWYgKChyZXMgPSBhbnctPnF1ZXJ5KGFudywgTkFUSVZFX1dJTkRPV19IRUlHSFQsICZoZWlnaHQpKSAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgaGVpZ2h0IiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICBtQ2FtZXJhSWQpOwogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KLSAgICBpZiAoKHJlcyA9IGFudy0+cXVlcnkoYW53LmdldCgpLCBOQVRJVkVfV0lORE9XX0ZPUk1BVCwgJmZvcm1hdCkpICE9IE9LKSB7CisgICAgaWYgKChyZXMgPSBhbnctPnF1ZXJ5KGFudywgTkFUSVZFX1dJTkRPV19GT1JNQVQsICZmb3JtYXQpKSAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgZm9ybWF0IiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICBtQ2FtZXJhSWQpOwogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KKyAgICBpZiAoKHJlcyA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX0RFRkFVTFRfREFUQVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50Kj4oJmRhdGFTcGFjZSkpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgZGF0YVNwYWNlIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICBtQ2FtZXJhSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIAogICAgIC8vIEZJWE1FOiByZW1vdmUgdGhpcyBvdmVycmlkZSBzaW5jZSB0aGUgZGVmYXVsdCBmb3JtYXQgc2hvdWxkIGJlCiAgICAgLy8gICAgICAgSU1QTEVNRU5UQVRJT05fREVGSU5FRC4gYi85NDg3NDgyCkBAIC0zOTksMTQgKzQ1MCwxNyBAQAogCiAgICAgLy8gUm91bmQgZGltZW5zaW9ucyB0byB0aGUgbmVhcmVzdCBkaW1lbnNpb25zIGF2YWlsYWJsZSBmb3IgdGhpcyBmb3JtYXQKICAgICBpZiAoZmxleGlibGVDb25zdW1lciAmJiAhQ2FtZXJhRGV2aWNlQ2xpZW50Ojpyb3VuZEJ1ZmZlckRpbWVuc2lvbk5lYXJlc3Qod2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIGZvcm1hdCwgbURldmljZS0+aW5mbygpLCAvKm91dCovJndpZHRoLCAvKm91dCovJmhlaWdodCkpIHsKKyAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCBtRGV2aWNlLT5pbmZvKCksIC8qb3V0Ki8md2lkdGgsIC8qb3V0Ki8maGVpZ2h0KSkgewogICAgICAgICBBTE9HRSgiJXM6IE5vIHN0cmVhbSBjb25maWd1cmF0aW9ucyB3aXRoIHRoZSBmb3JtYXQgJSN4IGRlZmluZWQsIGZhaWxlZCB0byBjcmVhdGUgc3RyZWFtLiIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmb3JtYXQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIGludCBzdHJlYW1JZCA9IC0xOwotICAgIHJlcyA9IG1EZXZpY2UtPmNyZWF0ZVN0cmVhbShhbncsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgJnN0cmVhbUlkKTsKKyAgICByZXMgPSBtRGV2aWNlLT5jcmVhdGVTdHJlYW0oc3VyZmFjZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBkYXRhU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0Um90YXRpb24oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1JZCk7CiAKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIG1TdHJlYW1NYXAuYWRkKGJpbmRlciwgc3RyZWFtSWQpOwpAQCAtNDQwLDExICs0OTQsNjUgQEAKIH0KIAogCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmNyZWF0ZUlucHV0U3RyZWFtKGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgaW50IGZvcm1hdCkgeworCisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiJXMgKHcgPSAlZCwgaCA9ICVkLCBmID0gMHgleCkiLCBfX0ZVTkNUSU9OX18sIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CisKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKCAocmVzID0gY2hlY2tQaWQoX19GVU5DVElPTl9fKSApICE9IE9LKSByZXR1cm4gcmVzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOworICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOworCisgICAgaWYgKG1JbnB1dFN0cmVhbS5jb25maWd1cmVkKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBBbHJlYWR5IGhhcyBhbiBpbnB1dCBzdHJlYW0gIgorICAgICAgICAgICAgICAgICIgY29uZmlndXJhdGlvbi4gKElEICV6ZCkiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwKKyAgICAgICAgICAgICAgICBtSW5wdXRTdHJlYW0uaWQpOworICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgfQorCisgICAgaW50IHN0cmVhbUlkID0gLTE7CisgICAgcmVzID0gbURldmljZS0+Y3JlYXRlSW5wdXRTdHJlYW0od2lkdGgsIGhlaWdodCwgZm9ybWF0LCAmc3RyZWFtSWQpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgbUlucHV0U3RyZWFtLmNvbmZpZ3VyZWQgPSB0cnVlOworICAgICAgICBtSW5wdXRTdHJlYW0ud2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUlucHV0U3RyZWFtLmhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbUlucHV0U3RyZWFtLmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgbUlucHV0U3RyZWFtLmlkID0gc3RyZWFtSWQ7CisKKyAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN1Y2Nlc3NmdWxseSBjcmVhdGVkIGEgbmV3IGlucHV0IHN0cmVhbSBJRCAlZCIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlYW1JZCk7CisKKyAgICAgICAgcmV0dXJuIHN0cmVhbUlkOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6Z2V0SW5wdXRCdWZmZXJQcm9kdWNlcigKKyAgICAgICAgLypvdXQqL3NwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcikgeworICAgIHN0YXR1c190IHJlczsKKyAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CisKKyAgICBpZiAocHJvZHVjZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKKyAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKKworICAgIHJldHVybiBtRGV2aWNlLT5nZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKHByb2R1Y2VyKTsKK30KKwogYm9vbCBDYW1lcmFEZXZpY2VDbGllbnQ6OnJvdW5kQnVmZmVyRGltZW5zaW9uTmVhcmVzdChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgaW50MzJfdCBmb3JtYXQsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvLAorICAgICAgICBpbnQzMl90IGZvcm1hdCwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbywKICAgICAgICAgLypvdXQqL2ludDMyX3QqIG91dFdpZHRoLCAvKm91dCovaW50MzJfdCogb3V0SGVpZ2h0KSB7CiAKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgc3RyZWFtQ29uZmlncyA9CisgICAgICAgICAgICAoZGF0YVNwYWNlID09IEhBTF9EQVRBU1BBQ0VfREVQVEgpID8KKyAgICAgICAgICAgIGluZm8uZmluZChBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMpIDoKICAgICAgICAgICAgIGluZm8uZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKIAogICAgIGludDMyX3QgYmVzdFdpZHRoID0gLTE7CkBAIC01ODAsNiArNjg4LDY4IEBACiAgICAgcmV0dXJuIG1EZXZpY2UtPmZsdXNoKGxhc3RGcmFtZU51bWJlcik7CiB9CiAKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6cHJlcGFyZShpbnQgc3RyZWFtSWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CisKKyAgICAvLyBHdWFyZCBhZ2FpbnN0IHRyeWluZyB0byBwcmVwYXJlIG5vbi1jcmVhdGVkIHN0cmVhbXMKKyAgICBzc2l6ZV90IGluZGV4ID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtTWFwLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChzdHJlYW1JZCA9PSBtU3RyZWFtTWFwLnZhbHVlQXQoaSkpIHsKKyAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVkOiBJbnZhbGlkIHN0cmVhbSBJRCAoJWQpIHNwZWNpZmllZCwgbm8gc3RyZWFtICIKKyAgICAgICAgICAgICAgImNyZWF0ZWQgeWV0IiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBBbHNvIHJldHVybnMgQkFEX1ZBTFVFIGlmIHN0cmVhbSBJRCB3YXMgbm90IHZhbGlkLCBvciBzdHJlYW0gYWxyZWFkeQorICAgIC8vIGhhcyBiZWVuIHVzZWQKKyAgICByZXMgPSBtRGV2aWNlLT5wcmVwYXJlKHN0cmVhbUlkKTsKKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6dGVhckRvd24oaW50IHN0cmVhbUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgaWYgKCAocmVzID0gY2hlY2tQaWQoX19GVU5DVElPTl9fKSApICE9IE9LKSByZXR1cm4gcmVzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOworCisgICAgLy8gR3VhcmQgYWdhaW5zdCB0cnlpbmcgdG8gcHJlcGFyZSBub24tY3JlYXRlZCBzdHJlYW1zCisgICAgc3NpemVfdCBpbmRleCA9IE5BTUVfTk9UX0ZPVU5EOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0cmVhbU1hcC5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoc3RyZWFtSWQgPT0gbVN0cmVhbU1hcC52YWx1ZUF0KGkpKSB7CisgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBBTE9HVygiJXM6IENhbWVyYSAlZDogSW52YWxpZCBzdHJlYW0gSUQgKCVkKSBzcGVjaWZpZWQsIG5vIHN0cmVhbSAiCisgICAgICAgICAgICAgICJjcmVhdGVkIHlldCIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlYW1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQWxzbyByZXR1cm5zIEJBRF9WQUxVRSBpZiBzdHJlYW0gSUQgd2FzIG5vdCB2YWxpZCBvciBpZiB0aGUgc3RyZWFtIGlzIGluCisgICAgLy8gdXNlCisgICAgcmVzID0gbURldmljZS0+dGVhckRvd24oc3RyZWFtSWQpOworCisgICAgcmV0dXJuIHJlczsKK30KKwogc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewogICAgIHJldHVybiBCYXNpY0NsaWVudDo6ZHVtcChmZCwgYXJncyk7CiB9CkBAIC01OTAsMTkgKzc2MCwyMyBAQAogICAgICAgICAgICAgbUNhbWVyYUlkLAogICAgICAgICAgICAgKGdldFJlbW90ZUNhbGxiYWNrKCkgIT0gTlVMTCA/CiAgICAgICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGdldFJlbW90ZUNhbGxiYWNrKCkpLmdldCgpIDogTlVMTCkgKTsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIEN1cnJlbnQgY2xpZW50OiAlcyAoUElEICVkLCBVSUQgJXUpXG4iLAotICAgICAgICAgICAgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpLAotICAgICAgICAgICAgbUNsaWVudFBpZCwgbUNsaWVudFVpZCk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBDdXJyZW50IGNsaWVudCBVSUQgJXVcbiIsIG1DbGllbnRVaWQpOwogCiAgICAgcmVzdWx0LmFwcGVuZCgiICBTdGF0ZTpcbiIpOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICBSZXF1ZXN0IElEIGNvdW50ZXI6ICVkXG4iLCBtUmVxdWVzdElkQ291bnRlcik7CisgICAgaWYgKG1JbnB1dFN0cmVhbS5jb25maWd1cmVkKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICBDdXJyZW50IGlucHV0IHN0cmVhbSBJRDogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIG1JbnB1dFN0cmVhbS5pZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgIE5vIGlucHV0IHN0cmVhbSBjb25maWd1cmVkLlxuIik7CisgICAgfQogICAgIGlmICghbVN0cmVhbU1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgIEN1cnJlbnQgc3RyZWFtIElEczpcbiIpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgQ3VycmVudCBvdXRwdXQgc3RyZWFtIElEczpcbiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1NYXAuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICAgIFN0cmVhbSAlZFxuIiwgbVN0cmVhbU1hcC52YWx1ZUF0KGkpKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICBObyBzdHJlYW1zIGNvbmZpZ3VyZWQuXG4iKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgIE5vIG91dHB1dCBzdHJlYW1zIGNvbmZpZ3VyZWQuXG4iKTsKICAgICB9CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgLy8gVE9ETzogcHJpbnQgZHluYW1pYy9yZXF1ZXN0IHNlY3Rpb24gZnJvbSBtb3N0IHJlY2VudCByZXF1ZXN0cwpAQCAtNjM5LDggKzgxMywxMyBAQAogICAgIH0KIH0KIAotLy8gVE9ETzogcmVmYWN0b3IgdGhlIGNvZGUgYmVsb3cgdGhpcyB3aXRoIElQcm9DYW1lcmFVc2VyLgotLy8gaXQncyAxMDAlIGNvcHktcGFzdGVkLCBzbyBsZXRzIG5vdCBjaGFuZ2UgaXQgcmlnaHQgbm93IHRvIG1ha2UgaXQgZWFzaWVyLgordm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om5vdGlmeVByZXBhcmVkKGludCBzdHJlYW1JZCkgeworICAgIC8vIFRocmVhZCBzYWZlLiBEb24ndCBib3RoZXIgbG9ja2luZy4KKyAgICBzcDxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiByZW1vdGVDYiA9IGdldFJlbW90ZUNhbGxiYWNrKCk7CisgICAgaWYgKHJlbW90ZUNiICE9IDApIHsKKyAgICAgICAgcmVtb3RlQ2ItPm9uUHJlcGFyZWQoc3RyZWFtSWQpOworICAgIH0KK30KIAogdm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6OmRldGFjaERldmljZSgpIHsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm47CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAppbmRleCBiYmVkYjcwLi40ODZlNjhiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KIAogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKICNpbmNsdWRlICJjb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmgiCkBAIC0yNiw4ICsyNyw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IENhbWVyYURldmljZUNsaWVudEJhc2UgOgotICAgICAgICBwdWJsaWMgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQsIHB1YmxpYyBCbkNhbWVyYURldmljZVVzZXIKK3N0cnVjdCBDYW1lcmFEZXZpY2VDbGllbnRCYXNlIDogcHVibGljIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50LCBwdWJsaWMgQm5DYW1lcmFEZXZpY2VVc2VyCiB7CiAgICAgdHlwZWRlZiBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIFRDYW1DYWxsYmFja3M7CiAKQEAgLTc4LDE2ICs3OCwxOSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBiZWdpbkNvbmZpZ3VyZSgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBlbmRDb25maWd1cmUoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuZENvbmZpZ3VyZShib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQgPSBmYWxzZSk7CiAKICAgICAvLyBSZXR1cm5zIC1FQlVTWSBpZiBkZXZpY2UgaXMgbm90IGlkbGUKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgY3JlYXRlU3RyZWFtKAotICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBjcmVhdGVTdHJlYW0oY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3V0cHV0Q29uZmlndXJhdGlvbik7CisKKyAgICAvLyBDcmVhdGUgYW4gaW5wdXQgc3RyZWFtIG9mIHdpZHRoLCBoZWlnaHQsIGFuZCBmb3JtYXQuCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGNyZWF0ZUlucHV0U3RyZWFtKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCk7CisKKyAgICAvLyBHZXQgdGhlIGJ1ZmZlciBwcm9kdWNlciBvZiB0aGUgaW5wdXQgc3RyZWFtCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGdldElucHV0QnVmZmVyUHJvZHVjZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9zcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpOwogCiAgICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCBvYmplY3QgZnJvbSBhIHRlbXBsYXRlLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwKQEAgLTEwNSw2ICsxMDgsMTIgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZmx1c2goLypvdXQqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAorICAgIC8vIFByZXBhcmUgc3RyZWFtIGJ5IHByZWFsbG9jYXRpbmcgaXRzIGJ1ZmZlcnMKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgcHJlcGFyZShpbnQgc3RyZWFtSWQpOworCisgICAgLy8gVGVhciBkb3duIHN0cmVhbSByZXNvdXJjZXMgYnkgZnJlZWluZyBpdHMgdW51c2VkIGJ1ZmZlcnMKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgdGVhckRvd24oaW50IHN0cmVhbUlkKTsKKwogICAgIC8qKgogICAgICAqIEludGVyZmFjZSB1c2VkIGJ5IENhbWVyYVNlcnZpY2UKICAgICAgKi8KQEAgLTExOSw3ICsxMjgsNyBAQAogICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQpOwogICAgIHZpcnR1YWwgfkNhbWVyYURldmljZUNsaWVudCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBpbml0aWFsaXplKENhbWVyYU1vZHVsZSAqbW9kdWxlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKQEAgLTEzMyw2ICsxNDIsNyBAQAogICAgIHZpcnR1YWwgdm9pZCBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOwogICAgIHZpcnR1YWwgdm9pZCBub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywgbnNlY3NfdCB0aW1lc3RhbXApOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlQcmVwYXJlZChpbnQgc3RyZWFtSWQpOwogCiAgICAgLyoqCiAgICAgICogSW50ZXJmYWNlIHVzZWQgYnkgaW5kZXBlbmRlbnQgY29tcG9uZW50cyBvZiBDYW1lcmFEZXZpY2VDbGllbnQuCkBAIC0xNjEsMTQgKzE3MSwyMyBAQAogCiAgICAgLy8gRmluZCB0aGUgY2xvc2VzdCBkaW1lbnNpb25zIGZvciBhIGdpdmVuIGZvcm1hdCBpbiBhdmFpbGFibGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdpdGgKICAgICAvLyBhIHdpZHRoIDw9IFJPVU5ESU5HX1dJRFRIX0NBUAotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IFJPVU5ESU5HX1dJRFRIX0NBUCA9IDEwODA7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3QgUk9VTkRJTkdfV0lEVEhfQ0FQID0gMTkyMDsKICAgICBzdGF0aWMgYm9vbCByb3VuZEJ1ZmZlckRpbWVuc2lvbk5lYXJlc3QoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgZm9ybWF0LAotICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8sIC8qb3V0Ki9pbnQzMl90KiBvdXRXaWR0aCwgLypvdXQqL2ludDMyX3QqIG91dEhlaWdodCk7CisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvLAorICAgICAgICAgICAgLypvdXQqL2ludDMyX3QqIG91dFdpZHRoLCAvKm91dCovaW50MzJfdCogb3V0SGVpZ2h0KTsKIAotICAgIC8vIElHcmFwaGljc0J1ZmZlclByb2R1Y2VyIGJpbmRlciAtPiBTdHJlYW0gSUQKKyAgICAvLyBJR3JhcGhpY3NCdWZmZXJQcm9kdWNlciBiaW5kZXIgLT4gU3RyZWFtIElEIGZvciBvdXRwdXQgc3RyZWFtcwogICAgIEtleWVkVmVjdG9yPHNwPElCaW5kZXI+LCBpbnQ+IG1TdHJlYW1NYXA7CiAKLSAgICAvLyBTdHJlYW0gSUQKKyAgICBzdHJ1Y3QgSW5wdXRTdHJlYW1Db25maWd1cmF0aW9uIHsKKyAgICAgICAgYm9vbCBjb25maWd1cmVkOworICAgICAgICBpbnQzMl90IHdpZHRoOworICAgICAgICBpbnQzMl90IGhlaWdodDsKKyAgICAgICAgaW50MzJfdCBmb3JtYXQ7CisgICAgICAgIGludDMyX3QgaWQ7CisgICAgfSBtSW5wdXRTdHJlYW07CisKKyAgICAvLyBSZXF1ZXN0IElECiAgICAgVmVjdG9yPGludD4gbVN0cmVhbWluZ1JlcXVlc3RMaXN0OwogCiAgICAgaW50MzJfdCBtUmVxdWVzdElkQ291bnRlcjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjQ1YzdkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiUHJvQ2FtZXJhMkNsaWVudCIKLSNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KLQotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotCi0jaW5jbHVkZSAiYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmgiCi0jaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgbmFtZXNwYWNlIGNhbWVyYTI7Ci0KLS8vIEludGVyZmFjZSB1c2VkIGJ5IENhbWVyYVNlcnZpY2UKLQotUHJvQ2FtZXJhMkNsaWVudDo6UHJvQ2FtZXJhMkNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVByb0NhbWVyYUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VydmljZVBpZCkgOgotICAgIENhbWVyYTJDbGllbnRCYXNlKGNhbWVyYVNlcnZpY2UsIHJlbW90ZUNhbGxiYWNrLCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICBjYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCkKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dJKCJQcm9DYW1lcmEgJWQ6IE9wZW5lZCIsIGNhbWVyYUlkKTsKLQotICAgIG1FeGNsdXNpdmVMb2NrID0gZmFsc2U7Ci19Ci0KLXN0YXR1c190IFByb0NhbWVyYTJDbGllbnQ6OmluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpCi17Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzdGF0dXNfdCByZXM7Ci0KLSAgICByZXMgPSBDYW1lcmEyQ2xpZW50QmFzZTo6aW5pdGlhbGl6ZShtb2R1bGUpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBTdHJpbmc4IHRocmVhZE5hbWU7Ci0gICAgbUZyYW1lUHJvY2Vzc29yID0gbmV3IEZyYW1lUHJvY2Vzc29yQmFzZShtRGV2aWNlKTsKLSAgICB0aHJlYWROYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJQQzItJWQtRnJhbWVQcm9jIiwgbUNhbWVyYUlkKTsKLSAgICBtRnJhbWVQcm9jZXNzb3ItPnJ1bih0aHJlYWROYW1lLnN0cmluZygpKTsKLQotICAgIG1GcmFtZVByb2Nlc3Nvci0+cmVnaXN0ZXJMaXN0ZW5lcihGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUlOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUFYX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxpc3RlbmVyKi90aGlzKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotUHJvQ2FtZXJhMkNsaWVudDo6flByb0NhbWVyYTJDbGllbnQoKSB7Ci19Ci0KLXN0YXR1c190IFByb0NhbWVyYTJDbGllbnQ6OmV4Y2x1c2l2ZVRyeUxvY2soKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwotICAgIFNoYXJlZENhbWVyYUNhbGxiYWNrczo6TG9jayBsKG1TaGFyZWRDYW1lcmFDYWxsYmFja3MpOwotCi0gICAgaWYgKCFtRGV2aWNlLmdldCgpKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0KLSAgICBpZiAoIW1FeGNsdXNpdmVMb2NrKSB7Ci0gICAgICAgIG1FeGNsdXNpdmVMb2NrID0gdHJ1ZTsKLQotICAgICAgICBpZiAobVJlbW90ZUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1SZW1vdGVDYWxsYmFjay0+b25Mb2NrU3RhdHVzQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9DYW1lcmFDYWxsYmFja3M6OkxPQ0tfQUNRVUlSRUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQUxPR1YoIiVzOiBleGNsdXNpdmUgbG9jayBhY3F1aXJlZCIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8vIFRPRE86IGhhdmUgYSBQRVJNSVNTSU9OX0RFTklFRCBjYXNlIGZvciB3aGVuIHNvbWVvbmUgZWxzZSBvd25zIHRoZSBsb2NrCi0KLSAgICAvLyBkb24ndCBhbGxvdyByZWN1cnNpdmUgbG9ja2luZwotICAgIEFMT0dXKCIlczogZXhjbHVzaXZlIGxvY2sgYWxyZWFkeSBleGlzdHMgLSByZWN1cnNpdmUgbG9ja2luZyBpcyBub3QiCi0gICAgICAgICAgImFsbG93ZWQiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwotfQotCi1zdGF0dXNfdCBQcm9DYW1lcmEyQ2xpZW50OjpleGNsdXNpdmVMb2NrKCkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKLSAgICBTaGFyZWRDYW1lcmFDYWxsYmFja3M6OkxvY2sgbChtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzKTsKLQotICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotCi0gICAgLyoqCi0gICAgICogVE9ETzogdGhpcyBzaG91bGQgYXN5bmNocm9ub3VzbHkgJ3dhaXQnIHVudGlsIHRoZSBsb2NrIGJlY29tZXMgYXZhaWxhYmxlCi0gICAgICogaWYgYW5vdGhlciBjbGllbnQgYWxyZWFkeSBoYXMgYW4gZXhjbHVzaXZlIGxvY2suCi0gICAgICoKLSAgICAgKiBvbmNlIHdlIGhhdmUgcHJvcGVyIHNoYXJpbmcgc3VwcG9ydCB0aGlzIHdpbGwgbmVlZCB0byBkbwotICAgICAqIG1vcmUgdGhhbiBqdXN0IHJldHVybiBpbW1lZGlhdGVseQotICAgICAqLwotICAgIGlmICghbUV4Y2x1c2l2ZUxvY2spIHsKLSAgICAgICAgbUV4Y2x1c2l2ZUxvY2sgPSB0cnVlOwotCi0gICAgICAgIGlmIChtUmVtb3RlQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgbVJlbW90ZUNhbGxiYWNrLT5vbkxvY2tTdGF0dXNDaGFuZ2VkKElQcm9DYW1lcmFDYWxsYmFja3M6OkxPQ0tfQUNRVUlSRUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQUxPR1YoIiVzOiBleGNsdXNpdmUgbG9jayBhY3F1aXJlZCIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8vIGRvbid0IGFsbG93IHJlY3Vyc2l2ZSBsb2NraW5nCi0gICAgQUxPR1coIiVzOiBleGNsdXNpdmUgbG9jayBhbHJlYWR5IGV4aXN0cyAtIHJlY3Vyc2l2ZSBsb2NraW5nIGlzIG5vdCBhbGxvd2VkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgX19GVU5DVElPTl9fKTsKLSAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7Ci19Ci0KLXN0YXR1c190IFByb0NhbWVyYTJDbGllbnQ6OmV4Y2x1c2l2ZVVubG9jaygpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7Ci0gICAgU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzOjpMb2NrIGwobVNoYXJlZENhbWVyYUNhbGxiYWNrcyk7Ci0KLSAgICAvLyBkb24ndCBhbGxvdyB1bmxvY2tpbmcgaWYgd2UgaGF2ZSBubyBsb2NrCi0gICAgaWYgKCFtRXhjbHVzaXZlTG9jaykgewotICAgICAgICBBTE9HVygiJXM6IGNhbm5vdCB1bmxvY2ssIG5vIGxvY2sgd2FzIGhlbGQgaW4gdGhlIGZpcnN0IHBsYWNlIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBtRXhjbHVzaXZlTG9jayA9IGZhbHNlOwotICAgIGlmIChtUmVtb3RlQ2FsbGJhY2sgIT0gTlVMTCApIHsKLSAgICAgICAgbVJlbW90ZUNhbGxiYWNrLT5vbkxvY2tTdGF0dXNDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb0NhbWVyYUNhbGxiYWNrczo6TE9DS19SRUxFQVNFRCk7Ci0gICAgfQotICAgIEFMT0dWKCIlczogZXhjbHVzaXZlIGxvY2sgcmVsZWFzZWQiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1ib29sIFByb0NhbWVyYTJDbGllbnQ6Omhhc0V4Y2x1c2l2ZUxvY2soKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwotICAgIHJldHVybiBtRXhjbHVzaXZlTG9jazsKLX0KLQotdm9pZCBQcm9DYW1lcmEyQ2xpZW50OjpvbkV4Y2x1c2l2ZUxvY2tTdG9sZW4oKSB7Ci0gICAgQUxPR1YoIiVzOiBQcm9DbGllbnQgbG9zdCBleGNsdXNpdml0eSAoaWQgJWQpIiwKLSAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7Ci0gICAgU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzOjpMb2NrIGwobVNoYXJlZENhbWVyYUNhbGxiYWNrcyk7Ci0KLSAgICBpZiAobUV4Y2x1c2l2ZUxvY2sgJiYgbVJlbW90ZUNhbGxiYWNrLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgbVJlbW90ZUNhbGxiYWNrLT5vbkxvY2tTdGF0dXNDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb0NhbWVyYUNhbGxiYWNrczo6TE9DS19TVE9MRU4pOwotICAgIH0KLQotICAgIG1FeGNsdXNpdmVMb2NrID0gZmFsc2U7Ci0KLSAgICAvL1RPRE86IHdlIHNob3VsZCBub3QgbmVlZCB0byBkZXRhY2ggdGhlIGRldmljZSwgbWVyZWx5IHJlc2V0IGl0LgotICAgIGRldGFjaERldmljZSgpOwotfQotCi1zdGF0dXNfdCBQcm9DYW1lcmEyQ2xpZW50OjpzdWJtaXRSZXF1ZXN0KGNhbWVyYV9tZXRhZGF0YV90KiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZykgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKLQotICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOwotCi0gICAgaWYgKCFtRXhjbHVzaXZlTG9jaykgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotCi0gICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEocmVxdWVzdCk7Ci0KLSAgICBpZiAoIWVuZm9yY2VSZXF1ZXN0UGVybWlzc2lvbnMobWV0YWRhdGEpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0KLSAgICBpZiAoc3RyZWFtaW5nKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5zZXRTdHJlYW1pbmdSZXF1ZXN0KG1ldGFkYXRhKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbURldmljZS0+Y2FwdHVyZShtZXRhZGF0YSk7Ci0gICAgfQotCi0gICAgLy8gdW5yZWFjaGFibGUuIHRoeCBnY2MgZm9yIGEgdXNlbGVzcyB3YXJuaW5nCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcm9DYW1lcmEyQ2xpZW50OjpjYW5jZWxSZXF1ZXN0KGludCByZXF1ZXN0SWQpIHsKLSAgICAodm9pZClyZXF1ZXN0SWQ7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwotCi0gICAgaWYgKCFtRGV2aWNlLmdldCgpKSByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0KLSAgICBpZiAoIW1FeGNsdXNpdmVMb2NrKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBpbXBsZW1lbnQKLSAgICBBTE9HRSgiJXM6IG5vdCBmdWxseSBpbXBsZW1lbnRlZCB5ZXQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgUHJvQ2FtZXJhMkNsaWVudDo6ZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIiVzIChzdHJlYW1JZCA9IDB4JXgpIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7Ci0KLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgaWYgKCAocmVzID0gY2hlY2tQaWQoX19GVU5DVElPTl9fKSApICE9IE9LKSByZXR1cm4gcmVzOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwotCi0gICAgaWYgKCFtRGV2aWNlLmdldCgpKSByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgbURldmljZS0+Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCk7Ci0KLSAgICBzdGF0dXNfdCBjb2RlOwotICAgIGlmICgoY29kZSA9IG1EZXZpY2UtPndhaXRVbnRpbERyYWluZWQoKSkgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiB3YWl0VW50aWxEcmFpbmVkIGZhaWxlZCB3aXRoIGNvZGUgMHgleCIsIF9fRlVOQ1RJT05fXywgY29kZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1EZXZpY2UtPmRlbGV0ZVN0cmVhbShzdHJlYW1JZCk7Ci19Ci0KLXN0YXR1c190IFByb0NhbWVyYTJDbGllbnQ6OmNyZWF0ZVN0cmVhbShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0cmVhbUlkKQotewotICAgIGlmIChzdHJlYW1JZCkgewotICAgICAgICAqc3RyZWFtSWQgPSAtMTsKLSAgICB9Ci0KLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCIlcyAodyA9ICVkLCBoID0gJWQsIGYgPSAweCV4KSIsIF9fRlVOQ1RJT05fXywgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKLQotICAgIHN0YXR1c190IHJlczsKLSAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7Ci0KLSAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKLQotICAgIHNwPElCaW5kZXI+IGJpbmRlcjsKLSAgICBzcDxBTmF0aXZlV2luZG93PiB3aW5kb3c7Ci0gICAgaWYgKGJ1ZmZlclByb2R1Y2VyICE9IDApIHsKLSAgICAgICAgYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpOwotICAgICAgICB3aW5kb3cgPSBuZXcgU3VyZmFjZShidWZmZXJQcm9kdWNlcik7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1EZXZpY2UtPmNyZWF0ZVN0cmVhbSh3aW5kb3csIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkKTsKLX0KLQotLy8gQ3JlYXRlIGEgcmVxdWVzdCBvYmplY3QgZnJvbSBhIHRlbXBsYXRlLgotLy8gLS0gQ2FsbGVyIG93bnMgdGhlIG5ld2x5IGFsbG9jYXRlZCBtZXRhZGF0YQotc3RhdHVzX3QgUHJvQ2FtZXJhMkNsaWVudDo6Y3JlYXRlRGVmYXVsdFJlcXVlc3QoaW50IHRlbXBsYXRlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YSoqIHJlcXVlc3QpCi17Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigiJXMgKHRlbXBsYXRlSWQgPSAweCV4KSIsIF9fRlVOQ1RJT05fXywgdGVtcGxhdGVJZCk7Ci0KLSAgICBpZiAocmVxdWVzdCkgewotICAgICAgICAqcmVxdWVzdCA9IE5VTEw7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgcmVzOwotICAgIGlmICggKHJlcyA9IGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgKSAhPSBPSykgcmV0dXJuIHJlczsKLQotICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKLQotICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOwotCi0gICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7Ci0gICAgaWYgKCAocmVzID0gbURldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QodGVtcGxhdGVJZCwgJm1ldGFkYXRhKSApID09IE9LKSB7Ci0gICAgICAgICpyZXF1ZXN0ID0gbWV0YWRhdGEucmVsZWFzZSgpOwotICAgIH0KLQotICAgIHJldHVybiByZXM7Ci19Ci0KLXN0YXR1c190IFByb0NhbWVyYTJDbGllbnQ6OmdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YSoqIGluZm8pCi17Ci0gICAgaWYgKGNhbWVyYUlkICE9IG1DYW1lcmFJZCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwotCi0gICAgaWYgKCFtRGV2aWNlLmdldCgpKSByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0KLSAgICBDYW1lcmFNZXRhZGF0YSBkZXZpY2VJbmZvID0gbURldmljZS0+aW5mbygpOwotICAgICppbmZvID0gZGV2aWNlSW5mby5yZWxlYXNlKCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByb0NhbWVyYTJDbGllbnQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIEJhc2ljQ2xpZW50OjpkdW1wKGZkLCBhcmdzKTsKLX0KLQotc3RhdHVzX3QgUHJvQ2FtZXJhMkNsaWVudDo6ZHVtcENsaWVudChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJQcm9DYW1lcmEyQ2xpZW50WyVkXSAoJXApIFBJRDogJWQsIGR1bXA6XG4iLAotICAgICAgICAgICAgbUNhbWVyYUlkLAotICAgICAgICAgICAgKGdldFJlbW90ZUNhbGxiYWNrKCkgIT0gTlVMTCA/Ci0gICAgICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGdldFJlbW90ZUNhbGxiYWNrKCkpLmdldCgpIDogTlVMTCksCi0gICAgICAgICAgICBtQ2xpZW50UGlkKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgIFN0YXRlOlxuIik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICAvLyBUT0RPOiBwcmludCBkeW5hbWljL3JlcXVlc3Qgc2VjdGlvbiBmcm9tIG1vc3QgcmVjZW50IHJlcXVlc3RzCi0gICAgbUZyYW1lUHJvY2Vzc29yLT5kdW1wKGZkLCBhcmdzKTsKLSAgICByZXR1cm4gZHVtcERldmljZShmZCwgYXJncyk7Ci19Ci0KLS8vIElQcm9DYW1lcmFVc2VyIGludGVyZmFjZQotCi12b2lkIFByb0NhbWVyYTJDbGllbnQ6OmRldGFjaERldmljZSgpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm47Ci0KLSAgICBBTE9HVigiQ2FtZXJhICVkOiBTdG9wcGluZyBwcm9jZXNzb3JzIiwgbUNhbWVyYUlkKTsKLQotICAgIG1GcmFtZVByb2Nlc3Nvci0+cmVtb3ZlTGlzdGVuZXIoRlJBTUVfUFJPQ0VTU09SX0xJU1RFTkVSX01JTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX1BST0NFU1NPUl9MSVNURU5FUl9NQVhfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxpc3RlbmVyKi90aGlzKTsKLSAgICBtRnJhbWVQcm9jZXNzb3ItPnJlcXVlc3RFeGl0KCk7Ci0gICAgQUxPR1YoIkNhbWVyYSAlZDogV2FpdGluZyBmb3IgdGhyZWFkcyIsIG1DYW1lcmFJZCk7Ci0gICAgbUZyYW1lUHJvY2Vzc29yLT5qb2luKCk7Ci0gICAgQUxPR1YoIkNhbWVyYSAlZDogRGlzY29ubmVjdGluZyBkZXZpY2UiLCBtQ2FtZXJhSWQpOwotCi0gICAgLy8gV09SS0FST1VORDogSEFMIHJlZnVzZXMgdG8gZGlzY29ubmVjdCB3aGlsZSB0aGVyZSdzIHN0cmVhbXMgaW4gZmxpZ2h0Ci0gICAgewotICAgICAgICBtRGV2aWNlLT5jbGVhclN0cmVhbWluZ1JlcXVlc3QoKTsKLQotICAgICAgICBzdGF0dXNfdCBjb2RlOwotICAgICAgICBpZiAoKGNvZGUgPSBtRGV2aWNlLT53YWl0VW50aWxEcmFpbmVkKCkpICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IHdhaXRVbnRpbERyYWluZWQgZmFpbGVkIHdpdGggY29kZSAweCV4IiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgY29kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDYW1lcmEyQ2xpZW50QmFzZTo6ZGV0YWNoRGV2aWNlKCk7Ci19Ci0KLXZvaWQgUHJvQ2FtZXJhMkNsaWVudDo6b25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCYgcmVzdWx0KSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwotICAgIFNoYXJlZENhbWVyYUNhbGxiYWNrczo6TG9jayBsKG1TaGFyZWRDYW1lcmFDYWxsYmFja3MpOwotCi0gICAgaWYgKG1SZW1vdGVDYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgIENhbWVyYU1ldGFkYXRhIHRtcChyZXN1bHQubU1ldGFkYXRhKTsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QqIG1ldGEgPSB0bXAucmVsZWFzZSgpOwotICAgICAgICBBTE9HVigiJXM6IG1ldGEgPSAlcCAiLCBfX0ZVTkNUSU9OX18sIG1ldGEpOwotICAgICAgICBtUmVtb3RlQ2FsbGJhY2stPm9uUmVzdWx0UmVjZWl2ZWQocmVzdWx0Lm1SZXN1bHRFeHRyYXMucmVxdWVzdElkLCBtZXRhKTsKLSAgICAgICAgdG1wLmFjcXVpcmUobWV0YSk7Ci0gICAgfQotfQotCi1ib29sIFByb0NhbWVyYTJDbGllbnQ6OmVuZm9yY2VSZXF1ZXN0UGVybWlzc2lvbnMoQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKSB7Ci0KLSAgICBjb25zdCBpbnQgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIGNvbnN0IGludCBzZWxmUGlkID0gZ2V0cGlkKCk7Ci0gICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnk7Ci0KLSAgICAvKioKLSAgICAgKiBNaXhpbiBkZWZhdWx0IGltcG9ydGFudCBzZWN1cml0eSB2YWx1ZXMKLSAgICAgKiAtIGFuZHJvaWQubGVkLnRyYW5zbWl0ID0gZGVmYXVsdGVkIE9OCi0gICAgICovCi0gICAgQ2FtZXJhTWV0YWRhdGEgc3RhdGljSW5mbyA9IG1EZXZpY2UtPmluZm8oKTsKLSAgICBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0xFRF9BVkFJTEFCTEVfTEVEUyk7Ci0gICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyArK2kpIHsKLSAgICAgICAgdWludDhfdCBsZWQgPSBlbnRyeS5kYXRhLnU4W2ldOwotCi0gICAgICAgIHN3aXRjaChsZWQpIHsKLSAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9MRURfQVZBSUxBQkxFX0xFRFNfVFJBTlNNSVQ6IHsKLSAgICAgICAgICAgICAgICB1aW50OF90IHRyYW5zbWl0RGVmYXVsdCA9IEFORFJPSURfTEVEX1RSQU5TTUlUX09OOwotICAgICAgICAgICAgICAgIGlmICghbWV0YWRhdGEuZXhpc3RzKEFORFJPSURfTEVEX1RSQU5TTUlUKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9MRURfVFJBTlNNSVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNtaXREZWZhdWx0LCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBXZSBjYW4gZG8gYW55dGhpbmchCi0gICAgaWYgKHBpZCA9PSBzZWxmUGlkKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcm1pc3Npb24gY2hlY2sgc3BlY2lhbCBmaWVsZHMgaW4gdGhlIHJlcXVlc3QKLSAgICAgKiAtIGFuZHJvaWQubGVkLnRyYW5zbWl0ID0gYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9ESVNBQkxFX1RSQU5TTUlUCi0gICAgICovCi0gICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfTEVEX1RSQU5TTUlUKTsKLSAgICBpZiAoZW50cnkuY291bnQgPiAwICYmIGVudHJ5LmRhdGEudThbMF0gIT0gQU5EUk9JRF9MRURfVFJBTlNNSVRfT04pIHsKLSAgICAgICAgU3RyaW5nMTYgcGVybWlzc2lvblN0cmluZyA9Ci0gICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9ESVNBQkxFX1RSQU5TTUlUX0xFRCIpOwotICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24ocGVybWlzc2lvblN0cmluZykpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgICAgICBBTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6ICIKLSAgICAgICAgICAgICAgICAgICJjYW4ndCBkaXNhYmxlIHRyYW5zbWl0IExFRCBwaWQ9JWQsIHVpZD0lZCIsIHBpZCwgdWlkKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmQ4NjlkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfUFJPQ0FNRVJBMkNMSUVOVF9ICi0jZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfUFJPQ0FNRVJBMkNMSUVOVF9ICi0KLSNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oIgotI2luY2x1ZGUgImNvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oIgotI2luY2x1ZGUgImRldmljZTIvQ2FtZXJhMkRldmljZS5oIgotI2luY2x1ZGUgImNhbWVyYS9DYXB0dXJlUmVzdWx0LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSU1lbW9yeTsKLS8qKgotICogSW1wbGVtZW50cyB0aGUgYmluZGVyIElQcm9DYW1lcmFVc2VyIEFQSSwKLSAqIG1lYW50IGZvciBIQUwyLWxldmVsIHByaXZhdGUgQVBJIGFjY2Vzcy4KLSAqLwotY2xhc3MgUHJvQ2FtZXJhMkNsaWVudCA6Ci0gICAgICAgIHB1YmxpYyBDYW1lcmEyQ2xpZW50QmFzZTxDYW1lcmFTZXJ2aWNlOjpQcm9DbGllbnQ+LAotICAgICAgICBwdWJsaWMgY2FtZXJhMjo6RnJhbWVQcm9jZXNzb3JCYXNlOjpGaWx0ZXJlZExpc3RlbmVyCi17Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogSVByb0NhbWVyYVVzZXIgaW50ZXJmYWNlIChzZWUgSVByb0NhbWVyYVVzZXIgZm9yIGRldGFpbHMpCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGV4Y2x1c2l2ZVRyeUxvY2soKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZXhjbHVzaXZlTG9jaygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBleGNsdXNpdmVVbmxvY2soKTsKLQotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICBoYXNFeGNsdXNpdmVMb2NrKCk7Ci0KLSAgICAvLyBOb3RlIHRoYXQgdGhlIGNhbGxlZSBnZXRzIGEgY29weSBvZiB0aGUgbWV0YWRhdGEuCi0gICAgdmlydHVhbCBpbnQgICAgICAgICAgIHN1Ym1pdFJlcXVlc3QoY2FtZXJhX21ldGFkYXRhX3QqIG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nID0gZmFsc2UpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBjYW5jZWxSZXF1ZXN0KGludCByZXF1ZXN0SWQpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGNyZWF0ZVN0cmVhbSgKLSAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyLAotICAgICAgICAgICAgLypvdXQqLwotICAgICAgICAgICAgaW50KiBzdHJlYW1JZCk7Ci0KLSAgICAvLyBDcmVhdGUgYSByZXF1ZXN0IG9iamVjdCBmcm9tIGEgdGVtcGxhdGUuCi0gICAgLy8gLS0gQ2FsbGVyIG93bnMgdGhlIG5ld2x5IGFsbG9jYXRlZCBtZXRhZGF0YQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGEqKiByZXF1ZXN0KTsKLQotICAgIC8vIEdldCB0aGUgc3RhdGljIG1ldGFkYXRhIGZvciB0aGUgY2FtZXJhCi0gICAgLy8gLS0gQ2FsbGVyIG93bnMgdGhlIG5ld2x5IGFsbG9jYXRlZCBtZXRhZGF0YQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBnZXRDYW1lcmFJbmZvKGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhKiogaW5mbyk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgdXNlZCBieSBDYW1lcmFTZXJ2aWNlCi0gICAgICovCi0KLSAgICBQcm9DYW1lcmEyQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAotICAgICAgICAgICAgY29uc3Qgc3A8SVByb0NhbWVyYUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAotICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKLSAgICAgICAgICAgIGludCBjbGllbnRQaWQsCi0gICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQsCi0gICAgICAgICAgICBpbnQgc2VydmljZVBpZCk7Ci0gICAgdmlydHVhbCB+UHJvQ2FtZXJhMkNsaWVudCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkdW1wQ2xpZW50KGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLSAgICAvLyBDYWxsYmFja3MgZnJvbSBjYW1lcmEgc2VydmljZQotICAgIHZpcnR1YWwgdm9pZCBvbkV4Y2x1c2l2ZUxvY2tTdG9sZW4oKTsKLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSB1c2VkIGJ5IGluZGVwZW5kZW50IGNvbXBvbmVudHMgb2YgUHJvQ2FtZXJhMkNsaWVudC4KLSAgICAgKi8KLQotcHJvdGVjdGVkOgotICAgIC8qKiBGaWx0ZXJlZExpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqLwotICAgIHZpcnR1YWwgdm9pZCBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0JiByZXN1bHQpOwotCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgIGRldGFjaERldmljZSgpOwotCi1wcml2YXRlOgotICAgIC8qKiBJUHJvQ2FtZXJhVXNlciBpbnRlcmZhY2UtcmVsYXRlZCBwcml2YXRlIG1lbWJlcnMgKi8KLQotICAgIC8qKiBQcmV2aWV3IGNhbGxiYWNrIHJlbGF0ZWQgbWVtYmVycyAqLwotICAgIHNwPGNhbWVyYTI6OkZyYW1lUHJvY2Vzc29yQmFzZT4gbUZyYW1lUHJvY2Vzc29yOwotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IEZSQU1FX1BST0NFU1NPUl9MSVNURU5FUl9NSU5fSUQgPSAwOwotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IEZSQU1FX1BST0NFU1NPUl9MSVNURU5FUl9NQVhfSUQgPSAweDdmZmZmZmZmTDsKLQotICAgIC8qKiBVdGlsaXR5IG1lbWJlcnMgKi8KLSAgICBib29sIGVuZm9yY2VSZXF1ZXN0UGVybWlzc2lvbnMoQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKTsKLQotICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIGhhdmUgYW4gZXhjbHVzaXZlIGxvY2sgb24gdGhlIGRldmljZQotICAgIC8vIC0gaWYgbm8gd2UgY2FuJ3QgbW9kaWZ5IHRoZSByZXF1ZXN0IHF1ZXVlLgotICAgIC8vIG5vdGUgdGhhdCBjcmVhdGluZy9kZWxldGluZyBzdHJlYW1zIHdlIG93biBpcyBzdGlsbCBPSwotICAgIGJvb2wgbUV4Y2x1c2l2ZUxvY2s7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCmluZGV4IDI0YWNmYmYuLmZkYjgwMWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcApAQCAtNzgsNyArNzgsNyBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+Ci1zdGF0dXNfdCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OmluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpIHsKK3N0YXR1c190IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6aW5pdGlhbGl6ZShDYW1lcmFNb2R1bGUgKm1vZHVsZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBJbml0aWFsaXppbmcgY2xpZW50IGZvciBjYW1lcmEgJWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgVENsaWVudEJhc2U6Om1DYW1lcmFJZCk7CkBAIC0yODAsNiArMjgwLDE0IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KK3ZvaWQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojpub3RpZnlQcmVwYXJlZChpbnQgc3RyZWFtSWQpIHsKKyAgICAodm9pZClzdHJlYW1JZDsKKworICAgIEFMT0dWKCIlczogU3RyZWFtICVkIG5vdyBwcmVwYXJlZCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgogaW50IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6Z2V0Q2FtZXJhSWQoKSBjb25zdCB7CiAgICAgcmV0dXJuIFRDbGllbnRCYXNlOjptQ2FtZXJhSWQ7CiB9CkBAIC0zMzcsNyArMzQ1LDYgQEAKICAgICBtUmVtb3RlQ2FsbGJhY2suY2xlYXIoKTsKIH0KIAotdGVtcGxhdGUgY2xhc3MgQ2FtZXJhMkNsaWVudEJhc2U8Q2FtZXJhU2VydmljZTo6UHJvQ2xpZW50PjsKIHRlbXBsYXRlIGNsYXNzIENhbWVyYTJDbGllbnRCYXNlPENhbWVyYVNlcnZpY2U6OkNsaWVudD47CiB0ZW1wbGF0ZSBjbGFzcyBDYW1lcmEyQ2xpZW50QmFzZTxDYW1lcmFEZXZpY2VDbGllbnRCYXNlPjsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAppbmRleCA3N2FlNGZjLi5kNjZlMTFjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTJDTElFTlRfQkFTRV9ICiAKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFNb2R1bGUuaCIKICNpbmNsdWRlICJjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0zNSw3ICszNiw3IEBACiAgICAgdHlwZWRlZiB0eXBlbmFtZSBUQ2xpZW50QmFzZTo6VENhbUNhbGxiYWNrcyBUQ2FtQ2FsbGJhY2tzOwogCiAgICAgLyoqCi0gICAgICogQmFzZSBiaW5kZXIgaW50ZXJmYWNlIChzZWUgSUNhbWVyYS9JUHJvQ2FtZXJhVXNlciBmb3IgZGV0YWlscykKKyAgICAgKiBCYXNlIGJpbmRlciBpbnRlcmZhY2UgKHNlZSBJQ2FtZXJhL0lDYW1lcmFEZXZpY2VVc2VyIGZvciBkZXRhaWxzKQogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBjb25uZWN0KGNvbnN0IHNwPFRDYW1DYWxsYmFja3M+JiBjYWxsYmFja3MpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBkaXNjb25uZWN0KCk7CkBAIC01NSw3ICs1Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQpOwogICAgIHZpcnR1YWwgfkNhbWVyYTJDbGllbnRCYXNlKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgaW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGluaXRpYWxpemUoQ2FtZXJhTW9kdWxlICptb2R1bGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkdW1wQ2xpZW50KGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICAvKioKQEAgLTcxLDcgKzcyLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5QXV0b0V4cG9zdXJlKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlBdXRvV2hpdGViYWxhbmNlKHVpbnQ4X3QgbmV3U3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJJZCk7Ci0KKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5UHJlcGFyZWQoaW50IHN0cmVhbUlkKTsKIAogICAgIGludCAgICAgICAgICAgICAgICAgICBnZXRDYW1lcmFJZCgpIGNvbnN0OwogICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+JgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKaW5kZXggZDI2ZTIwYy4uY2QyNTk0OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCkBAIC0yOSw2ICsyOSw4IEBACiAjaW5jbHVkZSAiaGFyZHdhcmUvY2FtZXJhMy5oIgogI2luY2x1ZGUgImNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oIgogI2luY2x1ZGUgImNhbWVyYS9DYXB0dXJlUmVzdWx0LmgiCisjaW5jbHVkZSAiY29tbW9uL0NhbWVyYU1vZHVsZS5oIgorI2luY2x1ZGUgImd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDUsNyArNDcsNyBAQAogICAgICAqLwogICAgIHZpcnR1YWwgaW50ICAgICAgZ2V0SWQoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUoQ2FtZXJhTW9kdWxlICptb2R1bGUpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3QoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSA9IDA7CkBAIC05OSwxNyArMTAxLDIyIEBACiAgICAgICAgICAgICBuc2Vjc190IHRpbWVvdXQpID0gMDsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBvdXRwdXQgc3RyZWFtIG9mIHRoZSByZXF1ZXN0ZWQgc2l6ZSBhbmQgZm9ybWF0LgorICAgICAqIENyZWF0ZSBhbiBvdXRwdXQgc3RyZWFtIG9mIHRoZSByZXF1ZXN0ZWQgc2l6ZSwgZm9ybWF0LCByb3RhdGlvbiBhbmQgZGF0YXNwYWNlCiAgICAgICoKLSAgICAgKiBJZiBmb3JtYXQgaXMgQ0FNRVJBMl9IQUxfUElYRUxfRk9STUFUX09QQVFVRSwgdGhlbiB0aGUgSEFMIGRldmljZSBzZWxlY3RzCi0gICAgICogYW4gYXBwcm9wcmlhdGUgZm9ybWF0OyBpdCBjYW4gYmUgcXVlcmllZCB3aXRoIGdldFN0cmVhbUluZm8uCi0gICAgICoKLSAgICAgKiBJZiBmb3JtYXQgaXMgSEFMX1BJWEVMX0ZPUk1BVF9DT01QUkVTU0VELCB0aGUgc2l6ZSBwYXJhbWV0ZXIgbXVzdCBiZQotICAgICAqIGVxdWFsIHRvIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBidWZmZXJzIHRvIGFsbG9jYXRlIGZvciB0aGUgc3RyZWFtLiBGb3IKLSAgICAgKiBvdGhlciBmb3JtYXRzLCB0aGUgc2l6ZSBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KKyAgICAgKiBGb3IgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CIGZvcm1hdHMsIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHNob3VsZCBiZSB0aGUKKyAgICAgKiBsb2dpY2FsIGRpbWVuc2lvbnMgb2YgdGhlIGJ1ZmZlciwgbm90IHRoZSBudW1iZXIgb2YgYnl0ZXMuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgKmlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oc3A8U3VyZmFjZT4gY29uc3VtZXIsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5wdXQgc3RyZWFtIG9mIHdpZHRoLCBoZWlnaHQsIGFuZCBmb3JtYXQuCisgICAgICoKKyAgICAgKiBSZXR1cm4gdmFsdWUgaXMgdGhlIHN0cmVhbSBJRCBpZiBub24tbmVnYXRpdmUgYW5kIGFuIGVycm9yIGlmIG5lZ2F0aXZlLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdHJlYW0odWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0LCAvKm91dCovIGludDMyX3QgKmlkKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW4gaW5wdXQgcmVwcm9jZXNzIHN0cmVhbSB0aGF0IHVzZXMgYnVmZmVycyBmcm9tIGFuIGV4aXN0aW5nCkBAIC0xMjEsNyArMTI4LDggQEAKICAgICAgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBnaXZlbiBzdHJlYW0uCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1JbmZvKGludCBpZCwKLSAgICAgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCkgPSAwOworICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgKmZvcm1hdCwgYW5kcm9pZF9kYXRhc3BhY2UgKmRhdGFTcGFjZSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogU2V0IHN0cmVhbSBncmFsbG9jIGJ1ZmZlciB0cmFuc2Zvcm0KQEAgLTE1MCw3ICsxNTgsMTEgQEAKICAgICAgKiAtIEJBRF9WQUxVRSBpZiB0aGUgc2V0IG9mIHN0cmVhbXMgd2FzIGludmFsaWQgKGUuZy4gZm10cyBvciBzaXplcykKICAgICAgKiAtIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBkZXZpY2Ugd2FzIGluIHRoZSB3cm9uZyBzdGF0ZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcygpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkID0gZmFsc2UpID0gMDsKKworICAgIC8vIGdldCB0aGUgYnVmZmVyIHByb2R1Y2VyIG9mIHRoZSBpbnB1dCBzdHJlYW0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyUHJvZHVjZXIoCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpID0gMDsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIG1ldGFkYXRhIGJ1ZmZlciB3aXRoIGZpZWxkcyB0aGF0IHRoZSBIQUwgZGV2aWNlIGJlbGlldmVzIGFyZQpAQCAtMTg4LDYgKzIwMCw3IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCBub3RpZnlJZGxlKCkgPSAwOwogICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZyZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVByZXBhcmVkKGludCBzdHJlYW1JZCkgPSAwOwogCiAgICAgICAgIC8vIFJlcXVpcmVkIG9ubHkgZm9yIEFQSTEKICAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUF1dG9Gb2N1cyh1aW50OF90IG5ld1N0YXRlLCBpbnQgdHJpZ2dlcklkKSA9IDA7CkBAIC0yNzAsNiArMjgzLDE3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaChpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CiAKICAgICAvKioKKyAgICAgKiBQcmVwYXJlIHN0cmVhbSBieSBwcmVhbGxvY2F0aW5nIGJ1ZmZlcnMgZm9yIGl0IGFzeW5jaHJvbm91c2x5LgorICAgICAqIENhbGxzIG5vdGlmeVByZXBhcmVkKCkgb25jZSBhbGxvY2F0aW9uIGlzIGNvbXBsZXRlLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZShpbnQgc3RyZWFtSWQpID0gMDsKKworICAgIC8qKgorICAgICAqIEZyZWUgc3RyZWFtIHJlc291cmNlcyBieSBkdW1waW5nIGl0cyB1bnVzZWQgZ3JhbGxvYyBidWZmZXJzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgdGVhckRvd24oaW50IHN0cmVhbUlkKSA9IDA7CisKKyAgICAvKioKICAgICAgKiBHZXQgdGhlIEhBTCBkZXZpY2UgdmVyc2lvbi4KICAgICAgKi8KICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldERldmljZVZlcnNpb24oKSA9IDA7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhTW9kdWxlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFNb2R1bGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNGRmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhTW9kdWxlLmNwcApAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhTW9kdWxlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiQ2FtZXJhTW9kdWxlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCBDYW1lcmFNb2R1bGU6OmRlcml2ZUNhbWVyYUNoYXJhY3RlcmlzdGljc0tleXMoCisgICAgICAgIHVpbnQzMl90IGRldmljZVZlcnNpb24sIENhbWVyYU1ldGFkYXRhICZjaGFycykgeworICAgIC8vIEhBTDEgZGV2aWNlcyBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyAgICBpZiAoZGV2aWNlVmVyc2lvbiA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wKSB7CisgICAgICAgIEFMT0dWKCIlczogQ2Fubm90IGRlcml2ZSBrZXlzIGZvciBIQUwgdmVyc2lvbiA8IDIuMCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gS2V5cyBhZGRlZCBpbiBIQUwzLjMKKyAgICBpZiAoZGV2aWNlVmVyc2lvbiA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zKSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBOVU1fREVSSVZFRF9LRVlTX0hBTDNfMyA9IDU7CisgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb250cm9sTW9kZXM7CisgICAgICAgIHVpbnQ4X3QgZGF0YSA9IEFORFJPSURfQ09OVFJPTF9BRV9MT0NLX0FWQUlMQUJMRV9UUlVFOworICAgICAgICBjaGFycy51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX0xPQ0tfQVZBSUxBQkxFLCAmZGF0YSwgLypjb3VudCovMSk7CisgICAgICAgIGRhdGEgPSBBTkRST0lEX0NPTlRST0xfQVdCX0xPQ0tfQVZBSUxBQkxFX1RSVUU7CisgICAgICAgIGNoYXJzLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQVdCX0xPQ0tfQVZBSUxBQkxFLCAmZGF0YSwgLypjb3VudCovMSk7CisgICAgICAgIGNvbnRyb2xNb2Rlcy5wdXNoKEFORFJPSURfQ09OVFJPTF9NT0RFX0FVVE8pOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZW50cnkgPSBjaGFycy5maW5kKEFORFJPSURfQ09OVFJPTF9BVkFJTEFCTEVfU0NFTkVfTU9ERVMpOworICAgICAgICBpZiAoZW50cnkuY291bnQgPiAxIHx8IGVudHJ5LmRhdGEudThbMF0gIT0gQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQpIHsKKyAgICAgICAgICAgIGNvbnRyb2xNb2Rlcy5wdXNoKEFORFJPSURfQ09OVFJPTF9NT0RFX1VTRV9TQ0VORV9NT0RFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE9ubHkgYWR2ZXJ0aXNlIENPTlRST0xfT0ZGIG1vZGUgaWYgM0EgbWFudWFsIGNvbnRyb2xzIGFyZSBzdXBwb3J0ZWQuCisgICAgICAgIGJvb2wgaXNNYW51YWxBZVN1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICBib29sIGlzTWFudWFsQWZTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBpc01hbnVhbEF3YlN1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICBlbnRyeSA9IGNoYXJzLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FFX0FWQUlMQUJMRV9NT0RFUyk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5kYXRhLnU4W2ldID09IEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09GRikgeworICAgICAgICAgICAgICAgICAgICBpc01hbnVhbEFlU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVudHJ5ID0gY2hhcnMuZmluZChBTkRST0lEX0NPTlRST0xfQUZfQVZBSUxBQkxFX01PREVTKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGEudThbaV0gPT0gQU5EUk9JRF9DT05UUk9MX0FGX01PREVfT0ZGKSB7CisgICAgICAgICAgICAgICAgICAgIGlzTWFudWFsQWZTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZW50cnkgPSBjaGFycy5maW5kKEFORFJPSURfQ09OVFJPTF9BV0JfQVZBSUxBQkxFX01PREVTKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGEudThbaV0gPT0gQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFX09GRikgeworICAgICAgICAgICAgICAgICAgICBpc01hbnVhbEF3YlN1cHBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaXNNYW51YWxBZVN1cHBvcnRlZCAmJiBpc01hbnVhbEFmU3VwcG9ydGVkICYmIGlzTWFudWFsQXdiU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBjb250cm9sTW9kZXMucHVzaChBTkRST0lEX0NPTlRST0xfTU9ERV9PRkYpOworICAgICAgICB9CisKKyAgICAgICAgY2hhcnMudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BVkFJTEFCTEVfTU9ERVMsIGNvbnRyb2xNb2Rlcyk7CisKKyAgICAgICAgZW50cnkgPSBjaGFycy5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfUkVRVUVTVF9LRVlTKTsKKyAgICAgICAgLy8gSEFMMy4yIGRldmljZXMgcGFzc2luZyBleGlzdGluZyBDVFMgdGVzdCBzaG91bGQgYWxsIHN1cHBvcnQgYWxsIExTQyBtb2RlcyBhbmQgTFNDIG1hcAorICAgICAgICBib29sIGxlbnNTaGFkaW5nTW9kZVN1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuZGF0YS5pMzJbaV0gPT0gQU5EUk9JRF9TSEFESU5HX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuc1NoYWRpbmdNb2RlU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFZlY3Rvcjx1aW50OF90PiBsc2NNb2RlczsKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGxzY01hcE1vZGVzOworICAgICAgICBsc2NNb2Rlcy5wdXNoKEFORFJPSURfU0hBRElOR19NT0RFX0ZBU1QpOworICAgICAgICBsc2NNb2Rlcy5wdXNoKEFORFJPSURfU0hBRElOR19NT0RFX0hJR0hfUVVBTElUWSk7CisgICAgICAgIGxzY01hcE1vZGVzLnB1c2goQU5EUk9JRF9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVBfTU9ERV9PRkYpOworICAgICAgICBpZiAobGVuc1NoYWRpbmdNb2RlU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBsc2NNb2Rlcy5wdXNoKEFORFJPSURfU0hBRElOR19NT0RFX09GRik7CisgICAgICAgICAgICBsc2NNYXBNb2Rlcy5wdXNoKEFORFJPSURfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQX01PREVfT04pOworICAgICAgICB9CisgICAgICAgIGNoYXJzLnVwZGF0ZShBTkRST0lEX1NIQURJTkdfQVZBSUxBQkxFX01PREVTLCBsc2NNb2Rlcyk7CisgICAgICAgIGNoYXJzLnVwZGF0ZShBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19BVkFJTEFCTEVfTEVOU19TSEFESU5HX01BUF9NT0RFUywgbHNjTWFwTW9kZXMpOworCisgICAgICAgIGVudHJ5ID0gY2hhcnMuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKTsKKyAgICAgICAgVmVjdG9yPGludDMyX3Q+IGF2YWlsYWJsZUNoYXJzS2V5czsKKyAgICAgICAgYXZhaWxhYmxlQ2hhcnNLZXlzLnNldENhcGFjaXR5KGVudHJ5LmNvdW50ICsgTlVNX0RFUklWRURfS0VZU19IQUwzXzMpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZUNoYXJzS2V5cy5wdXNoKGVudHJ5LmRhdGEuaTMyW2ldKTsKKyAgICAgICAgfQorICAgICAgICBhdmFpbGFibGVDaGFyc0tleXMucHVzaChBTkRST0lEX0NPTlRST0xfQUVfTE9DS19BVkFJTEFCTEUpOworICAgICAgICBhdmFpbGFibGVDaGFyc0tleXMucHVzaChBTkRST0lEX0NPTlRST0xfQVdCX0xPQ0tfQVZBSUxBQkxFKTsKKyAgICAgICAgYXZhaWxhYmxlQ2hhcnNLZXlzLnB1c2goQU5EUk9JRF9DT05UUk9MX0FWQUlMQUJMRV9NT0RFUyk7CisgICAgICAgIGF2YWlsYWJsZUNoYXJzS2V5cy5wdXNoKEFORFJPSURfU0hBRElOR19BVkFJTEFCTEVfTU9ERVMpOworICAgICAgICBhdmFpbGFibGVDaGFyc0tleXMucHVzaChBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19BVkFJTEFCTEVfTEVOU19TSEFESU5HX01BUF9NT0RFUyk7CisgICAgICAgIGNoYXJzLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTLCBhdmFpbGFibGVDaGFyc0tleXMpOworCisgICAgICAgIC8vIE5lZWQgdXBkYXRlIGFuZHJvaWQuY29udHJvbC5hdmFpbGFibGVIaWdoU3BlZWRWaWRlb0NvbmZpZ3VyYXRpb25zIHNpbmNlIEhBTDMuMworICAgICAgICAvLyBhZGRzIGJhdGNoIHNpemUgdG8gdGhpcyBhcnJheS4KKyAgICAgICAgZW50cnkgPSBjaGFycy5maW5kKEFORFJPSURfQ09OVFJPTF9BVkFJTEFCTEVfSElHSF9TUEVFRF9WSURFT19DT05GSUdVUkFUSU9OUyk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIFZlY3RvcjxpbnQzMl90PiBoaWdoU3BlZWRDb25maWc7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgICAgICAgICBoaWdoU3BlZWRDb25maWcuYWRkKGVudHJ5LmRhdGEuaTMyW2ldKTsgLy8gd2lkdGgKKyAgICAgICAgICAgICAgICBoaWdoU3BlZWRDb25maWcuYWRkKGVudHJ5LmRhdGEuaTMyW2kgKyAxXSk7IC8vIGhlaWdodAorICAgICAgICAgICAgICAgIGhpZ2hTcGVlZENvbmZpZy5hZGQoZW50cnkuZGF0YS5pMzJbaSArIDJdKTsgLy8gZnBzX21pbgorICAgICAgICAgICAgICAgIGhpZ2hTcGVlZENvbmZpZy5hZGQoZW50cnkuZGF0YS5pMzJbaSArIDNdKTsgLy8gZnBzX21heAorICAgICAgICAgICAgICAgIGhpZ2hTcGVlZENvbmZpZy5hZGQoMSk7IC8vIGJhdGNoU2l6ZV9tYXguIGRlZmF1bHQgdG8gMSBmb3IgSEFMMy4yCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFycy51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FWQUlMQUJMRV9ISUdIX1NQRUVEX1ZJREVPX0NPTkZJR1VSQVRJT05TLAorICAgICAgICAgICAgICAgICAgICBoaWdoU3BlZWRDb25maWcpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQWx3YXlzIGFkZCBhIGRlZmF1bHQgZm9yIHRoZSBwcmUtY29ycmVjdGlvbiBhY3RpdmUgYXJyYXkgaWYgdGhlIHZlbmRvciBjaG9vc2VzIHRvIG9taXQgdGhpcworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBlbnRyeSA9IGNoYXJzLmZpbmQoQU5EUk9JRF9TRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRSk7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgVmVjdG9yPGludDMyX3Q+IHByZUNvcnJlY3Rpb25BcnJheTsKKyAgICAgICAgZW50cnkgPSBjaGFycy5maW5kKEFORFJPSURfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUpOworICAgICAgICBwcmVDb3JyZWN0aW9uQXJyYXkuYXBwZW5kQXJyYXkoZW50cnkuZGF0YS5pMzIsIGVudHJ5LmNvdW50KTsKKyAgICAgICAgY2hhcnMudXBkYXRlKEFORFJPSURfU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkUsIHByZUNvcnJlY3Rpb25BcnJheSk7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitDYW1lcmFNb2R1bGU6OkNhbWVyYU1vZHVsZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkgeworICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBoYXJkd2FyZSBtb2R1bGUgbXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGFzc2VydCgwKTsKKyAgICB9CisKKyAgICBtTW9kdWxlID0gbW9kdWxlOworICAgIG1DYW1lcmFJbmZvTWFwLnNldENhcGFjaXR5KGdldE51bWJlck9mQ2FtZXJhcygpKTsKK30KKworQ2FtZXJhTW9kdWxlOjp+Q2FtZXJhTW9kdWxlKCkKK3sKKyAgICB3aGlsZSAobUNhbWVyYUluZm9NYXAuc2l6ZSgpID4gMCkgeworICAgICAgICBjYW1lcmFfaW5mbyBjYW1lcmFJbmZvID0gbUNhbWVyYUluZm9NYXAuZWRpdFZhbHVlQXQoMCk7CisgICAgICAgIGlmIChjYW1lcmFJbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWVfY2FtZXJhX21ldGFkYXRhKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oY2FtZXJhSW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljcykpOworICAgICAgICB9CisgICAgICAgIG1DYW1lcmFJbmZvTWFwLnJlbW92ZUl0ZW1zQXQoMCk7CisgICAgfQorfQorCitpbnQgQ2FtZXJhTW9kdWxlOjppbml0KCkgeworICAgIGlmIChnZXRNb2R1bGVBcGlWZXJzaW9uKCkgPj0gQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzQgJiYKKyAgICAgICAgICAgIG1Nb2R1bGUtPmluaXQgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbU1vZHVsZS0+aW5pdCgpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK2ludCBDYW1lcmFNb2R1bGU6OmdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLCBzdHJ1Y3QgY2FtZXJhX2luZm8gKmluZm8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtQ2FtZXJhSW5mb0xvY2spOworICAgIGlmIChjYW1lcmFJZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBJRCAlZCIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvLyBPbmx5IG92ZXJyaWRlIHN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzIGZvciBBUEkyIGRldmljZXMKKyAgICBpbnQgYXBpVmVyc2lvbiA9IG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb247CisgICAgaWYgKGFwaVZlcnNpb24gPCBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMCkgeworICAgICAgICByZXR1cm4gbU1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKGNhbWVyYUlkLCBpbmZvKTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUNhbWVyYUluZm9NYXAuaW5kZXhPZktleShjYW1lcmFJZCk7CisgICAgaWYgKGluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIC8vIEdldCBjYW1lcmEgaW5mbyBmcm9tIHJhdyBtb2R1bGUgYW5kIGNhY2hlIGl0CisgICAgICAgIGNhbWVyYV9pbmZvIHJhd0luZm8sIGNhbWVyYUluZm87CisgICAgICAgIGludCByZXQgPSBtTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oY2FtZXJhSWQsICZyYXdJbmZvKTsKKyAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGludCBkZXZpY2VWZXJzaW9uID0gcmF3SW5mby5kZXZpY2VfdmVyc2lvbjsKKyAgICAgICAgaWYgKGRldmljZVZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMCkgeworICAgICAgICAgICAgLy8gc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3MgaXMgaW52YWxpZAorICAgICAgICAgICAgKmluZm8gPSByYXdJbmZvOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBDYW1lcmFNZXRhZGF0YSBtOworICAgICAgICBtID0gcmF3SW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljczsKKyAgICAgICAgZGVyaXZlQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzS2V5cyhyYXdJbmZvLmRldmljZV92ZXJzaW9uLCBtKTsKKyAgICAgICAgY2FtZXJhSW5mbyA9IHJhd0luZm87CisgICAgICAgIGNhbWVyYUluZm8uc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3MgPSBtLnJlbGVhc2UoKTsKKyAgICAgICAgaW5kZXggPSBtQ2FtZXJhSW5mb01hcC5hZGQoY2FtZXJhSWQsIGNhbWVyYUluZm8pOworICAgIH0KKworICAgIGFzc2VydChpbmRleCAhPSBOQU1FX05PVF9GT1VORCk7CisgICAgLy8gcmV0dXJuIHRoZSBjYWNoZWQgY2FtZXJhIGluZm8KKyAgICAqaW5mbyA9IG1DYW1lcmFJbmZvTWFwW2luZGV4XTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2ludCBDYW1lcmFNb2R1bGU6Om9wZW4oY29uc3QgY2hhciogaWQsIHN0cnVjdCBod19kZXZpY2VfdCoqIGRldmljZSkgeworICAgIHJldHVybiBmaWx0ZXJPcGVuRXJyb3JDb2RlKG1Nb2R1bGUtPmNvbW1vbi5tZXRob2RzLT5vcGVuKCZtTW9kdWxlLT5jb21tb24sIGlkLCBkZXZpY2UpKTsKK30KKworaW50IENhbWVyYU1vZHVsZTo6b3BlbkxlZ2FjeSgKKyAgICAgICAgY29uc3QgY2hhciogaWQsIHVpbnQzMl90IGhhbFZlcnNpb24sIHN0cnVjdCBod19kZXZpY2VfdCoqIGRldmljZSkgeworICAgIHJldHVybiBtTW9kdWxlLT5vcGVuX2xlZ2FjeSgmbU1vZHVsZS0+Y29tbW9uLCBpZCwgaGFsVmVyc2lvbiwgZGV2aWNlKTsKK30KKworaW50IENhbWVyYU1vZHVsZTo6Z2V0TnVtYmVyT2ZDYW1lcmFzKCkgeworICAgIHJldHVybiBtTW9kdWxlLT5nZXRfbnVtYmVyX29mX2NhbWVyYXMoKTsKK30KKworaW50IENhbWVyYU1vZHVsZTo6c2V0Q2FsbGJhY2tzKGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QgKmNhbGxiYWNrcykgeworICAgIHJldHVybiBtTW9kdWxlLT5zZXRfY2FsbGJhY2tzKGNhbGxiYWNrcyk7Cit9CisKK2Jvb2wgQ2FtZXJhTW9kdWxlOjppc1ZlbmRvclRhZ0RlZmluZWQoKSB7CisgICAgcmV0dXJuIG1Nb2R1bGUtPmdldF92ZW5kb3JfdGFnX29wcyAhPSBOVUxMOworfQorCit2b2lkIENhbWVyYU1vZHVsZTo6Z2V0VmVuZG9yVGFnT3BzKHZlbmRvcl90YWdfb3BzX3QqIG9wcykgeworICAgIGlmIChtTW9kdWxlLT5nZXRfdmVuZG9yX3RhZ19vcHMpIHsKKyAgICAgICAgbU1vZHVsZS0+Z2V0X3ZlbmRvcl90YWdfb3BzKG9wcyk7CisgICAgfQorfQorCitpbnQgQ2FtZXJhTW9kdWxlOjpzZXRUb3JjaE1vZGUoY29uc3QgY2hhciogY2FtZXJhX2lkLCBib29sIGVuYWJsZSkgeworICAgIHJldHVybiBtTW9kdWxlLT5zZXRfdG9yY2hfbW9kZShjYW1lcmFfaWQsIGVuYWJsZSk7Cit9CisKK3N0YXR1c190IENhbWVyYU1vZHVsZTo6ZmlsdGVyT3BlbkVycm9yQ29kZShzdGF0dXNfdCBlcnIpIHsKKyAgICBzd2l0Y2goZXJyKSB7CisgICAgICAgIGNhc2UgTk9fRVJST1I6CisgICAgICAgIGNhc2UgLUVCVVNZOgorICAgICAgICBjYXNlIC1FSU5WQUw6CisgICAgICAgIGNhc2UgLUVVU0VSUzoKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIC1FTk9ERVY7Cit9CisKK3VpbnQxNl90IENhbWVyYU1vZHVsZTo6Z2V0TW9kdWxlQXBpVmVyc2lvbigpIHsKKyAgICByZXR1cm4gbU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbjsKK30KKworY29uc3QgY2hhciogQ2FtZXJhTW9kdWxlOjpnZXRNb2R1bGVOYW1lKCkgeworICAgIHJldHVybiBtTW9kdWxlLT5jb21tb24ubmFtZTsKK30KKwordWludDE2X3QgQ2FtZXJhTW9kdWxlOjpnZXRIYWxBcGlWZXJzaW9uKCkgeworICAgIHJldHVybiBtTW9kdWxlLT5jb21tb24uaGFsX2FwaV92ZXJzaW9uOworfQorCitjb25zdCBjaGFyKiBDYW1lcmFNb2R1bGU6OmdldE1vZHVsZUF1dGhvcigpIHsKKyAgICByZXR1cm4gbU1vZHVsZS0+Y29tbW9uLmF1dGhvcjsKK30KKwordm9pZCogQ2FtZXJhTW9kdWxlOjpnZXREc28oKSB7CisgICAgcmV0dXJuIG1Nb2R1bGUtPmNvbW1vbi5kc287Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhTW9kdWxlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhTW9kdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4MjJjNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFNb2R1bGUuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQU1PRFVMRV9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBTU9EVUxFX0gKKworI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworLyoqCisgKiBBIHdyYXBwZXIgY2xhc3MgZm9yIEhBTCBjYW1lcmEgbW9kdWxlLgorICoKKyAqIFRoaXMgY2xhc3Mgd3JhcHMgY2FtZXJhX21vZHVsZV90IHJldHVybmVkIGZyb20gSEFMIHRvIHByb3ZpZGUgYSB3cmFwcGVkCisgKiBnZXRfY2FtZXJhX2luZm8gaW1wbGVtZW50YXRpb24gd2hpY2ggQ2FtZXJhU2VydmljZSBnZW5lcmF0ZXMgc29tZQorICogY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBrZXlzIGRlZmluZWQgaW4gbmV3ZXIgSEFMIHZlcnNpb24gb24gYW4gb2xkZXIgSEFMLgorICovCitjbGFzcyBDYW1lcmFNb2R1bGUgeworcHVibGljOgorICAgIENhbWVyYU1vZHVsZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSk7CisgICAgdmlydHVhbCB+Q2FtZXJhTW9kdWxlKCk7CisKKyAgICAvLyBNdXN0IGJlIGNhbGxlZCBhZnRlciBjb25zdHJ1Y3Rpb24KKyAgICAvLyBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIE5PX0lOSVQgb24gZmFpbHVyZQorICAgIGludCBpbml0KCk7CisKKyAgICBpbnQgZ2V0Q2FtZXJhSW5mbyhpbnQgY2FtZXJhSWQsIHN0cnVjdCBjYW1lcmFfaW5mbyAqaW5mbyk7CisgICAgaW50IGdldE51bWJlck9mQ2FtZXJhcyh2b2lkKTsKKyAgICBpbnQgb3Blbihjb25zdCBjaGFyKiBpZCwgc3RydWN0IGh3X2RldmljZV90KiogZGV2aWNlKTsKKyAgICBpbnQgb3BlbkxlZ2FjeShjb25zdCBjaGFyKiBpZCwgdWludDMyX3QgaGFsVmVyc2lvbiwgc3RydWN0IGh3X2RldmljZV90KiogZGV2aWNlKTsKKyAgICBpbnQgc2V0Q2FsbGJhY2tzKGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QgKmNhbGxiYWNrcyk7CisgICAgYm9vbCBpc1ZlbmRvclRhZ0RlZmluZWQoKTsKKyAgICB2b2lkIGdldFZlbmRvclRhZ09wcyh2ZW5kb3JfdGFnX29wc190KiBvcHMpOworICAgIGludCBzZXRUb3JjaE1vZGUoY29uc3QgY2hhciogY2FtZXJhX2lkLCBib29sIGVuYWJsZSk7CisgICAgdWludDE2X3QgZ2V0TW9kdWxlQXBpVmVyc2lvbigpOworICAgIGNvbnN0IGNoYXIqIGdldE1vZHVsZU5hbWUoKTsKKyAgICB1aW50MTZfdCBnZXRIYWxBcGlWZXJzaW9uKCk7CisgICAgY29uc3QgY2hhciogZ2V0TW9kdWxlQXV0aG9yKCk7CisgICAgLy8gT25seSB1c2VkIGJ5IENhbWVyYU1vZHVsZUZpeHR1cmUgbmF0aXZlIHRlc3QuIERvIE5PVCB1c2UgZWxzZXdoZXJlLgorICAgIHZvaWQgKmdldERzbygpOworCitwcml2YXRlOgorICAgIC8vIERlcml2ZSBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGtleXMgZGVmaW5lZCBhZnRlciBIQUwgZGV2aWNlIHZlcnNpb24KKyAgICBzdGF0aWMgdm9pZCBkZXJpdmVDYW1lcmFDaGFyYWN0ZXJpc3RpY3NLZXlzKHVpbnQzMl90IGRldmljZVZlcnNpb24sIENhbWVyYU1ldGFkYXRhICZjaGFycyk7CisgICAgc3RhdHVzX3QgZmlsdGVyT3BlbkVycm9yQ29kZShzdGF0dXNfdCBlcnIpOworCisgICAgY2FtZXJhX21vZHVsZV90ICptTW9kdWxlOworICAgIEtleWVkVmVjdG9yPGludCwgY2FtZXJhX2luZm8+IG1DYW1lcmFJbmZvTWFwOworICAgIE11dGV4IG1DYW1lcmFJbmZvTG9jazsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKaW5kZXggMTkzNWMyYi4uN2YxNGNkNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaApAQCAtODksMjQgKzg5LDIyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGF0dXNfdCBpbml0aWFsaXplKGh3X21vZHVsZV90ICptb2R1bGUpCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShDYW1lcmFNb2R1bGUgKm1vZHVsZSkKICAgICB7CiAgICAgICAgIEFMT0dJKCJPcGVuaW5nIGNhbWVyYSAlcyIsIG1OYW1lLnN0cmluZygpKTsKLSAgICAgICAgY2FtZXJhX21vZHVsZV90ICpjYW1lcmFNb2R1bGUgPSByZWludGVycHJldF9jYXN0PGNhbWVyYV9tb2R1bGVfdCAqPihtb2R1bGUpOwogICAgICAgICBjYW1lcmFfaW5mbyBpbmZvOwotICAgICAgICBzdGF0dXNfdCByZXMgPSBjYW1lcmFNb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhhdG9pKG1OYW1lLnN0cmluZygpKSwgJmluZm8pOworICAgICAgICBzdGF0dXNfdCByZXMgPSBtb2R1bGUtPmdldENhbWVyYUluZm8oYXRvaShtTmFtZS5zdHJpbmcoKSksICZpbmZvKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAogICAgICAgICBpbnQgcmMgPSBPSzsKLSAgICAgICAgaWYgKG1vZHVsZS0+bW9kdWxlX2FwaV92ZXJzaW9uID49IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8zICYmCisgICAgICAgIGlmIChtb2R1bGUtPmdldE1vZHVsZUFwaVZlcnNpb24oKSA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMyAmJgogICAgICAgICAgICAgaW5mby5kZXZpY2VfdmVyc2lvbiA+IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wKSB7CiAgICAgICAgICAgICAvLyBPcGVuIGhpZ2hlciB2ZXJzaW9uIGNhbWVyYSBkZXZpY2UgYXMgSEFMMS4wIGRldmljZS4KLSAgICAgICAgICAgIHJjID0gY2FtZXJhTW9kdWxlLT5vcGVuX2xlZ2FjeShtb2R1bGUsIG1OYW1lLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGh3X2RldmljZV90ICoqKSZtRGV2aWNlKTsKKyAgICAgICAgICAgIHJjID0gbW9kdWxlLT5vcGVuTGVnYWN5KG1OYW1lLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChod19kZXZpY2VfdCAqKikmbURldmljZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByYyA9IENhbWVyYVNlcnZpY2U6OmZpbHRlck9wZW5FcnJvckNvZGUobW9kdWxlLT5tZXRob2RzLT5vcGVuKAotICAgICAgICAgICAgICAgIG1vZHVsZSwgbU5hbWUuc3RyaW5nKCksIChod19kZXZpY2VfdCAqKikmbURldmljZSkpOworICAgICAgICAgICAgcmMgPSBtb2R1bGUtPm9wZW4obU5hbWUuc3RyaW5nKCksIChod19kZXZpY2VfdCAqKikmbURldmljZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHJjICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IG9wZW4gY2FtZXJhICVzOiAlZCIsIG1OYW1lLnN0cmluZygpLCByYyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmNwcAppbmRleCBkMTE1OGQ2Li5jOWM5OTBjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5jcHAKQEAgLTUzLDcgKzUzLDcgQEAKICAgICByZXR1cm4gbUlkOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjppbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKQorc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6aW5pdGlhbGl6ZShDYW1lcmFNb2R1bGUgKm1vZHVsZSkKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogSW5pdGlhbGl6aW5nIGRldmljZSBmb3IgY2FtZXJhICVkIiwgX19GVU5DVElPTl9fLCBtSWQpOwpAQCAtNjgsOCArNjgsNyBAQAogCiAgICAgY2FtZXJhMl9kZXZpY2VfdCAqZGV2aWNlOwogCi0gICAgcmVzID0gQ2FtZXJhU2VydmljZTo6ZmlsdGVyT3BlbkVycm9yQ29kZShtb2R1bGUtPmNvbW1vbi5tZXRob2RzLT5vcGVuKAotICAgICAgICAmbW9kdWxlLT5jb21tb24sIG5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8aHdfZGV2aWNlX3QqKj4oJmRldmljZSkpKTsKKyAgICByZXMgPSBtb2R1bGUtPm9wZW4obmFtZSwgcmVpbnRlcnByZXRfY2FzdDxod19kZXZpY2VfdCoqPigmZGV2aWNlKSk7CiAKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IG9wZW4gY2FtZXJhICVkOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLApAQCAtODcsNyArODYsNyBAQAogICAgIH0KIAogICAgIGNhbWVyYV9pbmZvIGluZm87Ci0gICAgcmVzID0gbW9kdWxlLT5nZXRfY2FtZXJhX2luZm8obUlkLCAmaW5mbyk7CisgICAgcmVzID0gbW9kdWxlLT5nZXRDYW1lcmFJbmZvKG1JZCwgJmluZm8pOwogICAgIGlmIChyZXMgIT0gT0sgKSByZXR1cm4gcmVzOwogCiAgICAgaWYgKGluZm8uZGV2aWNlX3ZlcnNpb24gIT0gZGV2aWNlLT5jb21tb24udmVyc2lvbikgewpAQCAtMjQxLDggKzI0MCw5IEBACiAgICAgcmV0dXJuIG1SZXF1ZXN0UXVldWUud2FpdEZvckRlcXVldWUocmVxdWVzdElkLCB0aW1lb3V0KTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y3JlYXRlU3RyZWFtKHNwPEFOYXRpdmVXaW5kb3c+IGNvbnN1bWVyLAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgKmlkKSB7CitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjcmVhdGVTdHJlYW0oc3A8U3VyZmFjZT4gY29uc3VtZXIsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIC8qZGF0YVNwYWNlKi8sIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwpAQCAtMzE1LDcgKzMxNSw4IEBACiAKIAogc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Z2V0U3RyZWFtSW5mbyhpbnQgaWQsCi0gICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCkgeworICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsCisgICAgICAgIHVpbnQzMl90ICpmb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlICpkYXRhU3BhY2UpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwpAQCAtMzM2LDYgKzMzNyw3IEBACiAgICAgaWYgKHdpZHRoKSAqd2lkdGggPSAoKnN0cmVhbUkpLT5nZXRXaWR0aCgpOwogICAgIGlmIChoZWlnaHQpICpoZWlnaHQgPSAoKnN0cmVhbUkpLT5nZXRIZWlnaHQoKTsKICAgICBpZiAoZm9ybWF0KSAqZm9ybWF0ID0gKCpzdHJlYW1JKS0+Z2V0Rm9ybWF0KCk7CisgICAgaWYgKGRhdGFTcGFjZSkgKmRhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTQxNSw3ICs0MTcsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y29uZmlndXJlU3RyZWFtcygpIHsKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXMoYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogCkBAIC02MTgsNiArNjIwLDE4IEBACiAgICAgcmV0dXJuIHdhaXRVbnRpbERyYWluZWQoKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6cHJlcGFyZShpbnQgc3RyZWFtSWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiB1bmltcGxlbWVudGVkIiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgIHJldHVybiBOT19JTklUOworfQorCitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjp0ZWFyRG93bihpbnQgc3RyZWFtSWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiB1bmltcGxlbWVudGVkIiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgIHJldHVybiBOT19JTklUOworfQorCiB1aW50MzJfdCBDYW1lcmEyRGV2aWNlOjpnZXREZXZpY2VWZXJzaW9uKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgcmV0dXJuIG1EZXZpY2VWZXJzaW9uOwpAQCAtMTU4MSw0ICsxNTk1LDE4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCisvLyBjYW1lcmEgMiBkZXZpY2VzIGRvbid0IHN1cHBvcnQgcmVwcm9jZXNzaW5nCitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjcmVhdGVJbnB1dFN0cmVhbSgKKyAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgKmlkKSB7CisgICAgQUxPR0UoIiVzOiBjYW1lcmEgMiBkZXZpY2VzIGRvbid0IHN1cHBvcnQgcmVwcm9jZXNzaW5nIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKKy8vIGNhbWVyYSAyIGRldmljZXMgZG9uJ3Qgc3VwcG9ydCByZXByb2Nlc3NpbmcKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OmdldElucHV0QnVmZmVyUHJvZHVjZXIoCisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcikgeworICAgIEFMT0dFKCIlczogY2FtZXJhIDIgZGV2aWNlcyBkb24ndCBzdXBwb3J0IHJlcHJvY2Vzc2luZyIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuaAppbmRleCA0ZGVmOGFlLi4zNGMxZGVkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuaApAQCAtNDMsNyArNDMsNyBAQAogICAgICAqIENhbWVyYURldmljZSBpbnRlcmZhY2UKICAgICAgKi8KICAgICB2aXJ0dWFsIGludCAgICAgIGdldElkKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUoQ2FtZXJhTW9kdWxlICptb2R1bGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgIHZpcnR1YWwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8oKSBjb25zdDsKQEAgLTU2LDE2ICs1NiwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbGVhclN0cmVhbWluZ1JlcXVlc3QoaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB3YWl0VW50aWxSZXF1ZXN0UmVjZWl2ZWQoaW50MzJfdCByZXF1ZXN0SWQsIG5zZWNzX3QgdGltZW91dCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oc3A8U3VyZmFjZT4gY29uc3VtZXIsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUlucHV0U3RyZWFtKAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVSZXByb2Nlc3NTdHJlYW1Gcm9tU3RyZWFtKGludCBvdXRwdXRJZCwgaW50ICppZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1JbmZvKGludCBpZCwKLSAgICAgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCk7CisgICAgICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCAqZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSAqZGF0YVNwYWNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVRyYW5zZm9ybShpbnQgaWQsIGludCB0cmFuc2Zvcm0pOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKGludCBpZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZWxldGVSZXByb2Nlc3NTdHJlYW0oaW50IGlkKTsKICAgICAvLyBOby1vcCBvbiBIQUwyIGRldmljZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkID0gZmFsc2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJQcm9kdWNlcigKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcik7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwgQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd2FpdFVudGlsRHJhaW5lZCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Tm90aWZ5Q2FsbGJhY2soTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKTsKQEAgLTc5LDYgKzg1LDEwIEBACiAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwgd3A8QnVmZmVyUmVsZWFzZWRMaXN0ZW5lcj4gbGlzdGVuZXIpOwogICAgIC8vIEZsdXNoIGltcGxlbWVudGVkIGFzIGp1c3QgYSB3YWl0CiAgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaChpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICAvLyBQcmVwYXJlIGFuZCB0ZWFyRG93biBhcmUgbm8tb3BzCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKGludCBzdHJlYW1JZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCB0ZWFyRG93bihpbnQgc3RyZWFtSWQpOworCiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXREZXZpY2VWZXJzaW9uKCk7CiAgICAgdmlydHVhbCBzc2l6ZV90IGdldEpwZWdCdWZmZXJTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAppbmRleCA5NjRmYTM1Li42N2JkMjJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKQEAgLTU4LDExICs1OCwxNCBAQAogCiBDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlKGludCBpZCk6CiAgICAgICAgIG1JZChpZCksCisgICAgICAgIG1Jc0NvbnN0cmFpbmVkSGlnaFNwZWVkQ29uZmlndXJhdGlvbihmYWxzZSksCiAgICAgICAgIG1IYWwzRGV2aWNlKE5VTEwpLAogICAgICAgICBtU3RhdHVzKFNUQVRVU19VTklOSVRJQUxJWkVEKSwKKyAgICAgICAgbVN0YXR1c1dhaXRlcnMoMCksCiAgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0KGZhbHNlKSwKICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzKDEpLAogICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKDApLAorICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyKDApLAogICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcigwKSwKICAgICAgICAgbUxpc3RlbmVyKE5VTEwpCiB7CkBAIC04Nyw3ICs5MCw3IEBACiAgKiBDYW1lcmFEZXZpY2VCYXNlIGludGVyZmFjZQogICovCiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjppbml0aWFsaXplKENhbWVyYU1vZHVsZSAqbW9kdWxlKQogewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKQEAgLTEwNyw5ICsxMTAsOCBAQAogICAgIGNhbWVyYTNfZGV2aWNlX3QgKmRldmljZTsKIAogICAgIEFUUkFDRV9CRUdJTigiY2FtZXJhMy0+b3BlbiIpOwotICAgIHJlcyA9IENhbWVyYVNlcnZpY2U6OmZpbHRlck9wZW5FcnJvckNvZGUobW9kdWxlLT5jb21tb24ubWV0aG9kcy0+b3BlbigKLSAgICAgICAgJm1vZHVsZS0+Y29tbW9uLCBkZXZpY2VOYW1lLnN0cmluZygpLAotICAgICAgICByZWludGVycHJldF9jYXN0PGh3X2RldmljZV90Kio+KCZkZXZpY2UpKSk7CisgICAgcmVzID0gbW9kdWxlLT5vcGVuKGRldmljZU5hbWUuc3RyaW5nKCksCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGh3X2RldmljZV90Kio+KCZkZXZpY2UpKTsKICAgICBBVFJBQ0VfRU5EKCk7CiAKICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0xMjgsNyArMTMwLDcgQEAKICAgICB9CiAKICAgICBjYW1lcmFfaW5mbyBpbmZvOwotICAgIHJlcyA9IENhbWVyYVNlcnZpY2U6OmZpbHRlckdldEluZm9FcnJvckNvZGUobW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oCisgICAgcmVzID0gQ2FtZXJhU2VydmljZTo6ZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShtb2R1bGUtPmdldENhbWVyYUluZm8oCiAgICAgICAgIG1JZCwgJmluZm8pKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogCkBAIC0xNjQsOSArMTY2LDE3IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgLyoqIFN0YXJ0IHVwIHJlcXVlc3QgcXVldWUgdGhyZWFkICovCisgICAgYm9vbCBhZUxvY2tBdmFpbGFibGUgPSBmYWxzZTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgYWVMb2NrQXZhaWxhYmxlRW50cnk7CisgICAgcmVzID0gZmluZF9jYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkoaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljcywKKyAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9BRV9MT0NLX0FWQUlMQUJMRSwgJmFlTG9ja0F2YWlsYWJsZUVudHJ5KTsKKyAgICBpZiAocmVzID09IE9LICYmIGFlTG9ja0F2YWlsYWJsZUVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICBhZUxvY2tBdmFpbGFibGUgPSAoYWVMb2NrQXZhaWxhYmxlRW50cnkuZGF0YS51OFswXSA9PQorICAgICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9BRV9MT0NLX0FWQUlMQUJMRV9UUlVFKTsKKyAgICB9CiAKLSAgICBtUmVxdWVzdFRocmVhZCA9IG5ldyBSZXF1ZXN0VGhyZWFkKHRoaXMsIG1TdGF0dXNUcmFja2VyLCBkZXZpY2UpOworICAgIC8qKiBTdGFydCB1cCByZXF1ZXN0IHF1ZXVlIHRocmVhZCAqLworICAgIG1SZXF1ZXN0VGhyZWFkID0gbmV3IFJlcXVlc3RUaHJlYWQodGhpcywgbVN0YXR1c1RyYWNrZXIsIGRldmljZSwgYWVMb2NrQXZhaWxhYmxlKTsKICAgICByZXMgPSBtUmVxdWVzdFRocmVhZC0+cnVuKFN0cmluZzg6OmZvcm1hdCgiQzNEZXYtJWQtUmVxUXVldWUiLCBtSWQpLnN0cmluZygpKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIFNFVF9FUlJfTCgiVW5hYmxlIHRvIHN0YXJ0IHJlcXVlc3QgcXVldWUgdGhyZWFkOiAlcyAoJWQpIiwKQEAgLTE3NiwxMiArMTg2LDE1IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCisgICAgbVByZXBhcmVyVGhyZWFkID0gbmV3IFByZXBhcmVyVGhyZWFkKCk7CisKICAgICAvKiogRXZlcnl0aGluZyBpcyBnb29kIHRvIGdvICovCiAKICAgICBtRGV2aWNlVmVyc2lvbiA9IGRldmljZS0+Y29tbW9uLnZlcnNpb247CiAgICAgbURldmljZUluZm8gPSBpbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzOwogICAgIG1IYWwzRGV2aWNlID0gZGV2aWNlOwotICAgIG1TdGF0dXMgPSBTVEFUVVNfVU5DT05GSUdVUkVEOworCisgICAgaW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoU1RBVFVTX1VOQ09ORklHVVJFRCk7CiAgICAgbU5leHRTdHJlYW1JZCA9IDA7CiAgICAgbUR1bW15U3RyZWFtSWQgPSBOT19TVFJFQU07CiAgICAgbU5lZWRDb25maWcgPSB0cnVlOwpAQCAtMjAzLDYgKzIxNiwxNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGNvbmZpZ3MgPQorICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY29uZmlncy5jb3VudDsgaSArPSA0KSB7CisgICAgICAgIGlmIChjb25maWdzLmRhdGEuaTMyW2ldID09IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCAmJgorICAgICAgICAgICAgICAgIGNvbmZpZ3MuZGF0YS5pMzJbaSArIDNdID09CisgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19JTlBVVCkgeworICAgICAgICAgICAgbVN1cHBvcnRlZE9wYXF1ZUlucHV0U2l6ZXMuYWRkKFNpemUoY29uZmlncy5kYXRhLmkzMltpICsgMV0sCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3MuZGF0YS5pMzJbaSArIDJdKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI3NSw3ICsyOTksNyBAQAogICAgICAgICAgICAgbUhhbDNEZXZpY2UgPSBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgbVN0YXR1cyA9IFNUQVRVU19VTklOSVRJQUxJWkVEOworICAgICAgICBpbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZChTVEFUVVNfVU5JTklUSUFMSVpFRCk7CiAgICAgfQogCiAgICAgQUxPR1YoIiVzOiBYIiwgX19GVU5DVElPTl9fKTsKQEAgLTM0OSw3ICszNzMsNyBAQAogICAgIC8vIEdldCBtYXgganBlZyBzaXplIChhcmVhLXdpc2UpLgogICAgIFNpemUgbWF4SnBlZ1Jlc29sdXRpb24gPSBnZXRNYXhKcGVnUmVzb2x1dGlvbigpOwogICAgIGlmIChtYXhKcGVnUmVzb2x1dGlvbi53aWR0aCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBmaW5kIGZpbmQgdmFsaWQgYXZhaWxhYmxlIGpwZWcgc2l6ZXMgaW4gc3RhdGljIG1ldGFkYXRhISIsCisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBmaW5kIHZhbGlkIGF2YWlsYWJsZSBqcGVnIHNpemVzIGluIHN0YXRpYyBtZXRhZGF0YSEiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CkBAIC0zNzYsNiArNDAwLDIxIEBACiAgICAgcmV0dXJuIGpwZWdCdWZmZXJTaXplOwogfQogCitzc2l6ZV90IENhbWVyYTNEZXZpY2U6OmdldFBvaW50Q2xvdWRCdWZmZXJTaXplKCkgY29uc3QgeworICAgIGNvbnN0IGludCBGTE9BVFNfUEVSX1BPSU5UPTQ7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IG1heFBvaW50Q291bnQgPSBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfREVQVEhfTUFYX0RFUFRIX1NBTVBMRVMpOworICAgIGlmIChtYXhQb2ludENvdW50LmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGZpbmQgbWF4aW11bSBkZXB0aCBwb2ludCBjbG91ZCBzaXplIGluIHN0YXRpYyBtZXRhZGF0YSEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3NpemVfdCBtYXhCeXRlc0ZvclBvaW50Q2xvdWQgPSBzaXplb2YoYW5kcm9pZF9kZXB0aF9wb2ludHMpICsKKyAgICAgICAgICAgIG1heFBvaW50Q291bnQuZGF0YS5pMzJbMF0gKiBzaXplb2YoZmxvYXQpICogRkxPQVRTX1BFUl9QT0lOVDsKKyAgICByZXR1cm4gbWF4Qnl0ZXNGb3JQb2ludENsb3VkOworfQorCisKKwogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgICh2b2lkKWFyZ3M7CkBAIC00MDcsNiArNDQ2LDggQEAKICAgICAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgRXJyb3IgY2F1c2U6ICVzXG4iLCBtRXJyb3JDYXVzZS5zdHJpbmcoKSk7CiAgICAgfQogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgIFN0cmVhbSBjb25maWd1cmF0aW9uOlxuIik7CisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgT3BlcmF0aW9uIG1vZGU6ICVzIFxuIiwgbUlzQ29uc3RyYWluZWRIaWdoU3BlZWRDb25maWd1cmF0aW9uID8KKyAgICAgICAgICAgICJDT05TVFJBSU5FRCBISUdIIFNQRUVEIFZJREVPIiA6ICJOT1JNQUwiKTsKIAogICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gTlVMTCkgewogICAgICAgICB3cml0ZShmZCwgbGluZXMuc3RyaW5nKCksIGxpbmVzLnNpemUoKSk7CkBAIC04MDIsMTMgKzg0MywxNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y3JlYXRlU3RyZWFtKHNwPEFOYXRpdmVXaW5kb3c+IGNvbnN1bWVyLAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgKmlkKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjcmVhdGVTdHJlYW0oc3A8U3VyZmFjZT4gY29uc3VtZXIsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKKyAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7Ci0gICAgQUxPR1YoIkNhbWVyYSAlZDogQ3JlYXRpbmcgbmV3IHN0cmVhbSAlZDogJWQgeCAlZCwgZm9ybWF0ICVkIiwKLSAgICAgICAgICAgIG1JZCwgbU5leHRTdHJlYW1JZCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKKyAgICBBTE9HVigiQ2FtZXJhICVkOiBDcmVhdGluZyBuZXcgc3RyZWFtICVkOiAlZCB4ICVkLCBmb3JtYXQgJWQsIGRhdGFzcGFjZSAlZCByb3RhdGlvbiAlZCIsCisgICAgICAgICAgICBtSWQsIG1OZXh0U3RyZWFtSWQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbik7CiAKICAgICBzdGF0dXNfdCByZXM7CiAgICAgYm9vbCB3YXNBY3RpdmUgPSBmYWxzZTsKQEAgLTg0MSwxNyArODgzLDI1IEBACiAKICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtPiBuZXdTdHJlYW07CiAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKLSAgICAgICAgc3NpemVfdCBqcGVnQnVmZmVyU2l6ZSA9IGdldEpwZWdCdWZmZXJTaXplKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBpZiAoanBlZ0J1ZmZlclNpemUgPD0gMCkgewotICAgICAgICAgICAgU0VUX0VSUl9MKCJJbnZhbGlkIGpwZWcgYnVmZmVyIHNpemUgJXpkIiwganBlZ0J1ZmZlclNpemUpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgc3NpemVfdCBibG9iQnVmZmVyU2l6ZTsKKyAgICAgICAgaWYgKGRhdGFTcGFjZSAhPSBIQUxfREFUQVNQQUNFX0RFUFRIKSB7CisgICAgICAgICAgICBibG9iQnVmZmVyU2l6ZSA9IGdldEpwZWdCdWZmZXJTaXplKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgaWYgKGJsb2JCdWZmZXJTaXplIDw9IDApIHsKKyAgICAgICAgICAgICAgICBTRVRfRVJSX0woIkludmFsaWQganBlZyBidWZmZXIgc2l6ZSAlemQiLCBibG9iQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJsb2JCdWZmZXJTaXplID0gZ2V0UG9pbnRDbG91ZEJ1ZmZlclNpemUoKTsKKyAgICAgICAgICAgIGlmIChibG9iQnVmZmVyU2l6ZSA8PSAwKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJJbnZhbGlkIHBvaW50IGNsb3VkIGJ1ZmZlciBzaXplICV6ZCIsIGJsb2JCdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXIsCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwganBlZ0J1ZmZlclNpemUsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgYmxvYkJ1ZmZlclNpemUsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXIsCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24pOwogICAgIH0KICAgICBuZXdTdHJlYW0tPnNldFN0YXR1c1RyYWNrZXIobVN0YXR1c1RyYWNrZXIpOwogCkBAIC04ODksNyArOTM5LDggQEAKIAogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpnZXRTdHJlYW1JbmZvKGludCBpZCwKLSAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0KSB7CisgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwKKyAgICAgICAgdWludDMyX3QgKmZvcm1hdCwgYW5kcm9pZF9kYXRhc3BhY2UgKmRhdGFTcGFjZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CkBAIC05MjAsNyArOTcxLDcgQEAKICAgICBpZiAod2lkdGgpICp3aWR0aCAgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRXaWR0aCgpOwogICAgIGlmIChoZWlnaHQpICpoZWlnaHQgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRIZWlnaHQoKTsKICAgICBpZiAoZm9ybWF0KSAqZm9ybWF0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0Rm9ybWF0KCk7Ci0KKyAgICBpZiAoZGF0YVNwYWNlKSAqZGF0YVNwYWNlID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0RGF0YVNwYWNlKCk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xMDEwLDE2ICsxMDYxLDM1IEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zKCkgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y29uZmlndXJlU3RyZWFtcyhib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAorICAgIGlmIChtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb24gIT0gaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCkgeworICAgICAgICBtTmVlZENvbmZpZyA9IHRydWU7CisgICAgICAgIG1Jc0NvbnN0cmFpbmVkSGlnaFNwZWVkQ29uZmlndXJhdGlvbiA9IGlzQ29uc3RyYWluZWRIaWdoU3BlZWQ7CisgICAgfQorCiAgICAgcmV0dXJuIGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Z2V0SW5wdXRCdWZmZXJQcm9kdWNlcigKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKnByb2R1Y2VyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBpZiAocHJvZHVjZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAobUlucHV0U3RyZWFtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBtSW5wdXRTdHJlYW0tPmdldElucHV0QnVmZmVyUHJvZHVjZXIocHJvZHVjZXIpOworfQorCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwpAQCAtMTA2Miw5ICsxMTMyLDkgQEAKICAgICAgICAgbUhhbDNEZXZpY2UsIHRlbXBsYXRlSWQpOwogICAgIEFUUkFDRV9FTkQoKTsKICAgICBpZiAocmF3UmVxdWVzdCA9PSBOVUxMKSB7Ci0gICAgICAgIFNFVF9FUlJfTCgiSEFMIGlzIHVuYWJsZSB0byBjb25zdHJ1Y3QgZGVmYXVsdCBzZXR0aW5ncyBmb3IgdGVtcGxhdGUgJWQiLAotICAgICAgICAgICAgICAgIHRlbXBsYXRlSWQpOwotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIEFMT0dJKCIlczogdGVtcGxhdGUgJWQgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGNhbWVyYSBkZXZpY2UiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHRlbXBsYXRlSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICAqcmVxdWVzdCA9IHJhd1JlcXVlc3Q7CiAgICAgbVJlcXVlc3RUZW1wbGF0ZUNhY2hlW3RlbXBsYXRlSWRdID0gcmF3UmVxdWVzdDsKQEAgLTExMDYsNiArMTE3NiwxMyBAQAogICAgIHJldHVybiByZXM7CiB9CiAKKwordm9pZCBDYW1lcmEzRGV2aWNlOjppbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZChTdGF0dXMgc3RhdHVzKSB7CisgICAgbVN0YXR1cyA9IHN0YXR1czsKKyAgICBtUmVjZW50U3RhdHVzVXBkYXRlcy5hZGQobVN0YXR1cyk7CisgICAgbVN0YXR1c0NoYW5nZWQuYnJvYWRjYXN0KCk7Cit9CisKIC8vIFBhdXNlIHRvIHJlY29uZmlndXJlCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjppbnRlcm5hbFBhdXNlQW5kV2FpdExvY2tlZCgpIHsKICAgICBtUmVxdWVzdFRocmVhZC0+c2V0UGF1c2VkKHRydWUpOwpAQCAtMTEzNiwyMyArMTIxMyw0MCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6d2FpdFVudGlsU3RhdGVUaGVuUmVsb2NrKGJvb2wgYWN0aXZlLAotICAgICAgICBuc2Vjc190IHRpbWVvdXQpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OndhaXRVbnRpbFN0YXRlVGhlblJlbG9jayhib29sIGFjdGl2ZSwgbnNlY3NfdCB0aW1lb3V0KSB7CiAgICAgc3RhdHVzX3QgcmVzID0gT0s7Ci0gICAgaWYgKGFjdGl2ZSA9PSAobVN0YXR1cyA9PSBTVEFUVVNfQUNUSVZFKSkgewotICAgICAgICAvLyBEZXNpcmVkIHN0YXRlIGFscmVhZHkgcmVhY2hlZAotICAgICAgICByZXR1cm4gcmVzOworCisgICAgc2l6ZV90IHN0YXJ0SW5kZXggPSAwOworICAgIGlmIChtU3RhdHVzV2FpdGVycyA9PSAwKSB7CisgICAgICAgIC8vIENsZWFyIHRoZSBsaXN0IG9mIHJlY2VudCBzdGF0dXNlcyBpZiB0aGVyZSBhcmUgbm8gZXhpc3RpbmcgdGhyZWFkcyB3YWl0aW5nIG9uIHVwZGF0ZXMgdG8KKyAgICAgICAgLy8gdGhpcyBzdGF0dXMgbGlzdAorICAgICAgICBtUmVjZW50U3RhdHVzVXBkYXRlcy5jbGVhcigpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIElmIG90aGVyIHRocmVhZHMgYXJlIHdhaXRpbmcgb24gdXBkYXRlcyB0byB0aGlzIHN0YXR1cyBsaXN0LCBzZXQgdGhlIHBvc2l0aW9uIG9mIHRoZQorICAgICAgICAvLyBmaXJzdCBlbGVtZW50IHRoYXQgdGhpcyBsaXN0IHdpbGwgY2hlY2sgcmF0aGVyIHRoYW4gY2xlYXJpbmcgdGhlIGxpc3QuCisgICAgICAgIHN0YXJ0SW5kZXggPSBtUmVjZW50U3RhdHVzVXBkYXRlcy5zaXplKCk7CiAgICAgfQogCisgICAgbVN0YXR1c1dhaXRlcnMrKzsKKwogICAgIGJvb2wgc3RhdGVTZWVuID0gZmFsc2U7CiAgICAgZG8gewotICAgICAgICBtUmVjZW50U3RhdHVzVXBkYXRlcy5jbGVhcigpOworICAgICAgICBpZiAoYWN0aXZlID09IChtU3RhdHVzID09IFNUQVRVU19BQ1RJVkUpKSB7CisgICAgICAgICAgICAvLyBEZXNpcmVkIHN0YXRlIGlzIGN1cnJlbnQKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKICAgICAgICAgcmVzID0gbVN0YXR1c0NoYW5nZWQud2FpdFJlbGF0aXZlKG1Mb2NrLCB0aW1lb3V0KTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgYnJlYWs7CiAKLSAgICAgICAgLy8gQ2hlY2sgc3RhdGUgY2hhbmdlIGhpc3RvcnkgZHVyaW5nIHdhaXQKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjZW50U3RhdHVzVXBkYXRlcy5zaXplKCk7IGkrKykgeworICAgICAgICAvLyBUaGlzIGlzIGltcG9zc2libGUsIGJ1dCBpZiBub3QsIGNvdWxkIHJlc3VsdCBpbiBzdWJ0bGUgZGVhZGxvY2tzIGFuZCBpbnZhbGlkIHN0YXRlCisgICAgICAgIC8vIHRyYW5zaXRpb25zLgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0YXJ0SW5kZXggPiBtUmVjZW50U3RhdHVzVXBkYXRlcy5zaXplKCksCisgICAgICAgICAgICAgICAgIiVzOiBTa2lwcGluZyBzdGF0dXMgdXBkYXRlcyBpbiBDYW1lcmEzRGV2aWNlLCBtYXkgcmVzdWx0IGluIGRlYWRsb2NrLiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKworICAgICAgICAvLyBFbmNvdW50ZXJlZCBkZXNpcmVkIHN0YXRlIHNpbmNlIHdlIGJlZ2FuIHdhaXRpbmcKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IHN0YXJ0SW5kZXg7IGkgPCBtUmVjZW50U3RhdHVzVXBkYXRlcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgaWYgKGFjdGl2ZSA9PSAobVJlY2VudFN0YXR1c1VwZGF0ZXNbaV0gPT0gU1RBVFVTX0FDVElWRSkgKSB7CiAgICAgICAgICAgICAgICAgc3RhdGVTZWVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTExNjAsNiArMTI1NCw4IEBACiAgICAgICAgIH0KICAgICB9IHdoaWxlICghc3RhdGVTZWVuKTsKIAorICAgIG1TdGF0dXNXYWl0ZXJzLS07CisKICAgICByZXR1cm4gcmVzOwogfQogCkBAIC0xMTcyLDcgKzEyNjgsOCBAQAogICAgICAgICBBTE9HVygiJXM6IFJlcGxhY2luZyBvbGQgY2FsbGJhY2sgbGlzdGVuZXIiLCBfX0ZVTkNUSU9OX18pOwogICAgIH0KICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICBtUmVxdWVzdFRocmVhZC0+c2V0Tm90aWZ5Q2FsbGJhY2sobGlzdGVuZXIpOworICAgIG1SZXF1ZXN0VGhyZWFkLT5zZXROb3RpZmljYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgbVByZXBhcmVyVGhyZWFkLT5zZXROb3RpZmljYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xMzE4LDYgKzE0MTUsNjUgQEAKICAgICByZXR1cm4gcmVzOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpwcmVwYXJlKGludCBzdHJlYW1JZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFByZXBhcmluZyBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZWFtSWQpOworICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtOworICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7CisgICAgaWYgKG91dHB1dFN0cmVhbUlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0Iiwgc3RyZWFtSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7CisKKyAgICBpZiAoc3RyZWFtLT5pc1VucHJlcGFyYWJsZSgpIHx8IHN0cmVhbS0+aGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkgKSB7CisgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgaGFzIGFscmVhZHkgYmVlbiBhIHJlcXVlc3QgdGFyZ2V0Iiwgc3RyZWFtSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChtUmVxdWVzdFRocmVhZC0+aXNTdHJlYW1QZW5kaW5nKHN0cmVhbSkpIHsKKyAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBpcyBhbHJlYWR5IGEgdGFyZ2V0IGluIGEgcGVuZGluZyByZXF1ZXN0Iiwgc3RyZWFtSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiBtUHJlcGFyZXJUaHJlYWQtPnByZXBhcmUoc3RyZWFtKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6dGVhckRvd24oaW50IHN0cmVhbUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogVGVhcmluZyBkb3duIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlYW1JZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICAvLyBUZWFyZG93biBjYW4gb25seSBiZSBhY2NvbXBsaXNoZWQgb24gZGV2aWNlcyB0aGF0IGRvbid0IHJlcXVpcmUgcmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMsCisgICAgLy8gc2luY2Ugd2UgY2Fubm90IGNhbGwgcmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMgZXhjZXB0IHJpZ2h0IGFmdGVyIGNvbmZpZ3VyZV9zdHJlYW1zLgorICAgIGlmIChtSGFsM0RldmljZS0+Y29tbW9uLnZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byB0ZWFyIGRvd24gc3RyZWFtcyBvbiBkZXZpY2UgSEFMIHYleCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSGFsM0RldmljZS0+Y29tbW9uLnZlcnNpb24pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW07CisgICAgc3NpemVfdCBvdXRwdXRTdHJlYW1JZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKKyAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBzdHJlYW1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKKworICAgIGlmIChzdHJlYW0tPmhhc091dHN0YW5kaW5nQnVmZmVycygpIHx8IG1SZXF1ZXN0VGhyZWFkLT5pc1N0cmVhbVBlbmRpbmcoc3RyZWFtKSkgeworICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGlzIGEgdGFyZ2V0IG9mIGEgaW4tcHJvZ3Jlc3MgcmVxdWVzdCIsIHN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyZWFtLT50ZWFyRG93bigpOworfQorCiB1aW50MzJfdCBDYW1lcmEzRGV2aWNlOjpnZXREZXZpY2VWZXJzaW9uKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKQEAgLTEzNDEsOSArMTQ5Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IE5vdyAlcyIsIF9fRlVOQ1RJT05fXywgbUlkLAogICAgICAgICAgICAgICAgIGlkbGUgPyAiaWRsZSIgOiAiYWN0aXZlIik7Ci0gICAgICAgIG1TdGF0dXMgPSBpZGxlID8gU1RBVFVTX0NPTkZJR1VSRUQgOiBTVEFUVVNfQUNUSVZFOwotICAgICAgICBtUmVjZW50U3RhdHVzVXBkYXRlcy5hZGQobVN0YXR1cyk7Ci0gICAgICAgIG1TdGF0dXNDaGFuZ2VkLnNpZ25hbCgpOworICAgICAgICBpbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZChpZGxlID8gU1RBVFVTX0NPTkZJR1VSRUQgOiBTVEFUVVNfQUNUSVZFKTsKIAogICAgICAgICAvLyBTa2lwIG5vdGlmeWluZyBsaXN0ZW5lciBpZiB3ZSdyZSBkb2luZyBzb21lIHVzZXItdHJhbnNwYXJlbnQKICAgICAgICAgLy8gc3RhdGUgY2hhbmdlcwpAQCAtMTM5MSw2ICsxNTQ1LDExIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIGlzIGJlaW5nIHByZXBhcmVkCisgICAgICAgIGlmIChtSW5wdXRTdHJlYW0tPmlzUHJlcGFyaW5nKCkpIHsKKyAgICAgICAgICAgIENMT0dFKCJSZXF1ZXN0IHJlZmVyZW5jZXMgYW4gaW5wdXQgc3RyZWFtIHRoYXQncyBiZWluZyBwcmVwYXJlZCEiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKICAgICAgICAgbmV3UmVxdWVzdC0+bUlucHV0U3RyZWFtID0gbUlucHV0U3RyZWFtOwogICAgICAgICBuZXdSZXF1ZXN0LT5tU2V0dGluZ3MuZXJhc2UoQU5EUk9JRF9SRVFVRVNUX0lOUFVUX1NUUkVBTVMpOwpAQCAtMTQyMyw2ICsxNTgyLDExIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIGlzIGJlaW5nIHByZXBhcmVkCisgICAgICAgIGlmIChzdHJlYW0tPmlzUHJlcGFyaW5nKCkpIHsKKyAgICAgICAgICAgIENMT0dFKCJSZXF1ZXN0IHJlZmVyZW5jZXMgYW4gb3V0cHV0IHN0cmVhbSB0aGF0J3MgYmVpbmcgcHJlcGFyZWQhIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCiAgICAgICAgIG5ld1JlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLnB1c2goc3RyZWFtKTsKICAgICB9CkBAIC0xNDMxLDYgKzE1OTUsMTcgQEAKICAgICByZXR1cm4gbmV3UmVxdWVzdDsKIH0KIAorYm9vbCBDYW1lcmEzRGV2aWNlOjppc09wYXF1ZUlucHV0U2l6ZVN1cHBvcnRlZCh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1TdXBwb3J0ZWRPcGFxdWVJbnB1dFNpemVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIFNpemUgc2l6ZSA9IG1TdXBwb3J0ZWRPcGFxdWVJbnB1dFNpemVzW2ldOworICAgICAgICBpZiAoc2l6ZS53aWR0aCA9PSB3aWR0aCAmJiBzaXplLmhlaWdodCA9PSBoZWlnaHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zTG9ja2VkKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwpAQCAtMTQ1OCw3ICsxNjMzLDkgQEAKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogU3RhcnRpbmcgc3RyZWFtIGNvbmZpZ3VyYXRpb24iLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAKICAgICBjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uIGNvbmZpZzsKLQorICAgIGNvbmZpZy5vcGVyYXRpb25fbW9kZSA9IG1Jc0NvbnN0cmFpbmVkSGlnaFNwZWVkQ29uZmlndXJhdGlvbiA/CisgICAgICAgICAgICBDQU1FUkEzX1NUUkVBTV9DT05GSUdVUkFUSU9OX0NPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSA6CisgICAgICAgICAgICBDQU1FUkEzX1NUUkVBTV9DT05GSUdVUkFUSU9OX05PUk1BTF9NT0RFOwogICAgIGNvbmZpZy5udW1fc3RyZWFtcyA9IChtSW5wdXRTdHJlYW0gIT0gTlVMTCkgKyBtT3V0cHV0U3RyZWFtcy5zaXplKCk7CiAKICAgICBWZWN0b3I8Y2FtZXJhM19zdHJlYW1fdCo+IHN0cmVhbXM7CkBAIC0xNTI5LDcgKzE3MDYsNyBAQAogCiAgICAgICAgIC8vIFJldHVybiBzdGF0ZSB0byB0aGF0IGF0IHN0YXJ0IG9mIGNhbGwsIHNvIHRoYXQgZnV0dXJlIGNvbmZpZ3VyZXMKICAgICAgICAgLy8gcHJvcGVybHkgY2xlYW4gdGhpbmdzIHVwCi0gICAgICAgIG1TdGF0dXMgPSBTVEFUVVNfVU5DT05GSUdVUkVEOworICAgICAgICBpbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZChTVEFUVVNfVU5DT05GSUdVUkVEKTsKICAgICAgICAgbU5lZWRDb25maWcgPSB0cnVlOwogCiAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdHJlYW0gY29uZmlndXJhdGlvbiBmYWlsZWQiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CkBAIC0xNTc2LDExICsxNzUzLDggQEAKIAogICAgIG1OZWVkQ29uZmlnID0gZmFsc2U7CiAKLSAgICBpZiAobUR1bW15U3RyZWFtSWQgPT0gTk9fU1RSRUFNKSB7Ci0gICAgICAgIG1TdGF0dXMgPSBTVEFUVVNfQ09ORklHVVJFRDsKLSAgICB9IGVsc2UgewotICAgICAgICBtU3RhdHVzID0gU1RBVFVTX1VOQ09ORklHVVJFRDsKLSAgICB9CisgICAgaW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoKG1EdW1teVN0cmVhbUlkID09IE5PX1NUUkVBTSkgPworICAgICAgICAgICAgU1RBVFVTX0NPTkZJR1VSRUQgOiBTVEFUVVNfVU5DT05GSUdVUkVEKTsKIAogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdHJlYW0gY29uZmlndXJhdGlvbiBjb21wbGV0ZSIsIF9fRlVOQ1RJT05fXywgbUlkKTsKIApAQCAtMTY4OCw3ICsxODYyLDcgQEAKICAgICBtRXJyb3JDYXVzZSA9IGVycm9yQ2F1c2U7CiAKICAgICBtUmVxdWVzdFRocmVhZC0+c2V0UGF1c2VkKHRydWUpOwotICAgIG1TdGF0dXMgPSBTVEFUVVNfRVJST1I7CisgICAgaW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoU1RBVFVTX0VSUk9SKTsKIAogICAgIC8vIE5vdGlmeSB1cHN0cmVhbSBhYm91dCBhIGRldmljZSBlcnJvcgogICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgewpAQCAtMTcwNiwxMiArMTg4MCwxNCBAQAogICovCiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OnJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCi0gICAgICAgIGludDMyX3QgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsIGJvb2wgaGFzSW5wdXQpIHsKKyAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgYm9vbCBoYXNJbnB1dCwKKyAgICAgICAgY29uc3QgQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGVfdCAmYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbkZsaWdodExvY2spOwogCiAgICAgc3NpemVfdCByZXM7Ci0gICAgcmVzID0gbUluRmxpZ2h0TWFwLmFkZChmcmFtZU51bWJlciwgSW5GbGlnaHRSZXF1ZXN0KG51bUJ1ZmZlcnMsIHJlc3VsdEV4dHJhcywgaGFzSW5wdXQpKTsKKyAgICByZXMgPSBtSW5GbGlnaHRNYXAuYWRkKGZyYW1lTnVtYmVyLCBJbkZsaWdodFJlcXVlc3QobnVtQnVmZmVycywgcmVzdWx0RXh0cmFzLCBoYXNJbnB1dCwKKyAgICAgICAgICAgIGFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlKSk7CiAgICAgaWYgKHJlcyA8IDApIHJldHVybiByZXM7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xODg3LDcgKzIwNjMsNiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi0KIHZvaWQgQ2FtZXJhM0RldmljZTo6cmV0dXJuT3V0cHV0QnVmZmVycygKICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgKm91dHB1dEJ1ZmZlcnMsIHNpemVfdCBudW1CdWZmZXJzLAogICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgewpAQCAtMTk0Niw4ICsyMTIxLDEyIEBACiAKICAgICAvLyBTYW5pdHkgY2hlY2sgLSBpZiB3ZSBoYXZlIHRvbyBtYW55IGluLWZsaWdodCBmcmFtZXMsIHNvbWV0aGluZyBoYXMKICAgICAvLyBsaWtlbHkgZ29uZSB3cm9uZwotICAgIGlmIChtSW5GbGlnaHRNYXAuc2l6ZSgpID4ga0luRmxpZ2h0V2FybkxpbWl0KSB7CisgICAgaWYgKCFtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb24gJiYgbUluRmxpZ2h0TWFwLnNpemUoKSA+IGtJbkZsaWdodFdhcm5MaW1pdCkgewogICAgICAgICBDTE9HRSgiSW4tZmxpZ2h0IGxpc3QgdG9vIGxhcmdlOiAlenUiLCBtSW5GbGlnaHRNYXAuc2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKG1Jc0NvbnN0cmFpbmVkSGlnaFNwZWVkQ29uZmlndXJhdGlvbiAmJiBtSW5GbGlnaHRNYXAuc2l6ZSgpID4KKyAgICAgICAgICAgIGtJbkZsaWdodFdhcm5MaW1pdEhpZ2hTcGVlZCkgeworICAgICAgICBDTE9HRSgiSW4tZmxpZ2h0IGxpc3QgdG9vIGxhcmdlIGZvciBoaWdoIHNwZWVkIGNvbmZpZ3VyYXRpb246ICV6dSIsCisgICAgICAgICAgICAgICAgbUluRmxpZ2h0TWFwLnNpemUoKSk7CiAgICAgfQogfQogCkBAIC0xOTU1LDIwICsyMTM0LDMyIEBACiB2b2lkIENhbWVyYTNEZXZpY2U6OnNlbmRDYXB0dXJlUmVzdWx0KENhbWVyYU1ldGFkYXRhICZwZW5kaW5nTWV0YWRhdGEsCiAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgJnJlc3VsdEV4dHJhcywKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgJmNvbGxlY3RlZFBhcnRpYWxSZXN1bHQsCi0gICAgICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyKSB7CisgICAgICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICBib29sIHJlcHJvY2VzcywKKyAgICAgICAgY29uc3QgQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGVfdCAmYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUpIHsKICAgICBpZiAocGVuZGluZ01ldGFkYXRhLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU91dHB1dExvY2spOwogCiAgICAgLy8gVE9ETzogbmVlZCB0byB0cmFjayBlcnJvcnMgZm9yIHRpZ2h0ZXIgYm91bmRzIG9uIGV4cGVjdGVkIGZyYW1lIG51bWJlcgotICAgIGlmIChmcmFtZU51bWJlciA8IG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIpIHsKLSAgICAgICAgU0VUX0VSUigiT3V0LW9mLW9yZGVyIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIHN1Ym1pdHRlZCEgIgorICAgIGlmIChyZXByb2Nlc3MpIHsKKyAgICAgICAgaWYgKGZyYW1lTnVtYmVyIDwgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlcikgeworICAgICAgICAgICAgU0VUX0VSUigiT3V0LW9mLW9yZGVyIHJlcHJvY2VzcyBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBzdWJtaXR0ZWQhICIKICAgICAgICAgICAgICAgICAiKGdvdCBmcmFtZSBudW1iZXIgJWQsIGV4cGVjdGluZyAlZCkiLAotICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXIgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmcmFtZU51bWJlciA8IG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgIFNFVF9FUlIoIk91dC1vZi1vcmRlciBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBzdWJtaXR0ZWQhICIKKyAgICAgICAgICAgICAgICAgICAgIihnb3QgZnJhbWUgbnVtYmVyICVkLCBleHBlY3RpbmcgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlciArIDE7CiAgICAgfQotICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlciArIDE7CiAKICAgICBDYXB0dXJlUmVzdWx0IGNhcHR1cmVSZXN1bHQ7CiAgICAgY2FwdHVyZVJlc3VsdC5tUmVzdWx0RXh0cmFzID0gcmVzdWx0RXh0cmFzOwpAQCAtMjAwMCw2ICsyMTkxLDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIG92ZXJyaWRlUmVzdWx0Rm9yUHJlY2FwdHVyZUNhbmNlbCgmY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEsIGFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlKTsKKwogICAgIC8vIFZhbGlkIHJlc3VsdCwgaW5zZXJ0IGludG8gcXVldWUKICAgICBMaXN0PENhcHR1cmVSZXN1bHQ+OjppdGVyYXRvciBxdWV1ZWRSZXN1bHQgPQogICAgICAgICAgICAgbVJlc3VsdFF1ZXVlLmluc2VydChtUmVzdWx0UXVldWUuZW5kKCksIENhcHR1cmVSZXN1bHQoY2FwdHVyZVJlc3VsdCkpOwpAQCAtMjE3OCw3ICsyMzcxLDggQEAKICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IHJlc3VsdC0+cmVzdWx0OwogICAgICAgICAgICAgICAgIHNlbmRDYXB0dXJlUmVzdWx0KG1ldGFkYXRhLCByZXF1ZXN0LnJlc3VsdEV4dHJhcywKLSAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkUGFydGlhbFJlc3VsdCwgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0LCBmcmFtZU51bWJlciwgaGFzSW5wdXRCdWZmZXJJblJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTIzNDAsNyArMjUzNCw4IEBACiAKICAgICAgICAgICAgIC8vIHNlbmQgcGVuZGluZyByZXN1bHQgYW5kIGJ1ZmZlcnMKICAgICAgICAgICAgIHNlbmRDYXB0dXJlUmVzdWx0KHIucGVuZGluZ01ldGFkYXRhLCByLnJlc3VsdEV4dHJhcywKLSAgICAgICAgICAgICAgICByLnBhcnRpYWxSZXN1bHQuY29sbGVjdGVkUmVzdWx0LCBtc2cuZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgICAgICByLnBhcnRpYWxSZXN1bHQuY29sbGVjdGVkUmVzdWx0LCBtc2cuZnJhbWVfbnVtYmVyLAorICAgICAgICAgICAgICAgIHIuaGFzSW5wdXRCdWZmZXIsIHIuYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUpOwogICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhyLnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFycmF5KCksCiAgICAgICAgICAgICAgICAgci5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIHIuc2h1dHRlclRpbWVzdGFtcCk7CiAgICAgICAgICAgICByLnBlbmRpbmdPdXRwdXRCdWZmZXJzLmNsZWFyKCk7CkBAIC0yMzc0LDggKzI1NjksOSBAQAogCiBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKLSAgICAgICAgY2FtZXJhM19kZXZpY2VfdCAqaGFsM0RldmljZSkgOgotICAgICAgICBUaHJlYWQoZmFsc2UpLAorICAgICAgICBjYW1lcmEzX2RldmljZV90ICpoYWwzRGV2aWNlLAorICAgICAgICBib29sIGFlTG9ja0F2YWlsYWJsZSkgOgorICAgICAgICBUaHJlYWQoLypjYW5DYWxsSmF2YSovZmFsc2UpLAogICAgICAgICBtUGFyZW50KHBhcmVudCksCiAgICAgICAgIG1TdGF0dXNUcmFja2VyKHN0YXR1c1RyYWNrZXIpLAogICAgICAgICBtSGFsM0RldmljZShoYWwzRGV2aWNlKSwKQEAgLTIzODcsMTEgKzI1ODMsMTIgQEAKICAgICAgICAgbUxhdGVzdFJlcXVlc3RJZChOQU1FX05PVF9GT1VORCksCiAgICAgICAgIG1DdXJyZW50QWZUcmlnZ2VySWQoMCksCiAgICAgICAgIG1DdXJyZW50UHJlQ2FwdHVyZVRyaWdnZXJJZCgwKSwKLSAgICAgICAgbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcihOT19JTl9GTElHSFRfUkVQRUFUSU5HX0ZSQU1FUykgeworICAgICAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyKE5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTKSwKKyAgICAgICAgbUFlTG9ja0F2YWlsYWJsZShhZUxvY2tBdmFpbGFibGUpIHsKICAgICBtU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKIH0KIAotdm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpzZXROb3RpZnlDYWxsYmFjaygKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2V0Tm90aWZpY2F0aW9uTGlzdGVuZXIoCiAgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CkBAIC0yNTMyLDYgKzI3MjksMjEgQEAKICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewogICAgICAgICBmb3IgKFJlcXVlc3RMaXN0OjppdGVyYXRvciBpdCA9IG1SZXF1ZXN0UXVldWUuYmVnaW4oKTsKICAgICAgICAgICAgICAgICAgaXQgIT0gbVJlcXVlc3RRdWV1ZS5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgLy8gQWJvcnQgdGhlIGlucHV0IGJ1ZmZlcnMgZm9yIHJlcHJvY2VzcyByZXF1ZXN0cy4KKyAgICAgICAgICAgIGlmICgoKml0KS0+bUlucHV0U3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCBpbnB1dEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSAoKml0KS0+bUlucHV0U3RyZWFtLT5nZXRJbnB1dEJ1ZmZlcigmaW5wdXRCdWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiAlZDogY291bGRuJ3QgZ2V0IGlucHV0IGJ1ZmZlciB3aGlsZSBjbGVhcmluZyB0aGUgcmVxdWVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3Q6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXMgPSAoKml0KS0+bUlucHV0U3RyZWFtLT5yZXR1cm5JbnB1dEJ1ZmZlcihpbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogJWQ6IGNvdWxkbid0IHJldHVybiBpbnB1dCBidWZmZXIgd2hpbGUgY2xlYXJpbmcgdGhlIHJlcXVlc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gU2V0IHRoZSBmcmFtZSBudW1iZXIgdGhpcyByZXF1ZXN0IHdvdWxkIGhhdmUgaGFkLCBpZiBpdAogICAgICAgICAgICAgLy8gaGFkIGJlZW4gc3VibWl0dGVkOyB0aGlzIGZyYW1lIG51bWJlciB3aWxsIG5vdCBiZSByZXVzZWQuCiAgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdElkIGFuZCBidXJzdElkIGZpZWxkcyB3ZXJlIHNldCB3aGVuIHRoZSByZXF1ZXN0IHdhcwpAQCAtMjU4MCw2ICsyNzkyLDY1IEBACiAgICAgbVJlcXVlc3RTaWduYWwuc2lnbmFsKCk7CiB9CiAKKworLyoqCisgKiBGb3IgZGV2aWNlcyA8PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMiwgQUVfUFJFQ0FQVFVSRV9UUklHR0VSX0NBTkNFTCBpcyBub3Qgc3VwcG9ydGVkIHNvCisgKiB3ZSBuZWVkIHRvIG92ZXJyaWRlIEFFX1BSRUNBUFRVUkVfVFJJR0dFUl9DQU5DRUwgdG8gQUVfUFJFQ0FQVFVSRV9UUklHR0VSX0lETEUgYW5kIEFFX0xPQ0tfT0ZGCisgKiB0byBBRV9MT0NLX09OIHRvIHN0YXJ0IGNhbmNlbGxpbmcgQUUgcHJlY2FwdHVyZS4gSWYgQUUgbG9jayBpcyBub3QgYXZhaWxhYmxlLCBpdCBzdGlsbCBvdmVycmlkZXMKKyAqIEFFX1BSRUNBUFRVUkVfVFJJR0dFUl9DQU5DRUwgdG8gQUVfUFJFQ0FQVFVSRV9UUklHR0VSX0lETEUgYnV0IGRvZXNuJ3QgYWRkIEFFX0xPQ0tfT04gdG8gdGhlCisgKiByZXF1ZXN0LgorICovCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmhhbmRsZUFlUHJlY2FwdHVyZUNhbmNlbFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QpIHsKKyAgICByZXF1ZXN0LT5tQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUuYXBwbHlBZUxvY2sgPSBmYWxzZTsKKyAgICByZXF1ZXN0LT5tQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUuYXBwbHlBZVByZWNhcHR1cmVUcmlnZ2VyID0gZmFsc2U7CisKKyAgICBpZiAobUhhbDNEZXZpY2UtPmNvbW1vbi52ZXJzaW9uID4gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGFlUHJlY2FwdHVyZVRyaWdnZXIgPQorICAgICAgICAgICAgcmVxdWVzdC0+bVNldHRpbmdzLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUik7CisgICAgaWYgKGFlUHJlY2FwdHVyZVRyaWdnZXIuY291bnQgPiAwICYmCisgICAgICAgICAgICBhZVByZWNhcHR1cmVUcmlnZ2VyLmRhdGEudThbMF0gPT0gQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUl9DQU5DRUwpIHsKKyAgICAgICAgLy8gQWx3YXlzIG92ZXJyaWRlIENBTkNFTCB0byBJRExFCisgICAgICAgIHVpbnQ4X3QgYWVQcmVjYXB0dXJlVHJpZ2dlciA9IEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVJfSURMRTsKKyAgICAgICAgcmVxdWVzdC0+bVNldHRpbmdzLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSLCAmYWVQcmVjYXB0dXJlVHJpZ2dlciwgMSk7CisgICAgICAgIHJlcXVlc3QtPm1BZVRyaWdnZXJDYW5jZWxPdmVycmlkZS5hcHBseUFlUHJlY2FwdHVyZVRyaWdnZXIgPSB0cnVlOworICAgICAgICByZXF1ZXN0LT5tQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUuYWVQcmVjYXB0dXJlVHJpZ2dlciA9CisgICAgICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUl9DQU5DRUw7CisKKyAgICAgICAgaWYgKG1BZUxvY2tBdmFpbGFibGUgPT0gdHJ1ZSkgeworICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgYWVMb2NrID0gcmVxdWVzdC0+bVNldHRpbmdzLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FFX0xPQ0spOworICAgICAgICAgICAgaWYgKGFlTG9jay5jb3VudCA9PSAwIHx8ICBhZUxvY2suZGF0YS51OFswXSA9PSBBTkRST0lEX0NPTlRST0xfQUVfTE9DS19PRkYpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGFlTG9jayA9IEFORFJPSURfQ09OVFJPTF9BRV9MT0NLX09OOworICAgICAgICAgICAgICAgIHJlcXVlc3QtPm1TZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX0xPQ0ssICZhZUxvY2ssIDEpOworICAgICAgICAgICAgICAgIHJlcXVlc3QtPm1BZVRyaWdnZXJDYW5jZWxPdmVycmlkZS5hcHBseUFlTG9jayA9IHRydWU7CisgICAgICAgICAgICAgICAgcmVxdWVzdC0+bUFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlLmFlTG9jayA9IEFORFJPSURfQ09OVFJPTF9BRV9MT0NLX09GRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBPdmVycmlkZSByZXN1bHQgbWV0YWRhdGEgZm9yIGNhbmNlbGxpbmcgQUUgcHJlY2FwdHVyZSB0cmlnZ2VyIGFwcGxpZWQgaW4KKyAqIGhhbmRsZUFlUHJlY2FwdHVyZUNhbmNlbFJlcXVlc3QoKS4KKyAqLwordm9pZCBDYW1lcmEzRGV2aWNlOjpvdmVycmlkZVJlc3VsdEZvclByZWNhcHR1cmVDYW5jZWwoCisgICAgICAgIENhbWVyYU1ldGFkYXRhICpyZXN1bHQsIGNvbnN0IEFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlX3QgJmFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlKSB7CisgICAgaWYgKGFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlLmFwcGx5QWVMb2NrKSB7CisgICAgICAgIC8vIE9ubHkgZGV2aWNlcyA8PSB2My4yIHNob3VsZCBoYXZlIHRoaXMgb3ZlcnJpZGUKKyAgICAgICAgYXNzZXJ0KG1EZXZpY2VWZXJzaW9uIDw9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKTsKKyAgICAgICAgcmVzdWx0LT51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX0xPQ0ssICZhZVRyaWdnZXJDYW5jZWxPdmVycmlkZS5hZUxvY2ssIDEpOworICAgIH0KKworICAgIGlmIChhZVRyaWdnZXJDYW5jZWxPdmVycmlkZS5hcHBseUFlUHJlY2FwdHVyZVRyaWdnZXIpIHsKKyAgICAgICAgLy8gT25seSBkZXZpY2VzIDw9IHYzLjIgc2hvdWxkIGhhdmUgdGhpcyBvdmVycmlkZQorICAgICAgICBhc3NlcnQobURldmljZVZlcnNpb24gPD0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpOworICAgICAgICByZXN1bHQtPnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSLAorICAgICAgICAgICAgICAgICZhZVRyaWdnZXJDYW5jZWxPdmVycmlkZS5hZVByZWNhcHR1cmVUcmlnZ2VyLCAxKTsKKyAgICB9Cit9CisKIGJvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6dGhyZWFkTG9vcCgpIHsKIAogICAgIHN0YXR1c190IHJlczsKQEAgLTI2NzEsMjkgKzI5NDIsMTEgQEAKICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgfQogCi0gICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgaW5wdXRCdWZmZXI7CiAgICAgdWludDMyX3QgdG90YWxOdW1CdWZmZXJzID0gMDsKIAogICAgIC8vIEZpbGwgaW4gYnVmZmVycwotCiAgICAgaWYgKG5leHRSZXF1ZXN0LT5tSW5wdXRTdHJlYW0gIT0gTlVMTCkgewotICAgICAgICByZXF1ZXN0LmlucHV0X2J1ZmZlciA9ICZpbnB1dEJ1ZmZlcjsKLSAgICAgICAgcmVzID0gbmV4dFJlcXVlc3QtPm1JbnB1dFN0cmVhbS0+Z2V0SW5wdXRCdWZmZXIoJmlucHV0QnVmZmVyKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgLy8gQ2FuJ3QgZ2V0IGlucHV0IGJ1ZmZlciBmcm9tIGdyYWxsb2MgcXVldWUgLSB0aGlzIGNvdWxkIGJlIGR1ZSB0bwotICAgICAgICAgICAgLy8gZGlzY29ubmVjdGVkIHF1ZXVlIG9yIG90aGVyIHByb2R1Y2VyIG1pc2JlaGF2aW9yLCBzbyBub3QgYSBmYXRhbAotICAgICAgICAgICAgLy8gZXJyb3IKLSAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0VGhyZWFkOiBDYW4ndCBnZXQgaW5wdXQgYnVmZmVyLCBza2lwcGluZyByZXF1ZXN0OiIKLSAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOwotICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUxpc3RlbmVyLT5ub3RpZnlFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xlYW5VcEZhaWxlZFJlcXVlc3QocmVxdWVzdCwgbmV4dFJlcXVlc3QsIG91dHB1dEJ1ZmZlcnMpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5pbnB1dF9idWZmZXIgPSAmbmV4dFJlcXVlc3QtPm1JbnB1dEJ1ZmZlcjsKICAgICAgICAgdG90YWxOdW1CdWZmZXJzICs9IDE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmVxdWVzdC5pbnB1dF9idWZmZXIgPSBOVUxMOwpAQCAtMjcxMSwxMSArMjk2NCwxMyBAQAogICAgICAgICAgICAgLy8gZXJyb3IKICAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0VGhyZWFkOiBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciwgc2tpcHBpbmcgcmVxdWVzdDoiCiAgICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKLSAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1MaXN0ZW5lci0+bm90aWZ5RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOworICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXItPm5vdGlmeUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTI3MzUsNyArMjk5MCw4IEBACiAKICAgICByZXMgPSBwYXJlbnQtPnJlZ2lzdGVySW5GbGlnaHQocmVxdWVzdC5mcmFtZV9udW1iZXIsCiAgICAgICAgICAgICB0b3RhbE51bUJ1ZmZlcnMsIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLAotICAgICAgICAgICAgLypoYXNJbnB1dCovcmVxdWVzdC5pbnB1dF9idWZmZXIgIT0gTlVMTCk7CisgICAgICAgICAgICAvKmhhc0lucHV0Ki9yZXF1ZXN0LmlucHV0X2J1ZmZlciAhPSBOVUxMLAorICAgICAgICAgICAgbmV4dFJlcXVlc3QtPm1BZVRyaWdnZXJDYW5jZWxPdmVycmlkZSk7CiAgICAgQUxPR1ZWKCIlczogcmVnaXN0ZXJlZCBpbiBmbGlnaHQgcmVxdWVzdElkID0gJSIgUFJJZDMyICIsIGZyYW1lTnVtYmVyID0gJSIgUFJJZDY0CiAgICAgICAgICAgICIsIGJ1cnN0SWQgPSAlIiBQUklkMzIgIi4iLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLApAQCAtMjc4NCw2ICszMDQwLDEyIEBACiAgICAgICAgIG5leHRSZXF1ZXN0LT5tU2V0dGluZ3MudW5sb2NrKHJlcXVlc3Quc2V0dGluZ3MpOwogICAgIH0KIAorICAgIC8vIFVuc2V0IGFzIGN1cnJlbnQgcmVxdWVzdAorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKKyAgICAgICAgbU5leHRSZXF1ZXN0LmNsZWFyKCk7CisgICAgfQorCiAgICAgLy8gUmVtb3ZlIGFueSBwcmV2aW91c2x5IHF1ZXVlZCB0cmlnZ2VycyAoYWZ0ZXIgdW5sb2NrKQogICAgIHJlcyA9IHJlbW92ZVRyaWdnZXJzKG1QcmV2UmVxdWVzdCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMjgwNSw2ICszMDY3LDMzIEBACiAgICAgcmV0dXJuIG1MYXRlc3RSZXF1ZXN0OwogfQogCitib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmlzU3RyZWFtUGVuZGluZygKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4mIHN0cmVhbSkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisKKyAgICBpZiAobU5leHRSZXF1ZXN0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzIDogbU5leHRSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcykgeworICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBzKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyZWFtID09IG1OZXh0UmVxdWVzdC0+bUlucHV0U3RyZWFtKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHJlcXVlc3QgOiBtUmVxdWVzdFF1ZXVlKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcyA6IHJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zKSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtID09IHMpIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJlYW0gPT0gcmVxdWVzdC0+bUlucHV0U3RyZWFtKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHJlcXVlc3QgOiBtUmVwZWF0aW5nUmVxdWVzdHMpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzIDogcmVxdWVzdC0+bU91dHB1dFN0cmVhbXMpIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gcykgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmVhbSA9PSByZXF1ZXN0LT5tSW5wdXRTdHJlYW0pIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhblVwRmFpbGVkUmVxdWVzdCgKICAgICAgICAgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAmcmVxdWVzdCwKQEAgLTI4MTQsMTUgKzMxMDMsMTggQEAKICAgICBpZiAocmVxdWVzdC5zZXR0aW5ncyAhPSBOVUxMKSB7CiAgICAgICAgIG5leHRSZXF1ZXN0LT5tU2V0dGluZ3MudW5sb2NrKHJlcXVlc3Quc2V0dGluZ3MpOwogICAgIH0KLSAgICBpZiAocmVxdWVzdC5pbnB1dF9idWZmZXIgIT0gTlVMTCkgewotICAgICAgICByZXF1ZXN0LmlucHV0X2J1ZmZlci0+c3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOwotICAgICAgICBuZXh0UmVxdWVzdC0+bUlucHV0U3RyZWFtLT5yZXR1cm5JbnB1dEJ1ZmZlcigqKHJlcXVlc3QuaW5wdXRfYnVmZmVyKSk7CisgICAgaWYgKG5leHRSZXF1ZXN0LT5tSW5wdXRTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICBuZXh0UmVxdWVzdC0+bUlucHV0QnVmZmVyLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgbmV4dFJlcXVlc3QtPm1JbnB1dFN0cmVhbS0+cmV0dXJuSW5wdXRCdWZmZXIobmV4dFJlcXVlc3QtPm1JbnB1dEJ1ZmZlcik7CiAgICAgfQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxdWVzdC5udW1fb3V0cHV0X2J1ZmZlcnM7IGkrKykgewogICAgICAgICBvdXRwdXRCdWZmZXJzLmVkaXRJdGVtQXQoaSkuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOwogICAgICAgICBuZXh0UmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuZWRpdEl0ZW1BdChpKS0+cmV0dXJuQnVmZmVyKAogICAgICAgICAgICAgb3V0cHV0QnVmZmVyc1tpXSwgMCk7CiAgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKKyAgICBtTmV4dFJlcXVlc3QuY2xlYXIoKTsKIH0KIAogc3A8Q2FtZXJhM0RldmljZTo6Q2FwdHVyZVJlcXVlc3Q+CkBAIC0yOTA1LDcgKzMxOTcsMzEgQEAKICAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIgPSBtRnJhbWVOdW1iZXIrKzsKICAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMuYWZUcmlnZ2VySWQgPSBtQ3VycmVudEFmVHJpZ2dlcklkOwogICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5wcmVjYXB0dXJlVHJpZ2dlcklkID0gbUN1cnJlbnRQcmVDYXB0dXJlVHJpZ2dlcklkOworCisgICAgICAgIC8vIFNpbmNlIFJlcXVlc3RUaHJlYWQ6OmNsZWFyKCkgcmVtb3ZlcyBidWZmZXJzIGZyb20gdGhlIGlucHV0IHN0cmVhbSwKKyAgICAgICAgLy8gZ2V0IHRoZSByaWdodCBidWZmZXIgaGVyZSBiZWZvcmUgdW5sb2NraW5nIG1SZXF1ZXN0TG9jaworICAgICAgICBpZiAobmV4dFJlcXVlc3QtPm1JbnB1dFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICByZXMgPSBuZXh0UmVxdWVzdC0+bUlucHV0U3RyZWFtLT5nZXRJbnB1dEJ1ZmZlcigmbmV4dFJlcXVlc3QtPm1JbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gQ2FuJ3QgZ2V0IGlucHV0IGJ1ZmZlciBmcm9tIGdyYWxsb2MgcXVldWUgLSB0aGlzIGNvdWxkIGJlIGR1ZSB0bworICAgICAgICAgICAgICAgIC8vIGRpc2Nvbm5lY3RlZCBxdWV1ZSBvciBvdGhlciBwcm9kdWNlciBtaXNiZWhhdmlvciwgc28gbm90IGEgZmF0YWwKKyAgICAgICAgICAgICAgICAvLyBlcnJvcgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgZ2V0IGlucHV0IGJ1ZmZlciwgc2tpcHBpbmcgcmVxdWVzdDoiCisgICAgICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXItPm5vdGlmeUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CisKKyAgICBoYW5kbGVBZVByZWNhcHR1cmVDYW5jZWxSZXF1ZXN0KG5leHRSZXF1ZXN0KTsKKworICAgIG1OZXh0UmVxdWVzdCA9IG5leHRSZXF1ZXN0OworCiAgICAgcmV0dXJuIG5leHRSZXF1ZXN0OwogfQogCkBAIC0zMTUyLDYgKzM0NjgsMTM4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCisvKioKKyAqIFByZXBhcmVyVGhyZWFkIGlubmVyIGNsYXNzIG1ldGhvZHMKKyAqLworCitDYW1lcmEzRGV2aWNlOjpQcmVwYXJlclRocmVhZDo6UHJlcGFyZXJUaHJlYWQoKSA6CisgICAgICAgIFRocmVhZCgvKmNhbkNhbGxKYXZhKi9mYWxzZSksIG1BY3RpdmUoZmFsc2UpLCBtQ2FuY2VsTm93KGZhbHNlKSB7Cit9CisKK0NhbWVyYTNEZXZpY2U6OlByZXBhcmVyVGhyZWFkOjp+UHJlcGFyZXJUaHJlYWQoKSB7CisgICAgVGhyZWFkOjpyZXF1ZXN0RXhpdEFuZFdhaXQoKTsKKyAgICBpZiAobUN1cnJlbnRTdHJlYW0gIT0gbnVsbHB0cikgeworICAgICAgICBtQ3VycmVudFN0cmVhbS0+Y2FuY2VsUHJlcGFyZSgpOworICAgICAgICBBVFJBQ0VfQVNZTkNfRU5EKCJzdHJlYW0gcHJlcGFyZSIsIG1DdXJyZW50U3RyZWFtLT5nZXRJZCgpKTsKKyAgICAgICAgbUN1cnJlbnRTdHJlYW0uY2xlYXIoKTsKKyAgICB9CisgICAgY2xlYXIoKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UHJlcGFyZXJUaHJlYWQ6OnByZXBhcmUoc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4mIHN0cmVhbSkgeworICAgIHN0YXR1c190IHJlczsKKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIHJlcyA9IHN0cmVhbS0+c3RhcnRQcmVwYXJlKCk7CisgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAvLyBObyBwcmVwYXJhdGlvbiBuZWVkZWQsIGZpcmUgbGlzdGVuZXIgcmlnaHQgb2ZmCisgICAgICAgIEFMT0dWKCIlczogU3RyZWFtICVkIGFscmVhZHkgcHJlcGFyZWQiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbS0+Z2V0SWQoKSk7CisgICAgICAgIGlmIChtTGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lci0+bm90aWZ5UHJlcGFyZWQoc3RyZWFtLT5nZXRJZCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChyZXMgIT0gTk9UX0VOT1VHSF9EQVRBKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gTmVlZCB0byBwcmVwYXJlLCBzdGFydCB1cCB0aHJlYWQgaWYgbmVjZXNzYXJ5CisgICAgaWYgKCFtQWN0aXZlKSB7CisgICAgICAgIC8vIG1SdW5uaW5nIHdpbGwgY2hhbmdlIHRvIGZhbHNlIGJlZm9yZSB0aGUgdGhyZWFkIGZ1bGx5IHNodXRzIGRvd24sIHNvIHdhaXQgdG8gYmUgc3VyZSBpdAorICAgICAgICAvLyBpc24ndCBydW5uaW5nCisgICAgICAgIFRocmVhZDo6cmVxdWVzdEV4aXRBbmRXYWl0KCk7CisgICAgICAgIHJlcyA9IFRocmVhZDo6cnVuKCJDM1ByZXBUaHJlYWQiLCBQUklPUklUWV9CQUNLR1JPVU5EKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc3RhcnQgcHJlcGFyZXIgc3RyZWFtOiAlZCAoJXMpIiwgX19GVU5DVElPTl9fLCByZXMsIHN0cmVycm9yKC1yZXMpKTsKKyAgICAgICAgICAgIGlmIChtTGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICBtTGlzdGVuZXItPm5vdGlmeVByZXBhcmVkKHN0cmVhbS0+Z2V0SWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIG1DYW5jZWxOb3cgPSBmYWxzZTsKKyAgICAgICAgbUFjdGl2ZSA9IHRydWU7CisgICAgICAgIEFMT0dWKCIlczogUHJlcGFyZXIgc3RyZWFtIHN0YXJ0ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKworICAgIC8vIHF1ZXVlIHVwIHRoZSB3b3JrCisgICAgbVBlbmRpbmdTdHJlYW1zLnB1c2hfYmFjayhzdHJlYW0pOworICAgIEFMT0dWKCIlczogU3RyZWFtICVkIHF1ZXVlZCBmb3IgcHJlcGFyaW5nIiwgX19GVU5DVElPTl9fLCBzdHJlYW0tPmdldElkKCkpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpQcmVwYXJlclRocmVhZDo6Y2xlYXIoKSB7CisgICAgc3RhdHVzX3QgcmVzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgZm9yIChjb25zdCBhdXRvJiBzdHJlYW0gOiBtUGVuZGluZ1N0cmVhbXMpIHsKKyAgICAgICAgc3RyZWFtLT5jYW5jZWxQcmVwYXJlKCk7CisgICAgfQorICAgIG1QZW5kaW5nU3RyZWFtcy5jbGVhcigpOworICAgIG1DYW5jZWxOb3cgPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlByZXBhcmVyVGhyZWFkOjpzZXROb3RpZmljYXRpb25MaXN0ZW5lcihOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Cit9CisKK2Jvb2wgQ2FtZXJhM0RldmljZTo6UHJlcGFyZXJUaHJlYWQ6OnRocmVhZExvb3AoKSB7CisgICAgc3RhdHVzX3QgcmVzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBpZiAobUN1cnJlbnRTdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gRW5kIHRocmVhZCBpZiBkb25lIHdpdGggd29yaworICAgICAgICAgICAgaWYgKG1QZW5kaW5nU3RyZWFtcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBQcmVwYXJlciBzdHJlYW0gb3V0IG9mIHdvcmsiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIC8vIHRocmVhZExvb3AgX211c3Qgbm90XyByZS1hY3F1aXJlIG1Mb2NrIGFmdGVyIGl0IHNldHMgbUFjdGl2ZSB0byBmYWxzZTsgd291bGQKKyAgICAgICAgICAgICAgICAvLyBjYXVzZSBkZWFkbG9jayB3aXRoIHByZXBhcmUoKSdzIHJlcXVlc3RFeGl0QW5kV2FpdCB0cmlnZ2VyZWQgYnkgIW1BY3RpdmUuCisgICAgICAgICAgICAgICAgbUFjdGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gR2V0IG5leHQgc3RyZWFtIHRvIHByZXBhcmUKKyAgICAgICAgICAgIGF1dG8gaXQgPSBtUGVuZGluZ1N0cmVhbXMuYmVnaW4oKTsKKyAgICAgICAgICAgIG1DdXJyZW50U3RyZWFtID0gKml0OworICAgICAgICAgICAgbVBlbmRpbmdTdHJlYW1zLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIEFUUkFDRV9BU1lOQ19CRUdJTigic3RyZWFtIHByZXBhcmUiLCBtQ3VycmVudFN0cmVhbS0+Z2V0SWQoKSk7CisgICAgICAgICAgICBBTE9HVigiJXM6IFByZXBhcmluZyBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIG1DdXJyZW50U3RyZWFtLT5nZXRJZCgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQ2FuY2VsTm93KSB7CisgICAgICAgICAgICBtQ3VycmVudFN0cmVhbS0+Y2FuY2VsUHJlcGFyZSgpOworICAgICAgICAgICAgQVRSQUNFX0FTWU5DX0VORCgic3RyZWFtIHByZXBhcmUiLCBtQ3VycmVudFN0cmVhbS0+Z2V0SWQoKSk7CisgICAgICAgICAgICBBTE9HVigiJXM6IENhbmNlbGxpbmcgc3RyZWFtICVkIHByZXBhcmUiLCBfX0ZVTkNUSU9OX18sIG1DdXJyZW50U3RyZWFtLT5nZXRJZCgpKTsKKyAgICAgICAgICAgIG1DdXJyZW50U3RyZWFtLmNsZWFyKCk7CisgICAgICAgICAgICBtQ2FuY2VsTm93ID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IG1DdXJyZW50U3RyZWFtLT5wcmVwYXJlTmV4dEJ1ZmZlcigpOworICAgIGlmIChyZXMgPT0gTk9UX0VOT1VHSF9EQVRBKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIC8vIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQ7IHRyeSB0byByZWNvdmVyIGJ5IGNhbmNlbGxpbmcgcHJlcGFyZSBhbmQKKyAgICAgICAgLy8gc2lnbmFsbGluZyBsaXN0ZW5lciBhbnl3YXkKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgcmV0dXJuZWQgZXJyb3IgJWQgKCVzKSBkdXJpbmcgcHJlcGFyZSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBtQ3VycmVudFN0cmVhbS0+Z2V0SWQoKSwgcmVzLCBzdHJlcnJvcigtcmVzKSk7CisgICAgICAgIG1DdXJyZW50U3RyZWFtLT5jYW5jZWxQcmVwYXJlKCk7CisgICAgfQorCisgICAgLy8gVGhpcyBzdHJlYW0gaGFzIGZpbmlzaGVkLCBub3RpZnkgbGlzdGVuZXIKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgaWYgKG1MaXN0ZW5lcikgeworICAgICAgICBBTE9HVigiJXM6IFN0cmVhbSAlZCBwcmVwYXJlIGRvbmUsIHNpZ25hbGluZyBsaXN0ZW5lciIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBtQ3VycmVudFN0cmVhbS0+Z2V0SWQoKSk7CisgICAgICAgIG1MaXN0ZW5lci0+bm90aWZ5UHJlcGFyZWQobUN1cnJlbnRTdHJlYW0tPmdldElkKCkpOworICAgIH0KKworICAgIEFUUkFDRV9BU1lOQ19FTkQoInN0cmVhbSBwcmVwYXJlIiwgbUN1cnJlbnRTdHJlYW0tPmdldElkKCkpOworICAgIG1DdXJyZW50U3RyZWFtLmNsZWFyKCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KIAogLyoqCiAgKiBTdGF0aWMgY2FsbGJhY2sgZm9yd2FyZGluZyBtZXRob2RzIGZyb20gSEFMIHRvIGluc3RhbmNlCkBAIC0zMTYxLDYgKzM2MDksNyBAQAogICAgICAgICBjb25zdCBjYW1lcmEzX2NhcHR1cmVfcmVzdWx0ICpyZXN1bHQpIHsKICAgICBDYW1lcmEzRGV2aWNlICpkID0KICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Q2FtZXJhM0RldmljZSo+KHN0YXRpY19jYXN0PGNvbnN0IENhbWVyYTNEZXZpY2UqPihjYikpOworCiAgICAgZC0+cHJvY2Vzc0NhcHR1cmVSZXN1bHQocmVzdWx0KTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAppbmRleCBlYzhkYzEwLi41Mjg3MDU4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaApAQCAtNzMsNyArNzMsNyBAQAogICAgIHZpcnR1YWwgaW50ICAgICAgZ2V0SWQoKSBjb25zdDsKIAogICAgIC8vIFRyYW5zaXRpb25zIHRvIGlkbGUgc3RhdGUgb24gc3VjY2Vzcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShDYW1lcmFNb2R1bGUgKm1vZHVsZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0KCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncyk7CiAgICAgdmlydHVhbCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbygpIGNvbnN0OwpAQCAtOTQsOCArOTQsOSBAQAogICAgIC8vIEFjdHVhbCBzdHJlYW0gY3JlYXRpb24vZGVsZXRpb24gaXMgZGVsYXllZCB1bnRpbCBmaXJzdCByZXF1ZXN0IGlzIHN1Ym1pdHRlZAogICAgIC8vIElmIGFkZGluZyBzdHJlYW1zIHdoaWxlIGFjdGl2ZWx5IGNhcHR1cmluZywgd2lsbCBwYXVzZSBkZXZpY2UgYmVmb3JlIGFkZGluZwogICAgIC8vIHN0cmVhbSwgcmVjb25maWd1cmluZyBkZXZpY2UsIGFuZCB1bnBhdXNpbmcuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgKmlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN0cmVhbShzcDxTdXJmYWNlPiBjb25zdW1lciwKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdHJlYW0oCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgaW50ICppZCk7CkBAIC0xMDgsMTMgKzEwOSwxNiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUmVwcm9jZXNzU3RyZWFtRnJvbVN0cmVhbShpbnQgb3V0cHV0SWQsIGludCAqaWQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1JbmZvKGludCBpZCwKLSAgICAgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCk7CisgICAgICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCAqZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSAqZGF0YVNwYWNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVRyYW5zZm9ybShpbnQgaWQsIGludCB0cmFuc2Zvcm0pOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZWxldGVTdHJlYW0oaW50IGlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZVJlcHJvY2Vzc1N0cmVhbShpbnQgaWQpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKGJvb2wgaXNDb25zdHJhaWVkSGlnaFNwZWVkID0gZmFsc2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJQcm9kdWNlcigKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcik7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLCBDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCk7CiAKQEAgLTEzNSw5ICsxMzksMTQgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmUoaW50IHN0cmVhbUlkKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdGVhckRvd24oaW50IHN0cmVhbUlkKTsKKwogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGV2aWNlVmVyc2lvbigpOwogCiAgICAgdmlydHVhbCBzc2l6ZV90IGdldEpwZWdCdWZmZXJTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0OworICAgIHNzaXplX3QgZ2V0UG9pbnRDbG91ZEJ1ZmZlclNpemUoKSBjb25zdDsKIAogICAgIC8vIE1ldGhvZHMgY2FsbGVkIGJ5IHN1YmNsYXNzZXMKICAgICB2b2lkICAgICAgICAgICAgIG5vdGlmeVN0YXR1cyhib29sIGlkbGUpOyAvLyB1cGRhdGVzIGZyb20gU3RhdHVzVHJhY2tlcgpAQCAtMTQ1LDkgKzE1NCwxMSBAQAogICBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgICAgIGtEdW1wTG9ja0F0dGVtcHRzICA9IDEwOwogICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgICAgIGtEdW1wU2xlZXBEdXJhdGlvbiA9IDEwMDAwMDsgLy8gMC4xMCBzZWMKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICAgICBrSW5GbGlnaHRXYXJuTGltaXQgPSAyMDsKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCAgICAgICBrU2h1dGRvd25UaW1lb3V0ICAgPSA1MDAwMDAwMDAwOyAvLyA1IHNlYwogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190ICAgICAgIGtBY3RpdmVUaW1lb3V0ICAgICA9IDUwMDAwMDAwMDsgIC8vIDUwMCBtcworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgICAgIGtJbkZsaWdodFdhcm5MaW1pdCA9IDIwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgICAgIGtJbkZsaWdodFdhcm5MaW1pdEhpZ2hTcGVlZCA9IDI1NjsgLy8gYmF0Y2ggc2l6ZSAzMiAqIHBpcGUgZGVwdGggOAorCiAgICAgc3RydWN0ICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdFRyaWdnZXI7CiAgICAgLy8gbWluaW1hbCBqcGVnIGJ1ZmZlciBzaXplOiAyNTZLQiArIGJsb2IgaGVhZGVyCiAgICAgc3RhdGljIGNvbnN0IHNzaXplX3QgICAgICAga01pbkpwZWdCdWZmZXJTaXplID0gMjU2ICogMTAyNCArIHNpemVvZihjYW1lcmEzX2pwZWdfYmxvYik7CkBAIC0xNjgsNiArMTc5LDkgQEAKICAgICAvLyBDYW1lcmEgZGV2aWNlIElECiAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICAgbUlkOwogCisgICAgLy8gRmxhZyBpbmRpY2F0aW5nIGlzIHRoZSBjdXJyZW50IGFjdGl2ZSBzdHJlYW0gY29uZmlndXJhdGlvbiBpcyBjb25zdHJhaW5lZCBoaWdoIHNwZWVkLgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1Jc0NvbnN0cmFpbmVkSGlnaFNwZWVkQ29uZmlndXJhdGlvbjsKKwogICAgIC8qKioqIFNjb3BlIGZvciBtTG9jayAqKioqLwogCiAgICAgY2FtZXJhM19kZXZpY2VfdCAgICAgICAgICAqbUhhbDNEZXZpY2U7CkBAIC0xNzgsNiArMTkyLDE0IEBACiAKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICBtRGV2aWNlVmVyc2lvbjsKIAorICAgIHN0cnVjdCBTaXplIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGg7CisgICAgICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICAgICAgU2l6ZSh1aW50MzJfdCB3ID0gMCwgdWludDMyX3QgaCA9IDApIDogd2lkdGgodyksIGhlaWdodChoKXt9CisgICAgfTsKKyAgICAvLyBNYXAgZnJvbSBmb3JtYXQgdG8gc2l6ZS4KKyAgICBWZWN0b3I8U2l6ZT4gICAgICAgICAgICAgICBtU3VwcG9ydGVkT3BhcXVlSW5wdXRTaXplczsKKwogICAgIGVudW0gU3RhdHVzIHsKICAgICAgICAgU1RBVFVTX0VSUk9SLAogICAgICAgICBTVEFUVVNfVU5JTklUSUFMSVpFRCwKQEAgLTE4NSw3ICsyMDcsMTEgQEAKICAgICAgICAgU1RBVFVTX0NPTkZJR1VSRUQsCiAgICAgICAgIFNUQVRVU19BQ1RJVkUKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzOworCisgICAgLy8gT25seSBjbGVhciBtUmVjZW50U3RhdHVzVXBkYXRlcywgbVN0YXR1c1dhaXRlcnMgZnJvbSB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2sKICAgICBWZWN0b3I8U3RhdHVzPiAgICAgICAgICAgICBtUmVjZW50U3RhdHVzVXBkYXRlczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzV2FpdGVyczsKKwogICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgICAgIG1TdGF0dXNDaGFuZ2VkOwogCiAgICAgLy8gVHJhY2tpbmcgY2F1c2Ugb2YgZmF0YWwgZXJyb3JzIHdoZW4gaW4gU1RBVFVTX0VSUk9SCkBAIC0yMTcsMTMgKzI0MywyNCBAQAogCiAgICAgLyoqKiogRW5kIHNjb3BlIGZvciBtTG9jayAqKioqLwogCisgICAgdHlwZWRlZiBzdHJ1Y3QgQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUgeworICAgICAgICBib29sIGFwcGx5QWVMb2NrOworICAgICAgICB1aW50OF90IGFlTG9jazsKKyAgICAgICAgYm9vbCBhcHBseUFlUHJlY2FwdHVyZVRyaWdnZXI7CisgICAgICAgIHVpbnQ4X3QgYWVQcmVjYXB0dXJlVHJpZ2dlcjsKKyAgICB9IEFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlX3Q7CisKICAgICBjbGFzcyBDYXB0dXJlUmVxdWVzdCA6IHB1YmxpYyBMaWdodFJlZkJhc2U8Q2FwdHVyZVJlcXVlc3Q+IHsKICAgICAgIHB1YmxpYzoKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzOwogICAgICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiAgICAgICAgICBtSW5wdXRTdHJlYW07CisgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcjsKICAgICAgICAgVmVjdG9yPHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+ID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbXM7CiAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgICAgICAgICAgICAgICAgIG1SZXN1bHRFeHRyYXM7CisgICAgICAgIC8vIFVzZWQgdG8gY2FuY2VsIEFFIHByZWNhcHR1cmUgdHJpZ2dlciBmb3IgZGV2aWNlcyBkb2Vzbid0IHN1cHBvcnQKKyAgICAgICAgLy8gQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVJfQ0FOQ0VMCisgICAgICAgIEFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlX3QgICAgICAgICAgIG1BZVRyaWdnZXJDYW5jZWxPdmVycmlkZTsKICAgICB9OwogICAgIHR5cGVkZWYgTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiBSZXF1ZXN0TGlzdDsKIApAQCAtMjQ1LDYgKzI4MiwxMyBAQAogICAgIHZpcnR1YWwgQ2FtZXJhTWV0YWRhdGEgZ2V0TGF0ZXN0UmVxdWVzdExvY2tlZCgpOwogCiAgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBjdXJyZW50IGRldmljZSBzdGF0dXMgYW5kIHdha2UgYWxsIHdhaXRpbmcgdGhyZWFkcy4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIHdpdGggbUxvY2sgaGVsZC4KKyAgICAgKi8KKyAgICB2b2lkIGludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKFN0YXR1cyBzdGF0dXMpOworCisgICAgLyoqCiAgICAgICogUGF1c2UgcHJvY2Vzc2luZyBhbmQgZmx1c2ggZXZlcnl0aGluZywgYnV0IGRvbid0IHRlbGwgdGhlIGNsaWVudHMuCiAgICAgICogVGhpcyBpcyBmb3IgcmVjb25maWd1cmluZyBvdXRwdXRzIHRyYW5zcGFyZW50bHkgd2hlbiBhY2NvcmRpbmcgdG8gdGhlCiAgICAgICogQ2FtZXJhRGV2aWNlQmFzZSBpbnRlcmZhY2Ugd2Ugc2hvdWxkbid0IG5lZWQgdG8uCkBAIC0zMjMsMTEgKzM2NywxMSBAQAogICAgICAqLwogICAgIGJvb2wgICAgICAgICAgICAgICB0cnlMb2NrU3BpblJpZ2h0Um91bmQoTXV0ZXgmIGxvY2spOwogCi0gICAgc3RydWN0IFNpemUgewotICAgICAgICBpbnQgd2lkdGg7Ci0gICAgICAgIGludCBoZWlnaHQ7Ci0gICAgICAgIFNpemUoaW50IHcsIGludCBoKSA6IHdpZHRoKHcpLCBoZWlnaHQoaCl7fQotICAgIH07CisgICAgLyoqCisgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhbiBpbnB1dCBzaXplIGZvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkCisgICAgICogZm9ybWF0IGlzIHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBib29sIGlzT3BhcXVlSW5wdXRTaXplU3VwcG9ydGVkKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOwogCiAgICAgLyoqCiAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgbGFyZ2VzdCBKcGVnIHJlc29sdXRpb24gKGluIGFyZWEpCkBAIC0zNjEsOSArNDA1LDEwIEBACiAKICAgICAgICAgUmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCiAgICAgICAgICAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKLSAgICAgICAgICAgICAgICBjYW1lcmEzX2RldmljZV90ICpoYWwzRGV2aWNlKTsKKyAgICAgICAgICAgICAgICBjYW1lcmEzX2RldmljZV90ICpoYWwzRGV2aWNlLAorICAgICAgICAgICAgICAgIGJvb2wgYWVMb2NrQXZhaWxhYmxlKTsKIAotICAgICAgICB2b2lkICAgICBzZXROb3RpZnlDYWxsYmFjayhOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpOworICAgICAgICB2b2lkICAgICBzZXROb3RpZmljYXRpb25MaXN0ZW5lcihOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBDYWxsIGFmdGVyIHN0cmVhbSAocmUpLWNvbmZpZ3VyYXRpb24gaXMgY29tcGxldGVkLgpAQCAtNDI3LDYgKzQ3MiwxMiBAQAogICAgICAgICAgKi8KICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgZ2V0TGF0ZXN0UmVxdWVzdCgpIGNvbnN0OwogCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBhIHRhcmdldCBvZiBhbnkgcXVldWVkIG9yIHJlcGVhdGluZworICAgICAgICAgKiBjYXB0dXJlIHJlcXVlc3QKKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaXNTdHJlYW1QZW5kaW5nKHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1JbnRlcmZhY2U+JiBzdHJlYW0pOworCiAgICAgICBwcm90ZWN0ZWQ6CiAKICAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKQEAgLTQ2OCw2ICs1MTksOSBAQAogICAgICAgICAvLyBJZiB0aGUgaW5wdXQgcmVxdWVzdCBpcyBpbiBtUmVwZWF0aW5nUmVxdWVzdHMuIE11c3QgYmUgY2FsbGVkIHdpdGggbVJlcXVlc3RMb2NrIGhvbGQKICAgICAgICAgYm9vbCBpc1JlcGVhdGluZ1JlcXVlc3RMb2NrZWQoY29uc3Qgc3A8Q2FwdHVyZVJlcXVlc3Q+KTsKIAorICAgICAgICAvLyBIYW5kbGUgQUUgcHJlY2FwdHVyZSB0cmlnZ2VyIGNhbmNlbCBmb3IgZGV2aWNlcyA8PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMi4KKyAgICAgICAgdm9pZCBoYW5kbGVBZVByZWNhcHR1cmVDYW5jZWxSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0KTsKKwogICAgICAgICB3cDxDYW1lcmEzRGV2aWNlPiAgbVBhcmVudDsKICAgICAgICAgd3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gIG1TdGF0dXNUcmFja2VyOwogICAgICAgICBjYW1lcmEzX2RldmljZV90ICAqbUhhbDNEZXZpY2U7CkBAIC00ODIsNiArNTM2LDEwIEBACiAgICAgICAgIENvbmRpdGlvbiAgICAgICAgICBtUmVxdWVzdFNpZ25hbDsKICAgICAgICAgUmVxdWVzdExpc3QgICAgICAgIG1SZXF1ZXN0UXVldWU7CiAgICAgICAgIFJlcXVlc3RMaXN0ICAgICAgICBtUmVwZWF0aW5nUmVxdWVzdHM7CisgICAgICAgIC8vIFRoZSBuZXh0IHJlcXVlc3QgYmVpbmcgcHJlcHBlZCBmb3Igc3VibWlzc2lvbiB0byB0aGUgSEFMLCBubyBsb25nZXIKKyAgICAgICAgLy8gb24gdGhlIHJlcXVlc3QgcXVldWUuIFJlYWQtb25seSBldmVuIHdpdGggbVJlcXVlc3RMb2NrIGhlbGQsIG91dHNpZGUKKyAgICAgICAgLy8gb2YgdGhyZWFkTG9vcAorICAgICAgICBzcDxjb25zdCBDYXB0dXJlUmVxdWVzdD4gbU5leHRSZXF1ZXN0OwogCiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtUmVjb25maWd1cmVkOwogCkBAIC01MTIsNiArNTcwLDkgQEAKICAgICAgICAgdWludDMyX3QgICAgICAgICAgIG1DdXJyZW50UHJlQ2FwdHVyZVRyaWdnZXJJZDsKIAogICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcjsKKworICAgICAgICAvLyBXaGV0aGVyIHRoZSBkZXZpY2Ugc3VwcG9ydHMgQUUgbG9jaworICAgICAgICBib29sICAgICAgICAgICAgICAgbUFlTG9ja0F2YWlsYWJsZTsKICAgICB9OwogICAgIHNwPFJlcXVlc3RUaHJlYWQ+IG1SZXF1ZXN0VGhyZWFkOwogCkBAIC01MzQsNyArNTk1LDYgQEAKICAgICAgICAgLy8gSWYgdGhpcyByZXF1ZXN0IGhhcyBhbnkgaW5wdXQgYnVmZmVyCiAgICAgICAgIGJvb2wgaGFzSW5wdXRCdWZmZXI7CiAKLQogICAgICAgICAvLyBUaGUgbGFzdCBtZXRhZGF0YSB0aGF0IGZyYW1ld29yayByZWNlaXZlcyBmcm9tIEhBTCBhbmQKICAgICAgICAgLy8gbm90IHlldCBzZW5kIG91dCBiZWNhdXNlIHRoZSBzaHV0dGVyIGV2ZW50IGhhc24ndCBhcnJpdmVkLgogICAgICAgICAvLyBJdCdzIGFkZGVkIGJ5IHByb2Nlc3NfY2FwdHVyZV9yZXN1bHQgYW5kIHNlbnQgd2hlbiBmcmFtZXdvcmsKQEAgLTU0Nyw2ICs2MDcsOSBAQAogICAgICAgICAvLyB0aGUgc2h1dHRlciBldmVudC4KICAgICAgICAgVmVjdG9yPGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90PiBwZW5kaW5nT3V0cHV0QnVmZmVyczsKIAorICAgICAgICAvLyBVc2VkIHRvIGNhbmNlbCBBRSBwcmVjYXB0dXJlIHRyaWdnZXIgZm9yIGRldmljZXMgZG9lc24ndCBzdXBwb3J0CisgICAgICAgIC8vIENPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSX0NBTkNFTAorICAgICAgICBBZVRyaWdnZXJDYW5jZWxPdmVycmlkZV90IGFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlOwogCiAKICAgICAgICAgLy8gRmllbGRzIHVzZWQgYnkgdGhlIHBhcnRpYWwgcmVzdWx0IG9ubHkKQEAgLTU2OCwzOCArNjMxLDIzIEBACiAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCiAgICAgICAgICAgICAgICAgaGF2ZVJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKICAgICAgICAgICAgICAgICBudW1CdWZmZXJzTGVmdCgwKSwKLSAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihmYWxzZSl7CisgICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoZmFsc2UpLAorICAgICAgICAgICAgICAgIGFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlKHtmYWxzZSwgMCwgZmFsc2UsIDB9KXsKICAgICAgICAgfQogCi0gICAgICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgbnVtQnVmZmVycykgOgotICAgICAgICAgICAgICAgIHNodXR0ZXJUaW1lc3RhbXAoMCksCi0gICAgICAgICAgICAgICAgc2Vuc29yVGltZXN0YW1wKDApLAotICAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMoT0spLAotICAgICAgICAgICAgICAgIGhhdmVSZXN1bHRNZXRhZGF0YShmYWxzZSksCi0gICAgICAgICAgICAgICAgbnVtQnVmZmVyc0xlZnQobnVtQnVmZmVycyksCi0gICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoZmFsc2UpewotICAgICAgICB9Ci0KLSAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KGludCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhcykgOgorICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzLCBib29sIGhhc0lucHV0LAorICAgICAgICAgICAgICAgIEFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlIGFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlKSA6CiAgICAgICAgICAgICAgICAgc2h1dHRlclRpbWVzdGFtcCgwKSwKICAgICAgICAgICAgICAgICBzZW5zb3JUaW1lc3RhbXAoMCksCiAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCiAgICAgICAgICAgICAgICAgaGF2ZVJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKICAgICAgICAgICAgICAgICBudW1CdWZmZXJzTGVmdChudW1CdWZmZXJzKSwKICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMoZXh0cmFzKSwKLSAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihmYWxzZSl7CisgICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoaGFzSW5wdXQpLAorICAgICAgICAgICAgICAgIGFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlKGFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlKXsKICAgICAgICAgfQorICAgIH07CiAKLSAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KGludCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhcywgYm9vbCBoYXNJbnB1dCkgOgotICAgICAgICAgICAgICAgIHNodXR0ZXJUaW1lc3RhbXAoMCksCi0gICAgICAgICAgICAgICAgc2Vuc29yVGltZXN0YW1wKDApLAotICAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMoT0spLAotICAgICAgICAgICAgICAgIGhhdmVSZXN1bHRNZXRhZGF0YShmYWxzZSksCi0gICAgICAgICAgICAgICAgbnVtQnVmZmVyc0xlZnQobnVtQnVmZmVycyksCi0gICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzKGV4dHJhcyksCi0gICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoaGFzSW5wdXQpewotICAgICAgICB9Ci19OwogICAgIC8vIE1hcCBmcm9tIGZyYW1lIG51bWJlciB0byB0aGUgaW4tZmxpZ2h0IHJlcXVlc3Qgc3RhdGUKICAgICB0eXBlZGVmIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJbkZsaWdodFJlcXVlc3Q+IEluRmxpZ2h0TWFwOwogCkBAIC02MDcsNyArNjU1LDggQEAKICAgICBJbkZsaWdodE1hcCAgICAgICAgICAgIG1JbkZsaWdodE1hcDsKIAogICAgIHN0YXR1c190IHJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCi0gICAgICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0KTsKKyAgICAgICAgICAgIGludDMyX3QgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsIGJvb2wgaGFzSW5wdXQsCisgICAgICAgICAgICBjb25zdCBBZVRyaWdnZXJDYW5jZWxPdmVycmlkZV90ICZhZVRyaWdnZXJDYW5jZWxPdmVycmlkZSk7CiAKICAgICAvKioKICAgICAgKiBGb3IgdGhlIHBhcnRpYWwgcmVzdWx0LCBjaGVjayBpZiBhbGwgM0Egc3RhdGUgZmllbGRzIGFyZSBhdmFpbGFibGUKQEAgLTYyNSwxMiArNjc0LDU5IEBACiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICBib29sIGluc2VydDNBUmVzdWx0KENhbWVyYU1ldGFkYXRhICZyZXN1bHQsIGludDMyX3QgdGFnLCBjb25zdCBUKiB2YWx1ZSwKICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyKTsKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHJlc3VsdCBtZXRhZGF0YSBmb3IgY2FuY2VsbGluZyBBRSBwcmVjYXB0dXJlIHRyaWdnZXIgYXBwbGllZCBpbgorICAgICAqIGhhbmRsZUFlUHJlY2FwdHVyZUNhbmNlbFJlcXVlc3QoKS4KKyAgICAgKi8KKyAgICB2b2lkIG92ZXJyaWRlUmVzdWx0Rm9yUHJlY2FwdHVyZUNhbmNlbChDYW1lcmFNZXRhZGF0YSogcmVzdWx0LAorICAgICAgICAgICAgY29uc3QgQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGVfdCAmYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUpOworCiAgICAgLyoqCiAgICAgICogVHJhY2tpbmcgZm9yIGlkbGUgZGV0ZWN0aW9uCiAgICAgICovCiAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gbVN0YXR1c1RyYWNrZXI7CiAKICAgICAvKioKKyAgICAgKiBUaHJlYWQgZm9yIHByZXBhcmluZyBzdHJlYW1zCisgICAgICovCisgICAgY2xhc3MgUHJlcGFyZXJUaHJlYWQgOiBwcml2YXRlIFRocmVhZCwgcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CisgICAgICBwdWJsaWM6CisgICAgICAgIFByZXBhcmVyVGhyZWFkKCk7CisgICAgICAgIH5QcmVwYXJlclRocmVhZCgpOworCisgICAgICAgIHZvaWQgc2V0Tm90aWZpY2F0aW9uTGlzdGVuZXIoTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUXVldWUgdXAgYSBzdHJlYW0gdG8gYmUgcHJlcGFyZWQuIFN0cmVhbXMgYXJlIHByb2Nlc3NlZCBieQorICAgICAgICAgKiBhIGJhY2tncm91bmQgdGhyZWFkIGluIEZJRk8gb3JkZXIKKyAgICAgICAgICovCisgICAgICAgIHN0YXR1c190IHByZXBhcmUoc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4mIHN0cmVhbSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbmNlbCBhbGwgY3VycmVudCBhbmQgcGVuZGluZyBzdHJlYW0gcHJlcGFyYXRpb24KKyAgICAgICAgICovCisgICAgICAgIHN0YXR1c190IGNsZWFyKCk7CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIE11dGV4IG1Mb2NrOworCisgICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CisKKyAgICAgICAgLy8gR3VhcmRlZCBieSBtTG9jaworCisgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICptTGlzdGVuZXI7CisgICAgICAgIExpc3Q8c3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gPiBtUGVuZGluZ1N0cmVhbXM7CisgICAgICAgIGJvb2wgbUFjdGl2ZTsKKyAgICAgICAgYm9vbCBtQ2FuY2VsTm93OworCisgICAgICAgIC8vIE9ubHkgYWNjZXNzZWQgYnkgdGhyZWFkTG9vcCBhbmQgdGhlIGRlc3RydWN0b3IKKworICAgICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBtQ3VycmVudFN0cmVhbTsKKyAgICB9OworICAgIHNwPFByZXBhcmVyVGhyZWFkPiBtUHJlcGFyZXJUaHJlYWQ7CisKKyAgICAvKioKICAgICAgKiBPdXRwdXQgcmVzdWx0IHF1ZXVlIGFuZCBjdXJyZW50IEhBTCBkZXZpY2UgM0Egc3RhdGUKICAgICAgKi8KIApAQCAtNjM4LDggKzczNCwxMCBAQAogICAgIE11dGV4ICAgICAgICAgICAgICAgICAgbU91dHB1dExvY2s7CiAKICAgICAvKioqKiBTY29wZSBmb3IgbU91dHB1dExvY2sgKioqKi8KLQorICAgIC8vIHRoZSBtaW5pbWFsIGZyYW1lIG51bWJlciBvZiB0aGUgbmV4dCBub24tcmVwcm9jZXNzIHJlc3VsdAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlcjsKKyAgICAvLyB0aGUgbWluaW1hbCBmcmFtZSBudW1iZXIgb2YgdGhlIG5leHQgcmVwcm9jZXNzIHJlc3VsdAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlcjsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyOwogICAgIExpc3Q8Q2FwdHVyZVJlc3VsdD4gICBtUmVzdWx0UXVldWU7CiAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICBtUmVzdWx0U2lnbmFsOwpAQCAtNjY4LDcgKzc2Niw4IEBACiAgICAgLy8gcGFydGlhbCByZXN1bHRzLCBhbmQgdGhlIGZyYW1lIG51bWJlciB0byB0aGUgcmVzdWx0IHF1ZXVlLgogICAgIHZvaWQgc2VuZENhcHR1cmVSZXN1bHQoQ2FtZXJhTWV0YWRhdGEgJnBlbmRpbmdNZXRhZGF0YSwKICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgJnJlc3VsdEV4dHJhcywKLSAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICZjb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0LCB1aW50MzJfdCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAmY29sbGVjdGVkUGFydGlhbFJlc3VsdCwgdWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICBib29sIHJlcHJvY2VzcywgY29uc3QgQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGVfdCAmYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUpOwogCiAgICAgLyoqKiogU2NvcGUgZm9yIG1JbkZsaWdodExvY2sgKioqKi8KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCmluZGV4IDY2NTZiMDkuLmVjYjhhYzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKIAogQ2FtZXJhM0R1bW15U3RyZWFtOjpDYW1lcmEzRHVtbXlTdHJlYW0oaW50IGlkKSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgRFVNTVlfV0lEVEgsIERVTU1ZX0hFSUdIVCwKLSAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIERVTU1ZX0ZPUk1BVCkgeworICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwgRFVNTVlfRk9STUFULCBEVU1NWV9EQVRBU1BBQ0UsIERVTU1ZX1JPVEFUSU9OKSB7CiAKIH0KIApAQCAtODcsNyArODcsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0R1bW15U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgeworc3RhdHVzX3QgQ2FtZXJhM0R1bW15U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3QgewogICAgICp1c2FnZSA9IERVTU1ZX1VTQUdFOwogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCmluZGV4IDNlNDI2MjMuLjNhM2RiZjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaApAQCAtNzUsNiArNzUsOCBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQgRFVNTVlfV0lEVEggPSAzMjA7CiAgICAgc3RhdGljIGNvbnN0IGludCBEVU1NWV9IRUlHSFQgPSAyNDA7CiAgICAgc3RhdGljIGNvbnN0IGludCBEVU1NWV9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CisgICAgc3RhdGljIGNvbnN0IGFuZHJvaWRfZGF0YXNwYWNlIERVTU1ZX0RBVEFTUEFDRSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKKyAgICBzdGF0aWMgY29uc3QgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCBEVU1NWV9ST1RBVElPTiA9IENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzA7CiAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERVTU1ZX1VTQUdFID0gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUjsKIAogICAgIC8qKgpAQCAtODcsNyArODksNyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3Q7CiAKIH07IC8vIGNsYXNzIENhbWVyYTNEdW1teVN0cmVhbQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAppbmRleCBjYzY2NDU5Li4yM2IxYzQ1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKQEAgLTMwLDkgKzMwLDEwIEBACiBuYW1lc3BhY2UgY2FtZXJhMyB7CiAKIENhbWVyYTNJT1N0cmVhbUJhc2U6OkNhbWVyYTNJT1N0cmVhbUJhc2UoaW50IGlkLCBjYW1lcmEzX3N0cmVhbV90eXBlX3QgdHlwZSwKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQpIDoKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQsCisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbikgOgogICAgICAgICBDYW1lcmEzU3RyZWFtKGlkLCB0eXBlLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIG1heFNpemUsIGZvcm1hdCksCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgbWF4U2l6ZSwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uKSwKICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQoMCksCiAgICAgICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCgwKSwKICAgICAgICAgbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudCgwKSwKQEAgLTY2LDEzICs2NywxOCBAQAogdm9pZCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3QgewogICAgICh2b2lkKSBhcmdzOwogICAgIFN0cmluZzggbGluZXM7CisKKyAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlID0gMDsKKyAgICBzdGF0dXNfdCByZXMgPSBnZXRFbmRwb2ludFVzYWdlKCZjb25zdW1lclVzYWdlKTsKKyAgICBpZiAocmVzICE9IE9LKSBjb25zdW1lclVzYWdlID0gMDsKKwogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgU3RhdGU6ICVkXG4iLCBtU3RhdGUpOwotICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgRGltczogJWQgeCAlZCwgZm9ybWF0IDB4JXhcbiIsCisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBEaW1zOiAlZCB4ICVkLCBmb3JtYXQgMHgleCwgZGF0YXNwYWNlIDB4JXhcbiIsCiAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6d2lkdGgsIGNhbWVyYTNfc3RyZWFtOjpoZWlnaHQsCi0gICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0KTsKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQsIGNhbWVyYTNfc3RyZWFtOjpkYXRhX3NwYWNlKTsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIE1heCBzaXplOiAlenVcbiIsIG1NYXhTaXplKTsKLSAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFVzYWdlOiAlZCwgbWF4IEhBTCBidWZmZXJzOiAlZFxuIiwKLSAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSwgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKKyAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIENvbWJpbmVkIHVzYWdlOiAlZCwgbWF4IEhBTCBidWZmZXJzOiAlZFxuIiwKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSB8IGNvbnN1bWVyVXNhZ2UsIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyk7CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBGcmFtZXMgcHJvZHVjZWQ6ICVkLCBsYXN0IHRpbWVzdGFtcDogJSIgUFJJZDY0ICIgbnNcbiIsCiAgICAgICAgICAgICBtRnJhbWVDb3VudCwgbUxhc3RUaW1lc3RhbXApOwogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgVG90YWwgYnVmZmVyczogJXp1LCBjdXJyZW50bHkgZGVxdWV1ZWQ6ICV6dVxuIiwKQEAgLTE1NSwxMyArMTYxLDExIEBACiAKICAgICAvLyBJbmZvcm0gdHJhY2tlciBhYm91dCBiZWNvbWluZyBidXN5CiAgICAgaWYgKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9PSAwICYmIG1TdGF0ZSAhPSBTVEFURV9JTl9DT05GSUcgJiYKLSAgICAgICAgICAgIG1TdGF0ZSAhPSBTVEFURV9JTl9SRUNPTkZJRykgeworICAgICAgICAgICAgbVN0YXRlICE9IFNUQVRFX0lOX1JFQ09ORklHICYmIG1TdGF0ZSAhPSBTVEFURV9QUkVQQVJJTkcpIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIEF2b2lkIGEgc3B1cmlvdXMgSURMRS0+QUNUSVZFLT5JRExFIHRyYW5zaXRpb24gd2hlbiB1c2luZyBidWZmZXJzCiAgICAgICAgICAqIGJlZm9yZS9hZnRlciByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyBkdXJpbmcgaW5pdGlhbCBjb25maWd1cmF0aW9uCi0gICAgICAgICAqIG9yIHJlLWNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIFRPRE86IElOX0NPTkZJRyBhbmQgSU5fUkVDT05GSUcgY2hlY2tzIG9ubHkgbWFrZSBzZW5zZSBmb3IgPEhBTDMuMgorICAgICAgICAgKiBvciByZS1jb25maWd1cmF0aW9uLCBvciBkdXJpbmcgcHJlcGFyZSBwcmUtYWxsb2NhdGlvbgogICAgICAgICAgKi8KICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKICAgICAgICAgaWYgKHN0YXR1c1RyYWNrZXIgIT0gMCkgewpAQCAtMTc2LDkgKzE4MCwxMSBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpnZXRCdWZmZXJQcmVjb25kaXRpb25DaGVja0xvY2tlZCgpIGNvbnN0IHsKLSAgICAvLyBBbGxvdyBkZXF1ZXVlIGR1cmluZyBJTl9bUkVdQ09ORklHIGZvciByZWdpc3RyYXRpb24KKyAgICAvLyBBbGxvdyBkZXF1ZXVlIGR1cmluZyBJTl9bUkVdQ09ORklHIGZvciByZWdpc3RyYXRpb24sIGluCisgICAgLy8gUFJFUEFSSU5HIGZvciBwcmUtYWxsb2NhdGlvbgogICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQ09ORklHVVJFRCAmJgotICAgICAgICAgICAgbVN0YXRlICE9IFNUQVRFX0lOX0NPTkZJRyAmJiBtU3RhdGUgIT0gU1RBVEVfSU5fUkVDT05GSUcpIHsKKyAgICAgICAgICAgIG1TdGF0ZSAhPSBTVEFURV9JTl9DT05GSUcgJiYgbVN0YXRlICE9IFNUQVRFX0lOX1JFQ09ORklHICYmCisgICAgICAgICAgICBtU3RhdGUgIT0gU1RBVEVfUFJFUEFSSU5HKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBnZXQgYnVmZmVycyBpbiB1bmNvbmZpZ3VyZWQgc3RhdGUgJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtU3RhdGUpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0yMzksMTMgKzI0NSwxMSBAQAogCiAgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50LS07CiAgICAgaWYgKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9PSAwICYmIG1TdGF0ZSAhPSBTVEFURV9JTl9DT05GSUcgJiYKLSAgICAgICAgICAgIG1TdGF0ZSAhPSBTVEFURV9JTl9SRUNPTkZJRykgeworICAgICAgICAgICAgbVN0YXRlICE9IFNUQVRFX0lOX1JFQ09ORklHICYmIG1TdGF0ZSAhPSBTVEFURV9QUkVQQVJJTkcpIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIEF2b2lkIGEgc3B1cmlvdXMgSURMRS0+QUNUSVZFLT5JRExFIHRyYW5zaXRpb24gd2hlbiB1c2luZyBidWZmZXJzCiAgICAgICAgICAqIGJlZm9yZS9hZnRlciByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyBkdXJpbmcgaW5pdGlhbCBjb25maWd1cmF0aW9uCi0gICAgICAgICAqIG9yIHJlLWNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIFRPRE86IElOX0NPTkZJRyBhbmQgSU5fUkVDT05GSUcgY2hlY2tzIG9ubHkgbWFrZSBzZW5zZSBmb3IgPEhBTDMuMgorICAgICAgICAgKiBvciByZS1jb25maWd1cmF0aW9uLCBvciBkdXJpbmcgcHJlcGFyZSBwcmUtYWxsb2NhdGlvbgogICAgICAgICAgKi8KICAgICAgICAgQUxPR1YoIiVzOiBTdHJlYW0gJWQ6IEFsbCBidWZmZXJzIHJldHVybmVkOyBub3cgaWRsZSIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBtSWQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAppbmRleCBhMzVjMjkwLi5mNTcyN2U4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaApAQCAtMzMsNyArMzMsOCBAQAogICAgICAgICBwdWJsaWMgQ2FtZXJhM1N0cmVhbSB7CiAgIHByb3RlY3RlZDoKICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGludCBpZCwgY2FtZXJhM19zdHJlYW1fdHlwZV90IHR5cGUsCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCk7CisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbik7CiAKICAgcHVibGljOgogCkBAIC04Myw3ICs4NCw3IEBACiAKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3QgPSAwOwogCiAgICAgc3RhdHVzX3QgZ2V0QnVmZmVyUHJlY29uZGl0aW9uQ2hlY2tMb2NrZWQoKSBjb25zdDsKICAgICBzdGF0dXNfdCByZXR1cm5CdWZmZXJQcmVjb25kaXRpb25DaGVja0xvY2tlZCgpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCmluZGV4IDljMWUyOGIuLjI1MDRiZmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKQEAgLTI5LDggKzI5LDggQEAKIAogQ2FtZXJhM0lucHV0U3RyZWFtOjpDYW1lcmEzSW5wdXRTdHJlYW0oaW50IGlkLAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0KSA6Ci0gICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX0lOUFVULCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwgZm9ybWF0KSB7CisgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX0lOUFVULCB3aWR0aCwgaGVpZ2h0LCAvKm1heFNpemUqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBIQUxfREFUQVNQQUNFX1VOS05PV04sIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzApIHsKIAogICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CiAgICAgICAgIEFMT0dFKCIlczogQmFkIGZvcm1hdCwgQkxPQiBub3Qgc3VwcG9ydGVkIiwgX19GVU5DVElPTl9fKTsKQEAgLTY1LDggKzY1LDggQEAKICAgICBhc3NlcnQobUNvbnN1bWVyICE9IDApOwogCiAgICAgQnVmZmVySXRlbSBidWZmZXJJdGVtOwotICAgIHJlcyA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmYnVmZmVySXRlbSwgLyp3YWl0Rm9yRmVuY2UqL2ZhbHNlKTsKIAorICAgIHJlcyA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmYnVmZmVySXRlbSwgLyp3YWl0Rm9yRmVuY2UqL2ZhbHNlKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBhY3F1aXJlIG5leHQgb3V0cHV0IGJ1ZmZlcjogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMTYyLDYgKzE2MiwyMSBAQAogICAgIHJldHVybiByZXR1cm5BbnlCdWZmZXJMb2NrZWQoYnVmZmVyLCAvKnRpbWVzdGFtcCovMCwgLypvdXRwdXQqL2ZhbHNlKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM0lucHV0U3RyZWFtOjpnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyTG9ja2VkKAorICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKnByb2R1Y2VyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIGlmIChwcm9kdWNlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmIChtUHJvZHVjZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGlucHV0IHN0cmVhbSBpcyBjb25maWd1cmVkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAqcHJvZHVjZXIgPSBtUHJvZHVjZXI7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmEzSW5wdXRTdHJlYW06OmRpc2Nvbm5lY3RMb2NrZWQoKSB7CiAKICAgICBzdGF0dXNfdCByZXM7CkBAIC0xNzIsNiArMTg3LDggQEAKIAogICAgIGFzc2VydChtQnVmZmVyc0luRmxpZ2h0LnNpemUoKSA9PSAwKTsKIAorICAgIG1Db25zdW1lci0+YWJhbmRvbigpOworCiAgICAgLyoqCiAgICAgICogIG5vLW9wIHNpbmNlIHdlIGNhbid0IGRpc2Nvbm5lY3QgdGhlIHByb2R1Y2VyIGZyb20gdGhlIGNvbnN1bWVyLXNpZGUKICAgICAgKi8KQEAgLTIxMiwxMCArMjI5LDE3IEBACiAgICAgICAgIHJlcyA9IHByb2R1Y2VyLT5xdWVyeShOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsICZtaW5VbmRlcXVldWVkQnVmZmVycyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0sgfHwgbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgPCAwKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ291bGQgbm90IHF1ZXJ5IG1pbiB1bmRlcXVldWVkIGJ1ZmZlcnMgKGVycm9yICVkLCBidWZDb3VudCAlZCkiLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHJlcywgbWluVW5kZXF1ZXVlZEJ1ZmZlcnMpOworICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgcmVzLCBtaW5VbmRlcXVldWVkQnVmZmVycyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgICAgIHNpemVfdCBtaW5CdWZzID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihtaW5VbmRlcXVldWVkQnVmZmVycyk7CisKKyAgICAgICAgaWYgKGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6ICVkOiBIQUwgc2V0cyBtYXhfYnVmZmVyIHRvIDAuIE11c3QgYmUgYXQgbGVhc3QgMS4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCiAgICAgICAgIC8qCiAgICAgICAgICAqIFdlIHByb21pc2UgbmV2ZXIgdG8gJ2FjcXVpcmUnIG1vcmUgdGhhbiBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMKICAgICAgICAgICogYXQgYW55IG9uZSB0aW1lLgpAQCAtMjMyLDYgKzI1Niw4IEBACiAgICAgICAgIG1Db25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoY29uc3VtZXIsIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxCdWZmZXJDb3VudCk7CiAgICAgICAgIG1Db25zdW1lci0+c2V0TmFtZShTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYTMtSW5wdXRTdHJlYW0tJWQiLCBtSWQpKTsKKworICAgICAgICBtUHJvZHVjZXIgPSBwcm9kdWNlcjsKICAgICB9CiAKICAgICByZXMgPSBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJTaXplKGNhbWVyYTNfc3RyZWFtOjp3aWR0aCwKQEAgLTI1MSw3ICsyNzcsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0lucHV0U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgeworc3RhdHVzX3QgQ2FtZXJhM0lucHV0U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3QgewogICAgIC8vIFBlciBIQUwzIHNwZWMsIGlucHV0IHN0cmVhbXMgaGF2ZSAwIGZvciB0aGVpciBpbml0aWFsIHVzYWdlIGZpZWxkLgogICAgICp1c2FnZSA9IDA7CiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKaW5kZXggZmQxN2Y0Zi4uOWYzZGUxMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCkBAIC00OSw2ICs0OSw3IEBACiAgIHByaXZhdGU6CiAKICAgICBzcDxCdWZmZXJJdGVtQ29uc3VtZXI+IG1Db25zdW1lcjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CiAgICAgVmVjdG9yPEJ1ZmZlckl0ZW0+IG1CdWZmZXJzSW5GbGlnaHQ7CiAKICAgICAvKioKQEAgLTY4LDExICs2OSwxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuSW5wdXRCdWZmZXJMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlcik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyTG9ja2VkKAorICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKnByb2R1Y2VyKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3RMb2NrZWQoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIGNvbnN0OwogCiB9OyAvLyBjbGFzcyBDYW1lcmEzSW5wdXRTdHJlYW0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKaW5kZXggNzdhZDUwMy4uOGM2MTFkNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCkBAIC0zMiwxMCArMzIsMTEgQEAKIG5hbWVzcGFjZSBjYW1lcmEzIHsKIAogQ2FtZXJhM091dHB1dFN0cmVhbTo6Q2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsCi0gICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IGNvbnN1bWVyLAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0KSA6CisgICAgICAgIHNwPFN1cmZhY2U+IGNvbnN1bWVyLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pIDoKICAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwgZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiksCiAgICAgICAgIG1Db25zdW1lcihjb25zdW1lciksCiAgICAgICAgIG1UcmFuc2Zvcm0oMCksCiAgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyKHRydWUpIHsKQEAgLTQ3LDEwICs0OCwxMSBAQAogfQogCiBDYW1lcmEzT3V0cHV0U3RyZWFtOjpDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwKLSAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0KSA6CisgICAgICAgIHNwPFN1cmZhY2U+IGNvbnN1bWVyLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCwKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwgbWF4U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiksCiAgICAgICAgIG1Db25zdW1lcihjb25zdW1lciksCiAgICAgICAgIG1UcmFuc2Zvcm0oMCksCiAgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyKHRydWUpIHsKQEAgLTY5LDEwICs3MSwxMiBAQAogCiBDYW1lcmEzT3V0cHV0U3RyZWFtOjpDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwgY2FtZXJhM19zdHJlYW1fdHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIHR5cGUsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uKSwKICAgICAgICAgbVRyYW5zZm9ybSgwKSB7CiAKICAgICAvLyBTdWJjbGFzc2VzIGV4cGVjdGVkIHRvIGluaXRpYWxpemUgbUNvbnN1bWVyIHRoZW1zZWx2ZXMKQEAgLTE1MywzMyArMTU3LDkgQEAKICAgICBBTE9HX0FTU0VSVChvdXRwdXQsICJFeHBlY3RlZCBvdXRwdXQgdG8gYmUgdHJ1ZSIpOwogCiAgICAgc3RhdHVzX3QgcmVzOwotICAgIHNwPEZlbmNlPiByZWxlYXNlRmVuY2U7CiAKLSAgICAvKioKLSAgICAgKiBGZW5jZSBtYW5hZ2VtZW50IC0gY2FsY3VsYXRlIFJlbGVhc2UgRmVuY2UKLSAgICAgKi8KLSAgICBpZiAoYnVmZmVyLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci5yZWxlYXNlX2ZlbmNlICE9IC0xKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogSEFMIHNob3VsZCBub3Qgc2V0IHJlbGVhc2VfZmVuY2UoJWQpIHdoZW4gIgotICAgICAgICAgICAgICAgICAgInRoZXJlIGlzIGFuIGVycm9yIiwgX19GVU5DVElPTl9fLCBtSWQsIGJ1ZmZlci5yZWxlYXNlX2ZlbmNlKTsKLSAgICAgICAgICAgIGNsb3NlKGJ1ZmZlci5yZWxlYXNlX2ZlbmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFzc2lnbiByZWxlYXNlIGZlbmNlIGFzIHRoZSBhY3F1aXJlIGZlbmNlIGluIGNhc2Ugb2YgZXJyb3IKLSAgICAgICAgICovCi0gICAgICAgIHJlbGVhc2VGZW5jZSA9IG5ldyBGZW5jZShidWZmZXIuYWNxdWlyZV9mZW5jZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAobUNvbnN1bWVyLmdldCgpLCB0aW1lc3RhbXApOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRXJyb3Igc2V0dGluZyB0aW1lc3RhbXA6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotCi0gICAgICAgIHJlbGVhc2VGZW5jZSA9IG5ldyBGZW5jZShidWZmZXIucmVsZWFzZV9mZW5jZSk7Ci0gICAgfQotCisgICAgLy8gRmVuY2UgbWFuYWdlbWVudCAtIGFsd2F5cyBob25vciByZWxlYXNlIGZlbmNlIGZyb20gSEFMCisgICAgc3A8RmVuY2U+IHJlbGVhc2VGZW5jZSA9IG5ldyBGZW5jZShidWZmZXIucmVsZWFzZV9mZW5jZSk7CiAgICAgaW50IGFud1JlbGVhc2VGZW5jZSA9IHJlbGVhc2VGZW5jZS0+ZHVwKCk7CiAKICAgICAvKioKQEAgLTIxMyw2ICsxOTMsMTMgQEAKICAgICAgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyID0gZmFsc2U7CiAgICAgICAgIH0KIAorICAgICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChtQ29uc3VtZXIuZ2V0KCksIHRpbWVzdGFtcCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBFcnJvciBzZXR0aW5nIHRpbWVzdGFtcDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKICAgICAgICAgcmVzID0gY3VycmVudENvbnN1bWVyLT5xdWV1ZUJ1ZmZlcihjdXJyZW50Q29uc3VtZXIuZ2V0KCksCiAgICAgICAgICAgICAgICAgY29udGFpbmVyX29mKGJ1ZmZlci5idWZmZXIsIEFOYXRpdmVXaW5kb3dCdWZmZXIsIGhhbmRsZSksCiAgICAgICAgICAgICAgICAgYW53UmVsZWFzZUZlbmNlKTsKQEAgLTIyMiw2ICsyMDksMTMgQEAKICAgICAgICAgfQogICAgIH0KICAgICBtTG9jay5sb2NrKCk7CisKKyAgICAvLyBPbmNlIGEgdmFsaWQgYnVmZmVyIGhhcyBiZWVuIHJldHVybmVkIHRvIHRoZSBxdWV1ZSwgY2FuIG5vIGxvbmdlcgorICAgIC8vIGRlcXVldWUgYWxsIGJ1ZmZlcnMgZm9yIHByZWFsbG9jYXRpb24uCisgICAgaWYgKGJ1ZmZlci5zdGF0dXMgIT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SKSB7CisgICAgICAgIG1TdHJlYW1VbnByZXBhcmFibGUgPSB0cnVlOworICAgIH0KKwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgY2xvc2UoYW53UmVsZWFzZUZlbmNlKTsKICAgICB9CkBAIC0yMzUsNiArMjI5LDcgQEAKICAgICAodm9pZCkgYXJnczsKICAgICBTdHJpbmc4IGxpbmVzOwogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgIFN0cmVhbVslZF06IE91dHB1dFxuIiwgbUlkKTsKKyAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIENvbnN1bWVyIG5hbWU6ICVzXG4iLCBtQ29uc3VtZXJOYW1lLnN0cmluZygpKTsKICAgICB3cml0ZShmZCwgbGluZXMuc3RyaW5nKCksIGxpbmVzLnNpemUoKSk7CiAKICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlOjpkdW1wKGZkLCBhcmdzKTsKQEAgLTI4NCw2ICsyNzksOCBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAorICAgIG1Db25zdW1lck5hbWUgPSBtQ29uc3VtZXItPmdldENvbnN1bWVyTmFtZSgpOworCiAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobUNvbnN1bWVyLmdldCgpLCBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHVzYWdlICUwOHggZm9yIHN0cmVhbSAlZCIsCkBAIC0zMjMsOCArMzIwLDE3IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCisgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kYXRhX3NwYWNlKG1Db25zdW1lci5nZXQoKSwKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjpkYXRhX3NwYWNlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW0gZGF0YXNwYWNlICUjeCBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYTNfc3RyZWFtOjpkYXRhX3NwYWNlLCBtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKwogICAgIGludCBtYXhDb25zdW1lckJ1ZmZlcnM7Ci0gICAgcmVzID0gbUNvbnN1bWVyLT5xdWVyeShtQ29uc3VtZXIuZ2V0KCksCisgICAgcmVzID0gc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KG1Db25zdW1lci5nZXQoKSktPnF1ZXJ5KAorICAgICAgICAgICAgbUNvbnN1bWVyLmdldCgpLAogICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLCAmbWF4Q29uc3VtZXJCdWZmZXJzKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHF1ZXJ5IGNvbnN1bWVyIHVuZGVxdWV1ZWQiCkBAIC0zOTUsMTQgKzQwMSwyOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIHsKK3N0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdCB7CiAKICAgICBzdGF0dXNfdCByZXM7CiAgICAgaW50MzJfdCB1ID0gMDsKLSAgICByZXMgPSBtQ29uc3VtZXItPnF1ZXJ5KG1Db25zdW1lci5nZXQoKSwKKyAgICByZXMgPSBzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93Kj4obUNvbnN1bWVyLmdldCgpKS0+cXVlcnkobUNvbnN1bWVyLmdldCgpLAogICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19DT05TVU1FUl9VU0FHRV9CSVRTLCAmdSk7Ci0gICAgKnVzYWdlID0gdTsKIAorICAgIC8vIElmIGFuIG9wYXF1ZSBvdXRwdXQgc3RyZWFtJ3MgZW5kcG9pbnQgaXMgSW1hZ2VSZWFkZXIsIGFkZAorICAgIC8vIEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTCB0byB0aGUgdXNhZ2Ugc28gSEFMIGtub3dzIGl0IHdpbGwgYmUgdXNlZAorICAgIC8vIGZvciB0aGUgWlNMIHVzZSBjYXNlLgorICAgIC8vIEFzc3VtZSBpdCdzIGZvciBJbWFnZVJlYWRlciBpZiB0aGUgY29uc3VtZXIgdXNhZ2UgZG9lc24ndCBoYXZlIGFueSBvZiB0aGVzZSBiaXRzIHNldDoKKyAgICAvLyAgICAgMS4gR1JBTExPQ19VU0FHRV9IV19URVhUVVJFCisgICAgLy8gICAgIDIuIEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSCisgICAgLy8gICAgIDMuIEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIKKyAgICAvLyAgICAgNC4gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSCisgICAgaWYgKGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEICYmCisgICAgICAgICAgICAodSAmIChHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUgfCBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiB8IEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIgfAorICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSKSkgPT0gMCkgeworICAgICAgICB1IHw9IEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTDsKKyAgICB9CisKKyAgICAqdXNhZ2UgPSB1OwogICAgIHJldHVybiByZXM7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKaW5kZXggYmUyNzhjNS4uOTQxZDY5MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKQEAgLTM4LDE1ICszOCwxNyBAQAogICAgIC8qKgogICAgICAqIFNldCB1cCBhIHN0cmVhbSBmb3IgZm9ybWF0cyB0aGF0IGhhdmUgMiBkaW1lbnNpb25zLCBzdWNoIGFzIFJBVyBhbmQgWVVWLgogICAgICAqLwotICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQpOworICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBzcDxTdXJmYWNlPiBjb25zdW1lciwKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pOwogCiAgICAgLyoqCiAgICAgICogU2V0IHVwIGEgc3RyZWFtIGZvciBmb3JtYXRzIHRoYXQgaGF2ZSBhIHZhcmlhYmxlIGJ1ZmZlciBzaXplIGZvciB0aGUgc2FtZQogICAgICAqIGRpbWVuc2lvbnMsIHN1Y2ggYXMgY29tcHJlc3NlZCBKUEVHLgogICAgICAqLwotICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0KTsKKyAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwgc3A8U3VyZmFjZT4gY29uc3VtZXIsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbik7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEzT3V0cHV0U3RyZWFtKCk7CiAKQEAgLTY0LDcgKzY2LDggQEAKIAogICBwcm90ZWN0ZWQ6CiAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsIGNhbWVyYTNfc3RyZWFtX3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCk7CisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKTsKIAogICAgIC8qKgogICAgICAqIE5vdGUgdGhhdCB3ZSByZWxlYXNlIHRoZSBsb2NrIGJyaWVmbHkgaW4gdGhpcyBmdW5jdGlvbgpAQCAtNzgsNyArODEsNyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0TG9ja2VkKCk7CiAKLSAgICBzcDxBTmF0aXZlV2luZG93PiBtQ29uc3VtZXI7CisgICAgc3A8U3VyZmFjZT4gbUNvbnN1bWVyOwogICBwcml2YXRlOgogICAgIGludCAgICAgICAgICAgICAgIG1UcmFuc2Zvcm07CiAKQEAgLTg2LDYgKzg5LDkgQEAKIAogICAgIGJvb2wgbVRyYWNlRmlyc3RCdWZmZXI7CiAKKyAgICAvLyBOYW1lIG9mIFN1cmZhY2UgY29uc3VtZXIKKyAgICBTdHJpbmc4ICAgICAgICAgICBtQ29uc3VtZXJOYW1lOworCiAgICAgLyoqCiAgICAgICogSW50ZXJuYWwgQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKICAgICAgKi8KQEAgLTk2LDcgKzEwMiw3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdDsKIAogfTsgLy8gY2xhc3MgQ2FtZXJhM091dHB1dFN0cmVhbQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAppbmRleCAzYzBlOTA4Li4yNTI3ZmQ2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKQEAgLTQ2LDcgKzQ2LDggQEAKIAogQ2FtZXJhM1N0cmVhbTo6Q2FtZXJhM1N0cmVhbShpbnQgaWQsCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3R5cGUgdHlwZSwKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQpIDoKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQsCisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbikgOgogICAgIGNhbWVyYTNfc3RyZWFtKCksCiAgICAgbUlkKGlkKSwKICAgICBtTmFtZShTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYTNTdHJlYW1bJWRdIiwgaWQpKSwKQEAgLTU4LDYgKzU5LDggQEAKICAgICBjYW1lcmEzX3N0cmVhbTo6d2lkdGggPSB3aWR0aDsKICAgICBjYW1lcmEzX3N0cmVhbTo6aGVpZ2h0ID0gaGVpZ2h0OwogICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQgPSBmb3JtYXQ7CisgICAgY2FtZXJhM19zdHJlYW06OmRhdGFfc3BhY2UgPSBkYXRhU3BhY2U7CisgICAgY2FtZXJhM19zdHJlYW06OnJvdGF0aW9uID0gcm90YXRpb247CiAgICAgY2FtZXJhM19zdHJlYW06OnVzYWdlID0gMDsKICAgICBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMgPSAwOwogICAgIGNhbWVyYTNfc3RyZWFtOjpwcml2ID0gTlVMTDsKQEAgLTg0LDYgKzg3LDEwIEBACiAgICAgcmV0dXJuIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQ7CiB9CiAKK2FuZHJvaWRfZGF0YXNwYWNlIENhbWVyYTNTdHJlYW06OmdldERhdGFTcGFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FtZXJhM19zdHJlYW06OmRhdGFfc3BhY2U7Cit9CisKIGNhbWVyYTNfc3RyZWFtKiBDYW1lcmEzU3RyZWFtOjpzdGFydENvbmZpZ3VyYXRpb24oKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CkBAIC0xMDIsMTEgKzEwOSw3IEBACiAgICAgICAgICAgICAvLyBvbGRVc2FnZS9vbGRNYXhCdWZmZXJzCiAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgY2FzZSBTVEFURV9DT05GSUdVUkVEOgotICAgICAgICAgICAgaWYgKHN0cmVhbV90eXBlID09IENBTUVSQTNfU1RSRUFNX0lOUFVUKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgY29uZmlndXJlIGFuIGlucHV0IHN0cmVhbSB0d2ljZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNPdXRzdGFuZGluZ0J1ZmZlcnNMb2NrZWQoKSkgeworICAgICAgICAgICAgaWYgKGhhc091dHN0YW5kaW5nQnVmZmVyc0xvY2tlZCgpKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgY29uZmlndXJlIHN0cmVhbTsgaGFzIG91dHN0YW5kaW5nIGJ1ZmZlcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTE4Nyw2ICsxOTAsMTEgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAorICAgIC8vIFJlc2V0IHByZXBhcmVkIHN0YXRlLCBzaW5jZSBidWZmZXIgY29uZmlnIGhhcyBjaGFuZ2VkLCBhbmQgZXhpc3RpbmcKKyAgICAvLyBhbGxvY2F0aW9ucyBhcmUgbm8gbG9uZ2VyIHZhbGlkCisgICAgbVByZXBhcmVkID0gZmFsc2U7CisgICAgbVN0cmVhbVVucHJlcGFyYWJsZSA9IGZhbHNlOworCiAgICAgc3RhdHVzX3QgcmVzOwogICAgIHJlcyA9IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMjM3LDYgKzI0NSwxODAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK2Jvb2wgQ2FtZXJhM1N0cmVhbTo6aXNVbnByZXBhcmFibGUoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICByZXR1cm4gbVN0cmVhbVVucHJlcGFyYWJsZTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6c3RhcnRQcmVwYXJlKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvbmx5IGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gaXMgY29uZmlndXJlZCBhbHJlYWR5LgorICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQ09ORklHVVJFRCkgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgcHJlcGFyZSBzdHJlYW0gaWYgc3RyZWFtIGlzIG5vdCBpbiBDT05GSUdVUkVEICIKKyAgICAgICAgICAgICAgICAic3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1JZCwgbVN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIFRoaXMgZnVuY3Rpb24gY2FuJ3QgYmUgY2FsbGVkIGlmIHRoZSBzdHJlYW0gaGFzIGFscmVhZHkgcmVjZWl2ZWQgZmlsbGVkCisgICAgLy8gYnVmZmVycworICAgIGlmIChtU3RyZWFtVW5wcmVwYXJhYmxlKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBwcmVwYXJlIHN0cmVhbSB0aGF0J3MgYWxyZWFkeSBpbiB1c2UiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSA+IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IHByZXBhcmUgc3RyZWFtIHRoYXQgaGFzIG91dHN0YW5kaW5nIGJ1ZmZlcnMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChtUHJlcGFyZWQpIHJldHVybiBPSzsKKworICAgIHNpemVfdCBidWZmZXJDb3VudCA9IGdldEJ1ZmZlckNvdW50TG9ja2VkKCk7CisKKyAgICBtUHJlcGFyZWRCdWZmZXJzLmluc2VydEF0KGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90KCksIC8qaW5kZXgqLzAsIGJ1ZmZlckNvdW50KTsKKyAgICBtUHJlcGFyZWRCdWZmZXJJZHggPSAwOworCisgICAgbVN0YXRlID0gU1RBVEVfUFJFUEFSSU5HOworCisgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKK30KKworYm9vbCBDYW1lcmEzU3RyZWFtOjppc1ByZXBhcmluZygpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9QUkVQQVJJTkc7Cit9CisKK3N0YXR1c190IENhbWVyYTNTdHJlYW06OnByZXBhcmVOZXh0QnVmZmVyKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvbmx5IGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gaXMgcHJlcGFyaW5nCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9QUkVQQVJJTkcpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IHByZXBhcmUgYnVmZmVyIGlmIHN0cmVhbSBpcyBub3QgaW4gUFJFUEFSSU5HICIKKyAgICAgICAgICAgICAgICAic3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1JZCwgbVN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIEdldCBuZXh0IGJ1ZmZlciAtIHRoaXMgbWF5IGFsbG9jYXRlLCBhbmQgdGFrZSBhIHdoaWxlIGZvciBsYXJnZSBidWZmZXJzCisgICAgcmVzID0gZ2V0QnVmZmVyTG9ja2VkKCAmbVByZXBhcmVkQnVmZmVycy5lZGl0SXRlbUF0KG1QcmVwYXJlZEJ1ZmZlcklkeCkgKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBVbmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyICVkIGR1cmluZyBwcmVwYXJhdGlvbiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIG1QcmVwYXJlZEJ1ZmZlcklkeCk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIG1QcmVwYXJlZEJ1ZmZlcklkeCsrOworCisgICAgLy8gQ2hlY2sgaWYgd2Ugc3RpbGwgaGF2ZSBidWZmZXJzIGxlZnQgdG8gYWxsb2NhdGUKKyAgICBpZiAobVByZXBhcmVkQnVmZmVySWR4IDwgbVByZXBhcmVkQnVmZmVycy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICB9CisKKyAgICAvLyBEb25lIHdpdGggcHJlcGFyZSAtIG1hcmsgc3RyZWFtIGFzIHN1Y2gsIGFuZCByZXR1cm4gYWxsIGJ1ZmZlcnMKKyAgICAvLyB2aWEgY2FuY2VsUHJlcGFyZQorICAgIG1QcmVwYXJlZCA9IHRydWU7CisKKyAgICByZXR1cm4gY2FuY2VsUHJlcGFyZUxvY2tlZCgpOworfQorCitzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpjYW5jZWxQcmVwYXJlKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICByZXR1cm4gY2FuY2VsUHJlcGFyZUxvY2tlZCgpOworfQorCitzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpjYW5jZWxQcmVwYXJlTG9ja2VkKCkgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb25seSBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIG1pZC1wcmVwYXJpbmcuCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9QUkVQQVJJTkcpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IGNhbmNlbCBwcmVwYXJlIHN0cmVhbSBpZiBzdHJlYW0gaXMgbm90IGluICIKKyAgICAgICAgICAgICAgICAiUFJFUEFSSU5HIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtSWQsIG1TdGF0ZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gYWxsIHZhbGlkIGJ1ZmZlcnMgdG8gc3RyZWFtLCBpbiBFUlJPUiBzdGF0ZSB0byBpbmRpY2F0ZQorICAgIC8vIHRoZXkgd2VyZW4ndCBmaWxsZWQuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUHJlcGFyZWRCdWZmZXJJZHg7IGkrKykgeworICAgICAgICBtUHJlcGFyZWRCdWZmZXJzLmVkaXRJdGVtQXQoaSkucmVsZWFzZV9mZW5jZSA9IC0xOworICAgICAgICBtUHJlcGFyZWRCdWZmZXJzLmVkaXRJdGVtQXQoaSkuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICByZXR1cm5CdWZmZXJMb2NrZWQobVByZXBhcmVkQnVmZmVyc1tpXSwgMCk7CisgICAgfQorICAgIG1QcmVwYXJlZEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBtUHJlcGFyZWRCdWZmZXJJZHggPSAwOworCisgICAgbVN0YXRlID0gU1RBVEVfQ09ORklHVVJFRDsKKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IENhbWVyYTNTdHJlYW06OnRlYXJEb3duKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvbmx5IGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gaXMgY29uZmlndXJlZC4KKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX0NPTkZJR1VSRUQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IHRlYXIgZG93biBzdHJlYW0gaWYgc3RyZWFtIGlzIG5vdCBpbiAiCisgICAgICAgICAgICAgICAgIkNPTkZJR1VSRUQgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1JZCwgbVN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIElmIGFueSBidWZmZXJzIGhhdmUgYmVlbiBoYW5kZWQgdG8gdGhlIEhBTCwgdGhlIHN0cmVhbSBjYW5ub3QgYmUgdG9ybiBkb3duLgorICAgIGlmIChnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSA+IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IHRlYXIgZG93biBhIHN0cmVhbSB0aGF0IGhhcyBvdXRzdGFuZGluZyBidWZmZXJzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvLyBGcmVlIGJ1ZmZlcnMgYnkgZGlzY29ubmVjdGluZyBhbmQgdGhlbiByZWNvbm5lY3RpbmcgdG8gdGhlIGJ1ZmZlciBxdWV1ZQorICAgIC8vIE9ubHkgdW51c2VkIGJ1ZmZlcnMgd2lsbCBiZSBkcm9wcGVkIGltbWVkaWF0ZWx5OyBidWZmZXJzIHRoYXQgaGF2ZSBiZWVuIGZpbGxlZAorICAgIC8vIGFuZCBhcmUgd2FpdGluZyB0byBiZSBhY3F1aXJlZCBieSB0aGUgY29uc3VtZXIgYW5kIGJ1ZmZlcnMgdGhhdCBhcmUgY3VycmVudGx5CisgICAgLy8gYWNxdWlyZWQgd2lsbCBiZSBmcmVlZCBvbmNlIHRoZXkgYXJlIHJlbGVhc2VkIGJ5IHRoZSBjb25zdW1lci4KKworICAgIHJlcyA9IGRpc2Nvbm5lY3RMb2NrZWQoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIGlmIChyZXMgPT0gLUVOT1RDT05OKSB7CisgICAgICAgICAgICAvLyBxdWV1ZSBoYXMgYmVlbiBkaXNjb25uZWN0ZWQsIG5vdGhpbmcgbGVmdCB0byBkbywgc28gZXhpdCB3aXRoIHN1Y2Nlc3MKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogVW5hYmxlIHRvIGRpc2Nvbm5lY3QgdG8gdGVhciBkb3duIGJ1ZmZlcnM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtU3RhdGUgPSBTVEFURV9JTl9DT05GSUc7CisKKyAgICByZXMgPSBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSAlZCBxdWV1ZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBtU3RhdGUgPSBTVEFURV9FUlJPUjsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBSZXNldCBwcmVwYXJlZCBzdGF0ZSwgc2luY2Ugd2UndmUgcmVjb25uZWN0ZWQgdG8gdGhlIHF1ZXVlIGFuZCBjYW4gcHJlcGFyZSBhZ2Fpbi4KKyAgICBtUHJlcGFyZWQgPSBmYWxzZTsKKyAgICBtU3RyZWFtVW5wcmVwYXJhYmxlID0gZmFsc2U7CisKKyAgICBtU3RhdGUgPSBTVEFURV9DT05GSUdVUkVEOworCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpnZXRCdWZmZXIoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTMzOSw2ICs1MjEsMTMgQEAKICAgICByZXR1cm4gcmVzOwogfQogCitzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgcmV0dXJuIGdldElucHV0QnVmZmVyUHJvZHVjZXJMb2NrZWQocHJvZHVjZXIpOworfQorCiB2b2lkIENhbWVyYTNTdHJlYW06OmZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoCiAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciYgLypidWZmZXIqLywgYm9vbCBhY3F1aXJlZCwgYm9vbCBvdXRwdXQpIHsKICAgICBMaXN0PHdwPENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcj4gPjo6aXRlcmF0b3IgaXQsIGVuZDsKQEAgLTQxMywxNSArNjAyLDEzIEBACiAgICAgICAgICAgICBBTE9HRSgiJXM6IHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIGlzIGRlcHJlY2F0ZWQgaW4gSEFMMy4yOyAiCiAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIHNldCB0byBOVUxMIGluIGNhbWVyYTNfZGV2aWNlOjpvcHMiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0QoIiVzOiBTa2lwcGluZyBOVUxMIGNoZWNrIGZvciBkZXByZWNhdGVkIHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiJXM6IHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIHVzaW5nIGRlcHJlY2F0ZWQgY29kZSBwYXRoIiwgX19GVU5DVElPTl9fKTsKICAgICB9CiAKKyAgICBBTE9HVigiJXM6IHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIHVzaW5nIGRlcHJlY2F0ZWQgY29kZSBwYXRoIiwgX19GVU5DVElPTl9fKTsKKwogICAgIHN0YXR1c190IHJlczsKIAogICAgIHNpemVfdCBidWZmZXJDb3VudCA9IGdldEJ1ZmZlckNvdW50TG9ja2VkKCk7CkBAIC00NzcsNiArNjY0LDggQEAKICAgICAgICAgcmV0dXJuQnVmZmVyTG9ja2VkKHN0cmVhbUJ1ZmZlcnNbaV0sIDApOwogICAgIH0KIAorICAgIG1QcmVwYXJlZCA9IHRydWU7CisKICAgICByZXR1cm4gcmVzOwogfQogCkBAIC00OTgsNiArNjg3LDEwIEBACiAgICAgQUxPR0UoIiVzOiBUaGlzIHR5cGUgb2Ygc3RyZWFtIGRvZXMgbm90IHN1cHBvcnQgaW5wdXQiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KK3N0YXR1c190IENhbWVyYTNTdHJlYW06OmdldElucHV0QnVmZmVyUHJvZHVjZXJMb2NrZWQoc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKnByb2R1Y2VyKSB7CisgICAgQUxPR0UoIiVzOiBUaGlzIHR5cGUgb2Ygc3RyZWFtIGRvZXMgbm90IHN1cHBvcnQgaW5wdXQiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KIAogdm9pZCBDYW1lcmEzU3RyZWFtOjphZGRCdWZmZXJMaXN0ZW5lcigKICAgICAgICAgd3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyPiBsaXN0ZW5lcikgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAppbmRleCBkMGUxMzM3Li5iYWIyMTc3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaApAQCAtNTcsOCArNTcsMTUgQEAKICAqICAgIHJlLXJlZ2lzdGVyaW5nIGJ1ZmZlcnMgd2l0aCBIQUwuCiAgKgogICogIFNUQVRFX0NPTkZJR1VSRUQ6IFN0cmVhbSBpcyBjb25maWd1cmVkLCBhbmQgaGFzIHJlZ2lzdGVyZWQgYnVmZmVycyB3aXRoIHRoZQotICogICAgSEFMLiBUaGUgc3RyZWFtJ3MgZ2V0QnVmZmVyL3JldHVybkJ1ZmZlciB3b3JrLiBUaGUgcHJpdiBwb2ludGVyIG1heSBzdGlsbCBiZQotICogICAgbW9kaWZpZWQuCisgKiAgICBIQUwgKGlmIG5lY2Vzc2FyeSkuIFRoZSBzdHJlYW0ncyBnZXRCdWZmZXIvcmV0dXJuQnVmZmVyIHdvcmsuIFRoZSBwcml2CisgKiAgICBwb2ludGVyIG1heSBzdGlsbCBiZSBtb2RpZmllZC4KKyAqCisgKiAgU1RBVEVfUFJFUEFSSU5HOiBUaGUgc3RyZWFtJ3MgYnVmZmVycyBhcmUgYmVpbmcgcHJlLWFsbG9jYXRlZCBmb3IgdXNlLiAgT24KKyAqICAgIG9sZGVyIEhBTHMsIHRoaXMgaXMgZG9uZSBhcyBwYXJ0IG9mIGNvbmZpZ3VyYXRpb24sIGJ1dCBpbiBuZXdlciBIQUxzCisgKiAgICBidWZmZXJzIG1heSBiZSBhbGxvY2F0ZWQgYXQgdGltZSBvZiBmaXJzdCB1c2UuIEJ1dCBzb21lIHVzZSBjYXNlcyByZXF1aXJlCisgKiAgICBidWZmZXIgYWxsb2NhdGlvbiB1cGZyb250LCB0byBtaW5taXplIGRpc3J1cHRpb24gZHVlIHRvIGxlbmd0aHkgYWxsb2NhdGlvbgorICogICAgZHVyYXRpb24uICBJbiB0aGlzIHN0YXRlLCBvbmx5IHByZXBhcmVOZXh0QnVmZmVyKCkgYW5kIGNhbmNlbFByZXBhcmUoKQorICogICAgbWF5IGJlIGNhbGxlZC4KICAqCiAgKiBUcmFuc2l0aW9uIHRhYmxlOgogICoKQEAgLTgyLDYgKzg5LDEyIEBACiAgKiAgICBTVEFURV9DT05GSUdVUkVEICAgICA9PiBTVEFURV9DT05TVFJVQ1RFRDoKICAqICAgICAgICBXaGVuIGRpc2Nvbm5lY3QoKSBpcyBjYWxsZWQgYWZ0ZXIgbWFraW5nIHN1cmUgc3RyZWFtIGlzIGlkbGUgd2l0aAogICogICAgICAgIHdhaXRVbnRpbElkbGUoKS4KKyAqICAgIFNUQVRFX0NPTkZJR1VSRUQgICAgID0+IFNUQVRFX1BSRVBBUklORzoKKyAqICAgICAgICBXaGVuIHN0YXJ0UHJlcGFyZSBpcyBjYWxsZWQgYmVmb3JlIHRoZSBzdHJlYW0gaGFzIGEgYnVmZmVyCisgKiAgICAgICAgcXVldWVkIGJhY2sgaW50byBpdCBmb3IgdGhlIGZpcnN0IHRpbWUuCisgKiAgICBTVEFURV9QUkVQQVJJTkcgICAgICA9PiBTVEFURV9DT05GSUdVUkVEOgorICogICAgICAgIFdoZW4gc3VmZmljaWVudCBwcmVwYXJlTmV4dEJ1ZmZlciBjYWxscyBoYXZlIGJlZW4gbWFkZSB0byBhbGxvY2F0ZQorICogICAgICAgIGFsbCBzdHJlYW0gYnVmZmVycywgb3IgY2FuY2VsUHJlcGFyZSBpcyBjYWxsZWQuCiAgKgogICogU3RhdHVzIFRyYWNraW5nOgogICogICAgRWFjaCBzdHJlYW0gaXMgdHJhY2tlZCBieSBTdGF0dXNUcmFja2VyIGFzIGEgc2VwYXJhdGUgY29tcG9uZW50LApAQCAtMTE5LDkgKzEzMiwxMCBAQAogICAgIC8qKgogICAgICAqIEdldCB0aGUgc3RyZWFtJ3MgZGltZW5zaW9ucyBhbmQgZm9ybWF0CiAgICAgICovCi0gICAgdWludDMyX3QgICAgICAgICBnZXRXaWR0aCgpIGNvbnN0OwotICAgIHVpbnQzMl90ICAgICAgICAgZ2V0SGVpZ2h0KCkgY29uc3Q7Ci0gICAgaW50ICAgICAgICAgICAgICBnZXRGb3JtYXQoKSBjb25zdDsKKyAgICB1aW50MzJfdCAgICAgICAgICBnZXRXaWR0aCgpIGNvbnN0OworICAgIHVpbnQzMl90ICAgICAgICAgIGdldEhlaWdodCgpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICAgIGdldEZvcm1hdCgpIGNvbnN0OworICAgIGFuZHJvaWRfZGF0YXNwYWNlIGdldERhdGFTcGFjZSgpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogU3RhcnQgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uIHByb2Nlc3MuIFJldHVybnMgYSBoYW5kbGUgdG8gdGhlIHN0cmVhbSdzCkBAIC0xNjYsNiArMTgwLDg3IEBACiAgICAgc3RhdHVzX3QgICAgICAgICBjYW5jZWxDb25maWd1cmF0aW9uKCk7CiAKICAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc3RyZWFtIGhhcyBhbHJlYWR5IGJlY29tZSBpbi11c2UgKGhhcyByZWNlaXZlZAorICAgICAqIGEgdmFsaWQgZmlsbGVkIGJ1ZmZlciksIHdoaWNoIGRldGVybWluZXMgaWYgYSBzdHJlYW0gY2FuIHN0aWxsIGhhdmUKKyAgICAgKiBwcmVwYXJlTmV4dEJ1ZmZlciBjYWxsZWQgb24gaXQuCisgICAgICovCisgICAgYm9vbCAgICAgICAgICAgICBpc1VucHJlcGFyYWJsZSgpOworCisgICAgLyoqCisgICAgICogU3RhcnQgc3RyZWFtIHByZXBhcmF0aW9uLiBNYXkgb25seSBiZSBjYWxsZWQgaW4gdGhlIENPTkZJR1VSRUQgc3RhdGUsCisgICAgICogd2hlbiBubyB2YWxpZCBidWZmZXJzIGhhdmUgeWV0IGJlZW4gcmV0dXJuZWQgdG8gdGhpcyBzdHJlYW0uCisgICAgICoKKyAgICAgKiBJZiBubyBwcmVwYXJ0aW9uIGlzIG5lY2Vzc2FyeSwgcmV0dXJucyBPSyBhbmQgZG9lcyBub3QgdHJhbnNpdGlvbiB0bworICAgICAqIFBSRVBBUklORyBzdGF0ZS4gT3RoZXJ3aXNlLCByZXR1cm5zIE5PVF9FTk9VR0hfREFUQSBhbmQgdHJhbnNpdGlvbnMKKyAgICAgKiB0byBQUkVQQVJJTkcuCisgICAgICoKKyAgICAgKiBUaGlzIGNhbGwgcGVyZm9ybXMgbm8gYWxsb2NhdGlvbiwgc28gaXMgcXVpY2sgdG8gY2FsbC4KKyAgICAgKgorICAgICAqIFJldHVybnM6CisgICAgICogICAgT0sgaWYgbm8gbW9yZSBidWZmZXJzIG5lZWQgdG8gYmUgcHJlYWxsb2NhdGVkCisgICAgICogICAgTk9UX0VOT1VHSF9EQVRBIGlmIGNhbGxzIHRvIHByZXBhcmVOZXh0QnVmZmVyIGFyZSBuZWVkZWQgdG8gZmluaXNoCisgICAgICogICAgICAgIGJ1ZmZlciBwcmUtYWxsb2NhdGlvbiwgYW5kIHRyYW5zaXRpb25zIHRvIHRoZSBQUkVQQVJJTkcgc3RhdGUuCisgICAgICogICAgTk9fSU5JVCBpbiBjYXNlIG9mIGEgc2VyaW91cyBlcnJvciBmcm9tIHRoZSBIQUwgZGV2aWNlCisgICAgICogICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgY2FsbGVkIHdoZW4gbm90IGluIENPTkZJR1VSRUQgc3RhdGUsIG9yIGEKKyAgICAgKiAgICAgICAgdmFsaWQgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gcmV0dXJuZWQgdG8gdGhpcyBzdHJlYW0uCisgICAgICovCisgICAgc3RhdHVzX3QgICAgICAgICBzdGFydFByZXBhcmUoKTsKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBzdHJlYW0gaXMgbWlkLXByZXBhcmluZy4KKyAgICAgKi8KKyAgICBib29sICAgICAgICAgICAgIGlzUHJlcGFyaW5nKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb250aW51ZSBzdHJlYW0gYnVmZmVyIHByZXBhcmF0aW9uIGJ5IGFsbG9jYXRpbmcgdGhlIG5leHQKKyAgICAgKiBidWZmZXIgZm9yIHRoaXMgc3RyZWFtLiAgTWF5IG9ubHkgYmUgY2FsbGVkIGluIHRoZSBQUkVQQVJFRCBzdGF0ZS4KKyAgICAgKgorICAgICAqIFJldHVybnMgT0sgYW5kIHRyYW5zaXRpb25zIHRvIHRoZSBDT05GSUdVUkVEIHN0YXRlIGlmIGFsbCBidWZmZXJzCisgICAgICogYXJlIGFsbG9jYXRlZCBhZnRlciB0aGUgY2FsbCBjb25jbHVkZXMuIE90aGVyd2lzZSByZXR1cm5zIE5PVF9FTk9VR0hfREFUQS4KKyAgICAgKgorICAgICAqIFRoaXMgY2FsbCBhbGxvY2F0ZXMgb25lIGJ1ZmZlciwgd2hpY2ggbWF5IHRha2Ugc2V2ZXJhbCBtaWxsaXNlY29uZHMgZm9yCisgICAgICogbGFyZ2UgYnVmZmVycy4KKyAgICAgKgorICAgICAqIFJldHVybnM6CisgICAgICogICAgT0sgaWYgbm8gbW9yZSBidWZmZXJzIG5lZWQgdG8gYmUgcHJlYWxsb2NhdGVkLCBhbmQgdHJhbnNpdGlvbnMKKyAgICAgKiAgICAgICAgdG8gdGhlIENPTkZJR1VSRUQgc3RhdGUuCisgICAgICogICAgTk9UX0VOT1VHSF9EQVRBIGlmIG1vcmUgY2FsbHMgdG8gcHJlcGFyZU5leHRCdWZmZXIgYXJlIG5lZWRlZCB0byBmaW5pc2gKKyAgICAgKiAgICAgICAgYnVmZmVyIHByZS1hbGxvY2F0aW9uLgorICAgICAqICAgIE5PX0lOSVQgaW4gY2FzZSBvZiBhIHNlcmlvdXMgZXJyb3IgZnJvbSB0aGUgSEFMIGRldmljZQorICAgICAqICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIGNhbGxlZCB3aGVuIG5vdCBpbiBDT05GSUdVUkVEIHN0YXRlLCBvciBhCisgICAgICogICAgICAgIHZhbGlkIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIHJldHVybmVkIHRvIHRoaXMgc3RyZWFtLgorICAgICAqLworICAgIHN0YXR1c190ICAgICAgICAgcHJlcGFyZU5leHRCdWZmZXIoKTsKKworICAgIC8qKgorICAgICAqIENhbmNlbCBzdHJlYW0gcHJlcGFyYXRpb24gZWFybHkuIEluIGNhc2UgYWxsb2NhdGlvbiBuZWVkcyB0byBiZQorICAgICAqIHN0b3BwZWQsIHRoaXMgbWV0aG9kIHRyYW5zaXRpb25zIHRoZSBzdHJlYW0gYmFjayB0byB0aGUgQ09ORklHVVJFRCBzdGF0ZS4KKyAgICAgKiBCdWZmZXJzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIHByZXBhcmVOZXh0QnVmZmVyIHJlbWFpbiB0aGF0IHdheSwKKyAgICAgKiBidXQgYSBsYXRlciB1c2Ugb2YgcHJlcGFyZU5leHRCdWZmZXIgd2lsbCByZXF1aXJlIGp1c3QgYXMgbWFueQorICAgICAqIGNhbGxzIGFzIGlmIHRoZSBlYXJsaWVyIHByZXBhcmUgYXR0ZW1wdCBoYWQgbm90IGV4aXN0ZWQuCisgICAgICoKKyAgICAgKiBSZXR1cm5zOgorICAgICAqICAgIE9LIGlmIGNhbmNlbGxhdGlvbiBzdWNjZWVkZWQsIGFuZCB0cmFuc2l0aW9ucyB0byB0aGUgQ09ORklHVVJFRCBzdGF0ZQorICAgICAqICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIG5vdCBpbiB0aGUgUFJFUEFSSU5HIHN0YXRlCisgICAgICogICAgTk9fSU5JVCBpbiBjYXNlIG9mIGEgc2VyaW91cyBlcnJvciBmcm9tIHRoZSBIQUwgZGV2aWNlCisgICAgICovCisgICAgc3RhdHVzX3QgICAgICAgIGNhbmNlbFByZXBhcmUoKTsKKworICAgIC8qKgorICAgICAqIFRlYXIgZG93biBtZW1vcnkgZm9yIHRoaXMgc3RyZWFtLiBUaGlzIGZyZWVzIGFsbCB1bnVzZWQgZ3JhbGxvYyBidWZmZXJzCisgICAgICogYWxsb2NhdGVkIGZvciB0aGlzIHN0cmVhbSwgYnV0IGxlYXZlcyBpdCByZWFkeSBmb3Igb3BlcmF0aW9uIGFmdGVyd2FyZC4KKyAgICAgKgorICAgICAqIE1heSBvbmx5IGJlIGNhbGxlZCBpbiB0aGUgQ09ORklHVVJFRCBzdGF0ZSwgYW5kIGtlZXBzIHRoZSBzdHJlYW0gaW4KKyAgICAgKiB0aGUgQ09ORklHVVJFRCBzdGF0ZS4KKyAgICAgKgorICAgICAqIFJldHVybnM6CisgICAgICogICAgT0sgaWYgdGVhcmRvd24gc3VjY2VlZGVkLgorICAgICAqICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIG5vdCBpbiB0aGUgQ09ORklHVVJFRCBzdGF0ZQorICAgICAqICAgIE5PX0lOSVQgaW4gY2FzZSBvZiBhIHNlcmlvdXMgZXJyb3IgZnJvbSB0aGUgSEFMIGRldmljZQorICAgICAqLworICAgIHN0YXR1c190ICAgICAgIHRlYXJEb3duKCk7CisKKyAgICAvKioKICAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmEzX3N0cmVhbV9idWZmZXIgd2l0aCB0aGUgbmV4dCB2YWxpZCBidWZmZXIgZm9yIHRoaXMKICAgICAgKiBzdHJlYW0sIHRvIGhhbmQgb3ZlciB0byB0aGUgSEFMLgogICAgICAqCkBAIC0yMDQsNiArMjk5LDEwIEBACiAgICAgICovCiAgICAgc3RhdHVzX3QgICAgICAgICByZXR1cm5JbnB1dEJ1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlcik7CiAKKyAgICAvLyBnZXQgdGhlIGJ1ZmZlciBwcm9kdWNlciBvZiB0aGUgaW5wdXQgYnVmZmVyIHF1ZXVlLgorICAgIC8vIG9ubHkgYXBwbHkgdG8gaW5wdXQgc3RyZWFtcy4KKyAgICBzdGF0dXNfdCAgICAgICAgIGdldElucHV0QnVmZmVyUHJvZHVjZXIoc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKnByb2R1Y2VyKTsKKwogICAgIC8qKgogICAgICAqIFdoZXRoZXIgYW55IG9mIHRoZSBzdHJlYW0ncyBidWZmZXJzIGFyZSBjdXJyZW50bHkgaW4gdXNlIGJ5IHRoZSBIQUwsCiAgICAgICogaW5jbHVkaW5nIGJ1ZmZlcnMgdGhhdCBoYXZlIGJlZW4gcmV0dXJuZWQgYnV0IG5vdCB5ZXQgaGFkIHRoZWlyCkBAIC0yNTgsMTMgKzM1NywxNSBAQAogICAgICAgICBTVEFURV9DT05TVFJVQ1RFRCwKICAgICAgICAgU1RBVEVfSU5fQ09ORklHLAogICAgICAgICBTVEFURV9JTl9SRUNPTkZJRywKLSAgICAgICAgU1RBVEVfQ09ORklHVVJFRAorICAgICAgICBTVEFURV9DT05GSUdVUkVELAorICAgICAgICBTVEFURV9QUkVQQVJJTkcKICAgICB9IG1TdGF0ZTsKIAogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CiAKICAgICBDYW1lcmEzU3RyZWFtKGludCBpZCwgY2FtZXJhM19zdHJlYW1fdHlwZSB0eXBlLAotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQpOworICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQsCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pOwogCiAgICAgLyoqCiAgICAgICogSW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IGRlcml2ZWQgY2xhc3NlcwpAQCAtMjgzLDYgKzM4NCw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5JbnB1dEJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyKTsKICAgICB2aXJ0dWFsIGJvb2wgICAgIGhhc091dHN0YW5kaW5nQnVmZmVyc0xvY2tlZCgpIGNvbnN0ID0gMDsKKyAgICAvLyBHZXQgdGhlIGJ1ZmZlciBwcm9kdWNlciBvZiB0aGUgaW5wdXQgYnVmZmVyIHF1ZXVlLiBPbmx5IGFwcGx5IHRvIGlucHV0IHN0cmVhbXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyTG9ja2VkKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcik7CisKICAgICAvLyBDYW4gcmV0dXJuIC1FTk9UQ09OTiB3aGVuIHdlIGFyZSBhbHJlYWR5IGRpc2Nvbm5lY3RlZCAobm90IGFuIGVycm9yKQogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdExvY2tlZCgpID0gMDsKIApAQCAtMzAzLDEzICs0MDcsMTcgQEAKIAogICAgIC8vIEdldCB0aGUgdXNhZ2UgZmxhZ3MgZm9yIHRoZSBvdGhlciBlbmRwb2ludCwgb3IgcmV0dXJuCiAgICAgLy8gSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhleSBjYW5ub3QgYmUgb2J0YWluZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIGNvbnN0ID0gMDsKIAogICAgIC8vIFRyYWNraW5nIGZvciBpZGxlIHN0YXRlCiAgICAgd3A8U3RhdHVzVHJhY2tlcj4gbVN0YXR1c1RyYWNrZXI7CiAgICAgLy8gU3RhdHVzIHRyYWNrZXIgY29tcG9uZW50IElECiAgICAgaW50IG1TdGF0dXNJZDsKIAorICAgIC8vIFRyYWNraW5nIGZvciBzdHJlYW0gcHJlcGFyZSAtIHdoZXRoZXIgdGhpcyBzdHJlYW0gY2FuIHN0aWxsIGhhdmUKKyAgICAvLyBwcmVwYXJlTmV4dEJ1ZmZlciBjYWxsZWQgb24gaXQuCisgICAgYm9vbCBtU3RyZWFtVW5wcmVwYXJhYmxlOworCiAgIHByaXZhdGU6CiAgICAgdWludDMyX3Qgb2xkVXNhZ2U7CiAgICAgdWludDMyX3Qgb2xkTWF4QnVmZmVyczsKQEAgLTMyNCw2ICs0MzIsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFjcXVpcmVkLCBib29sIG91dHB1dCk7CiAgICAgTGlzdDx3cDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+ID4gbUJ1ZmZlckxpc3RlbmVyTGlzdDsKIAorICAgIHN0YXR1c190ICAgICAgICBjYW5jZWxQcmVwYXJlTG9ja2VkKCk7CisKKyAgICAvLyBUcmFja2luZyBmb3IgUFJFUEFSSU5HIHN0YXRlCisKKyAgICAvLyBTdGF0ZSBvZiBidWZmZXIgcHJlYWxsb2NhdGlvbi4gT25seSB0cnVlIGlmIGVpdGhlciBwcmVwYXJlTmV4dEJ1ZmZlcgorICAgIC8vIGhhcyBiZWVuIGNhbGxlZCBzdWZmaWNpZW50IG51bWJlciBvZiB0aW1lcywgb3Igc3RyZWFtIGNvbmZpZ3VyYXRpb24KKyAgICAvLyBoYWQgdG8gcmVnaXN0ZXIgYnVmZmVycyB3aXRoIHRoZSBIQUwKKyAgICBib29sIG1QcmVwYXJlZDsKKworICAgIFZlY3RvcjxjYW1lcmEzX3N0cmVhbV9idWZmZXJfdD4gbVByZXBhcmVkQnVmZmVyczsKKyAgICBzaXplX3QgbVByZXBhcmVkQnVmZmVySWR4OworCiB9OyAvLyBjbGFzcyBDYW1lcmEzU3RyZWFtCiAKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCmluZGV4IGRhOTg5Y2QuLmMwODZlYWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCkBAIC00NSw2ICs0NSw3IEBACiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRXaWR0aCgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldEhlaWdodCgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGludCAgICAgIGdldEZvcm1hdCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGFuZHJvaWRfZGF0YXNwYWNlIGdldERhdGFTcGFjZSgpIGNvbnN0ID0gMDsKIAogICAgIC8qKgogICAgICAqIFN0YXJ0IHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbiBwcm9jZXNzLiBSZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBzdHJlYW0ncwpAQCAtODksNiArOTAsODIgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNhbmNlbENvbmZpZ3VyYXRpb24oKSA9IDA7CiAKICAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc3RyZWFtIGhhcyBhbHJlYWR5IGJlY29tZSBpbi11c2UgKGhhcyByZWNlaXZlZAorICAgICAqIGEgdmFsaWQgZmlsbGVkIGJ1ZmZlciksIHdoaWNoIGRldGVybWluZXMgaWYgYSBzdHJlYW0gY2FuIHN0aWxsIGhhdmUKKyAgICAgKiBwcmVwYXJlTmV4dEJ1ZmZlciBjYWxsZWQgb24gaXQuCisgICAgICovCisgICAgdmlydHVhbCBib29sICAgICBpc1VucHJlcGFyYWJsZSgpID0gMDsKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHN0cmVhbSBwcmVwYXJhdGlvbi4gTWF5IG9ubHkgYmUgY2FsbGVkIGluIHRoZSBDT05GSUdVUkVEIHN0YXRlLAorICAgICAqIHdoZW4gbm8gdmFsaWQgYnVmZmVycyBoYXZlIHlldCBiZWVuIHJldHVybmVkIHRvIHRoaXMgc3RyZWFtLgorICAgICAqCisgICAgICogSWYgbm8gcHJlcGFydGlvbiBpcyBuZWNlc3NhcnksIHJldHVybnMgT0sgYW5kIGRvZXMgbm90IHRyYW5zaXRpb24gdG8KKyAgICAgKiBQUkVQQVJJTkcgc3RhdGUuIE90aGVyd2lzZSwgcmV0dXJucyBOT1RfRU5PVUdIX0RBVEEgYW5kIHRyYW5zaXRpb25zCisgICAgICogdG8gUFJFUEFSSU5HLgorICAgICAqCisgICAgICogUmV0dXJuczoKKyAgICAgKiAgICBPSyBpZiBubyBtb3JlIGJ1ZmZlcnMgbmVlZCB0byBiZSBwcmVhbGxvY2F0ZWQKKyAgICAgKiAgICBOT1RfRU5PVUdIX0RBVEEgaWYgY2FsbHMgdG8gcHJlcGFyZU5leHRCdWZmZXIgYXJlIG5lZWRlZCB0byBmaW5pc2gKKyAgICAgKiAgICAgICAgYnVmZmVyIHByZS1hbGxvY2F0aW9uLCBhbmQgdHJhbnNpdGlvbnMgdG8gdGhlIFBSRVBBUklORyBzdGF0ZS4KKyAgICAgKiAgICBOT19JTklUIGluIGNhc2Ugb2YgYSBzZXJpb3VzIGVycm9yIGZyb20gdGhlIEhBTCBkZXZpY2UKKyAgICAgKiAgICBJTlZBTElEX09QRVJBVElPTiBpZiBjYWxsZWQgd2hlbiBub3QgaW4gQ09ORklHVVJFRCBzdGF0ZSwgb3IgYQorICAgICAqICAgICAgICB2YWxpZCBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiByZXR1cm5lZCB0byB0aGlzIHN0cmVhbS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0UHJlcGFyZSgpID0gMDsKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBzdHJlYW0gaXMgbWlkLXByZXBhcmluZy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgICAgIGlzUHJlcGFyaW5nKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQ29udGludWUgc3RyZWFtIGJ1ZmZlciBwcmVwYXJhdGlvbiBieSBhbGxvY2F0aW5nIHRoZSBuZXh0CisgICAgICogYnVmZmVyIGZvciB0aGlzIHN0cmVhbS4gIE1heSBvbmx5IGJlIGNhbGxlZCBpbiB0aGUgUFJFUEFSRUQgc3RhdGUuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE9LIGFuZCB0cmFuc2l0aW9ucyB0byB0aGUgQ09ORklHVVJFRCBzdGF0ZSBpZiBhbGwgYnVmZmVycworICAgICAqIGFyZSBhbGxvY2F0ZWQgYWZ0ZXIgdGhlIGNhbGwgY29uY2x1ZGVzLiBPdGhlcndpc2UgcmV0dXJucyBOT1RfRU5PVUdIX0RBVEEuCisgICAgICoKKyAgICAgKiBSZXR1cm5zOgorICAgICAqICAgIE9LIGlmIG5vIG1vcmUgYnVmZmVycyBuZWVkIHRvIGJlIHByZWFsbG9jYXRlZCwgYW5kIHRyYW5zaXRpb25zCisgICAgICogICAgICAgIHRvIHRoZSBDT05GSUdVUkVEIHN0YXRlLgorICAgICAqICAgIE5PVF9FTk9VR0hfREFUQSBpZiBtb3JlIGNhbGxzIHRvIHByZXBhcmVOZXh0QnVmZmVyIGFyZSBuZWVkZWQgdG8gZmluaXNoCisgICAgICogICAgICAgIGJ1ZmZlciBwcmUtYWxsb2NhdGlvbi4KKyAgICAgKiAgICBOT19JTklUIGluIGNhc2Ugb2YgYSBzZXJpb3VzIGVycm9yIGZyb20gdGhlIEhBTCBkZXZpY2UKKyAgICAgKiAgICBJTlZBTElEX09QRVJBVElPTiBpZiBjYWxsZWQgd2hlbiBub3QgaW4gQ09ORklHVVJFRCBzdGF0ZSwgb3IgYQorICAgICAqICAgICAgICB2YWxpZCBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiByZXR1cm5lZCB0byB0aGlzIHN0cmVhbS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVOZXh0QnVmZmVyKCkgPSAwOworCisgICAgLyoqCisgICAgICogQ2FuY2VsIHN0cmVhbSBwcmVwYXJhdGlvbiBlYXJseS4gSW4gY2FzZSBhbGxvY2F0aW9uIG5lZWRzIHRvIGJlCisgICAgICogc3RvcHBlZCwgdGhpcyBtZXRob2QgdHJhbnNpdGlvbnMgdGhlIHN0cmVhbSBiYWNrIHRvIHRoZSBDT05GSUdVUkVEIHN0YXRlLgorICAgICAqIEJ1ZmZlcnMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggcHJlcGFyZU5leHRCdWZmZXIgcmVtYWluIHRoYXQgd2F5LAorICAgICAqIGJ1dCBhIGxhdGVyIHVzZSBvZiBwcmVwYXJlTmV4dEJ1ZmZlciB3aWxsIHJlcXVpcmUganVzdCBhcyBtYW55CisgICAgICogY2FsbHMgYXMgaWYgdGhlIGVhcmxpZXIgcHJlcGFyZSBhdHRlbXB0IGhhZCBub3QgZXhpc3RlZC4KKyAgICAgKgorICAgICAqIFJldHVybnM6CisgICAgICogICAgT0sgaWYgY2FuY2VsbGF0aW9uIHN1Y2NlZWRlZCwgYW5kIHRyYW5zaXRpb25zIHRvIHRoZSBDT05GSUdVUkVEIHN0YXRlCisgICAgICogICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgbm90IGluIHRoZSBQUkVQQVJJTkcgc3RhdGUKKyAgICAgKiAgICBOT19JTklUIGluIGNhc2Ugb2YgYSBzZXJpb3VzIGVycm9yIGZyb20gdGhlIEhBTCBkZXZpY2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNhbmNlbFByZXBhcmUoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUZWFyIGRvd24gbWVtb3J5IGZvciB0aGlzIHN0cmVhbS4gVGhpcyBmcmVlcyBhbGwgdW51c2VkIGdyYWxsb2MgYnVmZmVycworICAgICAqIGFsbG9jYXRlZCBmb3IgdGhpcyBzdHJlYW0sIGJ1dCBsZWF2ZXMgaXQgcmVhZHkgZm9yIG9wZXJhdGlvbiBhZnRlcndhcmQuCisgICAgICoKKyAgICAgKiBNYXkgb25seSBiZSBjYWxsZWQgaW4gdGhlIENPTkZJR1VSRUQgc3RhdGUsIGFuZCBrZWVwcyB0aGUgc3RyZWFtIGluCisgICAgICogdGhlIENPTkZJR1VSRUQgc3RhdGUuCisgICAgICoKKyAgICAgKiBSZXR1cm5zOgorICAgICAqICAgIE9LIGlmIHRlYXJkb3duIHN1Y2NlZWRlZC4KKyAgICAgKiAgICBJTlZBTElEX09QRVJBVElPTiBpZiBub3QgaW4gdGhlIENPTkZJR1VSRUQgc3RhdGUKKyAgICAgKiAgICBOT19JTklUIGluIGNhc2Ugb2YgYSBzZXJpb3VzIGVycm9yIGZyb20gdGhlIEhBTCBkZXZpY2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHRlYXJEb3duKCkgPSAwOworCisgICAgLyoqCiAgICAgICogRmlsbCBpbiB0aGUgY2FtZXJhM19zdHJlYW1fYnVmZmVyIHdpdGggdGhlIG5leHQgdmFsaWQgYnVmZmVyIGZvciB0aGlzCiAgICAgICogc3RyZWFtLCB0byBoYW5kIG92ZXIgdG8gdGhlIEhBTC4KICAgICAgKgpAQCAtMTI4LDYgKzIwNSwxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuSW5wdXRCdWZmZXIoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIpID0gMDsKIAogICAgIC8qKgorICAgICAqIEdldCB0aGUgYnVmZmVyIHByb2R1Y2VyIG9mIHRoZSBpbnB1dCBidWZmZXIgcXVldWUuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBvbmx5IGFwcGxpZXMgdG8gaW5wdXQgc3RyZWFtcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyUHJvZHVjZXIoc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKnByb2R1Y2VyKSA9IDA7CisKKyAgICAvKioKICAgICAgKiBXaGV0aGVyIGFueSBvZiB0aGUgc3RyZWFtJ3MgYnVmZmVycyBhcmUgY3VycmVudGx5IGluIHVzZSBieSB0aGUgSEFMLAogICAgICAqIGluY2x1ZGluZyBidWZmZXJzIHRoYXQgaGF2ZSBiZWVuIHJldHVybmVkIGJ1dCBub3QgeWV0IGhhZCB0aGVpcgogICAgICAqIHJlbGVhc2UgZmVuY2Ugc2lnbmFsZWQuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNac2xTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmNwcAppbmRleCA4MTMzMGVhLi5lZWZjYjQ0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNac2xTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5jcHAKQEAgLTExNCwxMyArMTE0LDE1IEBACiAgICAgICAgIGludCBidWZmZXJDb3VudCkgOgogICAgICAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGlkLCBDQU1FUkEzX1NUUkVBTV9CSURJUkVDVElPTkFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9VTktOT1dOLCBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wKSwKICAgICAgICAgbURlcHRoKGJ1ZmZlckNvdW50KSB7CiAKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOwogICAgIG1Qcm9kdWNlciA9IG5ldyBSaW5nQnVmZmVyQ29uc3VtZXIoY29uc3VtZXIsIEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTCwgYnVmZmVyQ291bnQpOworICAgIG1Qcm9kdWNlci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEyLVpzbFJpbmdCdWZmZXJDb25zdW1lciIpKTsKICAgICBtQ29uc3VtZXIgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGVlOTY1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suY3BwCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQXV0b0NvbmRpdGlvbkxvY2suaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitXYWl0YWJsZU11dGV4V3JhcHBlcjo6V2FpdGFibGVNdXRleFdyYXBwZXIoTXV0ZXgqIG11dGV4KSA6IG1NdXRleHttdXRleH0sIG1TdGF0ZXtmYWxzZX0ge30KKworV2FpdGFibGVNdXRleFdyYXBwZXI6On5XYWl0YWJsZU11dGV4V3JhcHBlcigpIHt9CisKKy8vIExvY2tzIG1hbmFnZXItb3duZWQgbXV0ZXgKK0F1dG9Db25kaXRpb25Mb2NrOjpBdXRvQ29uZGl0aW9uTG9jayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8V2FpdGFibGVNdXRleFdyYXBwZXI+JiBtYW5hZ2VyKSA6CisgICAgICAgIG1NYW5hZ2Vye21hbmFnZXJ9LCBtQXV0b0xvY2t7bWFuYWdlci0+bU11dGV4fSB7fQorCisvLyBVbmxvY2tzIG1hbmFnZXItb3duZWQgbXV0ZXgKK0F1dG9Db25kaXRpb25Mb2NrOjp+QXV0b0NvbmRpdGlvbkxvY2soKSB7CisgICAgLy8gVW5zZXQgdGhlIGNvbmRpdGlvbiBhbmQgd2FrZSBldmVyeW9uZSB1cCBiZWZvcmUgcmVsZWFzaW5nIGxvY2sKKyAgICBtTWFuYWdlci0+bVN0YXRlID0gZmFsc2U7CisgICAgbU1hbmFnZXItPm1Db25kaXRpb24uYnJvYWRjYXN0KCk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxBdXRvQ29uZGl0aW9uTG9jaz4gQXV0b0NvbmRpdGlvbkxvY2s6OndhaXRBbmRBY3F1aXJlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8V2FpdGFibGVNdXRleFdyYXBwZXI+JiBtYW5hZ2VyLCBuc2Vjc190IHdhaXRUaW1lKSB7CisKKyAgICBpZiAobWFuYWdlciA9PSBudWxscHRyIHx8IG1hbmFnZXItPm1NdXRleCA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIEJhZCBpbnB1dCwgcmV0dXJuIG51bGwKKyAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxBdXRvQ29uZGl0aW9uTG9jaz57bnVsbHB0cn07CisgICAgfQorCisgICAgLy8gQWNxdWlyZSBzY29wZWQgbG9jaworICAgIHN0ZDo6dW5pcXVlX3B0cjxBdXRvQ29uZGl0aW9uTG9jaz4gc2NvcGVkTG9jayhuZXcgQXV0b0NvbmRpdGlvbkxvY2sobWFuYWdlcikpOworCisgICAgLy8gRmlndXJlIG91dCB3aGF0IHRpbWUgaW4gdGhlIGZ1dHVyZSB3ZSBzaG91bGQgaGl0IHRoZSB0aW1lb3V0CisgICAgbnNlY3NfdCBmYWlsVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSArIHdhaXRUaW1lOworCisgICAgLy8gV2FpdCB1bnRpbCB3ZSB0aW1lb3V0LCBvciBzdWNjZXNzCisgICAgd2hpbGUobWFuYWdlci0+bVN0YXRlKSB7CisgICAgICAgIHN0YXR1c190IHJldCA9IG1hbmFnZXItPm1Db25kaXRpb24ud2FpdFJlbGF0aXZlKCoobWFuYWdlci0+bU11dGV4KSwgd2FpdFRpbWUpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAvLyBUaW1lZCBvdXQgb3Igd2hhdGV2ZXIsIHJldHVybiBudWxsCisgICAgICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEF1dG9Db25kaXRpb25Mb2NrPntudWxscHRyfTsKKyAgICAgICAgfQorICAgICAgICB3YWl0VGltZSA9IGZhaWxUaW1lIC0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIH0KKworICAgIC8vIFNldCB0aGUgY29uZGl0aW9uIGFuZCByZXR1cm4KKyAgICBtYW5hZ2VyLT5tU3RhdGUgPSB0cnVlOworICAgIHJldHVybiBzY29wZWRMb2NrOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8QXV0b0NvbmRpdGlvbkxvY2s+IEF1dG9Db25kaXRpb25Mb2NrOjp3YWl0QW5kQWNxdWlyZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFdhaXRhYmxlTXV0ZXhXcmFwcGVyPiYgbWFuYWdlcikgeworCisgICAgaWYgKG1hbmFnZXIgPT0gbnVsbHB0ciB8fCBtYW5hZ2VyLT5tTXV0ZXggPT0gbnVsbHB0cikgeworICAgICAgICAvLyBCYWQgaW5wdXQsIHJldHVybiBudWxsCisgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QXV0b0NvbmRpdGlvbkxvY2s+e251bGxwdHJ9OworICAgIH0KKworICAgIC8vIEFjcXVpcmUgc2NvcGVkIGxvY2sKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QXV0b0NvbmRpdGlvbkxvY2s+IHNjb3BlZExvY2sobmV3IEF1dG9Db25kaXRpb25Mb2NrKG1hbmFnZXIpKTsKKworICAgIC8vIFdhaXQgdW50aWwgd2UgdGltZW91dCwgb3Igc3VjY2VzcworICAgIHdoaWxlKG1hbmFnZXItPm1TdGF0ZSkgeworICAgICAgICBzdGF0dXNfdCByZXQgPSBtYW5hZ2VyLT5tQ29uZGl0aW9uLndhaXQoKihtYW5hZ2VyLT5tTXV0ZXgpKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgLy8gVGltZWQgb3V0IG9yIHdoYXRldmVyLCByZXR1cm4gbnVsbAorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxBdXRvQ29uZGl0aW9uTG9jaz57bnVsbHB0cn07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIGNvbmRpdGlvbiBhbmQgcmV0dXJuCisgICAgbWFuYWdlci0+bVN0YXRlID0gdHJ1ZTsKKyAgICByZXR1cm4gc2NvcGVkTG9jazsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9BdXRvQ29uZGl0aW9uTG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhM2VhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9BdXRvQ29uZGl0aW9uTG9jay5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWSUNFX1VUSUxTX1NDT1BFRF9DT05ESVRJT05fSAorI2RlZmluZSBBTkRST0lEX1NFUlZJQ0VfVVRJTFNfU0NPUEVEX0NPTkRJVElPTl9ICisKKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogV2FpdGFibGVNdXRleFdyYXBwZXIgY2FuIGJlIHVzZWQgd2l0aCBBdXRvQ29uZGl0aW9uTG9jayB0byBjb25zdHJ1Y3Qgc2NvcGVkIGxvY2tzIGZvciB0aGUKKyAqIHdyYXBwZWQgTXV0ZXggd2l0aCB0aW1lb3V0cyBmb3IgbG9jayBhY3F1aXNpdGlvbi4KKyAqLworY2xhc3MgV2FpdGFibGVNdXRleFdyYXBwZXIgeworICAgIGZyaWVuZCBjbGFzcyBBdXRvQ29uZGl0aW9uTG9jazsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgdGhlIENvbmRpdGlvbk1hbmdlciB3aXRoIHRoZSBnaXZlbiBNdXRleC4KKyAgICAgKi8KKyAgICBXYWl0YWJsZU11dGV4V3JhcHBlcihNdXRleCogbXV0ZXgpOworCisgICAgdmlydHVhbCB+V2FpdGFibGVNdXRleFdyYXBwZXIoKTsKK3ByaXZhdGU6CisgICAgTXV0ZXgqIG1NdXRleDsKKyAgICBib29sIG1TdGF0ZTsKKyAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKK307CisKKy8qKgorICogQXV0b0NvbmRpdGlvbkxvY2sgaXMgYSBzY29wZWQgbG9jayBzaW1pbGFyIHRvIE11dGV4OjpBdXRvbG9jaywgYnV0IGFsbG93cyB0aW1lb3V0cyB0byBiZQorICogc3BlY2lmaWVkIGZvciBsb2NrIGFjcXVpc2l0aW9uLgorICoKKyAqIEF1dG9Db25kaXRpb25Mb2NrIGlzIHVzZWQgd2l0aCBhIFdhaXRhYmxlTXV0ZXhXcmFwcGVyIHRvIGxvY2svdW5sb2NrIHRoZSBXYWl0YWJsZU11dGV4V3JhcHBlcidzCisgKiB3cmFwcGVkIE11dGV4LCBhbmQgd2FpdC9zZXQvc2lnbmFsIHRoZSBXYWl0YWJsZU11dGV4V3JhcHBlcidzIHdyYXBwZWQgY29uZGl0aW9uLiBUbyB1c2UgdGhpcywKKyAqIGNhbGwgQXV0b0NvbmRpdGlvbkxvY2s6OndhaXRBbmRBY3F1aXJlIHRvIGdldCBhbiBpbnN0YW5jZS4gIFRoaXMgd2lsbDoKKyAqICAgICAgLSBMb2NrIHRoZSBnaXZlbiBXYWl0YWJsZU11dGV4V3JhcHBlcidzIG11dGV4LgorICogICAgICAtIFdhaXQgZm9yIHRoZSBXYWl0YWJsZU11dGV4V3JhcHBlcidzIGNvbmRpdGlvbiB0byBiZWNvbWUgZmFsc2UsIG9yIHRpbWVvdXQuCisgKiAgICAgIC0gU2V0IHRoZSBXYWl0YWJsZU11dGV4V3JhcHBlcidzIGNvbmRpdGlvbiB0byB0cnVlLgorICoKKyAqIFdoZW4gdGhlIEF1dG9Db25kaXRpb25Mb2NrIGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBpcyBkZXN0cm95ZWQsIHRoaXMgd2lsbDoKKyAqICAgICAgLSBTZXQgdGhlIFdhaXRhYmxlTXV0ZXhXcmFwcGVyJ3MgY29uZGl0aW9uIHRvIGZhbHNlLgorICogICAgICAtIFNpZ25hbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24gdG8gd2FrZXVwLgorICogICAgICAtIFJlbGVhc2UgV2FpdGFibGVNdXRleFdyYXBwZXIncyBtdXRleC4KKyAqLworY2xhc3MgQXV0b0NvbmRpdGlvbkxvY2sgZmluYWwgeworcHVibGljOgorICAgIEF1dG9Db25kaXRpb25Mb2NrKCkgPSBkZWxldGU7CisgICAgQXV0b0NvbmRpdGlvbkxvY2soY29uc3QgQXV0b0NvbmRpdGlvbkxvY2smIG90aGVyKSA9IGRlbGV0ZTsKKyAgICBBdXRvQ29uZGl0aW9uTG9jayAmIG9wZXJhdG9yPShjb25zdCBBdXRvQ29uZGl0aW9uTG9jayYpID0gZGVsZXRlOworCisgICAgfkF1dG9Db25kaXRpb25Mb2NrKCk7CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGEgbmV3IEF1dG9Db25kaXRpb25Mb2NrIGZyb20gYSBnaXZlbiBXYWl0YWJsZU11dGV4V3JhcHBlciwgd2FpdGluZyB1cCB0byB3YWl0VGltZQorICAgICAqIG5hbm9zZWNvbmRzIHRvIGFjcXVpcmUgdGhlIFdhaXRhYmxlTXV0ZXhXcmFwcGVyJ3Mgd3JhcHBlZCBsb2NrLgorICAgICAqCisgICAgICogUmV0dXJuIGFuIGVtcHR5IHVuaXF1ZV9wdHIgaWYgdGhpcyBmYWlscywgb3IgYSB0aW1lb3V0IG9jY3Vycy4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEF1dG9Db25kaXRpb25Mb2NrPiB3YWl0QW5kQWNxdWlyZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxXYWl0YWJsZU11dGV4V3JhcHBlcj4mIG1hbmFnZXIsIG5zZWNzX3Qgd2FpdFRpbWUpOworCisgICAgLyoqCisgICAgICogTWFrZSBhIG5ldyBBdXRvQ29uZGl0aW9uTG9jayBmcm9tIGEgZ2l2ZW4gV2FpdGFibGVNdXRleFdyYXBwZXIsIHdhaXRpbmcgaW5kZWZpbml0ZWx5IHRvCisgICAgICogYWNxdWlyZSB0aGUgV2FpdGFibGVNdXRleFdyYXBwZXIncyB3cmFwcGVkIGxvY2suCisgICAgICoKKyAgICAgKiBSZXR1cm4gYW4gZW1wdHkgdW5pcXVlX3B0ciBpZiB0aGlzIGZhaWxzLgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QXV0b0NvbmRpdGlvbkxvY2s+IHdhaXRBbmRBY3F1aXJlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFdhaXRhYmxlTXV0ZXhXcmFwcGVyPiYgbWFuYWdlcik7Citwcml2YXRlOgorICAgIEF1dG9Db25kaXRpb25Mb2NrKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxXYWl0YWJsZU11dGV4V3JhcHBlcj4mIG1hbmFnZXIpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFdhaXRhYmxlTXV0ZXhXcmFwcGVyPiBtTWFuYWdlcjsKKyAgICBNdXRleDo6QXV0b2xvY2sgbUF1dG9Mb2NrOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0VSVklDRV9VVElMU19TQ09QRURfQ09ORElUSU9OX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NsaWVudE1hbmFnZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NsaWVudE1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWU1OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2xpZW50TWFuYWdlci5oCkBAIC0wLDAgKzEsNjQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZJQ0VfVVRJTFNfRVZJQ1RJT05fUE9MSUNZX01BTkFHRVJfSAorI2RlZmluZSBBTkRST0lEX1NFUlZJQ0VfVVRJTFNfRVZJQ1RJT05fUE9MSUNZX01BTkFHRVJfSAorCisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlc291cmNlX3BvbGljeSB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorICogVGhlIENsaWVudERlc2NyaXB0b3IgY2xhc3MgaXMgYSBjb250YWluZXIgZm9yIGEgZ2l2ZW4ga2V5L3ZhbHVlIHBhaXIgaWRlbnRpZnlpbmcgYSBzaGFyZWQKKyAqIHJlc291cmNlLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY29zdCwgcHJpb3JpdHksIG93bmVyIElELCBhbmQgY29uZmxpY3Rpbmcga2V5cyBsaXN0IHVzZWQKKyAqIGluIGRldGVybWluaW5nIGV2aWN0aW9uIGJlaGF2aW9yLgorICoKKyAqIEFzaWRlIGZyb20gdGhlIHByaW9yaXR5LCB0aGVzZSB2YWx1ZXMgYXJlIGltbXV0YWJsZSBvbmNlIHRoZSBDbGllbnREZXNjcmlwdG9yIGhhcyBiZWVuCisgKiBjb25zdHJ1Y3RlZC4KKyAqLwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KK2NsYXNzIENsaWVudERlc2NyaXB0b3IgZmluYWwgeworcHVibGljOgorICAgIENsaWVudERlc2NyaXB0b3IoY29uc3QgS0VZJiBrZXksIGNvbnN0IFZBTFVFJiB2YWx1ZSwgaW50MzJfdCBjb3N0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8S0VZPiYgY29uZmxpY3RpbmdLZXlzLCBpbnQzMl90IHByaW9yaXR5LCBpbnQzMl90IG93bmVySWQpOworICAgIENsaWVudERlc2NyaXB0b3IoS0VZJiYga2V5LCBWQUxVRSYmIHZhbHVlLCBpbnQzMl90IGNvc3QsIHN0ZDo6c2V0PEtFWT4mJiBjb25mbGljdGluZ0tleXMsCisgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LCBpbnQzMl90IG93bmVySWQpOworCisgICAgfkNsaWVudERlc2NyaXB0b3IoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUga2V5IGZvciB0aGlzIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgY29uc3QgS0VZJiBnZXRLZXkoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgZm9yIHRoaXMgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBjb25zdCBWQUxVRSYgZ2V0VmFsdWUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29zdCBmb3IgdGhpcyBkZXNjcmlwdG9yLgorICAgICAqLworICAgIGludDMyX3QgZ2V0Q29zdCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcmlvcml0eSBmb3IgdGhpcyBkZXNjcmlwdG9yLgorICAgICAqLworICAgIGludDMyX3QgZ2V0UHJpb3JpdHkoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb3duZXIgSUQgZm9yIHRoaXMgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBpbnQzMl90IGdldE93bmVySWQoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBrZXkgaXMgaW4gdGhpcyBkZXNjcmlwdG9yJ3MgY29uZmxpY3Rpbmcga2V5cyBsaXN0LgorICAgICAqLworICAgIGJvb2wgaXNDb25mbGljdGluZyhjb25zdCBLRVkmIGtleSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBhbGwgY29uZmxpY3Rpbmcga2V5cyBmb3IgdGhpcyBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHN0ZDo6c2V0PEtFWT4gZ2V0Q29uZmxpY3RpbmcoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJvaXJpdHkgZm9yIHRoaXMgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICB2b2lkIHNldFByaW9yaXR5KGludDMyX3QgcHJpb3JpdHkpOworCisgICAgLy8gVGhpcyBjbGFzcyBpcyBvcmRlcmVkIGJ5IGtleQorICAgIHRlbXBsYXRlPGNsYXNzIEssIGNsYXNzIFY+CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgQ2xpZW50RGVzY3JpcHRvcjxLLCBWPiYgYSwgY29uc3QgQ2xpZW50RGVzY3JpcHRvcjxLLCBWPiYgYik7CisKK3ByaXZhdGU6CisgICAgS0VZIG1LZXk7CisgICAgVkFMVUUgbVZhbHVlOworICAgIGludDMyX3QgbUNvc3Q7CisgICAgc3RkOjpzZXQ8S0VZPiBtQ29uZmxpY3Rpbmc7CisgICAgaW50MzJfdCBtUHJpb3JpdHk7CisgICAgaW50MzJfdCBtT3duZXJJZDsKK307IC8vIGNsYXNzIENsaWVudERlc2NyaXB0b3IKKwordGVtcGxhdGU8Y2xhc3MgSywgY2xhc3MgVj4KK2Jvb2wgb3BlcmF0b3IgPCAoY29uc3QgQ2xpZW50RGVzY3JpcHRvcjxLLCBWPiYgYSwgY29uc3QgQ2xpZW50RGVzY3JpcHRvcjxLLCBWPiYgYikgeworICAgIHJldHVybiBhLm1LZXkgPCBiLm1LZXk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+CitDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+OjpDbGllbnREZXNjcmlwdG9yKGNvbnN0IEtFWSYga2V5LCBjb25zdCBWQUxVRSYgdmFsdWUsIGludDMyX3QgY29zdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8S0VZPiYgY29uZmxpY3RpbmdLZXlzLCBpbnQzMl90IHByaW9yaXR5LCBpbnQzMl90IG93bmVySWQpIDogbUtleXtrZXl9LAorICAgICAgICBtVmFsdWV7dmFsdWV9LCBtQ29zdHtjb3N0fSwgbUNvbmZsaWN0aW5ne2NvbmZsaWN0aW5nS2V5c30sIG1Qcmlvcml0eXtwcmlvcml0eX0sCisgICAgICAgIG1Pd25lcklke293bmVySWR9IHt9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+CitDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+OjpDbGllbnREZXNjcmlwdG9yKEtFWSYmIGtleSwgVkFMVUUmJiB2YWx1ZSwgaW50MzJfdCBjb3N0LAorICAgICAgICBzdGQ6OnNldDxLRVk+JiYgY29uZmxpY3RpbmdLZXlzLCBpbnQzMl90IHByaW9yaXR5LCBpbnQzMl90IG93bmVySWQpIDoKKyAgICAgICAgbUtleXtzdGQ6OmZvcndhcmQ8S0VZPihrZXkpfSwgbVZhbHVle3N0ZDo6Zm9yd2FyZDxWQUxVRT4odmFsdWUpfSwgbUNvc3R7Y29zdH0sCisgICAgICAgIG1Db25mbGljdGluZ3tzdGQ6OmZvcndhcmQ8c3RkOjpzZXQ8S0VZPj4oY29uZmxpY3RpbmdLZXlzKX0sIG1Qcmlvcml0eXtwcmlvcml0eX0sCisgICAgICAgIG1Pd25lcklke293bmVySWR9IHt9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+CitDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+Ojp+Q2xpZW50RGVzY3JpcHRvcigpIHt9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+Citjb25zdCBLRVkmIENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT46OmdldEtleSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUtleTsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KK2NvbnN0IFZBTFVFJiBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+OjpnZXRWYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVZhbHVlOworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgoraW50MzJfdCBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+OjpnZXRDb3N0KCkgY29uc3QgeworICAgIHJldHVybiBtQ29zdDsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KK2ludDMyX3QgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPjo6Z2V0UHJpb3JpdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Qcmlvcml0eTsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KK2ludDMyX3QgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPjo6Z2V0T3duZXJJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU93bmVySWQ7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+Citib29sIENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT46OmlzQ29uZmxpY3RpbmcoY29uc3QgS0VZJiBrZXkpIGNvbnN0IHsKKyAgICBpZiAoa2V5ID09IG1LZXkpIHJldHVybiB0cnVlOworICAgIGZvciAoY29uc3QgYXV0byYgeCA6IG1Db25mbGljdGluZykgeworICAgICAgICBpZiAoa2V5ID09IHgpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+CitzdGQ6OnNldDxLRVk+IENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT46OmdldENvbmZsaWN0aW5nKCkgY29uc3QgeworICAgIHJldHVybiBtQ29uZmxpY3Rpbmc7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+Cit2b2lkIENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT46OnNldFByaW9yaXR5KGludDMyX3QgcHJpb3JpdHkpIHsKKyAgICBtUHJpb3JpdHkgPSBwcmlvcml0eTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCisgKiBBIGRlZmF1bHQgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBMSVNURU5FUiBpbnRlcmZhY2UgdXNlZCBieSBDbGllbnRNYW5hZ2VyLgorICovCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgorY2xhc3MgRGVmYXVsdEV2ZW50TGlzdGVuZXIgeworcHVibGljOgorICAgIHZvaWQgb25DbGllbnRBZGRlZChjb25zdCBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+JiBkZXNjcmlwdG9yKTsKKyAgICB2b2lkIG9uQ2xpZW50UmVtb3ZlZChjb25zdCBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+JiBkZXNjcmlwdG9yKTsKK307CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+Cit2b2lkIERlZmF1bHRFdmVudExpc3RlbmVyPEtFWSwgVkFMVUU+OjpvbkNsaWVudEFkZGVkKAorICAgICAgICBjb25zdCBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+JiAvKmRlc2NyaXB0b3IqLykge30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KK3ZvaWQgRGVmYXVsdEV2ZW50TGlzdGVuZXI8S0VZLCBWQUxVRT46Om9uQ2xpZW50UmVtb3ZlZCgKKyAgICAgICAgY29uc3QgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPiYgLypkZXNjcmlwdG9yKi8pIHt9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorICogVGhlIENsaWVudE1hbmFnZXIgY2xhc3Mgd3JhcHMgYW4gTFJVLW9yZGVyZWQgbGlzdCBvZiBhY3RpdmUgY2xpZW50cyBhbmQgaW1wbGVtZW50cyBldmljdGlvbgorICogYmVoYXZpb3IgZm9yIGhhbmRsaW5nIHNoYXJlZCByZXNvdXJjZSBhY2Nlc3MuCisgKgorICogV2hlbiBhZGRpbmcgYSBuZXcgZGVzY3JpcHRvciwgZXZpY3Rpb24gYmVoYXZpb3IgaXMgYXMgZm9sbG93czoKKyAqICAgLSBLZXlzIGFyZSB1bmlxdWUsIGFkZGluZyBhIGRlc2NyaXB0b3Igd2l0aCB0aGUgc2FtZSBrZXkgYXMgYW4gZXhpc3RpbmcgZGVzY3JpcHRvciB3aWxsCisgKiAgICAgcmVzdWx0IGluIHRoZSBsb3dlci1wcmlvcml0eSBvZiB0aGUgdHdvIGJlaW5nIHJlbW92ZWQuICBQcmlvcml0eSB0aWVzIHJlc3VsdCBpbiB0aGUKKyAqICAgICBMUlUgZGVzY3JpcHRvciBiZWluZyBldmljdGVkICh0aGlzIG1lYW5zIHRoZSBpbmNvbWluZyBkZXNjcmlwdG9yIGJlIGFkZGVkIGluIHRoaXMgY2FzZSkuCisgKiAgIC0gQW55IGRlc2NyaXB0b3JzIHdpdGgga2V5cyB0aGF0IGFyZSBpbiB0aGUgaW5jb21pbmcgZGVzY3JpcHRvcidzICdjb25mbGljdGluZyBrZXlzJyBsaXN0CisgKiAgICAgd2lsbCBiZSByZW1vdmVkIGlmIHRoZXkgaGF2ZSBhbiBlcXVhbCBvciBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSBpbmNvbWluZyBkZXNjcmlwdG9yOworICogICAgIGlmIGFueSBoYXZlIGEgaGlnaGVyIHByaW9yaXR5LCB0aGUgaW5jb21pbmcgZGVzY3JpcHRvciBpcyByZW1vdmVkIGluc3RlYWQuCisgKiAgIC0gSWYgdGhlIHN1bSBvZiBhbGwgZGVzY3JpcHRvcnMnIGNvc3RzLCBpbmNsdWRpbmcgdGhlIGluY29taW5nIGRlc2NyaXB0b3IncywgaXMgbW9yZSB0aGFuCisgKiAgICAgdGhlIG1heCBjb3N0IGFsbG93ZWQgZm9yIHRoaXMgQ2xpZW50TWFuYWdlciwgZGVzY3JpcHRvcnMgd2l0aCBub24temVybyBjb3N0LCBlcXVhbCBvciBsb3dlcgorICogICAgIHByaW9yaXR5LCBhbmQgYSBkaWZmZXJlbnQgb3duZXIgd2lsbCBiZSBldmljdGVkIGluIExSVSBvcmRlciB1bnRpbCBlaXRoZXIgdGhlIGNvc3QgaXMgbGVzcworICogICAgIHRoYW4gdGhlIG1heCBjb3N0LCBvciBhbGwgZGVzY3JpcHRvcnMgbWVldGluZyB0aGlzIGNyaXRlcmlhIGhhdmUgYmVlbiBldmljdGVkIGFuZCB0aGUKKyAqICAgICBpbmNvbWluZyBkZXNjcmlwdG9yIGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eS4gIE90aGVyd2lzZSwgdGhlIGluY29taW5nIGRlc2NyaXB0b3IgaXMKKyAqICAgICByZW1vdmVkIGluc3RlYWQuCisgKi8KK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPURlZmF1bHRFdmVudExpc3RlbmVyPEtFWSwgVkFMVUU+PgorY2xhc3MgQ2xpZW50TWFuYWdlciB7CitwdWJsaWM6CisgICAgLy8gVGhlIGRlZmF1bHQgbWF4aW11bSAiY29zdCIgYWxsb3dlZCBiZWZvcmUgZXZpY3RpbmcKKyAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3QgREVGQVVMVF9NQVhfQ09TVCA9IDEwMDsKKworICAgIENsaWVudE1hbmFnZXIoKTsKKyAgICBDbGllbnRNYW5hZ2VyKGludDMyX3QgdG90YWxDb3N0KTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIGdpdmVuIENsaWVudERlc2NyaXB0b3IgdG8gdGhlIG1hbmFnZWQgbGlzdC4gIENsaWVudERlc2NyaXB0b3JzIGZvciBjbGllbnRzIHRoYXQKKyAgICAgKiBhcmUgZXZpY3RlZCBieSB0aGlzIGFjdGlvbiBhcmUgcmV0dXJuZWQgaW4gYSB2ZWN0b3IuCisgICAgICoKKyAgICAgKiBUaGlzIG1heSByZXR1cm4gdGhlIENsaWVudERlc2NyaXB0b3IgcGFzc2VkIGluIGlmIGl0IHdvdWxkIGJlIGV2aWN0ZWQuCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+PiBhZGRBbmRFdmljdCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiYgY2xpZW50KTsKKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgbWFwIGNvbnRhaW5pbmcgb3duZXIgKHBpZCkgLT4gcHJpb3JpdHkgbWFwcGluZ3MsIHVwZGF0ZSB0aGUgcHJpb3JpdHkgb2YgZWFjaAorICAgICAqIENsaWVudERlc2NyaXB0b3Igd2l0aCBhbiBvd25lciBpbiB0aGlzIG1hcHBpbmcuCisgICAgICovCisgICAgdm9pZCB1cGRhdGVQcmlvcml0aWVzKGNvbnN0IHN0ZDo6bWFwPGludDMyX3QsaW50MzJfdD4mIG93bmVyUHJpb3JpdHlMaXN0KTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbGwgQ2xpZW50RGVzY3JpcHRvcnMuCisgICAgICovCisgICAgdm9pZCByZW1vdmVBbGwoKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbmQgcmV0dXJuIHRoZSBDbGllbnREZXNjcmlwdG9yIHdpdGggYSBnaXZlbiBrZXkuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+IHJlbW92ZShjb25zdCBLRVkmIGtleSk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIENsaWVudERlc2NyaXB0b3IuCisgICAgICovCisgICAgdm9pZCByZW1vdmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+JiB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB2ZWN0b3Igb2YgdGhlIENsaWVudERlc2NyaXB0b3JzIHRoYXQgd291bGQgYmUgZXZpY3RlZCBieSBhZGRpbmcgdGhlIGdpdmVuCisgICAgICogQ2xpZW50RGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIFRoaXMgbWF5IHJldHVybiB0aGUgQ2xpZW50RGVzY3JpcHRvciBwYXNzZWQgaW4gaWYgaXQgd291bGQgYmUgZXZpY3RlZC4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4+IHdvdWxkRXZpY3QoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4mIGNsaWVudCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB2ZWN0b3Igb2YgYWN0aXZlIENsaWVudERlc2NyaXB0b3JzIHRoYXQgcHJldmVudCB0aGlzIGNsaWVudCBmcm9tIGJlaW5nIGFkZGVkLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+Pj4gZ2V0SW5jb21wYXRpYmxlQ2xpZW50cygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiYgY2xpZW50KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHZlY3RvciBjb250YWluaW5nIGFsbCBjdXJyZW50bHkgYWN0aXZlIENsaWVudERlc2NyaXB0b3JzLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+Pj4gZ2V0QWxsKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB2ZWN0b3IgY29udGFpbmluZyBhbGwga2V5cyBvZiBjdXJyZW50bHkgYWN0aXZlIENsaWVudERlc2NyaXB0b3JzLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPEtFWT4gZ2V0QWxsS2V5cygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgdmVjdG9yIG9mIHRoZSBvd25lciB0YWdzIG9mIGFsbCBjdXJyZW50bHkgYWN0aXZlIENsaWVudERlc2NyaXB0b3JzIChkdXBsaWNhdGVzCisgICAgICogd2lsbCBiZSByZW1vdmVkKS4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBnZXRBbGxPd25lcnMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ2xpZW50RGVzY3JpcHRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBrZXksIG9yIGFuIGVtcHR5IHNoYXJlZCBwb2ludGVyCisgICAgICogaWYgbm9uZSBleGlzdHMuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+IGdldChjb25zdCBLRVkmIGtleSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBCbG9jayB1bnRpbCB0aGUgZ2l2ZW4gY2xpZW50IGlzIG5vIGxvbmdlciBpbiB0aGUgYWN0aXZlIGNsaWVudHMgbGlzdCwgb3IgdGhlIHRpbWVvdXQKKyAgICAgKiBvY2N1cnJlZC4KKyAgICAgKgorICAgICAqIFJldHVybnMgTk9fRVJST1IgaWYgdGhpcyBzdWNjZWVkZWQsIC1FVElNRURPVVQgb24gYSB0aW1lb3V0LCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24KKyAgICAgKiBmYWlsdXJlLgorICAgICAqLworICAgIHN0YXR1c190IHdhaXRVbnRpbFJlbW92ZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+IGNsaWVudCwKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZW91dCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgZm9yIGNsaWVudCBhZGQvcmVtb3ZlIGV2ZW50cy4KKyAgICAgKgorICAgICAqIFRoZSBsaXN0ZW5lciBpbnN0YW5jZSBtdXN0IGluaGVyaXQgZnJvbSB0aGUgTElTVEVORVIgY2xhc3MgYW5kIGltcGxlbWVudCB0aGUgZm9sbG93aW5nCisgICAgICogbWV0aG9kczoKKyAgICAgKiAgICB2b2lkIG9uQ2xpZW50UmVtb3ZlZChjb25zdCBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+JiBkZXNjcmlwdG9yKTsKKyAgICAgKiAgICB2b2lkIG9uQ2xpZW50QWRkZWQoY29uc3QgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPiYgZGVzY3JpcHRvcik7CisgICAgICoKKyAgICAgKiBUaGVzZSBjYWxsYmFjayBtZXRob2RzIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIENsaWVudE1hbmFnZXIncyBsb2NrIGhlbGQsIGFuZCBzaG91bGQKKyAgICAgKiBub3QgY2FsbCBhbnkgZnVydGhlciBDbGllbnRNYW5hZ2VyIG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBUaGUgb25DbGllbnRSZW1vdmVkIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBjbGllbnQgaGFzIGJlZW4gcmVtb3ZlZCBvciBldmljdGVkCisgICAgICogZnJvbSB0aGUgQ2xpZW50TWFuYWdlciB0aGF0IHRoaXMgZXZlbnQgbGlzdGVuZXIgaGFzIGJlZW4gYWRkZWQgdG8uIFRoZSBvbkNsaWVudEFkZGVkCisgICAgICogbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgQ2xpZW50TWFuYWdlciB0aGF0IHRoaXMKKyAgICAgKiBldmVudCBsaXN0ZW5lciBoYXMgYmVlbiBhZGRlZCB0by4KKyAgICAgKi8KKyAgICB2b2lkIHNldExpc3RlbmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMSVNURU5FUj4mIGxpc3RlbmVyKTsKKworcHJvdGVjdGVkOgorICAgIH5DbGllbnRNYW5hZ2VyKCk7CisKK3ByaXZhdGU6CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB2ZWN0b3Igb2YgdGhlIENsaWVudERlc2NyaXB0b3JzIHRoYXQgd291bGQgYmUgZXZpY3RlZCBieSBhZGRpbmcgdGhlIGdpdmVuCisgICAgICogQ2xpZW50RGVzY3JpcHRvci4gIElmIHJldHVybkluY29tcGF0aWJsZUNsaWVudHMgaXMgc2V0IHRvIHRydWUsIGluc3RlYWQsIHJldHVybiB0aGUKKyAgICAgKiB2ZWN0b3Igb2YgQ2xpZW50RGVzY3JpcHRvcnMgdGhhdCBhcmUgaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhlIGluY29taW5nIGNsaWVudCBhbmQKKyAgICAgKiBlaXRoZXIgY29uZmxpY3Qgd2l0aCB0aGlzIGNsaWVudCwgb3IgY29udHJpYnV0ZSB0byB0aGUgcmVzb3VyY2UgY29zdCBpZiB0aGF0IHdvdWxkCisgICAgICogcHJldmVudCB0aGUgaW5jb21pbmcgY2xpZW50IGZyb20gYmVpbmcgYWRkZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1heSByZXR1cm4gdGhlIENsaWVudERlc2NyaXB0b3IgcGFzc2VkIGluLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+Pj4gd291bGRFdmljdExvY2tlZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiYgY2xpZW50LAorICAgICAgICAgICAgYm9vbCByZXR1cm5JbmNvbXBhdGlibGVDbGllbnRzID0gZmFsc2UpIGNvbnN0OworCisgICAgaW50NjRfdCBnZXRDdXJyZW50Q29zdExvY2tlZCgpIGNvbnN0OworCisgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKKyAgICBtdXRhYmxlIENvbmRpdGlvbiBtUmVtb3ZlZENvbmRpdGlvbjsKKyAgICBpbnQzMl90IG1NYXhDb3N0OworICAgIC8vIExSVSBvcmRlcmVkLCBtb3N0IHJlY2VudCBhdCBlbmQKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4+IG1DbGllbnRzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxMSVNURU5FUj4gbUxpc3RlbmVyOworfTsgLy8gY2xhc3MgQ2xpZW50TWFuYWdlcgorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK0NsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+OjpDbGllbnRNYW5hZ2VyKCkgOgorICAgICAgICBDbGllbnRNYW5hZ2VyKERFRkFVTFRfTUFYX0NPU1QpIHt9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgorQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46OkNsaWVudE1hbmFnZXIoaW50MzJfdCB0b3RhbENvc3QpIDogbU1heENvc3QodG90YWxDb3N0KSB7fQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK0NsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+Ojp+Q2xpZW50TWFuYWdlcigpIHt9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgorc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+PgorQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46OndvdWxkRXZpY3QoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiYgY2xpZW50KSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIHJldHVybiB3b3VsZEV2aWN0TG9ja2VkKGNsaWVudCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgorc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+PgorQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46OmdldEluY29tcGF0aWJsZUNsaWVudHMoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiYgY2xpZW50KSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIHJldHVybiB3b3VsZEV2aWN0TG9ja2VkKGNsaWVudCwgLypyZXR1cm5JbmNvbXBhdGlibGVDbGllbnRzKi90cnVlKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+CitzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4+CitDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6d291bGRFdmljdExvY2tlZCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+JiBjbGllbnQsCisgICAgICAgIGJvb2wgcmV0dXJuSW5jb21wYXRpYmxlQ2xpZW50cykgY29uc3QgeworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+PiBldmljdExpc3Q7CisKKyAgICAvLyBEaXNhbGxvdyBudWxsIGNsaWVudHMsIHJldHVybiBpbnB1dAorICAgIGlmIChjbGllbnQgPT0gbnVsbHB0cikgeworICAgICAgICBldmljdExpc3QucHVzaF9iYWNrKGNsaWVudCk7CisgICAgICAgIHJldHVybiBldmljdExpc3Q7CisgICAgfQorCisgICAgY29uc3QgS0VZJiBrZXkgPSBjbGllbnQtPmdldEtleSgpOworICAgIGludDMyX3QgY29zdCA9IGNsaWVudC0+Z2V0Q29zdCgpOworICAgIGludDMyX3QgcHJpb3JpdHkgPSBjbGllbnQtPmdldFByaW9yaXR5KCk7CisgICAgaW50MzJfdCBvd25lciA9IGNsaWVudC0+Z2V0T3duZXJJZCgpOworCisgICAgaW50NjRfdCB0b3RhbENvc3QgPSBnZXRDdXJyZW50Q29zdExvY2tlZCgpICsgY29zdDsKKworICAgIC8vIERldGVybWluZSB0aGUgTVJVIG9mIHRoZSBvd25lcnMgdGllZCBmb3IgaGF2aW5nIHRoZSBoaWdoZXN0IHByaW9yaXR5CisgICAgaW50MzJfdCBoaWdoZXN0UHJpb3JpdHlPd25lciA9IG93bmVyOworICAgIGludDMyX3QgaGlnaGVzdFByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgZm9yIChjb25zdCBhdXRvJiBpIDogbUNsaWVudHMpIHsKKyAgICAgICAgaW50MzJfdCBjdXJQcmlvcml0eSA9IGktPmdldFByaW9yaXR5KCk7CisgICAgICAgIGlmIChjdXJQcmlvcml0eSA+PSBoaWdoZXN0UHJpb3JpdHkpIHsKKyAgICAgICAgICAgIGhpZ2hlc3RQcmlvcml0eSA9IGN1clByaW9yaXR5OworICAgICAgICAgICAgaGlnaGVzdFByaW9yaXR5T3duZXIgPSBpLT5nZXRPd25lcklkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaGlnaGVzdFByaW9yaXR5ID09IHByaW9yaXR5KSB7CisgICAgICAgIC8vIFN3aXRjaCBiYWNrIG93bmVyIGlmIHRoZSBpbmNvbWluZyBjbGllbnQgaGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5LCBhcyBpdCBpcyBNUlUKKyAgICAgICAgaGlnaGVzdFByaW9yaXR5T3duZXIgPSBvd25lcjsKKyAgICB9CisKKyAgICAvLyBCdWlsZCBldmljdGlvbiBsaXN0IG9mIGNsaWVudHMgdG8gcmVtb3ZlCisgICAgZm9yIChjb25zdCBhdXRvJiBpIDogbUNsaWVudHMpIHsKKyAgICAgICAgY29uc3QgS0VZJiBjdXJLZXkgPSBpLT5nZXRLZXkoKTsKKyAgICAgICAgaW50MzJfdCBjdXJDb3N0ID0gaS0+Z2V0Q29zdCgpOworICAgICAgICBpbnQzMl90IGN1clByaW9yaXR5ID0gaS0+Z2V0UHJpb3JpdHkoKTsKKyAgICAgICAgaW50MzJfdCBjdXJPd25lciA9IGktPmdldE93bmVySWQoKTsKKworICAgICAgICBib29sIGNvbmZsaWN0aW5nID0gKGN1cktleSA9PSBrZXkgfHwgaS0+aXNDb25mbGljdGluZyhrZXkpIHx8CisgICAgICAgICAgICAgICAgY2xpZW50LT5pc0NvbmZsaWN0aW5nKGN1cktleSkpOworCisgICAgICAgIGlmICghcmV0dXJuSW5jb21wYXRpYmxlQ2xpZW50cykgeworICAgICAgICAgICAgLy8gRmluZCBldmljdGVkIGNsaWVudHMKKworICAgICAgICAgICAgaWYgKGNvbmZsaWN0aW5nICYmIGN1clByaW9yaXR5ID4gcHJpb3JpdHkpIHsKKyAgICAgICAgICAgICAgICAvLyBQcmUtZXhpc3RpbmcgY29uZmxpY3RpbmcgY2xpZW50IHdpdGggaGlnaGVyIHByaW9yaXR5IGV4aXN0cworICAgICAgICAgICAgICAgIGV2aWN0TGlzdC5jbGVhcigpOworICAgICAgICAgICAgICAgIGV2aWN0TGlzdC5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXZpY3RMaXN0OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25mbGljdGluZyB8fCAoKHRvdGFsQ29zdCA+IG1NYXhDb3N0ICYmIGN1ckNvc3QgPiAwKSAmJgorICAgICAgICAgICAgICAgICAgICAoY3VyUHJpb3JpdHkgPD0gcHJpb3JpdHkpICYmCisgICAgICAgICAgICAgICAgICAgICEoaGlnaGVzdFByaW9yaXR5T3duZXIgPT0gb3duZXIgJiYgb3duZXIgPT0gY3VyT3duZXIpKSkgeworICAgICAgICAgICAgICAgIC8vIEFkZCBhIHByZS1leGlzdGluZyBjbGllbnQgdG8gdGhlIGV2aWN0aW9uIGxpc3QgaWY6CisgICAgICAgICAgICAgICAgLy8gLSBXZSBhcmUgYWRkaW5nIGEgY2xpZW50IHdpdGggaGlnaGVyIHByaW9yaXR5IHRoYXQgY29uZmxpY3RzIHdpdGggdGhpcyBvbmUuCisgICAgICAgICAgICAgICAgLy8gLSBUaGUgdG90YWwgY29zdCBpbmNsdWRpbmcgdGhlIGluY29taW5nIGNsaWVudCdzIGlzIG1vcmUgdGhhbiB0aGUgYWxsb3dhYmxlCisgICAgICAgICAgICAgICAgLy8gICBtYXhpbXVtLCBhbmQgdGhlIGNsaWVudCBoYXMgYSBub24temVybyBjb3N0LCBsb3dlciBwcmlvcml0eSwgYW5kIGEgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgLy8gICBvd25lciB0aGFuIHRoZSBpbmNvbWluZyBjbGllbnQgd2hlbiB0aGUgaW5jb21pbmcgY2xpZW50IGhhcyB0aGUKKyAgICAgICAgICAgICAgICAvLyAgIGhpZ2hlc3QgcHJpb3JpdHkuCisgICAgICAgICAgICAgICAgZXZpY3RMaXN0LnB1c2hfYmFjayhpKTsKKyAgICAgICAgICAgICAgICB0b3RhbENvc3QgLT0gY3VyQ29zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZpbmQgY2xpZW50cyBwcmV2ZW50aW5nIHRoZSBpbmNvbWluZyBjbGllbnQgZnJvbSBiZWluZyBhZGRlZAorCisgICAgICAgICAgICBpZiAoY3VyUHJpb3JpdHkgPiBwcmlvcml0eSAmJiAoY29uZmxpY3RpbmcgfHwgKHRvdGFsQ29zdCA+IG1NYXhDb3N0ICYmIGN1ckNvc3QgPiAwKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBQcmUtZXhpc3RpbmcgY29uZmxpY3RpbmcgY2xpZW50IHdpdGggaGlnaGVyIHByaW9yaXR5IGV4aXN0cworICAgICAgICAgICAgICAgIGV2aWN0TGlzdC5wdXNoX2JhY2soaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbW1lZGlhdGVseSByZXR1cm4gdGhlIGluY29tcGF0aWJsZSBjbGllbnRzIGlmIHdlIGFyZSBjYWxjdWxhdGluZyB0aGVzZSBpbnN0ZWFkCisgICAgaWYgKHJldHVybkluY29tcGF0aWJsZUNsaWVudHMpIHsKKyAgICAgICAgcmV0dXJuIGV2aWN0TGlzdDsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgdG90YWwgY29zdCBpcyB0b28gaGlnaCwgcmV0dXJuIHRoZSBpbnB1dCB1bmxlc3MgdGhlIGlucHV0IGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eQorICAgIGlmICh0b3RhbENvc3QgPiBtTWF4Q29zdCAmJiBoaWdoZXN0UHJpb3JpdHlPd25lciAhPSBvd25lcikgeworICAgICAgICBldmljdExpc3QuY2xlYXIoKTsKKyAgICAgICAgZXZpY3RMaXN0LnB1c2hfYmFjayhjbGllbnQpOworICAgICAgICByZXR1cm4gZXZpY3RMaXN0OworICAgIH0KKworICAgIHJldHVybiBldmljdExpc3Q7CisKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+CitzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4+CitDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6YWRkQW5kRXZpY3QoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiYgY2xpZW50KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGF1dG8gZXZpY3RlZCA9IHdvdWxkRXZpY3RMb2NrZWQoY2xpZW50KTsKKyAgICBhdXRvIGl0ID0gZXZpY3RlZC5iZWdpbigpOworICAgIGlmIChpdCAhPSBldmljdGVkLmVuZCgpICYmICppdCA9PSBjbGllbnQpIHsKKyAgICAgICAgcmV0dXJuIGV2aWN0ZWQ7CisgICAgfQorCisgICAgYXV0byBpdGVyID0gZXZpY3RlZC5jYmVnaW4oKTsKKworICAgIGlmIChpdGVyICE9IGV2aWN0ZWQuY2VuZCgpKSB7CisKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxscHRyKSBtTGlzdGVuZXItPm9uQ2xpZW50UmVtb3ZlZCgqKml0ZXIpOworCisgICAgICAgIC8vIFJlbW92ZSBldmljdGVkIGNsaWVudHMgZnJvbSBsaXN0CisgICAgICAgIG1DbGllbnRzLmVyYXNlKHN0ZDo6cmVtb3ZlX2lmKG1DbGllbnRzLmJlZ2luKCksIG1DbGllbnRzLmVuZCgpLAorICAgICAgICAgICAgWyZpdGVyXSAoc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+JiBjdXJDbGllbnRQdHIpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VyQ2xpZW50UHRyLT5nZXRLZXkoKSA9PSAoKml0ZXIpLT5nZXRLZXkoKSkgeworICAgICAgICAgICAgICAgICAgICBpdGVyKys7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9KSwgbUNsaWVudHMuZW5kKCkpOworICAgIH0KKworICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbHB0cikgbUxpc3RlbmVyLT5vbkNsaWVudEFkZGVkKCpjbGllbnQpOworICAgIG1DbGllbnRzLnB1c2hfYmFjayhjbGllbnQpOworICAgIG1SZW1vdmVkQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworCisgICAgcmV0dXJuIGV2aWN0ZWQ7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgorc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+PgorQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46OmdldEFsbCgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1DbGllbnRzOworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK3N0ZDo6dmVjdG9yPEtFWT4gQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46OmdldEFsbEtleXMoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIHN0ZDo6dmVjdG9yPEtFWT4ga2V5cyhtQ2xpZW50cy5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byYgaSA6IG1DbGllbnRzKSB7CisgICAgICAgIGtleXMucHVzaF9iYWNrKGktPmdldEtleSgpKTsKKyAgICB9CisgICAgcmV0dXJuIGtleXM7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgorc3RkOjp2ZWN0b3I8aW50MzJfdD4gQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46OmdldEFsbE93bmVycygpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgc3RkOjpzZXQ8aW50MzJfdD4gb3duZXJzOworICAgIGZvciAoY29uc3QgYXV0byYgaSA6IG1DbGllbnRzKSB7CisgICAgICAgIG93bmVycy5lbXBsYWNlKGktPmdldE93bmVySWQoKSk7CisgICAgfQorICAgIHJldHVybiBzdGQ6OnZlY3RvcjxpbnQzMl90Pihvd25lcnMuYmVnaW4oKSwgb3duZXJzLmVuZCgpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+Cit2b2lkIENsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+Ojp1cGRhdGVQcmlvcml0aWVzKAorICAgICAgICBjb25zdCBzdGQ6Om1hcDxpbnQzMl90LGludDMyX3Q+JiBvd25lclByaW9yaXR5TGlzdCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKGF1dG8mIGkgOiBtQ2xpZW50cykgeworICAgICAgICBhdXRvIGogPSBvd25lclByaW9yaXR5TGlzdC5maW5kKGktPmdldE93bmVySWQoKSk7CisgICAgICAgIGlmIChqICE9IG93bmVyUHJpb3JpdHlMaXN0LmVuZCgpKSB7CisgICAgICAgICAgICBpLT5zZXRQcmlvcml0eShqLT5zZWNvbmQpOworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK3N0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiBDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6Z2V0KAorICAgICAgICBjb25zdCBLRVkmIGtleSkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBtQ2xpZW50cykgeworICAgICAgICBpZiAoaS0+Z2V0S2V5KCkgPT0ga2V5KSByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PihudWxscHRyKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+Cit2b2lkIENsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+OjpyZW1vdmVBbGwoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBtQ2xpZW50cykgeworICAgICAgICAgICAgbUxpc3RlbmVyLT5vbkNsaWVudFJlbW92ZWQoKmkpOworICAgICAgICB9CisgICAgfQorICAgIG1DbGllbnRzLmNsZWFyKCk7CisgICAgbVJlbW92ZWRDb25kaXRpb24uYnJvYWRjYXN0KCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgorc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+IENsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+OjpyZW1vdmUoCisgICAgY29uc3QgS0VZJiBrZXkpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4gcmV0OworCisgICAgLy8gUmVtb3ZlIGV2aWN0ZWQgY2xpZW50cyBmcm9tIGxpc3QKKyAgICBtQ2xpZW50cy5lcmFzZShzdGQ6OnJlbW92ZV9pZihtQ2xpZW50cy5iZWdpbigpLCBtQ2xpZW50cy5lbmQoKSwKKyAgICAgICAgW3RoaXMsICZrZXksICZyZXRdIChzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4mIGN1ckNsaWVudFB0cikgeworICAgICAgICAgICAgaWYgKGN1ckNsaWVudFB0ci0+Z2V0S2V5KCkgPT0ga2V5KSB7CisgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxscHRyKSBtTGlzdGVuZXItPm9uQ2xpZW50UmVtb3ZlZCgqY3VyQ2xpZW50UHRyKTsKKyAgICAgICAgICAgICAgICByZXQgPSBjdXJDbGllbnRQdHI7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0pLCBtQ2xpZW50cy5lbmQoKSk7CisKKyAgICBtUmVtb3ZlZENvbmRpdGlvbi5icm9hZGNhc3QoKTsKKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK3N0YXR1c190IENsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+Ojp3YWl0VW50aWxSZW1vdmVkKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4gY2xpZW50LAorICAgICAgICBuc2Vjc190IHRpbWVvdXQpIGNvbnN0IHsKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICBib29sIGlzUmVtb3ZlZCA9IGZhbHNlOworCisgICAgLy8gRmlndXJlIG91dCB3aGF0IHRpbWUgaW4gdGhlIGZ1dHVyZSB3ZSBzaG91bGQgaGl0IHRoZSB0aW1lb3V0CisgICAgbnNlY3NfdCBmYWlsVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSArIHRpbWVvdXQ7CisKKyAgICB3aGlsZSAoIWlzUmVtb3ZlZCkgeworICAgICAgICBpc1JlbW92ZWQgPSB0cnVlOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBtQ2xpZW50cykgeworICAgICAgICAgICAgaWYgKGkgPT0gY2xpZW50KSB7CisgICAgICAgICAgICAgICAgaXNSZW1vdmVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzUmVtb3ZlZCkgeworICAgICAgICAgICAgcmV0ID0gbVJlbW92ZWRDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1Mb2NrLCB0aW1lb3V0KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVvdXQgPSBmYWlsVGltZSAtIHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgordm9pZCBDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6c2V0TGlzdGVuZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExJU1RFTkVSPiYgbGlzdGVuZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgordm9pZCBDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6cmVtb3ZlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4mIHZhbHVlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIC8vIFJlbW92ZSBldmljdGVkIGNsaWVudHMgZnJvbSBsaXN0CisgICAgbUNsaWVudHMuZXJhc2Uoc3RkOjpyZW1vdmVfaWYobUNsaWVudHMuYmVnaW4oKSwgbUNsaWVudHMuZW5kKCksCisgICAgICAgIFt0aGlzLCAmdmFsdWVdIChzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4mIGN1ckNsaWVudFB0cikgeworICAgICAgICAgICAgaWYgKGN1ckNsaWVudFB0ciA9PSB2YWx1ZSkgeworICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbHB0cikgbUxpc3RlbmVyLT5vbkNsaWVudFJlbW92ZWQoKmN1ckNsaWVudFB0cik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0pLCBtQ2xpZW50cy5lbmQoKSk7CisgICAgbVJlbW92ZWRDb25kaXRpb24uYnJvYWRjYXN0KCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgoraW50NjRfdCBDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6Z2V0Q3VycmVudENvc3RMb2NrZWQoKSBjb25zdCB7CisgICAgaW50NjRfdCB0b3RhbENvc3QgPSAwOworICAgIGZvciAoY29uc3QgYXV0byYgeCA6IG1DbGllbnRzKSB7CisgICAgICAgICAgICB0b3RhbENvc3QgKz0geC0+Z2V0Q29zdCgpOworICAgIH0KKyAgICByZXR1cm4gdG90YWxDb3N0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgcmVzb3VyY2VfcG9saWN5Cit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRVJWSUNFX1VUSUxTX0VWSUNUSU9OX1BPTElDWV9NQU5BR0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLm1rCmluZGV4IDk1ZjJmZWYuLjAzNDM4YmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5tawpAQCAtMTAsNCArMTAsNiBAQAogCiBMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCiAKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzIyMzBmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAgU2VydmljZUxvZy5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJtZWRpYSBsaWJzdGFnZWZyaWdodCBsaWJiaW5kZXIgbGlidXRpbHMgbGlibG9nCisKK0xPQ0FMX01PRFVMRTo9IGxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UKKworTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L2luY2x1ZGUKKworTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OTA3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDQ2NSBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIgorI2luY2x1ZGUgIlNlcnZpY2VMb2cuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBTdHJpbmc4IGdldFN0cmluZyhjb25zdCBWZWN0b3I8VD4gJml0ZW1zKSB7CisgICAgU3RyaW5nOCBpdGVtc1N0cjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgIGl0ZW1zU3RyLmFwcGVuZEZvcm1hdCgiJXMgIiwgaXRlbXNbaV0udG9TdHJpbmcoKS5zdHJpbmcoKSk7CisgICAgfQorICAgIHJldHVybiBpdGVtc1N0cjsKK30KKworc3RhdGljIGJvb2wgaGFzUmVzb3VyY2VUeXBlKFN0cmluZzggdHlwZSwgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlcykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChyZXNvdXJjZXNbaV0ubVR5cGUgPT0gdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBoYXNSZXNvdXJjZVR5cGUoU3RyaW5nOCB0eXBlLCBSZXNvdXJjZUluZm9zIGluZm9zKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmZvcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoaGFzUmVzb3VyY2VUeXBlKHR5cGUsIGluZm9zW2ldLnJlc291cmNlcykpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIFJlc291cmNlSW5mb3MmIGdldFJlc291cmNlSW5mb3NGb3JFZGl0KAorICAgICAgICBpbnQgcGlkLAorICAgICAgICBQaWRSZXNvdXJjZUluZm9zTWFwJiBtYXApIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbWFwLmluZGV4T2ZLZXkocGlkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIC8vIG5ldyBwaWQKKyAgICAgICAgUmVzb3VyY2VJbmZvcyBpbmZvc0ZvclBpZDsKKyAgICAgICAgbWFwLmFkZChwaWQsIGluZm9zRm9yUGlkKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWFwLmVkaXRWYWx1ZUZvcihwaWQpOworfQorCitzdGF0aWMgUmVzb3VyY2VJbmZvJiBnZXRSZXNvdXJjZUluZm9Gb3JFZGl0KAorICAgICAgICBpbnQ2NF90IGNsaWVudElkLAorICAgICAgICBjb25zdCBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQsCisgICAgICAgIFJlc291cmNlSW5mb3MmIGluZm9zKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmZvcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoaW5mb3NbaV0uY2xpZW50SWQgPT0gY2xpZW50SWQpIHsKKyAgICAgICAgICAgIHJldHVybiBpbmZvcy5lZGl0SXRlbUF0KGkpOworICAgICAgICB9CisgICAgfQorICAgIFJlc291cmNlSW5mbyBpbmZvOworICAgIGluZm8uY2xpZW50SWQgPSBjbGllbnRJZDsKKyAgICBpbmZvLmNsaWVudCA9IGNsaWVudDsKKyAgICBpbmZvcy5wdXNoX2JhY2soaW5mbyk7CisgICAgcmV0dXJuIGluZm9zLmVkaXRJdGVtQXQoaW5mb3Muc2l6ZSgpIC0gMSk7Cit9CisKK3N0YXR1c190IFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiAvKiBhcmdzICovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisKKyAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSkgPT0gZmFsc2UpIHsKKyAgICAgICAgcmVzdWx0LmZvcm1hdCgiUGVybWlzc2lvbiBEZW5pYWw6ICIKKyAgICAgICAgICAgICAgICAiY2FuJ3QgZHVtcCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZTogJXBcbiIsIHRoaXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICByZXN1bHQuYXBwZW5kKCIgIFBvbGljaWVzOlxuIik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIFN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3M6ICVkXG4iLCBtU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICBTdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYzogJWRcbiIsIG1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgcmVzdWx0LmFwcGVuZCgiICBQcm9jZXNzZXM6XG4iKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NYXAuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIFBpZDogJWRcbiIsIG1NYXAua2V5QXQoaSkpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICAgICAgY29uc3QgUmVzb3VyY2VJbmZvcyAmaW5mb3MgPSBtTWFwLnZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5mb3Muc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICAgIENsaWVudDpcbiIpOworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICAgICBJZDogJWxsZFxuIiwgKGxvbmcgbG9uZylpbmZvc1tqXS5jbGllbnRJZCk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgICAgTmFtZTogJXNcbiIsIGluZm9zW2pdLmNsaWVudC0+Z2V0TmFtZSgpLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgICAgICAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlcyA9IGluZm9zW2pdLnJlc291cmNlczsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICAgICAgUmVzb3VyY2VzOlxuIik7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHJlc291cmNlcy5zaXplKCk7ICsraykgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgICAgICAlc1xuIiwgcmVzb3VyY2VzW2tdLnRvU3RyaW5nKCkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCIgIEV2ZW50cyBsb2dzIChtb3N0IHJlY2VudCBhdCB0b3ApOlxuIik7CisgICAgcmVzdWx0LmFwcGVuZChtU2VydmljZUxvZy0+dG9TdHJpbmcoIiAgICAiIC8qIGxpbmVQcmVmaXggKi8pKTsKKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHJldHVybiBPSzsKK30KKworUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6UmVzb3VyY2VNYW5hZ2VyU2VydmljZSgpCisgICAgOiBtUHJvY2Vzc0luZm8obmV3IFByb2Nlc3NJbmZvKCkpLAorICAgICAgbVNlcnZpY2VMb2cobmV3IFNlcnZpY2VMb2coKSksCisgICAgICBtU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyh0cnVlKSwKKyAgICAgIG1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyh0cnVlKSB7fQorCitSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKHNwPFByb2Nlc3NJbmZvSW50ZXJmYWNlPiBwcm9jZXNzSW5mbykKKyAgICA6IG1Qcm9jZXNzSW5mbyhwcm9jZXNzSW5mbyksCisgICAgICBtU2VydmljZUxvZyhuZXcgU2VydmljZUxvZygpKSwKKyAgICAgIG1TdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzKHRydWUpLAorICAgICAgbVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjKHRydWUpIHt9CisKK1Jlc291cmNlTWFuYWdlclNlcnZpY2U6On5SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKCkge30KKwordm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpjb25maWcoY29uc3QgVmVjdG9yPE1lZGlhUmVzb3VyY2VQb2xpY3k+ICZwb2xpY2llcykgeworICAgIFN0cmluZzggbG9nID0gU3RyaW5nODo6Zm9ybWF0KCJjb25maWcoJXMpIiwgZ2V0U3RyaW5nKHBvbGljaWVzKS5zdHJpbmcoKSk7CisgICAgbVNlcnZpY2VMb2ctPmFkZChsb2cpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcG9saWNpZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgU3RyaW5nOCB0eXBlID0gcG9saWNpZXNbaV0ubVR5cGU7CisgICAgICAgIFN0cmluZzggdmFsdWUgPSBwb2xpY2llc1tpXS5tVmFsdWU7CisgICAgICAgIGlmICh0eXBlID09IGtQb2xpY3lTdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzKSB7CisgICAgICAgICAgICBtU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyA9ICh2YWx1ZSA9PSAidHJ1ZSIpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga1BvbGljeVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjKSB7CisgICAgICAgICAgICBtU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMgPSAodmFsdWUgPT0gInRydWUiKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjphZGRSZXNvdXJjZSgKKyAgICAgICAgaW50IHBpZCwKKyAgICAgICAgaW50NjRfdCBjbGllbnRJZCwKKyAgICAgICAgY29uc3Qgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50LAorICAgICAgICBjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gJnJlc291cmNlcykgeworICAgIFN0cmluZzggbG9nID0gU3RyaW5nODo6Zm9ybWF0KCJhZGRSZXNvdXJjZShwaWQgJWQsIGNsaWVudElkICVsbGQsIHJlc291cmNlcyAlcykiLAorICAgICAgICAgICAgcGlkLCAobG9uZyBsb25nKSBjbGllbnRJZCwgZ2V0U3RyaW5nKHJlc291cmNlcykuc3RyaW5nKCkpOworICAgIG1TZXJ2aWNlTG9nLT5hZGQobG9nKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBSZXNvdXJjZUluZm9zJiBpbmZvcyA9IGdldFJlc291cmNlSW5mb3NGb3JFZGl0KHBpZCwgbU1hcCk7CisgICAgUmVzb3VyY2VJbmZvJiBpbmZvID0gZ2V0UmVzb3VyY2VJbmZvRm9yRWRpdChjbGllbnRJZCwgY2xpZW50LCBpbmZvcyk7CisgICAgLy8gVE9ETzogZG8gdGhlIG1lcmdlIGluc3RlYWQgb2YgYXBwZW5kLgorICAgIGluZm8ucmVzb3VyY2VzLmFwcGVuZFZlY3RvcihyZXNvdXJjZXMpOworfQorCit2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnJlbW92ZVJlc291cmNlKGludCBwaWQsIGludDY0X3QgY2xpZW50SWQpIHsKKyAgICBTdHJpbmc4IGxvZyA9IFN0cmluZzg6OmZvcm1hdCgKKyAgICAgICAgICAgICJyZW1vdmVSZXNvdXJjZShwaWQgJWQsIGNsaWVudElkICVsbGQpIiwKKyAgICAgICAgICAgIHBpZCwgKGxvbmcgbG9uZykgY2xpZW50SWQpOworICAgIG1TZXJ2aWNlTG9nLT5hZGQobG9nKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU1hcC5pbmRleE9mS2V5KHBpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVigicmVtb3ZlUmVzb3VyY2U6IGRpZG4ndCBmaW5kIHBpZCAlZCBmb3IgY2xpZW50SWQgJWxsZCIsIHBpZCwgKGxvbmcgbG9uZykgY2xpZW50SWQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBSZXNvdXJjZUluZm9zICZpbmZvcyA9IG1NYXAuZWRpdFZhbHVlQXQoaW5kZXgpOworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5mb3Muc2l6ZSgpOyArK2opIHsKKyAgICAgICAgaWYgKGluZm9zW2pdLmNsaWVudElkID09IGNsaWVudElkKSB7CisgICAgICAgICAgICBqID0gaW5mb3MucmVtb3ZlQXQoaik7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgIEFMT0dWKCJkaWRuJ3QgZmluZCBjbGllbnQiKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0Q2xpZW50Rm9yUmVzb3VyY2VfbCgKKyAgICAgICAgaW50IGNhbGxpbmdQaWQsIGNvbnN0IE1lZGlhUmVzb3VyY2UgKnJlcywgVmVjdG9yPHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiAqY2xpZW50cykgeworICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudDsKKyAgICBpZiAoZ2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woY2FsbGluZ1BpZCwgcmVzLT5tVHlwZSwgJmNsaWVudCkpIHsKKyAgICAgICAgY2xpZW50cy0+cHVzaF9iYWNrKGNsaWVudCk7CisgICAgfQorfQorCitib29sIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnJlY2xhaW1SZXNvdXJjZSgKKyAgICAgICAgaW50IGNhbGxpbmdQaWQsIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKSB7CisgICAgU3RyaW5nOCBsb2cgPSBTdHJpbmc4Ojpmb3JtYXQoInJlY2xhaW1SZXNvdXJjZShjYWxsaW5nUGlkICVkLCByZXNvdXJjZXMgJXMpIiwKKyAgICAgICAgICAgIGNhbGxpbmdQaWQsIGdldFN0cmluZyhyZXNvdXJjZXMpLnN0cmluZygpKTsKKyAgICBtU2VydmljZUxvZy0+YWRkKGxvZyk7CisKKyAgICBWZWN0b3I8c3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4+IGNsaWVudHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgICAgIGNvbnN0IE1lZGlhUmVzb3VyY2UgKnNlY3VyZUNvZGVjID0gTlVMTDsKKyAgICAgICAgY29uc3QgTWVkaWFSZXNvdXJjZSAqbm9uU2VjdXJlQ29kZWMgPSBOVUxMOworICAgICAgICBjb25zdCBNZWRpYVJlc291cmNlICpncmFwaGljTWVtb3J5ID0gTlVMTDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIFN0cmluZzggdHlwZSA9IHJlc291cmNlc1tpXS5tVHlwZTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZXNbaV0ubVR5cGUgPT0ga1Jlc291cmNlU2VjdXJlQ29kZWMpIHsKKyAgICAgICAgICAgICAgICBzZWN1cmVDb2RlYyA9ICZyZXNvdXJjZXNbaV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga1Jlc291cmNlTm9uU2VjdXJlQ29kZWMpIHsKKyAgICAgICAgICAgICAgICBub25TZWN1cmVDb2RlYyA9ICZyZXNvdXJjZXNbaV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga1Jlc291cmNlR3JhcGhpY01lbW9yeSkgeworICAgICAgICAgICAgICAgIGdyYXBoaWNNZW1vcnkgPSAmcmVzb3VyY2VzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZmlyc3QgcGFzcyB0byBoYW5kbGUgc2VjdXJlL25vbi1zZWN1cmUgY29kZWMgY29uZmxpY3QKKyAgICAgICAgaWYgKHNlY3VyZUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghbVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdldEFsbENsaWVudHNfbChjYWxsaW5nUGlkLCBTdHJpbmc4KGtSZXNvdXJjZVNlY3VyZUNvZGVjKSwgJmNsaWVudHMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYykgeworICAgICAgICAgICAgICAgIGlmICghZ2V0QWxsQ2xpZW50c19sKGNhbGxpbmdQaWQsIFN0cmluZzgoa1Jlc291cmNlTm9uU2VjdXJlQ29kZWMpLCAmY2xpZW50cykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobm9uU2VjdXJlQ29kZWMgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFtU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdldEFsbENsaWVudHNfbChjYWxsaW5nUGlkLCBTdHJpbmc4KGtSZXNvdXJjZVNlY3VyZUNvZGVjKSwgJmNsaWVudHMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xpZW50cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gaWYgbm8gc2VjdXJlL25vbi1zZWN1cmUgY29kZWMgY29uZmxpY3QsIHJ1biBzZWNvbmQgcGFzcyB0byBoYW5kbGUgb3RoZXIgcmVzb3VyY2VzLgorICAgICAgICAgICAgZ2V0Q2xpZW50Rm9yUmVzb3VyY2VfbChjYWxsaW5nUGlkLCBncmFwaGljTWVtb3J5LCAmY2xpZW50cyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xpZW50cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gaWYgd2UgYXJlIGhlcmUsIHJ1biB0aGUgdGhpcmQgcGFzcyB0byBmcmVlIG9uZSBjb2RlYyB3aXRoIHRoZSBzYW1lIHR5cGUuCisgICAgICAgICAgICBnZXRDbGllbnRGb3JSZXNvdXJjZV9sKGNhbGxpbmdQaWQsIHNlY3VyZUNvZGVjLCAmY2xpZW50cyk7CisgICAgICAgICAgICBnZXRDbGllbnRGb3JSZXNvdXJjZV9sKGNhbGxpbmdQaWQsIG5vblNlY3VyZUNvZGVjLCAmY2xpZW50cyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xpZW50cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gaWYgd2UgYXJlIGhlcmUsIHJ1biB0aGUgZm91cnRoIHBhc3MgdG8gZnJlZSBvbmUgY29kZWMgd2l0aCB0aGUgZGlmZmVyZW50IHR5cGUuCisgICAgICAgICAgICBpZiAoc2VjdXJlQ29kZWMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2UgdGVtcChTdHJpbmc4KGtSZXNvdXJjZU5vblNlY3VyZUNvZGVjKSwgMSk7CisgICAgICAgICAgICAgICAgZ2V0Q2xpZW50Rm9yUmVzb3VyY2VfbChjYWxsaW5nUGlkLCAmdGVtcCwgJmNsaWVudHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5vblNlY3VyZUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlIHRlbXAoU3RyaW5nOChrUmVzb3VyY2VTZWN1cmVDb2RlYyksIDEpOworICAgICAgICAgICAgICAgIGdldENsaWVudEZvclJlc291cmNlX2woY2FsbGluZ1BpZCwgJnRlbXAsICZjbGllbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjbGllbnRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBmYWlsZWRDbGllbnQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjbGllbnRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGxvZyA9IFN0cmluZzg6OmZvcm1hdCgicmVjbGFpbVJlc291cmNlIGZyb20gY2xpZW50ICVwIiwgY2xpZW50c1tpXS5nZXQoKSk7CisgICAgICAgIG1TZXJ2aWNlTG9nLT5hZGQobG9nKTsKKyAgICAgICAgaWYgKCFjbGllbnRzW2ldLT5yZWNsYWltUmVzb3VyY2UoKSkgeworICAgICAgICAgICAgZmFpbGVkQ2xpZW50ID0gY2xpZW50c1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWFwLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBSZXNvdXJjZUluZm9zICZpbmZvcyA9IG1NYXAuZWRpdFZhbHVlQXQoaSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGluZm9zLnNpemUoKTspIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5mb3Nbal0uY2xpZW50ID09IGZhaWxlZENsaWVudCkgeworICAgICAgICAgICAgICAgICAgICBqID0gaW5mb3MucmVtb3ZlQXQoaik7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICArK2o7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgQUxPR1YoImRpZG4ndCBmaW5kIGZhaWxlZCBjbGllbnQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoZmFpbGVkQ2xpZW50ID09IE5VTEwpOworfQorCitib29sIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmdldEFsbENsaWVudHNfbCgKKyAgICAgICAgaW50IGNhbGxpbmdQaWQsIGNvbnN0IFN0cmluZzggJnR5cGUsIFZlY3RvcjxzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gKmNsaWVudHMpIHsKKyAgICBWZWN0b3I8c3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4+IHRlbXA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWFwLnNpemUoKTsgKytpKSB7CisgICAgICAgIFJlc291cmNlSW5mb3MgJmluZm9zID0gbU1hcC5lZGl0VmFsdWVBdChpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbmZvcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgaWYgKGhhc1Jlc291cmNlVHlwZSh0eXBlLCBpbmZvc1tqXS5yZXNvdXJjZXMpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0NhbGxpbmdQcmlvcml0eUhpZ2hlcl9sKGNhbGxpbmdQaWQsIG1NYXAua2V5QXQoaSkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNvbWUgaGlnaGVyL2VxdWFsIHByaW9yaXR5IHByb2Nlc3Mgb3ducyB0aGUgcmVzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCBjYW4ndCBiZSBmdWxmaWxsZWQuCisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRBbGxDbGllbnRzX2w6IGNhbid0IHJlY2xhaW0gcmVzb3VyY2UgJXMgZnJvbSBwaWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuc3RyaW5nKCksIG1NYXAua2V5QXQoaSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRlbXAucHVzaF9iYWNrKGluZm9zW2pdLmNsaWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRlbXAuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR1YoImdldEFsbENsaWVudHNfbDogZGlkbid0IGZpbmQgYW55IHJlc291cmNlICVzIiwgdHlwZS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjbGllbnRzLT5hcHBlbmRWZWN0b3IodGVtcCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woCisgICAgICAgIGludCBjYWxsaW5nUGlkLCBjb25zdCBTdHJpbmc4ICZ0eXBlLCBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiAqY2xpZW50KSB7CisgICAgaW50IGxvd2VzdFByaW9yaXR5UGlkOworICAgIGludCBsb3dlc3RQcmlvcml0eTsKKyAgICBpbnQgY2FsbGluZ1ByaW9yaXR5OworICAgIGlmICghbVByb2Nlc3NJbmZvLT5nZXRQcmlvcml0eShjYWxsaW5nUGlkLCAmY2FsbGluZ1ByaW9yaXR5KSkgeworICAgICAgICBBTE9HRSgiZ2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2w6IGNhbid0IGdldCBwcm9jZXNzIHByaW9yaXR5IGZvciBwaWQgJWQiLAorICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghZ2V0TG93ZXN0UHJpb3JpdHlQaWRfbCh0eXBlLCAmbG93ZXN0UHJpb3JpdHlQaWQsICZsb3dlc3RQcmlvcml0eSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobG93ZXN0UHJpb3JpdHkgPD0gY2FsbGluZ1ByaW9yaXR5KSB7CisgICAgICAgIEFMT0dFKCJnZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbDogbG93ZXN0IHByaW9yaXR5ICVkIHZzIGNhbGxlciBwcmlvcml0eSAlZCIsCisgICAgICAgICAgICAgICAgbG93ZXN0UHJpb3JpdHksIGNhbGxpbmdQcmlvcml0eSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWdldEJpZ2dlc3RDbGllbnRfbChsb3dlc3RQcmlvcml0eVBpZCwgdHlwZSwgY2xpZW50KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmdldExvd2VzdFByaW9yaXR5UGlkX2woCisgICAgICAgIGNvbnN0IFN0cmluZzggJnR5cGUsIGludCAqbG93ZXN0UHJpb3JpdHlQaWQsIGludCAqbG93ZXN0UHJpb3JpdHkpIHsKKyAgICBpbnQgcGlkID0gLTE7CisgICAgaW50IHByaW9yaXR5ID0gLTE7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWFwLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChtTWFwLnZhbHVlQXQoaSkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIC8vIG5vIGNsaWVudCBvbiB0aGlzIHByb2Nlc3MuCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhc1Jlc291cmNlVHlwZSh0eXBlLCBtTWFwLnZhbHVlQXQoaSkpKSB7CisgICAgICAgICAgICAvLyBkb2Vzbid0IGhhdmUgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSB0eXBlCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgdGVtcFBpZCA9IG1NYXAua2V5QXQoaSk7CisgICAgICAgIGludCB0ZW1wUHJpb3JpdHk7CisgICAgICAgIGlmICghbVByb2Nlc3NJbmZvLT5nZXRQcmlvcml0eSh0ZW1wUGlkLCAmdGVtcFByaW9yaXR5KSkgeworICAgICAgICAgICAgQUxPR1YoImdldExvd2VzdFByaW9yaXR5UGlkX2w6IGNhbid0IGdldCBwcmlvcml0eSBvZiBwaWQgJWQsIHNraXBwZWQiLCB0ZW1wUGlkKTsKKyAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIHBpZCBmcm9tIG1NYXA/CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGlkID09IC0xIHx8IHRlbXBQcmlvcml0eSA+IHByaW9yaXR5KSB7CisgICAgICAgICAgICAvLyBpbml0aWFsIHRoZSB2YWx1ZQorICAgICAgICAgICAgcGlkID0gdGVtcFBpZDsKKyAgICAgICAgICAgIHByaW9yaXR5ID0gdGVtcFByaW9yaXR5OworICAgICAgICB9CisgICAgfQorICAgIGlmIChwaWQgIT0gLTEpIHsKKyAgICAgICAgKmxvd2VzdFByaW9yaXR5UGlkID0gcGlkOworICAgICAgICAqbG93ZXN0UHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICB9CisgICAgcmV0dXJuIChwaWQgIT0gLTEpOworfQorCitib29sIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmlzQ2FsbGluZ1ByaW9yaXR5SGlnaGVyX2woaW50IGNhbGxpbmdQaWQsIGludCBwaWQpIHsKKyAgICBpbnQgY2FsbGluZ1BpZFByaW9yaXR5OworICAgIGlmICghbVByb2Nlc3NJbmZvLT5nZXRQcmlvcml0eShjYWxsaW5nUGlkLCAmY2FsbGluZ1BpZFByaW9yaXR5KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IHByaW9yaXR5OworICAgIGlmICghbVByb2Nlc3NJbmZvLT5nZXRQcmlvcml0eShwaWQsICZwcmlvcml0eSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiAoY2FsbGluZ1BpZFByaW9yaXR5IDwgcHJpb3JpdHkpOworfQorCitib29sIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmdldEJpZ2dlc3RDbGllbnRfbCgKKyAgICAgICAgaW50IHBpZCwgY29uc3QgU3RyaW5nOCAmdHlwZSwgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gKmNsaWVudCkgeworICAgIHNzaXplX3QgaW5kZXggPSBtTWFwLmluZGV4T2ZLZXkocGlkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCJnZXRCaWdnZXN0Q2xpZW50X2w6IGNhbid0IGZpbmQgcmVzb3VyY2UgaW5mbyBmb3IgcGlkICVkIiwgcGlkKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudFRlbXA7CisgICAgdWludDY0X3QgbGFyZ2VzdFZhbHVlID0gMDsKKyAgICBjb25zdCBSZXNvdXJjZUluZm9zICZpbmZvcyA9IG1NYXAudmFsdWVBdChpbmRleCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmZvcy5zaXplKCk7ICsraSkgeworICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzID0gaW5mb3NbaV0ucmVzb3VyY2VzOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJlc291cmNlcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgaWYgKHJlc291cmNlc1tqXS5tVHlwZSA9PSB0eXBlKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlc1tqXS5tVmFsdWUgPiBsYXJnZXN0VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VzdFZhbHVlID0gcmVzb3VyY2VzW2pdLm1WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50VGVtcCA9IGluZm9zW2ldLmNsaWVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2xpZW50VGVtcCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJnZXRCaWdnZXN0Q2xpZW50X2w6IGNhbid0IGZpbmQgcmVzb3VyY2UgdHlwZSAlcyBmb3IgcGlkICVkIiwgdHlwZS5zdHJpbmcoKSwgcGlkKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgICpjbGllbnQgPSBjbGllbnRUZW1wOworICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2OTM3MwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBBTkRST0lEX1JFU09VUkNFTUFOQUdFUlNFUlZJQ0VfSAorI2RlZmluZSBBTkRST0lEX1JFU09VUkNFTUFOQUdFUlNFUlZJQ0VfSAorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFNlcnZpY2VMb2c7CitzdHJ1Y3QgUHJvY2Vzc0luZm9JbnRlcmZhY2U7CisKK3N0cnVjdCBSZXNvdXJjZUluZm8geworICAgIGludDY0X3QgY2xpZW50SWQ7CisgICAgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50OworICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXM7Cit9OworCit0eXBlZGVmIFZlY3RvcjxSZXNvdXJjZUluZm8+IFJlc291cmNlSW5mb3M7Cit0eXBlZGVmIEtleWVkVmVjdG9yPGludCwgUmVzb3VyY2VJbmZvcz4gUGlkUmVzb3VyY2VJbmZvc01hcDsKKworY2xhc3MgUmVzb3VyY2VNYW5hZ2VyU2VydmljZQorICAgIDogcHVibGljIEJpbmRlclNlcnZpY2U8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4sCisgICAgICBwdWJsaWMgQm5SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlCit7CitwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgY29uc3QgKmdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLnJlc291cmNlX21hbmFnZXIiOyB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworICAgIFJlc291cmNlTWFuYWdlclNlcnZpY2UoKTsKKyAgICBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKHNwPFByb2Nlc3NJbmZvSW50ZXJmYWNlPiBwcm9jZXNzSW5mbyk7CisKKyAgICAvLyBJUmVzb3VyY2VNYW5hZ2VyU2VydmljZSBpbnRlcmZhY2UKKyAgICB2aXJ0dWFsIHZvaWQgY29uZmlnKGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlUG9saWN5PiAmcG9saWNpZXMpOworCisgICAgdmlydHVhbCB2b2lkIGFkZFJlc291cmNlKAorICAgICAgICAgICAgaW50IHBpZCwKKyAgICAgICAgICAgIGludDY0X3QgY2xpZW50SWQsCisgICAgICAgICAgICBjb25zdCBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gJnJlc291cmNlcyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlUmVzb3VyY2UoaW50IHBpZCwgaW50NjRfdCBjbGllbnRJZCk7CisKKyAgICAvLyBUcmllcyB0byByZWNsYWltIHJlc291cmNlIGZyb20gcHJvY2Vzc2VzIHdpdGggbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgY2FsbGluZyBwcm9jZXNzCisgICAgLy8gYWNjb3JkaW5nIHRvIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2VzLgorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgcmVzb3VyY2UgaGFzIGJlZW4gcmVjbGFpbWVkLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KKyAgICB2aXJ0dWFsIGJvb2wgcmVjbGFpbVJlc291cmNlKGludCBjYWxsaW5nUGlkLCBjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gJnJlc291cmNlcyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKCk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0OworCisgICAgLy8gR2V0cyB0aGUgbGlzdCBvZiBhbGwgdGhlIGNsaWVudHMgd2hvIG93biB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHR5cGUuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBhbnkgY2xpZW50IGJlbG9uZ3MgdG8gYSBwcm9jZXNzIHdpdGggaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhlCisgICAgLy8gY2FsbGluZyBwcm9jZXNzLiBUaGUgY2xpZW50cyB3aWxsIHJlbWFpbiB1bmNoYW5nZWQgaWYgcmV0dXJucyBmYWxzZS4KKyAgICBib29sIGdldEFsbENsaWVudHNfbChpbnQgY2FsbGluZ1BpZCwgY29uc3QgU3RyaW5nOCAmdHlwZSwKKyAgICAgICAgICAgIFZlY3RvcjxzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gKmNsaWVudHMpOworCisgICAgLy8gR2V0cyB0aGUgY2xpZW50IHdobyBvd25zIHNwZWNpZmllZCByZXNvdXJjZSB0eXBlIGZyb20gbG93ZXN0IHBvc3NpYmxlIHByaW9yaXR5IHByb2Nlc3MuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUgY2FsbGluZyBwcm9jZXNzIHByaW9yaXR5IGlzIG5vdCBoaWdoZXIgdGhhbiB0aGUgbG93ZXN0IHByb2Nlc3MKKyAgICAvLyBwcmlvcml0eS4gVGhlIGNsaWVudCB3aWxsIHJlbWFpbiB1bmNoYW5nZWQgaWYgcmV0dXJucyBmYWxzZS4KKyAgICBib29sIGdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sKGludCBjYWxsaW5nUGlkLCBjb25zdCBTdHJpbmc4ICZ0eXBlLAorICAgICAgICAgICAgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gKmNsaWVudCk7CisKKyAgICAvLyBHZXRzIGxvd2VzdCBwcmlvcml0eSBwcm9jZXNzIHRoYXQgaGFzIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIGZhaWxlZC4gVGhlIG91dHB1dCBwYXJhbWV0ZXJzIHdpbGwgcmVtYWluIHVuY2hhbmdlZCBpZiBmYWlsZWQuCisgICAgYm9vbCBnZXRMb3dlc3RQcmlvcml0eVBpZF9sKGNvbnN0IFN0cmluZzggJnR5cGUsIGludCAqcGlkLCBpbnQgKnByaW9yaXR5KTsKKworICAgIC8vIEdldHMgdGhlIGNsaWVudCB3aG8gb3ducyBiaWdnZXN0IHBpZWNlIG9mIHNwZWNpZmllZCByZXNvdXJjZSB0eXBlIGZyb20gcGlkLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgZmFpbGVkLiBUaGUgY2xpZW50IHdpbGwgcmVtYWluIHVuY2hhbmdlZCBpZiBmYWlsZWQuCisgICAgYm9vbCBnZXRCaWdnZXN0Q2xpZW50X2woaW50IHBpZCwgY29uc3QgU3RyaW5nOCAmdHlwZSwgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gKmNsaWVudCk7CisKKyAgICBib29sIGlzQ2FsbGluZ1ByaW9yaXR5SGlnaGVyX2woaW50IGNhbGxpbmdQaWQsIGludCBwaWQpOworCisgICAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gYmFzaWNhbGx5IGNhbGxzIGdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sIGFuZCBhZGQgdGhlIHJlc3VsdCBjbGllbnQKKyAgICAvLyB0byB0aGUgZ2l2ZW4gVmVjdG9yLgorICAgIHZvaWQgZ2V0Q2xpZW50Rm9yUmVzb3VyY2VfbCgKKyAgICAgICAgaW50IGNhbGxpbmdQaWQsIGNvbnN0IE1lZGlhUmVzb3VyY2UgKnJlcywgVmVjdG9yPHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiAqY2xpZW50cyk7CisKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworICAgIHNwPFByb2Nlc3NJbmZvSW50ZXJmYWNlPiBtUHJvY2Vzc0luZm87CisgICAgc3A8U2VydmljZUxvZz4gbVNlcnZpY2VMb2c7CisgICAgUGlkUmVzb3VyY2VJbmZvc01hcCBtTWFwOworICAgIGJvb2wgbVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3M7CisgICAgYm9vbCBtU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWM7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1JFU09VUkNFTUFOQUdFUlNFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvU2VydmljZUxvZy5jcHAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9TZXJ2aWNlTG9nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTFlNzk3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvU2VydmljZUxvZy5jcHAKQEAgLTAsMCArMSw2MyBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTZXJ2aWNlTG9nIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAiU2VydmljZUxvZy5oIgorCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtEZWZhdWx0TWF4TnVtID0gMTAwOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1NlcnZpY2VMb2c6OlNlcnZpY2VMb2coKSA6IG1NYXhOdW0oa0RlZmF1bHRNYXhOdW0pLCBtTG9ncyhtTWF4TnVtKSB7fQorU2VydmljZUxvZzo6U2VydmljZUxvZyhzaXplX3QgbWF4TnVtKSA6IG1NYXhOdW0obWF4TnVtKSwgbUxvZ3MobU1heE51bSkge30KKwordm9pZCBTZXJ2aWNlTG9nOjphZGQoY29uc3QgU3RyaW5nOCAmbG9nKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIHRpbWVfdCBub3cgPSB0aW1lKDApOworICAgIGNoYXIgYnVmWzY0XTsKKyAgICBzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiJW0tJWQgJVQiLCBsb2NhbHRpbWUoJm5vdykpOworICAgIG1Mb2dzLmFkZChTdHJpbmc4Ojpmb3JtYXQoIiVzICVzIiwgYnVmLCBsb2cuc3RyaW5nKCkpKTsKK30KKworU3RyaW5nOCBTZXJ2aWNlTG9nOjp0b1N0cmluZyhjb25zdCBjaGFyICpsaW5lUHJlZml4KSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIFN0cmluZzggcmVzdWx0OworICAgIGZvciAoY29uc3QgYXV0byYgbG9nIDogbUxvZ3MpIHsKKyAgICAgICAgYWRkTGluZShsb2cuc3RyaW5nKCksIGxpbmVQcmVmaXgsICZyZXN1bHQpOworICAgIH0KKyAgICBpZiAobUxvZ3Muc2l6ZSgpID09IG1NYXhOdW0pIHsKKyAgICAgICAgYWRkTGluZSgiLi4uIiwgbGluZVByZWZpeCwgJnJlc3VsdCk7CisgICAgfSBlbHNlIGlmIChtTG9ncy5zaXplKCkgPT0gMCkgeworICAgICAgICBhZGRMaW5lKCJbbm8gZXZlbnRzIHlldF0iLCBsaW5lUHJlZml4LCAmcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBTZXJ2aWNlTG9nOjphZGRMaW5lKGNvbnN0IGNoYXIgKmxvZywgY29uc3QgY2hhciAqcHJlZml4LCBTdHJpbmc4ICpyZXN1bHQpIGNvbnN0IHsKKyAgICBpZiAocHJlZml4ICE9IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0LT5hcHBlbmQocHJlZml4KTsKKyAgICB9CisgICAgcmVzdWx0LT5hcHBlbmQobG9nKTsKKyAgICByZXN1bHQtPmFwcGVuZCgiXG4iKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvU2VydmljZUxvZy5oIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvU2VydmljZUxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZjE2ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9TZXJ2aWNlTG9nLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZJQ0VMT0dfSAorI2RlZmluZSBBTkRST0lEX1NFUlZJQ0VMT0dfSAorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgIm1lZGlhL1JpbmdCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTZXJ2aWNlTG9nIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIFNlcnZpY2VMb2coKTsKKyAgICBTZXJ2aWNlTG9nKHNpemVfdCBtYXhOdW0pOworCisgICAgdm9pZCBhZGQoY29uc3QgU3RyaW5nOCAmbG9nKTsKKyAgICBTdHJpbmc4IHRvU3RyaW5nKGNvbnN0IGNoYXIgKmxpbmVQcmVmaXggPSBOVUxMKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBzaXplX3QgbU1heE51bTsKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworICAgIFJpbmdCdWZmZXI8U3RyaW5nOD4gbUxvZ3M7CisKKyAgICB2b2lkIGFkZExpbmUoY29uc3QgY2hhciAqbG9nLCBjb25zdCBjaGFyICpwcmVmaXgsIFN0cmluZzggKnJlc3VsdCkgY29uc3Q7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1NFUlZJQ0VMT0dfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNGVmMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQubWsKQEAgLTAsMCArMSw1NCBAQAorIyBCdWlsZCB0aGUgdW5pdCB0ZXN0cy4KK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0LmNwcCBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICBsaWJiaW5kZXIgXAorICBsaWJsb2cgXAorICBsaWJtZWRpYSBcCisgIGxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UgXAorICBsaWJ1dGlscyBcCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICBmcmFtZXdvcmtzL2F2L2luY2x1ZGUgXAorICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyIFwKKworTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKKworTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQorCitpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gU2VydmljZUxvZ190ZXN0CisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgIFNlcnZpY2VMb2dfdGVzdC5jcHAgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgbGlibG9nIFwKKyAgbGlibWVkaWEgXAorICBsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIFwKKyAgbGlidXRpbHMgXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIFwKKyAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlciBcCisKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCisKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKKworaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QuY3BwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNDlkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAKQEAgLTAsMCArMSw1NDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgIlJlc291cmNlTWFuYWdlclNlcnZpY2UuaCIKKyNpbmNsdWRlIDxtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVJlc291cmNlUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBpbnQ2NF90IGdldElkKHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudCkgeworICAgIHJldHVybiAoaW50NjRfdCkgY2xpZW50LmdldCgpOworfQorCitzdHJ1Y3QgVGVzdFByb2Nlc3NJbmZvIDogcHVibGljIFByb2Nlc3NJbmZvSW50ZXJmYWNlIHsKKyAgICBUZXN0UHJvY2Vzc0luZm8oKSB7fQorICAgIHZpcnR1YWwgflRlc3RQcm9jZXNzSW5mbygpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0UHJpb3JpdHkoaW50IHBpZCwgaW50ICpwcmlvcml0eSkgeworICAgICAgICAvLyBGb3IgdGVzdGluZywgdXNlIHBpZCBhcyBwcmlvcml0eS4KKyAgICAgICAgLy8gTG93ZXIgdGhlIHZhbHVlIGhpZ2hlciB0aGUgcHJpb3JpdHkuCisgICAgICAgICpwcmlvcml0eSA9IHBpZDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRlc3RQcm9jZXNzSW5mbyk7Cit9OworCitzdHJ1Y3QgVGVzdENsaWVudCA6IHB1YmxpYyBCblJlc291cmNlTWFuYWdlckNsaWVudCB7CisgICAgVGVzdENsaWVudChpbnQgcGlkLCBzcDxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiBzZXJ2aWNlKQorICAgICAgICA6IG1SZWNsYWltZWQoZmFsc2UpLCBtUGlkKHBpZCksIG1TZXJ2aWNlKHNlcnZpY2UpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgcmVjbGFpbVJlc291cmNlKCkgeworICAgICAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQodGhpcyk7CisgICAgICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShtUGlkLCAoaW50NjRfdCkgY2xpZW50LmdldCgpKTsKKyAgICAgICAgbVJlY2xhaW1lZCA9IHRydWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgidGVzdF9jbGllbnQiKTsKKyAgICB9CisKKyAgICBib29sIHJlY2xhaW1lZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1SZWNsYWltZWQ7CisgICAgfQorCisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbVJlY2xhaW1lZCA9IGZhbHNlOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflRlc3RDbGllbnQoKSB7fQorCitwcml2YXRlOgorICAgIGJvb2wgbVJlY2xhaW1lZDsKKyAgICBpbnQgbVBpZDsKKyAgICBzcDxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiBtU2VydmljZTsKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXN0Q2xpZW50KTsKK307CisKK3N0YXRpYyBjb25zdCBpbnQga1Rlc3RQaWQxID0gMzA7CitzdGF0aWMgY29uc3QgaW50IGtUZXN0UGlkMiA9IDIwOworCitzdGF0aWMgY29uc3QgaW50IGtMb3dQcmlvcml0eVBpZCA9IDQwOworc3RhdGljIGNvbnN0IGludCBrTWlkUHJpb3JpdHlQaWQgPSAyNTsKK3N0YXRpYyBjb25zdCBpbnQga0hpZ2hQcmlvcml0eVBpZCA9IDEwOworCitjbGFzcyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0KCkKKyAgICAgICAgOiBtU2VydmljZShuZXcgUmVzb3VyY2VNYW5hZ2VyU2VydmljZShuZXcgVGVzdFByb2Nlc3NJbmZvKSksCisgICAgICAgICAgbVRlc3RDbGllbnQxKG5ldyBUZXN0Q2xpZW50KGtUZXN0UGlkMSwgbVNlcnZpY2UpKSwKKyAgICAgICAgICBtVGVzdENsaWVudDIobmV3IFRlc3RDbGllbnQoa1Rlc3RQaWQyLCBtU2VydmljZSkpLAorICAgICAgICAgIG1UZXN0Q2xpZW50MyhuZXcgVGVzdENsaWVudChrVGVzdFBpZDIsIG1TZXJ2aWNlKSkgeworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0YXRpYyBib29sIGlzRXF1YWxSZXNvdXJjZXMoY29uc3QgVmVjdG9yPE1lZGlhUmVzb3VyY2U+ICZyZXNvdXJjZXMxLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPE1lZGlhUmVzb3VyY2U+ICZyZXNvdXJjZXMyKSB7CisgICAgICAgIGlmIChyZXNvdXJjZXMxLnNpemUoKSAhPSByZXNvdXJjZXMyLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzb3VyY2VzMS5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKHJlc291cmNlczFbaV0gIT0gcmVzb3VyY2VzMltpXSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBleHBlY3RFcVJlc291cmNlSW5mbyhjb25zdCBSZXNvdXJjZUluZm8gJmluZm8sIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKSB7CisgICAgICAgIEVYUEVDVF9FUShjbGllbnQsIGluZm8uY2xpZW50KTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaXNFcXVhbFJlc291cmNlcyhyZXNvdXJjZXMsIGluZm8ucmVzb3VyY2VzKSk7CisgICAgfQorCisgICAgdm9pZCB2ZXJpZnlDbGllbnRzKGJvb2wgYzEsIGJvb2wgYzIsIGJvb2wgYzMpIHsKKyAgICAgICAgVGVzdENsaWVudCAqY2xpZW50MSA9IHN0YXRpY19jYXN0PFRlc3RDbGllbnQqPihtVGVzdENsaWVudDEuZ2V0KCkpOworICAgICAgICBUZXN0Q2xpZW50ICpjbGllbnQyID0gc3RhdGljX2Nhc3Q8VGVzdENsaWVudCo+KG1UZXN0Q2xpZW50Mi5nZXQoKSk7CisgICAgICAgIFRlc3RDbGllbnQgKmNsaWVudDMgPSBzdGF0aWNfY2FzdDxUZXN0Q2xpZW50Kj4obVRlc3RDbGllbnQzLmdldCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoYzEsIGNsaWVudDEtPnJlY2xhaW1lZCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGMyLCBjbGllbnQyLT5yZWNsYWltZWQoKSk7CisgICAgICAgIEVYUEVDVF9FUShjMywgY2xpZW50My0+cmVjbGFpbWVkKCkpOworCisgICAgICAgIGNsaWVudDEtPnJlc2V0KCk7CisgICAgICAgIGNsaWVudDItPnJlc2V0KCk7CisgICAgICAgIGNsaWVudDMtPnJlc2V0KCk7CisgICAgfQorCisgICAgLy8gdGVzdCBzZXQgdXAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIHBpZCAgICAgICAgICAgICAgICBwcmlvcml0eSAgICAgICAgIGNsaWVudCAgICAgICAgICAgdHlwZSAgICAgICAgICAgICAgIG51bWJlcgorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAga1Rlc3RQaWQxKDMwKSAgICAgIDMwICAgICAgICAgICAgICAgbVRlc3RDbGllbnQxICAgICBzZWN1cmUgY29kZWMgICAgICAgMQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaGljIG1lbW9yeSAgICAgMjAwCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoaWMgbWVtb3J5ICAgICAyMDAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIGtUZXN0UGlkMigyMCkgICAgICAyMCAgICAgICAgICAgICAgIG1UZXN0Q2xpZW50MiAgICAgbm9uLXNlY3VyZSBjb2RlYyAgIDEKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhpYyBtZW1vcnkgICAgIDMwMAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RDbGllbnQzICAgICBzZWN1cmUgY29kZWMgICAgICAgMQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaGljIG1lbW9yeSAgICAgMTAwCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgdm9pZCBhZGRSZXNvdXJjZSgpIHsKKyAgICAgICAgLy8ga1Rlc3RQaWQxIG1UZXN0Q2xpZW50MQorICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzMTsKKyAgICAgICAgcmVzb3VyY2VzMS5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShTdHJpbmc4KGtSZXNvdXJjZVNlY3VyZUNvZGVjKSwgMSkpOworICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQxLCBnZXRJZChtVGVzdENsaWVudDEpLCBtVGVzdENsaWVudDEsIHJlc291cmNlczEpOworICAgICAgICByZXNvdXJjZXMxLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKFN0cmluZzgoa1Jlc291cmNlR3JhcGhpY01lbW9yeSksIDIwMCkpOworICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzMTE7CisgICAgICAgIHJlc291cmNlczExLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKFN0cmluZzgoa1Jlc291cmNlR3JhcGhpY01lbW9yeSksIDIwMCkpOworICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQxLCBnZXRJZChtVGVzdENsaWVudDEpLCBtVGVzdENsaWVudDEsIHJlc291cmNlczExKTsKKworICAgICAgICAvLyBrVGVzdFBpZDIgbVRlc3RDbGllbnQyCisgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXMyOworICAgICAgICByZXNvdXJjZXMyLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKFN0cmluZzgoa1Jlc291cmNlTm9uU2VjdXJlQ29kZWMpLCAxKSk7CisgICAgICAgIHJlc291cmNlczIucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoU3RyaW5nOChrUmVzb3VyY2VHcmFwaGljTWVtb3J5KSwgMzAwKSk7CisgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MiksIG1UZXN0Q2xpZW50MiwgcmVzb3VyY2VzMik7CisKKyAgICAgICAgLy8ga1Rlc3RQaWQyIG1UZXN0Q2xpZW50MworICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzMzsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgbVRlc3RDbGllbnQzLCByZXNvdXJjZXMzKTsKKyAgICAgICAgcmVzb3VyY2VzMy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShTdHJpbmc4KGtSZXNvdXJjZVNlY3VyZUNvZGVjKSwgMSkpOworICAgICAgICByZXNvdXJjZXMzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKFN0cmluZzgoa1Jlc291cmNlR3JhcGhpY01lbW9yeSksIDEwMCkpOworICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDMpLCBtVGVzdENsaWVudDMsIHJlc291cmNlczMpOworCisgICAgICAgIGNvbnN0IFBpZFJlc291cmNlSW5mb3NNYXAgJm1hcCA9IG1TZXJ2aWNlLT5tTWFwOworICAgICAgICBFWFBFQ1RfRVEoMnUsIG1hcC5zaXplKCkpOworICAgICAgICBzc2l6ZV90IGluZGV4MSA9IG1hcC5pbmRleE9mS2V5KGtUZXN0UGlkMSk7CisgICAgICAgIEFTU0VSVF9HRShpbmRleDEsIDApOworICAgICAgICBjb25zdCBSZXNvdXJjZUluZm9zICZpbmZvczEgPSBtYXBbaW5kZXgxXTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBpbmZvczEuc2l6ZSgpKTsKKyAgICAgICAgZXhwZWN0RXFSZXNvdXJjZUluZm8oaW5mb3MxWzBdLCBtVGVzdENsaWVudDEsIHJlc291cmNlczEpOworCisgICAgICAgIHNzaXplX3QgaW5kZXgyID0gbWFwLmluZGV4T2ZLZXkoa1Rlc3RQaWQyKTsKKyAgICAgICAgQVNTRVJUX0dFKGluZGV4MiwgMCk7CisgICAgICAgIGNvbnN0IFJlc291cmNlSW5mb3MgJmluZm9zMiA9IG1hcFtpbmRleDJdOworICAgICAgICBFWFBFQ1RfRVEoMnUsIGluZm9zMi5zaXplKCkpOworICAgICAgICBleHBlY3RFcVJlc291cmNlSW5mbyhpbmZvczJbMF0sIG1UZXN0Q2xpZW50MiwgcmVzb3VyY2VzMik7CisgICAgICAgIGV4cGVjdEVxUmVzb3VyY2VJbmZvKGluZm9zMlsxXSwgbVRlc3RDbGllbnQzLCByZXNvdXJjZXMzKTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RDb25maWcoKSB7CisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5tU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5tU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMpOworCisgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlUG9saWN5PiBwb2xpY2llczE7CisgICAgICAgIHBvbGljaWVzMS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZVBvbGljeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoa1BvbGljeVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgidHJ1ZSIpKSk7CisgICAgICAgIHBvbGljaWVzMS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZVBvbGljeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoa1BvbGljeVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoImZhbHNlIikpKTsKKyAgICAgICAgbVNlcnZpY2UtPmNvbmZpZyhwb2xpY2llczEpOworICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+bVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MpOworICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPm1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyk7CisKKyAgICAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2VQb2xpY3k+IHBvbGljaWVzMjsKKyAgICAgICAgcG9saWNpZXMyLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlUG9saWN5KAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChrUG9saWN5U3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCJmYWxzZSIpKSk7CisgICAgICAgIHBvbGljaWVzMi5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZVBvbGljeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoa1BvbGljeVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoInRydWUiKSkpOworICAgICAgICBtU2VydmljZS0+Y29uZmlnKHBvbGljaWVzMik7CisgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+bVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MpOworICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+bVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjKTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RSZW1vdmVSZXNvdXJjZSgpIHsKKyAgICAgICAgYWRkUmVzb3VyY2UoKTsKKworICAgICAgICBtU2VydmljZS0+cmVtb3ZlUmVzb3VyY2Uoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDIpKTsKKworICAgICAgICBjb25zdCBQaWRSZXNvdXJjZUluZm9zTWFwICZtYXAgPSBtU2VydmljZS0+bU1hcDsKKyAgICAgICAgRVhQRUNUX0VRKDJ1LCBtYXAuc2l6ZSgpKTsKKyAgICAgICAgY29uc3QgUmVzb3VyY2VJbmZvcyAmaW5mb3MxID0gbWFwLnZhbHVlRm9yKGtUZXN0UGlkMSk7CisgICAgICAgIGNvbnN0IFJlc291cmNlSW5mb3MgJmluZm9zMiA9IG1hcC52YWx1ZUZvcihrVGVzdFBpZDIpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGluZm9zMS5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGluZm9zMi5zaXplKCkpOworICAgICAgICAvLyBtVGVzdENsaWVudDIgaGFzIGJlZW4gcmVtb3ZlZC4KKyAgICAgICAgRVhQRUNUX0VRKG1UZXN0Q2xpZW50MywgaW5mb3MyWzBdLmNsaWVudCk7CisgICAgfQorCisgICAgdm9pZCB0ZXN0R2V0QWxsQ2xpZW50cygpIHsKKyAgICAgICAgYWRkUmVzb3VyY2UoKTsKKworICAgICAgICBTdHJpbmc4IHR5cGUgPSBTdHJpbmc4KGtSZXNvdXJjZVNlY3VyZUNvZGVjKTsKKyAgICAgICAgU3RyaW5nOCB1bmtub3dUeXBlID0gU3RyaW5nOCgidW5rbm93VHlwZSIpOworICAgICAgICBWZWN0b3I8c3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gPiBjbGllbnRzOworICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmdldEFsbENsaWVudHNfbChrTG93UHJpb3JpdHlQaWQsIHR5cGUsICZjbGllbnRzKSk7CisgICAgICAgIC8vIHNvbWUgaGlnaGVyIHByaW9yaXR5IHByb2Nlc3MgKGUuZy4ga1Rlc3RQaWQyKSBvd25zIHRoZSByZXNvdXJjZSwgc28gZ2V0QWxsQ2xpZW50c19sCisgICAgICAgIC8vIHdpbGwgZmFpbC4KKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5nZXRBbGxDbGllbnRzX2woa01pZFByaW9yaXR5UGlkLCB0eXBlLCAmY2xpZW50cykpOworICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+Z2V0QWxsQ2xpZW50c19sKGtIaWdoUHJpb3JpdHlQaWQsIHVua25vd1R5cGUsICZjbGllbnRzKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRBbGxDbGllbnRzX2woa0hpZ2hQcmlvcml0eVBpZCwgdHlwZSwgJmNsaWVudHMpKTsKKworICAgICAgICBFWFBFQ1RfRVEoMnUsIGNsaWVudHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKG1UZXN0Q2xpZW50MywgY2xpZW50c1swXSk7CisgICAgICAgIEVYUEVDVF9FUShtVGVzdENsaWVudDEsIGNsaWVudHNbMV0pOworICAgIH0KKworICAgIHZvaWQgdGVzdFJlY2xhaW1SZXNvdXJjZVNlY3VyZSgpIHsKKyAgICAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlczsKKyAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKFN0cmluZzgoa1Jlc291cmNlU2VjdXJlQ29kZWMpLCAxKSk7CisgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShTdHJpbmc4KGtSZXNvdXJjZUdyYXBoaWNNZW1vcnkpLCAxNTApKTsKKworICAgICAgICAvLyAjIyMgc2VjdXJlIGNvZGVjIGNhbid0IGNvZXhpc3QgYW5kIHNlY3VyZSBjb2RlYyBjYW4gY29leGlzdCB3aXRoIG5vbi1zZWN1cmUgY29kZWMgIyMjCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZFJlc291cmNlKCk7CisgICAgICAgICAgICBtU2VydmljZS0+bVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MgPSBmYWxzZTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5tU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMgPSB0cnVlOworCisgICAgICAgICAgICAvLyBwcmlvcml0eSB0b28gbG93CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrTG93UHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa01pZFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKworICAgICAgICAgICAgLy8gcmVjbGFpbSBhbGwgc2VjdXJlIGNvZGVjcworICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIHRydWUgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIG9uZSBsYXJnZXN0IGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgbGVmdAorICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyAjIyMgc2VjdXJlIGNvZGVjcyBjYW4ndCBjb2V4aXN0IGFuZCBzZWN1cmUgY29kZWMgY2FuJ3QgY29leGlzdCB3aXRoIG5vbi1zZWN1cmUgY29kZWMgIyMjCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZFJlc291cmNlKCk7CisgICAgICAgICAgICBtU2VydmljZS0+bVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MgPSBmYWxzZTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5tU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gcHJpb3JpdHkgdG9vIGxvdworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0xvd1ByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtNaWRQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisKKyAgICAgICAgICAgIC8vIHJlY2xhaW0gYWxsIHNlY3VyZSBhbmQgbm9uLXNlY3VyZSBjb2RlY3MKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIHRydWUgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBub3RoaW5nIGxlZnQKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICB9CisKKworICAgICAgICAvLyAjIyMgc2VjdXJlIGNvZGVjcyBjYW4gY29leGlzdCBidXQgc2VjdXJlIGNvZGVjIGNhbid0IGNvZXhpc3Qgd2l0aCBub24tc2VjdXJlIGNvZGVjICMjIworICAgICAgICB7CisgICAgICAgICAgICBhZGRSZXNvdXJjZSgpOworICAgICAgICAgICAgbVNlcnZpY2UtPm1TdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzID0gdHJ1ZTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5tU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gcHJpb3JpdHkgdG9vIGxvdworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0xvd1ByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtNaWRQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisKKyAgICAgICAgICAgIC8vIHJlY2xhaW0gYWxsIG5vbi1zZWN1cmUgY29kZWNzCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIG9uZSBsYXJnZXN0IGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIGNhbGwgYWdhaW4gc2hvdWxkIHJlY2xhaW0gYW5vdGhlciBsYXJnZXN0IGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgdHJ1ZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgbGVmdAorICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyAjIyMgc2VjdXJlIGNvZGVjcyBjYW4gY29leGlzdCBhbmQgc2VjdXJlIGNvZGVjIGNhbiBjb2V4aXN0IHdpdGggbm9uLXNlY3VyZSBjb2RlYyAjIyMKKyAgICAgICAgeworICAgICAgICAgICAgYWRkUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5tU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyA9IHRydWU7CisgICAgICAgICAgICBtU2VydmljZS0+bVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gcHJpb3JpdHkgdG9vIGxvdworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0xvd1ByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKworICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIC8vIG9uZSBsYXJnZXN0IGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MgZ290IHJlY2xhaW1lZAorICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyh0cnVlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIGFub3RoZXIgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcworICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gY2FsbCBhZ2FpbiBzaG91bGQgcmVjbGFpbSBhbm90aGVyIGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgdHJ1ZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgbGVmdAorICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyAjIyMgc2VjdXJlIGNvZGVjcyBjYW4gY29leGlzdCBhbmQgc2VjdXJlIGNvZGVjIGNhbiBjb2V4aXN0IHdpdGggbm9uLXNlY3VyZSBjb2RlYyAjIyMKKyAgICAgICAgeworICAgICAgICAgICAgYWRkUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5tU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyA9IHRydWU7CisgICAgICAgICAgICBtU2VydmljZS0+bVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjID0gdHJ1ZTsKKworICAgICAgICAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlczsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShTdHJpbmc4KGtSZXNvdXJjZVNlY3VyZUNvZGVjKSwgMSkpOworCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgLy8gc2VjdXJlIGNvZGVjIGZyb20gbG93ZXN0IHByb2Nlc3MgZ290IHJlY2xhaW1lZAorICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyh0cnVlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIGFub3RoZXIgc2VjdXJlIGNvZGVjIGZyb20gbG93ZXN0IHByb2Nlc3MKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgdHJ1ZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIG5vIG1vcmUgc2VjdXJlIGNvZGVjLCBub24tc2VjdXJlIGNvZGVjIHdpbGwgYmUgcmVjbGFpbWVkLgorICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdFJlY2xhaW1SZXNvdXJjZU5vblNlY3VyZSgpIHsKKyAgICAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlczsKKyAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKFN0cmluZzgoa1Jlc291cmNlTm9uU2VjdXJlQ29kZWMpLCAxKSk7CisgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShTdHJpbmc4KGtSZXNvdXJjZUdyYXBoaWNNZW1vcnkpLCAxNTApKTsKKworICAgICAgICAvLyAjIyMgc2VjdXJlIGNvZGVjIGNhbid0IGNvZXhpc3Qgd2l0aCBub24tc2VjdXJlIGNvZGVjICMjIworICAgICAgICB7CisgICAgICAgICAgICBhZGRSZXNvdXJjZSgpOworICAgICAgICAgICAgbVNlcnZpY2UtPm1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyA9IGZhbHNlOworCisgICAgICAgICAgICAvLyBwcmlvcml0eSB0b28gbG93CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrTG93UHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa01pZFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKworICAgICAgICAgICAgLy8gcmVjbGFpbSBhbGwgc2VjdXJlIGNvZGVjcworICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIHRydWUgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIG9uZSBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBub3RoaW5nIGxlZnQKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICB9CisKKworICAgICAgICAvLyAjIyMgc2VjdXJlIGNvZGVjIGNhbiBjb2V4aXN0IHdpdGggbm9uLXNlY3VyZSBjb2RlYyAjIyMKKyAgICAgICAgeworICAgICAgICAgICAgYWRkUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5tU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMgPSB0cnVlOworCisgICAgICAgICAgICAvLyBwcmlvcml0eSB0b28gbG93CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrTG93UHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgLy8gb25lIGxhcmdlc3QgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcyBnb3QgcmVjbGFpbWVkCisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIGNhbGwgYWdhaW4gc2hvdWxkIHJlY2xhaW0gYW5vdGhlciBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIGFub3RoZXIgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcworICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gbm90aGluZyBsZWZ0CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICMjIyBzZWN1cmUgY29kZWMgY2FuIGNvZXhpc3Qgd2l0aCBub24tc2VjdXJlIGNvZGVjICMjIworICAgICAgICB7CisgICAgICAgICAgICBhZGRSZXNvdXJjZSgpOworICAgICAgICAgICAgbVNlcnZpY2UtPm1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyA9IHRydWU7CisKKyAgICAgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoU3RyaW5nOChrUmVzb3VyY2VOb25TZWN1cmVDb2RlYyksIDEpKTsKKworICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIC8vIG9uZSBub24gc2VjdXJlIGNvZGVjIGZyb20gbG93ZXN0IHByb2Nlc3MgZ290IHJlY2xhaW1lZAorICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBubyBtb3JlIG5vbi1zZWN1cmUgY29kZWMsIHNlY3VyZSBjb2RlYyBmcm9tIGxvd2VzdCBwcmlvcml0eSBwcm9jZXNzIHdpbGwgYmUgcmVjbGFpbWVkCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyh0cnVlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBjbGVhbiB1cCBjbGllbnQgMyB3aGljaCBzdGlsbCBsZWZ0CisgICAgICAgICAgICBtU2VydmljZS0+cmVtb3ZlUmVzb3VyY2Uoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdEdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudCgpIHsKKyAgICAgICAgU3RyaW5nOCB0eXBlID0gU3RyaW5nOChrUmVzb3VyY2VHcmFwaGljTWVtb3J5KTsKKyAgICAgICAgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50OworICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sKGtIaWdoUHJpb3JpdHlQaWQsIHR5cGUsICZjbGllbnQpKTsKKworICAgICAgICBhZGRSZXNvdXJjZSgpOworCisgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woa0xvd1ByaW9yaXR5UGlkLCB0eXBlLCAmY2xpZW50KSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbChrSGlnaFByaW9yaXR5UGlkLCB0eXBlLCAmY2xpZW50KSk7CisKKyAgICAgICAgLy8ga1Rlc3RQaWQxIGlzIHRoZSBsb3dlc3QgcHJpb3JpdHkgcHJvY2VzcyB3aXRoIGtSZXNvdXJjZUdyYXBoaWNNZW1vcnkuCisgICAgICAgIC8vIG1UZXN0Q2xpZW50MSBoYXMgdGhlIGxhcmdlc3Qga1Jlc291cmNlR3JhcGhpY01lbW9yeSB3aXRoaW4ga1Rlc3RQaWQxLgorICAgICAgICBFWFBFQ1RfRVEobVRlc3RDbGllbnQxLCBjbGllbnQpOworICAgIH0KKworICAgIHZvaWQgdGVzdEdldExvd2VzdFByaW9yaXR5UGlkKCkgeworICAgICAgICBpbnQgcGlkOworICAgICAgICBpbnQgcHJpb3JpdHk7CisgICAgICAgIFRlc3RQcm9jZXNzSW5mbyBwcm9jZXNzSW5mbzsKKworICAgICAgICBTdHJpbmc4IHR5cGUgPSBTdHJpbmc4KGtSZXNvdXJjZUdyYXBoaWNNZW1vcnkpOworICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmdldExvd2VzdFByaW9yaXR5UGlkX2wodHlwZSwgJnBpZCwgJnByaW9yaXR5KSk7CisKKyAgICAgICAgYWRkUmVzb3VyY2UoKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+Z2V0TG93ZXN0UHJpb3JpdHlQaWRfbCh0eXBlLCAmcGlkLCAmcHJpb3JpdHkpKTsKKyAgICAgICAgRVhQRUNUX0VRKGtUZXN0UGlkMSwgcGlkKTsKKyAgICAgICAgaW50IHByaW9yaXR5MTsKKyAgICAgICAgcHJvY2Vzc0luZm8uZ2V0UHJpb3JpdHkoa1Rlc3RQaWQxLCAmcHJpb3JpdHkxKTsKKyAgICAgICAgRVhQRUNUX0VRKHByaW9yaXR5MSwgcHJpb3JpdHkpOworCisgICAgICAgIHR5cGUgPSBTdHJpbmc4KGtSZXNvdXJjZU5vblNlY3VyZUNvZGVjKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmdldExvd2VzdFByaW9yaXR5UGlkX2wodHlwZSwgJnBpZCwgJnByaW9yaXR5KSk7CisgICAgICAgIEVYUEVDVF9FUShrVGVzdFBpZDIsIHBpZCk7CisgICAgICAgIGludCBwcmlvcml0eTI7CisgICAgICAgIHByb2Nlc3NJbmZvLmdldFByaW9yaXR5KGtUZXN0UGlkMiwgJnByaW9yaXR5Mik7CisgICAgICAgIEVYUEVDVF9FUShwcmlvcml0eTIsIHByaW9yaXR5KTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RHZXRCaWdnZXN0Q2xpZW50KCkgeworICAgICAgICBTdHJpbmc4IHR5cGUgPSBTdHJpbmc4KGtSZXNvdXJjZUdyYXBoaWNNZW1vcnkpOworICAgICAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQ7CisgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0QmlnZ2VzdENsaWVudF9sKGtUZXN0UGlkMiwgdHlwZSwgJmNsaWVudCkpOworCisgICAgICAgIGFkZFJlc291cmNlKCk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmdldEJpZ2dlc3RDbGllbnRfbChrVGVzdFBpZDIsIHR5cGUsICZjbGllbnQpKTsKKyAgICAgICAgRVhQRUNUX0VRKG1UZXN0Q2xpZW50MiwgY2xpZW50KTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RJc0NhbGxpbmdQcmlvcml0eUhpZ2hlcigpIHsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5pc0NhbGxpbmdQcmlvcml0eUhpZ2hlcl9sKDEwMSwgMTAwKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+aXNDYWxsaW5nUHJpb3JpdHlIaWdoZXJfbCgxMDAsIDEwMCkpOworICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+aXNDYWxsaW5nUHJpb3JpdHlIaWdoZXJfbCg5OSwgMTAwKSk7CisgICAgfQorCisgICAgc3A8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gbVNlcnZpY2U7CisgICAgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gbVRlc3RDbGllbnQxOworICAgIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IG1UZXN0Q2xpZW50MjsKKyAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBtVGVzdENsaWVudDM7Cit9OworCitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIGNvbmZpZykgeworICAgIHRlc3RDb25maWcoKTsKK30KKworVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCBhZGRSZXNvdXJjZSkgeworICAgIGFkZFJlc291cmNlKCk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgcmVtb3ZlUmVzb3VyY2UpIHsKKyAgICB0ZXN0UmVtb3ZlUmVzb3VyY2UoKTsKK30KKworVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCByZWNsYWltUmVzb3VyY2UpIHsKKyAgICB0ZXN0UmVjbGFpbVJlc291cmNlU2VjdXJlKCk7CisgICAgdGVzdFJlY2xhaW1SZXNvdXJjZU5vblNlY3VyZSgpOworfQorCitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIGdldEFsbENsaWVudHNfbCkgeworICAgIHRlc3RHZXRBbGxDbGllbnRzKCk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgZ2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2wpIHsKKyAgICB0ZXN0R2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50KCk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgZ2V0TG93ZXN0UHJpb3JpdHlQaWRfbCkgeworICAgIHRlc3RHZXRMb3dlc3RQcmlvcml0eVBpZCgpOworfQorCitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIGdldEJpZ2dlc3RDbGllbnRfbCkgeworICAgIHRlc3RHZXRCaWdnZXN0Q2xpZW50KCk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgaXNDYWxsaW5nUHJpb3JpdHlIaWdoZXJfbCkgeworICAgIHRlc3RJc0NhbGxpbmdQcmlvcml0eUhpZ2hlcigpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1NlcnZpY2VMb2dfdGVzdC5jcHAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1NlcnZpY2VMb2dfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE3MjQ5OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvU2VydmljZUxvZ190ZXN0LmNwcApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNlcnZpY2VMb2dfdGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJTZXJ2aWNlTG9nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU2VydmljZUxvZ1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBTZXJ2aWNlTG9nVGVzdCgpIDogbVNlcnZpY2VMb2cobmV3IFNlcnZpY2VMb2coMykpIHsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzcDxTZXJ2aWNlTG9nPiBtU2VydmljZUxvZzsKK307CisKK1RFU1RfRihTZXJ2aWNlTG9nVGVzdCwgYWRkVGhlblRvU3RyaW5nKSB7CisgICAgU3RyaW5nOCBsb2dTdHJpbmc7CisKKyAgICBtU2VydmljZUxvZy0+YWRkKFN0cmluZzgoImxvZzEiKSk7CisgICAgbG9nU3RyaW5nID0gbVNlcnZpY2VMb2ctPnRvU3RyaW5nKCk7CisgICAgRVhQRUNUX1RSVUUobG9nU3RyaW5nLmNvbnRhaW5zKCJsb2cxIikpOworICAgIEFMT0dWKCJ0b1N0cmluZzpcbiVzIiwgbG9nU3RyaW5nLnN0cmluZygpKTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtUZXN0TG9nUHJlZml4W10gPSAidGVzdGxvZ3ByZWZpeDogIjsKKyAgICBsb2dTdHJpbmcgPSBtU2VydmljZUxvZy0+dG9TdHJpbmcoa1Rlc3RMb2dQcmVmaXgpOworICAgIEVYUEVDVF9UUlVFKGxvZ1N0cmluZy5jb250YWlucyhrVGVzdExvZ1ByZWZpeCkpOworICAgIEVYUEVDVF9UUlVFKGxvZ1N0cmluZy5jb250YWlucygibG9nMSIpKTsKKyAgICBBTE9HVigidG9TdHJpbmc6XG4lcyIsIGxvZ1N0cmluZy5zdHJpbmcoKSk7CisKKyAgICBtU2VydmljZUxvZy0+YWRkKFN0cmluZzgoImxvZzIiKSk7CisgICAgbG9nU3RyaW5nID0gbVNlcnZpY2VMb2ctPnRvU3RyaW5nKCk7CisgICAgRVhQRUNUX1RSVUUobG9nU3RyaW5nLmNvbnRhaW5zKCJsb2cxIikpOworICAgIEVYUEVDVF9UUlVFKGxvZ1N0cmluZy5jb250YWlucygibG9nMiIpKTsKKyAgICBBTE9HVigidG9TdHJpbmc6XG4lcyIsIGxvZ1N0cmluZy5zdHJpbmcoKSk7CisKKyAgICBtU2VydmljZUxvZy0+YWRkKFN0cmluZzgoImxvZzMiKSk7CisgICAgbG9nU3RyaW5nID0gbVNlcnZpY2VMb2ctPnRvU3RyaW5nKCk7CisgICAgRVhQRUNUX1RSVUUobG9nU3RyaW5nLmNvbnRhaW5zKCJsb2cxIikpOworICAgIEVYUEVDVF9UUlVFKGxvZ1N0cmluZy5jb250YWlucygibG9nMiIpKTsKKyAgICBFWFBFQ1RfVFJVRShsb2dTdHJpbmcuY29udGFpbnMoImxvZzMiKSk7CisgICAgQUxPR1YoInRvU3RyaW5nOlxuJXMiLCBsb2dTdHJpbmcuc3RyaW5nKCkpOworCisgICAgbVNlcnZpY2VMb2ctPmFkZChTdHJpbmc4KCJsb2c0IikpOworICAgIGxvZ1N0cmluZyA9IG1TZXJ2aWNlTG9nLT50b1N0cmluZygpOworICAgIEVYUEVDVF9GQUxTRShsb2dTdHJpbmcuY29udGFpbnMoImxvZzEiKSk7CisgICAgRVhQRUNUX1RSVUUobG9nU3RyaW5nLmNvbnRhaW5zKCJsb2cyIikpOworICAgIEVYUEVDVF9UUlVFKGxvZ1N0cmluZy5jb250YWlucygibG9nMyIpKTsKKyAgICBFWFBFQ1RfVFJVRShsb2dTdHJpbmcuY29udGFpbnMoImxvZzQiKSk7CisgICAgQUxPR1YoInRvU3RyaW5nOlxuJXMiLCBsb2dTdHJpbmcuc3RyaW5nKCkpOworCisgICAgbVNlcnZpY2VMb2ctPmFkZChTdHJpbmc4KCJsb2c1IikpOworICAgIGxvZ1N0cmluZyA9IG1TZXJ2aWNlTG9nLT50b1N0cmluZygpOworICAgIEVYUEVDVF9GQUxTRShsb2dTdHJpbmcuY29udGFpbnMoImxvZzEiKSk7CisgICAgRVhQRUNUX0ZBTFNFKGxvZ1N0cmluZy5jb250YWlucygibG9nMiIpKTsKKyAgICBFWFBFQ1RfVFJVRShsb2dTdHJpbmcuY29udGFpbnMoImxvZzMiKSk7CisgICAgRVhQRUNUX1RSVUUobG9nU3RyaW5nLmNvbnRhaW5zKCJsb2c0IikpOworICAgIEVYUEVDVF9UUlVFKGxvZ1N0cmluZy5jb250YWlucygibG9nNSIpKTsKKyAgICBBTE9HVigidG9TdHJpbmc6XG4lcyIsIGxvZ1N0cmluZy5zdHJpbmcoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9yYWRpby9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZTU2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9yYWRpby9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzYgQEAKKyMgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAorICAgIFJhZGlvU2VydmljZS5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IFwKKyAgICBsaWJ1aSBcCisgICAgbGlibG9nIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGliYmluZGVyIFwKKyAgICBsaWJjdXRpbHMgXAorICAgIGxpYm1lZGlhIFwKKyAgICBsaWJoYXJkd2FyZSBcCisgICAgbGlicmFkaW8gXAorICAgIGxpYnJhZGlvX21ldGFkYXRhCisKK0xPQ0FMX01PRFVMRTo9IGxpYnJhZGlvc2VydmljZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb1JlZ2lvbnMuaCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvUmVnaW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMzViOGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9yYWRpby9SYWRpb1JlZ2lvbnMuaApAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19SRUdJT05TX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19SRUdJT05TX0gKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMSAgICA4NzUwMAorI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTEgICAgMTA4MDAwCisjZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUxICAxMDAKKworI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTIgICAgODc5MDAKKyNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9GTV9JVFUyICAgIDEwNzkwMAorI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfRk1fSVRVMiAgMjAwCisKKyNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9GTV9KQVBBTiAgICA3NjAwMAorI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX0ZNX0pBUEFOICAgIDkwMDAwCisjZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19GTV9KQVBBTiAgMTAwCisKKyNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9GTV9PSVJUICAgIDY1ODAwCisjZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfRk1fT0lSVCAgICA3NDAwMAorI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfRk1fT0lSVCAgMTAKKworI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX0xXICAgICAgICAgMTUzCisjZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfTFcgICAgICAgICAyNzkKKyNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX0xXICAgICAgIDkKKworI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX01XX0lVVDEgICAgNTMxCisjZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfTVdfSVRVMSAgICAxNjExCisjZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19NV19JVFUxICA5CisKKyNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9NV19JVVQyICAgIDU0MAorI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX01XX0lUVTIgICAgMTYxMAorI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfTVdfSVRVMiAgMTAKKworI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX1NXICAgICAgICAgMjMwMAorI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX1NXICAgICAgICAgMjYxMDAKKyNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX1NXICAgICAgIDUKKworCisjaWZuZGVmIEFSUkFZX1NJWkUKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCisjZW5kaWYKKworY29uc3QgcmFkaW9fYmFuZF9jb25maWdfdCBzS25vd25SZWdpb25Db25maWdzW10gPSB7CisgICAgeyAgIC8vIEZNIElUVSAxCisgICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMSwKKyAgICAgICAgeworICAgICAgICBSQURJT19CQU5EX0ZNLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTEsCisgICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTEsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUxfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNTAsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgUkFESU9fUkRTX1dPUkxELAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9LAorICAgIHsgICAvLyBGTSBBbWVyaWNhcworICAgICAgICBSQURJT19SRUdJT05fSVRVXzIsCisgICAgICAgIHsKKyAgICAgICAgUkFESU9fQkFORF9GTSwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9JVFUyLAorICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9GTV9JVFUyLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfRk1fSVRVMn0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzc1LAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIFJBRElPX1JEU19VUywKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgICB7ICAgLy8gRk0gSmFwYW4KKyAgICAgICAgUkFESU9fUkVHSU9OX0pBUEFOLAorICAgICAgICB7CisgICAgICAgIFJBRElPX0JBTkRfRk0sCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fSkFQQU4sCisgICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX0pBUEFOLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfRk1fSkFQQU59LAorICAgICAgICAgICAgeworICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU181MCwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICBSQURJT19SRFNfV09STEQsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisgICAgeyAgIC8vIEZNIEtvcmVhCisgICAgICAgIFJBRElPX1JFR0lPTl9LT1JFQSwKKyAgICAgICAgeworICAgICAgICBSQURJT19CQU5EX0ZNLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTEsCisgICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTEsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUxfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNzUsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgUkFESU9fUkRTX1dPUkxELAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9LAorICAgIHsgICAvLyBGTSBPSVJUCisgICAgICAgIFJBRElPX1JFR0lPTl9PSVJULAorICAgICAgICB7CisgICAgICAgIFJBRElPX0JBTkRfRk0sCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fT0lSVCwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fT0lSVCwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0ZNX09JUlR9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU181MCwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICBSQURJT19SRFNfV09STEQsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisgICAgeyAgIC8vIEZNIFVTIEhEIHJhZGlvCisgICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMiwKKyAgICAgICAgeworICAgICAgICAgICAgUkFESU9fQkFORF9GTV9IRCwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9JVFUyLAorICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9GTV9JVFUyLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfRk1fSVRVMn0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzc1LAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIFJBRElPX1JEU19VUywKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgICB7ICAgLy8gQU0gTFcKKyAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8xLAorICAgICAgICB7CisgICAgICAgICAgICBSQURJT19CQU5EX0FNLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0xXLAorICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9MVywKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0xXfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisgICAgeyAgIC8vIEFNIFNXCisgICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMSwKKyAgICAgICAgeworICAgICAgICAgICAgUkFESU9fQkFORF9BTSwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9TVywKKyAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfU1csCisgICAgICAgICAgICAxLAorICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19TV30sCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9LAorICAgIHsgICAvLyBBTSBNVyBJVFUxCisgICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMSwKKyAgICAgICAgeworICAgICAgICAgICAgUkFESU9fQkFORF9BTSwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9NV19JVVQxLAorICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9NV19JVFUxLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfTVdfSVRVMX0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9LAorICAgIHsgICAvLyBBTSBNVyBJVFUyCisgICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMiwKKyAgICAgICAgeworICAgICAgICAgICAgUkFESU9fQkFORF9BTSwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9NV19JVVQyLAorICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9NV19JVFUyLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfTVdfSVRVMn0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9OworCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfUkFESU9fUkVHSU9OU19ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuY3BwIGIvc2VydmljZXMvcmFkaW8vUmFkaW9TZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDBmNWYzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvcmFkaW8vUmFkaW9TZXJ2aWNlLmNwcApAQCAtMCwwICsxLDkwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiUmFkaW9TZXJ2aWNlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL3JhZGlvX21ldGFkYXRhLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9yYWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSAiUmFkaW9TZXJ2aWNlLmgiCisjaW5jbHVkZSAiUmFkaW9SZWdpb25zLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IGNoYXIga1JhZGlvVHVuZXJBdWRpb0RldmljZU5hbWVbXSA9ICJSYWRpbyB0dW5lciBzb3VyY2UiOworCitSYWRpb1NlcnZpY2U6OlJhZGlvU2VydmljZSgpCisgICAgOiBCblJhZGlvU2VydmljZSgpLCBtTmV4dFVuaXF1ZUlkKDEpCit7CisgICAgQUxPR0koIiVzIiwgX19GVU5DVElPTl9fKTsKK30KKwordm9pZCBSYWRpb1NlcnZpY2U6Om9uRmlyc3RSZWYoKQoreworICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7CisgICAgaW50IHJjOworICAgIHN0cnVjdCByYWRpb19od19kZXZpY2UgKmRldjsKKworICAgIEFMT0dJKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICByYyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBSQURJT19IQVJEV0FSRV9NT0RVTEVfSURfRk0sICZtb2QpOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBsb2FkIHJhZGlvIG1vZHVsZSAlcy4lcyAoJXMpIiwKKyAgICAgICAgICAgICAgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lELCAicHJpbWFyeSIsIHN0cmVycm9yKC1yYykpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJjID0gcmFkaW9faHdfZGV2aWNlX29wZW4obW9kLCAmZGV2KTsKKyAgICBpZiAocmMgIT0gMCkgeworICAgICAgICBBTE9HRSgiY291bGRuJ3Qgb3BlbiByYWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsCisgICAgICAgICAgICAgIFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgInByaW1hcnkiLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZGV2LT5jb21tb24udmVyc2lvbiAhPSBSQURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fQ1VSUkVOVCkgeworICAgICAgICBBTE9HRSgid3JvbmcgcmFkaW8gaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIGRldi0+Y29tbW9uLnZlcnNpb24pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RydWN0IHJhZGlvX2hhbF9wcm9wZXJ0aWVzIGhhbFByb3BlcnRpZXM7CisgICAgcmMgPSBkZXYtPmdldF9wcm9wZXJ0aWVzKGRldiwgJmhhbFByb3BlcnRpZXMpOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgcmVhZCBpbXBsZW1lbnRhdGlvbiBwcm9wZXJ0aWVzIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByYWRpb19wcm9wZXJ0aWVzX3QgcHJvcGVydGllczsKKyAgICBwcm9wZXJ0aWVzLmhhbmRsZSA9CisgICAgICAgICAgICAocmFkaW9faGFuZGxlX3QpYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dFVuaXF1ZUlkKTsKKworICAgIEFMT0dJKCJsb2FkZWQgZGVmYXVsdCBtb2R1bGUgJXMsIGhhbmRsZSAlZCIsIHByb3BlcnRpZXMucHJvZHVjdCwgcHJvcGVydGllcy5oYW5kbGUpOworCisgICAgY29udmVydFByb3BlcnRpZXMoJnByb3BlcnRpZXMsICZoYWxQcm9wZXJ0aWVzKTsKKyAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG5ldyBNb2R1bGUoZGV2LCBwcm9wZXJ0aWVzKTsKKyAgICBtTW9kdWxlcy5hZGQocHJvcGVydGllcy5oYW5kbGUsIG1vZHVsZSk7Cit9CisKK1JhZGlvU2VydmljZTo6flJhZGlvU2VydmljZSgpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICByYWRpb19od19kZXZpY2VfY2xvc2UobU1vZHVsZXMudmFsdWVBdChpKS0+aHdEZXZpY2UoKSk7CisgICAgfQorfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6Omxpc3RNb2R1bGVzKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKK3sKKyAgICBBTE9HVigibGlzdE1vZHVsZXMiKTsKKworICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgaWYgKG51bU1vZHVsZXMgPT0gTlVMTCB8fCAoKm51bU1vZHVsZXMgIT0gMCAmJiBwcm9wZXJ0aWVzID09IE5VTEwpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNpemVfdCBtYXhNb2R1bGVzID0gKm51bU1vZHVsZXM7CisgICAgKm51bU1vZHVsZXMgPSBtTW9kdWxlcy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCkgJiYgaSA8IG1heE1vZHVsZXM7IGkrKykgeworICAgICAgICBwcm9wZXJ0aWVzW2ldID0gbU1vZHVsZXMudmFsdWVBdChpKS0+cHJvcGVydGllcygpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6YXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCisgICAgICAgICAgICAgICAgICAgICAgICBzcDxJUmFkaW8+JiByYWRpbykKK3sKKyAgICBBTE9HVigiJXMgJWQgY29uZmlnICVwIHdpdGhBdWRpbyAlZCIsIF9fRlVOQ1RJT05fXywgaGFuZGxlLCBjb25maWcsIHdpdGhBdWRpbyk7CisKKyAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOworICAgIHJhZGlvLmNsZWFyKCk7CisgICAgaWYgKGNsaWVudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNzaXplX3QgaW5kZXggPSBtTW9kdWxlcy5pbmRleE9mS2V5KGhhbmRsZSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGVzLnZhbHVlQXQoaW5kZXgpOworCisgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7CisgICAgICAgIGNvbmZpZyA9IG1vZHVsZS0+Z2V0RGVmYXVsdENvbmZpZygpOworICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiJXMgcmVnaW9uICVkIHR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sIGNvbmZpZy0+cmVnaW9uLCBjb25maWctPmJhbmQudHlwZSk7CisKKyAgICByYWRpbyA9IG1vZHVsZS0+YWRkQ2xpZW50KGNsaWVudCwgY29uZmlnLCB3aXRoQXVkaW8pOworCisgICAgaWYgKHJhZGlvID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCitzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKK3N0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXAgPSA2MDAwMDsKKworc3RhdGljIGJvb2wgdHJ5TG9jayhNdXRleCYgbXV0ZXgpCit7CisgICAgYm9vbCBsb2NrZWQgPSBmYWxzZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtEdW1wTG9ja1JldHJpZXM7ICsraSkgeworICAgICAgICBpZiAobXV0ZXgudHJ5TG9jaygpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBsb2NrZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdXNsZWVwKGtEdW1wTG9ja1NsZWVwKTsKKyAgICB9CisgICAgcmV0dXJuIGxvY2tlZDsKK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgeworICAgIFN0cmluZzggcmVzdWx0OworICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpKSA9PSBmYWxzZSkgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBSYWRpb1NlcnZpY2UiKTsKKyAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gUmFkaW9TZXJ2aWNlIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKKyAgICAgICAgaWYgKCFsb2NrZWQpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlJhZGlvU2VydmljZSBtYXkgYmUgZGVhZGxvY2tlZFxuIik7CisgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsb2NrZWQpIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykgeworICAgIHJldHVybiBCblJhZGlvU2VydmljZTo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworfQorCisKKy8vIHN0YXRpYwordm9pZCBSYWRpb1NlcnZpY2U6OmNhbGxiYWNrKHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCwgdm9pZCAqY29va2llKQoreworICAgIENhbGxiYWNrVGhyZWFkICpjYWxsYmFja1RocmVhZCA9IChDYWxsYmFja1RocmVhZCAqKWNvb2tpZTsKKyAgICBpZiAoY2FsbGJhY2tUaHJlYWQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhbGxiYWNrVGhyZWFkLT5zZW5kRXZlbnQoaGFsRXZlbnQpOworfQorCisvKiBzdGF0aWMgKi8KK3ZvaWQgUmFkaW9TZXJ2aWNlOjpjb252ZXJ0UHJvcGVydGllcyhyYWRpb19wcm9wZXJ0aWVzX3QgKnByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqaGFsUHJvcGVydGllcykKK3sKKyAgICBtZW1zZXQocHJvcGVydGllcywgMCwgc2l6ZW9mKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzKSk7CisgICAgcHJvcGVydGllcy0+Y2xhc3NfaWQgPSBoYWxQcm9wZXJ0aWVzLT5jbGFzc19pZDsKKyAgICBzdHJsY3B5KHByb3BlcnRpZXMtPmltcGxlbWVudG9yLCBoYWxQcm9wZXJ0aWVzLT5pbXBsZW1lbnRvciwKKyAgICAgICAgICAgIFJBRElPX1NUUklOR19MRU5fTUFYKTsKKyAgICBzdHJsY3B5KHByb3BlcnRpZXMtPnByb2R1Y3QsIGhhbFByb3BlcnRpZXMtPnByb2R1Y3QsCisgICAgICAgICAgICBSQURJT19TVFJJTkdfTEVOX01BWCk7CisgICAgc3RybGNweShwcm9wZXJ0aWVzLT52ZXJzaW9uLCBoYWxQcm9wZXJ0aWVzLT52ZXJzaW9uLAorICAgICAgICAgICAgUkFESU9fU1RSSU5HX0xFTl9NQVgpOworICAgIHN0cmxjcHkocHJvcGVydGllcy0+c2VyaWFsLCBoYWxQcm9wZXJ0aWVzLT5zZXJpYWwsCisgICAgICAgICAgICBSQURJT19TVFJJTkdfTEVOX01BWCk7CisgICAgcHJvcGVydGllcy0+bnVtX3R1bmVycyA9IGhhbFByb3BlcnRpZXMtPm51bV90dW5lcnM7CisgICAgcHJvcGVydGllcy0+bnVtX2F1ZGlvX3NvdXJjZXMgPSBoYWxQcm9wZXJ0aWVzLT5udW1fYXVkaW9fc291cmNlczsKKyAgICBwcm9wZXJ0aWVzLT5zdXBwb3J0c19jYXB0dXJlID0gaGFsUHJvcGVydGllcy0+c3VwcG9ydHNfY2FwdHVyZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShzS25vd25SZWdpb25Db25maWdzKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpiYW5kID0gJnNLbm93blJlZ2lvbkNvbmZpZ3NbaV0uYmFuZDsKKyAgICAgICAgc2l6ZV90IGo7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBoYWxQcm9wZXJ0aWVzLT5udW1fYmFuZHM7IGorKykgeworICAgICAgICAgICAgY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmhhbEJhbmQgPSAmaGFsUHJvcGVydGllcy0+YmFuZHNbal07CisgICAgICAgICAgICBzaXplX3QgazsKKyAgICAgICAgICAgIGlmIChiYW5kLT50eXBlICE9IGhhbEJhbmQtPnR5cGUpIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGJhbmQtPmxvd2VyX2xpbWl0IDwgaGFsQmFuZC0+bG93ZXJfbGltaXQpIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGJhbmQtPnVwcGVyX2xpbWl0ID4gaGFsQmFuZC0+dXBwZXJfbGltaXQpIGNvbnRpbnVlOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGhhbEJhbmQtPm51bV9zcGFjaW5nczsgaysrKSB7CisgICAgICAgICAgICAgICAgaWYgKGJhbmQtPnNwYWNpbmdzWzBdID09IGhhbEJhbmQtPnNwYWNpbmdzW2tdKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChrID09IGhhbEJhbmQtPm51bV9zcGFjaW5ncykgY29udGludWU7CisgICAgICAgICAgICBpZiAoYmFuZC0+dHlwZSA9PSBSQURJT19CQU5EX0FNKSBicmVhazsKKyAgICAgICAgICAgIGlmICgoYmFuZC0+Zm0uZGVlbXBoYXNpcyAmIGhhbEJhbmQtPmZtLmRlZW1waGFzaXMpID09IDApIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGhhbEJhbmQtPmZtLnJkcyA9PSAwKSBicmVhazsKKyAgICAgICAgICAgIGlmICgoYmFuZC0+Zm0ucmRzICYgaGFsQmFuZC0+Zm0ucmRzKSAhPSAwKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoaiA9PSBoYWxQcm9wZXJ0aWVzLT5udW1fYmFuZHMpIGNvbnRpbnVlOworCisgICAgICAgIEFMT0dJKCJjb252ZXJ0UHJvcGVydGllcygpIEFkZGluZyBiYW5kIHR5cGUgJWQgcmVnaW9uICVkIiwKKyAgICAgICAgICAgICAgc0tub3duUmVnaW9uQ29uZmlnc1tpXS5iYW5kLnR5cGUgLCBzS25vd25SZWdpb25Db25maWdzW2ldLnJlZ2lvbik7CisKKyAgICAgICAgbWVtY3B5KCZwcm9wZXJ0aWVzLT5iYW5kc1twcm9wZXJ0aWVzLT5udW1fYmFuZHMrK10sCisgICAgICAgICAgICAgICAmc0tub3duUmVnaW9uQ29uZmlnc1tpXSwKKyAgICAgICAgICAgICAgIHNpemVvZihyYWRpb19iYW5kX2NvbmZpZ190KSk7CisgICAgfQorfQorCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkIgorCitSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpDYWxsYmFja1RocmVhZChjb25zdCB3cDxNb2R1bGVDbGllbnQ+JiBtb2R1bGVDbGllbnQpCisgICAgOiBtTW9kdWxlQ2xpZW50KG1vZHVsZUNsaWVudCksIG1NZW1vcnlEZWFsZXIobmV3IE1lbW9yeURlYWxlcigxMDI0ICogMTAyNCwgIlJhZGlvU2VydmljZSIpKQoreworfQorCitSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjp+Q2FsbGJhY2tUaHJlYWQoKQoreworICAgIG1FdmVudFF1ZXVlLmNsZWFyKCk7Cit9CisKK3ZvaWQgUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6b25GaXJzdFJlZigpCit7CisgICAgcnVuKCJSYWRpb1NlcnZpY2UgY2JrIiwgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8pOworfQorCitib29sIFJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OnRocmVhZExvb3AoKQoreworICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkgeworICAgICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeTsKKyAgICAgICAgc3A8TW9kdWxlQ2xpZW50PiBtb2R1bGVDbGllbnQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKKyAgICAgICAgICAgIHdoaWxlIChtRXZlbnRRdWV1ZS5pc0VtcHR5KCkgJiYgIWV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiQ2FsbGJhY2tUaHJlYWQ6OnRocmVhZExvb3AoKSBzbGVlcCIpOworICAgICAgICAgICAgICAgIG1DYWxsYmFja0NvbmQud2FpdChtQ2FsbGJhY2tMb2NrKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiQ2FsbGJhY2tUaHJlYWQ6OnRocmVhZExvb3AoKSB3YWtlIHVwIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXZlbnRNZW1vcnkgPSBtRXZlbnRRdWV1ZVswXTsKKyAgICAgICAgICAgIG1FdmVudFF1ZXVlLnJlbW92ZUF0KDApOworICAgICAgICAgICAgbW9kdWxlQ2xpZW50ID0gbU1vZHVsZUNsaWVudC5wcm9tb3RlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1vZHVsZUNsaWVudCAhPSAwKSB7CisgICAgICAgICAgICBtb2R1bGVDbGllbnQtPm9uQ2FsbGJhY2tFdmVudChldmVudE1lbW9yeSk7CisgICAgICAgICAgICBldmVudE1lbW9yeS5jbGVhcigpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpleGl0KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgcmVxdWVzdEV4aXQoKTsKKyAgICBtQ2FsbGJhY2tDb25kLmJyb2FkY2FzdCgpOworfQorCitzcDxJTWVtb3J5PiBSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpwcmVwYXJlRXZlbnQocmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KQoreworICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5OworCisgICAgc2l6ZV90IGhlYWRlclNpemUgPQorICAgICAgICAgICAgKHNpemVvZihzdHJ1Y3QgcmFkaW9fZXZlbnQpICsgc2l6ZW9mKHVuc2lnbmVkIGludCkgLSAxKSAvc2l6ZW9mKHVuc2lnbmVkIGludCk7CisgICAgc2l6ZV90IG1ldGFkYXRhU2l6ZSA9IDA7CisgICAgc3dpdGNoIChoYWxFdmVudC0+dHlwZSkgeworICAgIGNhc2UgUkFESU9fRVZFTlRfVFVORUQ6CisgICAgY2FzZSBSQURJT19FVkVOVF9BRl9TV0lUQ0g6CisgICAgICAgIGlmIChyYWRpb19tZXRhZGF0YV9jaGVjayhoYWxFdmVudC0+aW5mby5tZXRhZGF0YSkgPT0gMCkgeworICAgICAgICAgICAgbWV0YWRhdGFTaXplID0gcmFkaW9fbWV0YWRhdGFfZ2V0X3NpemUoaGFsRXZlbnQtPmluZm8ubWV0YWRhdGEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkFESU9fRVZFTlRfTUVUQURBVEE6CisgICAgICAgIGlmIChyYWRpb19tZXRhZGF0YV9jaGVjayhoYWxFdmVudC0+bWV0YWRhdGEpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBldmVudE1lbW9yeTsKKyAgICAgICAgfQorICAgICAgICBtZXRhZGF0YVNpemUgPSByYWRpb19tZXRhZGF0YV9nZXRfc2l6ZShoYWxFdmVudC0+bWV0YWRhdGEpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgc2l6ZV90IHNpemUgPSBoZWFkZXJTaXplICsgbWV0YWRhdGFTaXplOworICAgIGV2ZW50TWVtb3J5ID0gbU1lbW9yeURlYWxlci0+YWxsb2NhdGUoc2l6ZSk7CisgICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIGV2ZW50TWVtb3J5LmNsZWFyKCk7CisgICAgICAgIHJldHVybiBldmVudE1lbW9yeTsKKyAgICB9CisgICAgc3RydWN0IHJhZGlvX2V2ZW50ICpldmVudCA9IChzdHJ1Y3QgcmFkaW9fZXZlbnQgKilldmVudE1lbW9yeS0+cG9pbnRlcigpOworICAgIGV2ZW50LT50eXBlID0gaGFsRXZlbnQtPnR5cGU7CisgICAgZXZlbnQtPnN0YXR1cyA9IGhhbEV2ZW50LT5zdGF0dXM7CisKKyAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKSB7CisgICAgY2FzZSBSQURJT19FVkVOVF9DT05GSUc6CisgICAgICAgIGV2ZW50LT5jb25maWcuYmFuZCA9IGhhbEV2ZW50LT5jb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkFESU9fRVZFTlRfVFVORUQ6CisgICAgY2FzZSBSQURJT19FVkVOVF9BRl9TV0lUQ0g6CisgICAgICAgIGV2ZW50LT5pbmZvID0gaGFsRXZlbnQtPmluZm87CisgICAgICAgIGlmIChtZXRhZGF0YVNpemUgIT0gMCkgeworICAgICAgICAgICAgbWVtY3B5KChjaGFyICopZXZlbnQgKyBoZWFkZXJTaXplLCBoYWxFdmVudC0+aW5mby5tZXRhZGF0YSwgbWV0YWRhdGFTaXplKTsKKyAgICAgICAgICAgIC8vIHJlcGxhY2UgbWV0YSBkYXRhIHBvaW50ZXIgYnkgb2Zmc2V0IHdoaWxlIGluIHNoYXJlZCBtZW1vcnkgc28gdGhhdCByZWNlaXZpbmcgc2lkZQorICAgICAgICAgICAgLy8gY2FuIHJlc3RvcmUgdGhlIHBvaW50ZXIgaW4gZGVzdGluYXRpb24gcHJvY2Vzcy4KKyAgICAgICAgICAgIGV2ZW50LT5pbmZvLm1ldGFkYXRhID0gKHJhZGlvX21ldGFkYXRhX3QgKiloZWFkZXJTaXplOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkFESU9fRVZFTlRfVEE6CisgICAgY2FzZSBSQURJT19FVkVOVF9BTlRFTk5BOgorICAgIGNhc2UgUkFESU9fRVZFTlRfQ09OVFJPTDoKKyAgICAgICAgZXZlbnQtPm9uID0gaGFsRXZlbnQtPm9uOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJBRElPX0VWRU5UX01FVEFEQVRBOgorICAgICAgICBtZW1jcHkoKGNoYXIgKilldmVudCArIGhlYWRlclNpemUsIGhhbEV2ZW50LT5tZXRhZGF0YSwgbWV0YWRhdGFTaXplKTsKKyAgICAgICAgLy8gcmVwbGFjZSBtZXRhIGRhdGEgcG9pbnRlciBieSBvZmZzZXQgd2hpbGUgaW4gc2hhcmVkIG1lbW9yeSBzbyB0aGF0IHJlY2VpdmluZyBzaWRlCisgICAgICAgIC8vIGNhbiByZXN0b3JlIHRoZSBwb2ludGVyIGluIGRlc3RpbmF0aW9uIHByb2Nlc3MuCisgICAgICAgIGV2ZW50LT5tZXRhZGF0YSA9IChyYWRpb19tZXRhZGF0YV90ICopaGVhZGVyU2l6ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQURJT19FVkVOVF9IV19GQUlMVVJFOgorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBldmVudE1lbW9yeTsKK30KKwordm9pZCBSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpzZW5kRXZlbnQocmFkaW9faGFsX2V2ZW50X3QgKmV2ZW50KQorIHsKKyAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBwcmVwYXJlRXZlbnQoZXZlbnQpOworICAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCkgeworICAgICAgICAgcmV0dXJuOworICAgICB9CisKKyAgICAgQXV0b011dGV4IGxvY2sobUNhbGxiYWNrTG9jayk7CisgICAgIG1FdmVudFF1ZXVlLmFkZChldmVudE1lbW9yeSk7CisgICAgIG1DYWxsYmFja0NvbmQuc2lnbmFsKCk7CisgICAgIEFMT0dWKCIlcyBET05FIiwgX19GVU5DVElPTl9fKTsKK30KKworCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJSYWRpb1NlcnZpY2U6Ok1vZHVsZSIKKworUmFkaW9TZXJ2aWNlOjpNb2R1bGU6Ok1vZHVsZShyYWRpb19od19kZXZpY2UqIGh3RGV2aWNlLCByYWRpb19wcm9wZXJ0aWVzIHByb3BlcnRpZXMpCisgOiBtSHdEZXZpY2UoaHdEZXZpY2UpLCBtUHJvcGVydGllcyhwcm9wZXJ0aWVzKSwgbU11dGUodHJ1ZSkKK3sKK30KKworUmFkaW9TZXJ2aWNlOjpNb2R1bGU6On5Nb2R1bGUoKSB7CisgICAgbU1vZHVsZUNsaWVudHMuY2xlYXIoKTsKK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OmR1bXAoaW50IGZkIF9fdW51c2VkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSB7CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzcDxSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudD4gUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OmFkZENsaWVudChjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8pCit7CisgICAgQUxPR1YoImFkZENsaWVudCgpICVwIGNvbmZpZyAlcCBwcm9kdWN0ICVzIiwgdGhpcywgY29uZmlnLCBtUHJvcGVydGllcy5wcm9kdWN0KTsKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgc3A8TW9kdWxlQ2xpZW50PiBtb2R1bGVDbGllbnQ7CisgICAgaW50IHJldDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZUNsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5jbGllbnQoKSA9PSBjbGllbnQpIHsKKyAgICAgICAgICAgIC8vIGNsaWVudCBhbHJlYWR5IGNvbm5lY3RlZDogcmVqZWN0CisgICAgICAgICAgICByZXR1cm4gbW9kdWxlQ2xpZW50OworICAgICAgICB9CisgICAgfQorICAgIG1vZHVsZUNsaWVudCA9IG5ldyBNb2R1bGVDbGllbnQodGhpcywgY2xpZW50LCBjb25maWcsIGF1ZGlvKTsKKworICAgIHN0cnVjdCByYWRpb19oYWxfYmFuZF9jb25maWcgaGFsQ29uZmlnOworICAgIGhhbENvbmZpZyA9IGNvbmZpZy0+YmFuZDsKKworICAgIC8vIFR1bmVyIHByZWVtcHRpb24gbG9naWM6CisgICAgLy8gVGhlcmUgaXMgYSBsaW1pdGVkIGFtb3VudCBvZiB0dW5lcnMgYW5kIGEgbGltaXRlZCBhbW91bnQgb2YgcmFkaW8gYXVkaW8gc291cmNlcyBwZXIgbW9kdWxlLgorICAgIC8vIFRoZSBtaW5pbXVtIGlzIG9uZSB0dW5lciBhbmQgb25lIGF1ZGlvIHNvdXJjZS4KKyAgICAvLyBUaGUgbnVtYmVycyBvZiB0dW5lcnMgYW5kIHNvdXJjZXMgYXJlIGluZGljYXRlZCBpbiB0aGUgbW9kdWxlIHByb3BlcnRpZXMuCisgICAgLy8gTk9URTogY3VycmVudCBmcmFtZXdvcmsgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBvbmUgcmFkaW8gYXVkaW8gc291cmNlLgorICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRvIG9wZW4gbW9yZSB0aGFuIG9uZSB0dW5lciBhdCBhIHRpbWUgYnV0IG9ubHkgb25lIHR1bmVyIGNhbiBiZSBjb25uZWN0ZWQKKyAgICAvLyB0byB0aGUgcmFkaW8gYXVkaW8gc291cmNlIChBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpLgorICAgIC8vIFRoZSBiYXNlIHJ1bGUgaXMgdGhhdCBhIG5ld2x5IGNvbm5lY3RlZCB0dW5lciBhbHdheXMgd2lucywgaS5lLiBhbHdheXMgZ2V0cyBhIHR1bmVyCisgICAgLy8gYW5kIGNhbiB1c2UgdGhlIGF1ZGlvIHNvdXJjZSBpZiByZXF1ZXN0ZWQuCisgICAgLy8gSWYgYW5vdGhlciBjbGllbnQgaXMgcHJlZW1wdGVkLCBpdCBpcyBub3RpZmllZCBieSBhIGNhbGxiYWNrIHdpdGggUkFESU9fRVZFTlRfQ09OVFJPTAorICAgIC8vIGluZGljYXRpbmcgbG9zcyBvZiBjb250cm9sLgorICAgIC8vIC0gSWYgdGhlIG5ld2x5IGNvbm5lY3RlZCBjbGllbnQgcmVxdWVzdHMgdGhlIGF1ZGlvIHNvdXJjZSAoYXVkaW8gPT0gdHJ1ZSk6CisgICAgLy8gICAgLSBpZiBhbiBhdWRpbyBzb3VyY2UgaXMgYXZhaWxhYmxlCisgICAgLy8gICAgICAgICAgbm8gcHJvYmxlbQorICAgIC8vICAgIC0gaWYgbm90OgorICAgIC8vICAgICAgICAgIHRoZSBvbGRlc3QgY2xpZW50IGluIHRoZSBsaXN0IHVzaW5nIGF1ZGlvIGlzIHByZWVtcHRlZC4KKyAgICAvLyAtIElmIHRoZSBuZXdseSBjb25uZWN0ZWQgY2xpZW50IGRvZXMgbm90IHJlcXVlc3QgdGhlIGF1ZGlvIHNvdXJjZSAoYXVkaW8gPT0gZmFsc2UpOgorICAgIC8vICAgIC0gaWYgYSB0dW5lciBpcyBhdmFpbGFibGUKKyAgICAvLyAgICAgICAgICBubyBwcm9ibGVtCisgICAgLy8gICAgLSBpZiBub3Q6CisgICAgLy8gICAgICAgICAgVGhlIG9sZGVzdCBjbGllbnQgbm90IHVzaW5nIGF1ZGlvIGlzIHByZWVtcHRlZCBmaXJzdCBhbmQgaWYgbm9uZSBpcyBmb3VuZCB0aGUKKyAgICAvLyAgICAgICAgICB0aGUgb2xkZXN0IGNsaWVudCB1c2luZyBhdWRpbyBpcyBwcmVlbXB0ZWQuCisgICAgLy8gRWFjaCB0aW1lIGEgdHVuZXIgdXNpbmcgdGhlIGF1ZGlvIHNvdXJjZSBpcyBvcGVuZWQgb3IgY2xvc2VkLCB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgaXMKKyAgICAvLyBub3RpZmllZCBvZiB0aGUgY29ubmVjdGlvbiBvciBkaXNjb25uZWN0aW9uIG9mIEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUi4KKworICAgIHNwPE1vZHVsZUNsaWVudD4gb2xkZXN0VHVuZXI7CisgICAgc3A8TW9kdWxlQ2xpZW50PiBvbGRlc3RBdWRpbzsKKyAgICBzaXplX3QgYWxsb2NhdGVkVHVuZXJzID0gMDsKKyAgICBzaXplX3QgYWxsb2NhdGVkQXVkaW8gPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZUNsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5nZXRUdW5lcigpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+YXVkaW8oKSkgeworICAgICAgICAgICAgICAgIGlmIChvbGRlc3RBdWRpbyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG9sZGVzdEF1ZGlvID0gbU1vZHVsZUNsaWVudHNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFsbG9jYXRlZEF1ZGlvKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChvbGRlc3RUdW5lciA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG9sZGVzdFR1bmVyID0gbU1vZHVsZUNsaWVudHNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFsbG9jYXRlZFR1bmVycysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY29uc3Qgc3RydWN0IHJhZGlvX3R1bmVyICpoYWxUdW5lcjsKKyAgICBzcDxNb2R1bGVDbGllbnQ+IHByZWVtdGVkQ2xpZW50OworICAgIGlmIChhdWRpbykgeworICAgICAgICBpZiAoYWxsb2NhdGVkQXVkaW8gPj0gbVByb3BlcnRpZXMubnVtX2F1ZGlvX3NvdXJjZXMpIHsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKG9sZGVzdEF1ZGlvICE9IDAsICJhZGRDbGllbnQoKSBhbGxvY2F0ZWRBdWRpby9vbGRlc3RBdWRpbyBtaXNtYXRjaCIpOworICAgICAgICAgICAgcHJlZW10ZWRDbGllbnQgPSBvbGRlc3RBdWRpbzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhbGxvY2F0ZWRBdWRpbyArIGFsbG9jYXRlZFR1bmVycyA+PSBtUHJvcGVydGllcy5udW1fdHVuZXJzKSB7CisgICAgICAgICAgICBpZiAoYWxsb2NhdGVkVHVuZXJzICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChvbGRlc3RUdW5lciAhPSAwLCAiYWRkQ2xpZW50KCkgYWxsb2NhdGVkVHVuZXJzL29sZGVzdFR1bmVyIG1pc21hdGNoIik7CisgICAgICAgICAgICAgICAgcHJlZW10ZWRDbGllbnQgPSBvbGRlc3RUdW5lcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQob2xkZXN0QXVkaW8gIT0gMCwgImFkZENsaWVudCgpIGFsbG9jYXRlZEF1ZGlvL29sZGVzdEF1ZGlvIG1pc21hdGNoIik7CisgICAgICAgICAgICAgICAgcHJlZW10ZWRDbGllbnQgPSBvbGRlc3RBdWRpbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocHJlZW10ZWRDbGllbnQgIT0gMCkgeworICAgICAgICBoYWxUdW5lciA9IHByZWVtdGVkQ2xpZW50LT5nZXRUdW5lcigpOworICAgICAgICBwcmVlbXRlZENsaWVudC0+c2V0VHVuZXIoTlVMTCk7CisgICAgICAgIG1Id0RldmljZS0+Y2xvc2VfdHVuZXIobUh3RGV2aWNlLCBoYWxUdW5lcik7CisgICAgICAgIGlmIChwcmVlbXRlZENsaWVudC0+YXVkaW8oKSkgeworICAgICAgICAgICAgbm90aWZ5RGV2aWNlQ29ubmVjdGlvbihmYWxzZSwgIiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gbUh3RGV2aWNlLT5vcGVuX3R1bmVyKG1Id0RldmljZSwgJmhhbENvbmZpZywgYXVkaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvU2VydmljZTo6Y2FsbGJhY2ssIG1vZHVsZUNsaWVudC0+Y2FsbGJhY2tUaHJlYWQoKS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbFR1bmVyKTsKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgQUxPR1YoImFkZENsaWVudCgpIHNldFR1bmVyICVwIiwgaGFsVHVuZXIpOworICAgICAgICBtb2R1bGVDbGllbnQtPnNldFR1bmVyKGhhbFR1bmVyKTsKKyAgICAgICAgbU1vZHVsZUNsaWVudHMuYWRkKG1vZHVsZUNsaWVudCk7CisgICAgICAgIGlmIChhdWRpbykgeworICAgICAgICAgICAgbm90aWZ5RGV2aWNlQ29ubmVjdGlvbih0cnVlLCAiIik7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImFkZENsaWVudCgpIERPTkUgbW9kdWxlQ2xpZW50ICVwIiwgbW9kdWxlQ2xpZW50LmdldCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiJXMgb3Blbl90dW5lciBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKyAgICAgICAgbW9kdWxlQ2xpZW50LmNsZWFyKCk7CisgICAgfQorCisgICAgcmV0dXJuIG1vZHVsZUNsaWVudDsKK30KKwordm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6cmVtb3ZlQ2xpZW50KGNvbnN0IHNwPE1vZHVsZUNsaWVudD4mIG1vZHVsZUNsaWVudCkgeworICAgIEFMT0dWKCJyZW1vdmVDbGllbnQoKSIpOworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBpbnQgcmV0OworICAgIHNzaXplX3QgaW5kZXggPSAtMTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZUNsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldID09IG1vZHVsZUNsaWVudCkgeworICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtTW9kdWxlQ2xpZW50cy5yZW1vdmVBdChpbmRleCk7CisgICAgY29uc3Qgc3RydWN0IHJhZGlvX3R1bmVyICpoYWxUdW5lciA9IG1vZHVsZUNsaWVudC0+Z2V0VHVuZXIoKTsKKyAgICBpZiAoaGFsVHVuZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUh3RGV2aWNlLT5jbG9zZV90dW5lcihtSHdEZXZpY2UsIGhhbFR1bmVyKTsKKyAgICBpZiAobW9kdWxlQ2xpZW50LT5hdWRpbygpKSB7CisgICAgICAgIG5vdGlmeURldmljZUNvbm5lY3Rpb24oZmFsc2UsICIiKTsKKyAgICB9CisKKyAgICBtTXV0ZSA9IHRydWU7CisKKyAgICBpZiAobU1vZHVsZUNsaWVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUdW5lciByZWFsbG9jYXRpb24gbG9naWM6CisgICAgLy8gV2hlbiBhIGNsaWVudCBpcyByZW1vdmVkIGFuZCB3YXMgY29udHJvbGxpbmcgYSB0dW5lciwgdGhpcyB0dW5lciB3aWxsIGJlIGFsbG9jYXRlZCB0byBhCisgICAgLy8gcHJldmlvdXNseSBwcmVlbXB0ZWQgY2xpZW50LiBUaGlzIGNsaWVudCB3aWxsIGJlIG5vdGlmaWVkIGJ5IGEgY2FsbGJhY2sgd2l0aAorICAgIC8vIFJBRElPX0VWRU5UX0NPTlRST0wgaW5kaWNhdGluZyBnYWluIG9mIGNvbnRyb2wuCisgICAgLy8gLSBJZiBhIHByZWVtcHRlZCBjbGllbnQgaXMgd2FpdGluZyBmb3IgYW4gYXVkaW8gc291cmNlIGFuZCBvbmUgYmVjb21lcyBhdmFpbGFibGU6CisgICAgLy8gICAgQWxsb2NhdGUgdGhlIHR1bmVyIHRvIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIGNsaWVudCB3YWl0aW5nIGZvciBhbiBhdWRpbyBzb3VyY2UKKyAgICAvLyAtIElmIG5vdDoKKyAgICAvLyAgICBBbGxvY2F0ZSB0aGUgdHVuZXIgdG8gdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgY2xpZW50LgorICAgIC8vIEVhY2ggdGltZSBhIHR1bmVyIHVzaW5nIHRoZSBhdWRpbyBzb3VyY2UgaXMgb3BlbmVkIG9yIGNsb3NlZCwgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGlzCisgICAgLy8gbm90aWZpZWQgb2YgdGhlIGNvbm5lY3Rpb24gb3IgZGlzY29ubmVjdGlvbiBvZiBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIuCisKKyAgICBzcDxNb2R1bGVDbGllbnQ+IHlvdW5nZXN0Q2xpZW50OworICAgIHNwPE1vZHVsZUNsaWVudD4geW91bmdlc3RDbGllbnRBdWRpbzsKKyAgICBzaXplX3QgYWxsb2NhdGVkVHVuZXJzID0gMDsKKyAgICBzaXplX3QgYWxsb2NhdGVkQXVkaW8gPSAwOworICAgIGZvciAoc3NpemVfdCBpID0gbU1vZHVsZUNsaWVudHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5nZXRUdW5lcigpID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+YXVkaW8oKSkgeworICAgICAgICAgICAgICAgIGlmICh5b3VuZ2VzdENsaWVudEF1ZGlvID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgeW91bmdlc3RDbGllbnRBdWRpbyA9IG1Nb2R1bGVDbGllbnRzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHlvdW5nZXN0Q2xpZW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgeW91bmdlc3RDbGllbnQgPSBtTW9kdWxlQ2xpZW50c1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0tPmF1ZGlvKCkpIHsKKyAgICAgICAgICAgICAgICBhbGxvY2F0ZWRBdWRpbysrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbGxvY2F0ZWRUdW5lcnMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dfQVNTRVJUKGFsbG9jYXRlZFR1bmVycyArIGFsbG9jYXRlZEF1ZGlvIDwgbVByb3BlcnRpZXMubnVtX3R1bmVycywKKyAgICAgICAgICAgICAgICAicmVtb3ZlQ2xpZW50KCkgcmVtb3ZlZCBjbGllbnQgYnV0IG5vIHR1bmVyIGF2YWlsYWJsZSIpOworCisgICAgQUxPR19BU1NFUlQoIW1vZHVsZUNsaWVudC0+YXVkaW8oKSB8fCBhbGxvY2F0ZWRBdWRpbyA8IG1Qcm9wZXJ0aWVzLm51bV9hdWRpb19zb3VyY2VzLAorICAgICAgICAgICAgICAgICJyZW1vdmVDbGllbnQoKSByZW1vdmVkIGF1ZGlvIGNsaWVudCBidXQgbm8gdHVuZXIgd2l0aCBhdWRpbyBhdmFpbGFibGUiKTsKKworICAgIGlmIChhbGxvY2F0ZWRBdWRpbyA8IG1Qcm9wZXJ0aWVzLm51bV9hdWRpb19zb3VyY2VzICYmIHlvdW5nZXN0Q2xpZW50QXVkaW8gIT0gMCkgeworICAgICAgICB5b3VuZ2VzdENsaWVudCA9IHlvdW5nZXN0Q2xpZW50QXVkaW87CisgICAgfQorCisgICAgQUxPR19BU1NFUlQoeW91bmdlc3RDbGllbnQgIT0gMCwgInJlbW92ZUNsaWVudCgpIHJlbW92ZWQgY2xpZW50IG5vIGNhbmRpZGF0ZSBmb3VuZCBmb3IgdHVuZXIiKTsKKworICAgIHN0cnVjdCByYWRpb19oYWxfYmFuZF9jb25maWcgaGFsQ29uZmlnID0geW91bmdlc3RDbGllbnQtPmhhbENvbmZpZygpOworICAgIHJldCA9IG1Id0RldmljZS0+b3Blbl90dW5lcihtSHdEZXZpY2UsICZoYWxDb25maWcsIHlvdW5nZXN0Q2xpZW50LT5hdWRpbygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1NlcnZpY2U6OmNhbGxiYWNrLCBtb2R1bGVDbGllbnQtPmNhbGxiYWNrVGhyZWFkKCkuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYWxUdW5lcik7CisKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgeW91bmdlc3RDbGllbnQtPnNldFR1bmVyKGhhbFR1bmVyKTsKKyAgICAgICAgaWYgKHlvdW5nZXN0Q2xpZW50LT5hdWRpbygpKSB7CisgICAgICAgICAgICBub3RpZnlEZXZpY2VDb25uZWN0aW9uKHRydWUsICIiKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OnNldE11dGUoYm9vbCBtdXRlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG11dGUgIT0gbU11dGUpIHsKKyAgICAgICAgbU11dGUgPSBtdXRlOworICAgICAgICAvL1RPRE8gbm90aWZpZnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgb2YgbWVkaWEgYWN0aXZpdHkgb24gcmFkaW8gYXVkaW8gZGV2aWNlCisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OmdldE11dGUoYm9vbCAqbXV0ZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICptdXRlID0gbU11dGU7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK2NvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OmdldERlZmF1bHRDb25maWcoKSBjb25zdAoreworICAgIGlmIChtUHJvcGVydGllcy5udW1fYmFuZHMgPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICZtUHJvcGVydGllcy5iYW5kc1swXTsKK30KKwordm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6bm90aWZ5RGV2aWNlQ29ubmVjdGlvbihib29sIGNvbm5lY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcykgeworICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIEF1ZGlvU3lzdGVtOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkID8gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywga1JhZGlvVHVuZXJBdWRpb0RldmljZU5hbWUpOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworfQorCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudCIKKworUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Ok1vZHVsZUNsaWVudChjb25zdCBzcDxNb2R1bGU+JiBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8pCisgOiBtTW9kdWxlKG1vZHVsZSksIG1DbGllbnQoY2xpZW50KSwgbUNvbmZpZygqY29uZmlnKSwgbUF1ZGlvKGF1ZGlvKSwgbVR1bmVyKE5VTEwpCit7Cit9CisKK3ZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Om9uRmlyc3RSZWYoKQoreworICAgIG1DYWxsYmFja1RocmVhZCA9IG5ldyBDYWxsYmFja1RocmVhZCh0aGlzKTsKKyAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQ2xpZW50KS0+bGlua1RvRGVhdGgodGhpcyk7Cit9CisKK1JhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50Ojp+TW9kdWxlQ2xpZW50KCkgeworICAgIGlmIChtQ2xpZW50ICE9IDApIHsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUNsaWVudCktPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgIG1DbGllbnQuY2xlYXIoKTsKKyAgICB9CisgICAgaWYgKG1DYWxsYmFja1RocmVhZCAhPSAwKSB7CisgICAgICAgIG1DYWxsYmFja1RocmVhZC0+ZXhpdCgpOworICAgIH0KK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmR1bXAoaW50IGZkIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgeworICAgIFN0cmluZzggcmVzdWx0OworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6ZGV0YWNoKCkgeworICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgc3A8TW9kdWxlQ2xpZW50PiBzdHJvbmdNZSA9IHRoaXM7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIGlmIChtQ2xpZW50ICE9IDApIHsKKyAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1DbGllbnQpLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICAgICAgbUNsaWVudC5jbGVhcigpOworICAgICAgICB9CisgICAgfQorICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7CisgICAgaWYgKG1vZHVsZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbW9kdWxlLT5yZW1vdmVDbGllbnQodGhpcyk7Cit9CisKK3JhZGlvX2hhbF9iYW5kX2NvbmZpZ190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpoYWxDb25maWcoKSBjb25zdAoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gbUNvbmZpZy5iYW5kOworfQorCitjb25zdCBzdHJ1Y3QgcmFkaW9fdHVuZXIgKlJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRUdW5lcigpIGNvbnN0Cit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBtVHVuZXI7Cit9CisKK3ZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnNldFR1bmVyKGNvbnN0IHN0cnVjdCByYWRpb190dW5lciAqdHVuZXIpCit7CisgICAgQUxPR1YoIiVzICVwIiwgX19GVU5DVElPTl9fLCB0aGlzKTsKKworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBtVHVuZXIgPSB0dW5lcjsKKyAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJhZGlvX2hhbF9ldmVudF90IGV2ZW50OworICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9DT05UUk9MOworICAgIGV2ZW50LnN0YXR1cyA9IDA7CisgICAgZXZlbnQub24gPSBtVHVuZXIgIT0gTlVMTDsKKyAgICBtQ2FsbGJhY2tUaHJlYWQtPnNlbmRFdmVudCgmZXZlbnQpOworICAgIEFMT0dWKCIlcyBET05FIiwgX19GVU5DVElPTl9fKTsKKworfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBpZiAobVR1bmVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RydWN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZyBoYWxDb25maWc7CisgICAgICAgIGhhbENvbmZpZyA9IGNvbmZpZy0+YmFuZDsKKyAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+c2V0X2NvbmZpZ3VyYXRpb24obVR1bmVyLCAmaGFsQ29uZmlnKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbUNvbmZpZyA9ICpjb25maWc7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtQ29uZmlnID0gKmNvbmZpZzsKKyAgICAgICAgc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKKworICAgIGlmIChtVHVuZXIgIT0gTlVMTCkgeworICAgICAgICBzdHJ1Y3QgcmFkaW9faGFsX2JhbmRfY29uZmlnIGhhbENvbmZpZzsKKyAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+Z2V0X2NvbmZpZ3VyYXRpb24obVR1bmVyLCAmaGFsQ29uZmlnKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbUNvbmZpZy5iYW5kID0gaGFsQ29uZmlnOworICAgICAgICB9CisgICAgfQorICAgICpjb25maWcgPSBtQ29uZmlnOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnNldE11dGUoYm9vbCBtdXRlKQoreworICAgIHNwPE1vZHVsZT4gbW9kdWxlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGlmIChtVHVuZXIgPT0gTlVMTCB8fCAhbUF1ZGlvKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChtb2R1bGUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbW9kdWxlLT5zZXRNdXRlKG11dGUpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmdldE11dGUoYm9vbCAqbXV0ZSkKK3sKKyAgICBzcDxNb2R1bGU+IG1vZHVsZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKG1vZHVsZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbW9kdWxlLT5nZXRNdXRlKG11dGUpOworfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpCit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAobVR1bmVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+c2NhbihtVHVuZXIsIGRpcmVjdGlvbiwgc2tpcFN1YkNoYW5uZWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpCit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAobVR1bmVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+c3RlcChtVHVuZXIsIGRpcmVjdGlvbiwgc2tpcFN1YkNoYW5uZWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6dHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwpCit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAobVR1bmVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+dHVuZShtVHVuZXIsIGNoYW5uZWwsIHN1YkNoYW5uZWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6Y2FuY2VsKCkKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmIChtVHVuZXIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5jYW5jZWwobVR1bmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKQoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKG1UdW5lciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPmdldF9wcm9ncmFtX2luZm9ybWF0aW9uKG1UdW5lciwgaW5mbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICpoYXNDb250cm9sID0gbVR1bmVyICE9IE5VTEw7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpvbkNhbGxiYWNrRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQoreworICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8SVJhZGlvQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByYWRpb19ldmVudF90ICpldmVudCA9IChyYWRpb19ldmVudF90ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKTsKKyAgICAgICAgc3dpdGNoIChldmVudC0+dHlwZSkgeworICAgICAgICBjYXNlIFJBRElPX0VWRU5UX0NPTkZJRzoKKyAgICAgICAgICAgIG1Db25maWcuYmFuZCA9IGV2ZW50LT5jb25maWcuYmFuZDsKKyAgICAgICAgICAgIGV2ZW50LT5jb25maWcucmVnaW9uID0gbUNvbmZpZy5yZWdpb247CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2xpZW50ID0gbUNsaWVudDsKKyAgICB9CisgICAgaWYgKGNsaWVudCAhPSAwKSB7CisgICAgICAgIGNsaWVudC0+b25FdmVudChldmVudE1lbW9yeSk7CisgICAgfQorfQorCisKK3ZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmJpbmRlckRpZWQoCisgICAgY29uc3Qgd3A8SUJpbmRlcj4gJndobyBfX3VudXNlZCkgeworICAgIEFMT0dXKCJjbGllbnQgYmluZGVyIGRpZWQgZm9yIGNsaWVudCAlcCIsIHRoaXMpOworICAgIGRldGFjaCgpOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vUmFkaW9TZXJ2aWNlLmggYi9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWZlZGE2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvcmFkaW8vUmFkaW9TZXJ2aWNlLmgKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fU0VSVklDRV9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUkFESU9fU0VSVklDRV9ICisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKy8vI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lBcHBPcHNDYWxsYmFjay5oPgorI2luY2x1ZGUgPHJhZGlvL0lSYWRpb1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KKyNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9yYWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lbW9yeUhlYXBCYXNlOworCitjbGFzcyBSYWRpb1NlcnZpY2UgOgorICAgIHB1YmxpYyBCaW5kZXJTZXJ2aWNlPFJhZGlvU2VydmljZT4sCisgICAgcHVibGljIEJuUmFkaW9TZXJ2aWNlCit7CisgICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8UmFkaW9TZXJ2aWNlPjsKKworcHVibGljOgorICAgIGNsYXNzIE1vZHVsZUNsaWVudDsKKyAgICBjbGFzcyBNb2R1bGU7CisKKyAgICBzdGF0aWMgY2hhciBjb25zdCogZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEucmFkaW8iOyB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvU2VydmljZSgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgflJhZGlvU2VydmljZSgpOworCisgICAgLy8gSVJhZGlvU2VydmljZQorICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdE1vZHVsZXMoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChyYWRpb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElSYWRpbz4mIHJhZGlvKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCisKKyAgICBjbGFzcyBNb2R1bGUgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICBNb2R1bGUocmFkaW9faHdfZGV2aWNlKiBod0RldmljZSwKKyAgICAgICAgICAgICAgc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgcHJvcGVydGllcyk7CisKKyAgICAgICB2aXJ0dWFsIH5Nb2R1bGUoKTsKKworICAgICAgICAgICAgICAgc3A8TW9kdWxlQ2xpZW50PiBhZGRDbGllbnQoY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8pOworCisgICAgICAgICAgICAgICB2b2lkIHJlbW92ZUNsaWVudChjb25zdCBzcDxNb2R1bGVDbGllbnQ+JiBtb2R1bGVDbGllbnQpOworCisgICAgICAgICAgICAgICBzdGF0dXNfdCBzZXRNdXRlKGJvb2wgbXV0ZSk7CisKKyAgICAgICAgICAgICAgIHN0YXR1c190IGdldE11dGUoYm9vbCAqbXV0ZSk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19od19kZXZpY2UgKmh3RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUh3RGV2aWNlOyB9CisgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgcHJvcGVydGllcygpIGNvbnN0IHsgcmV0dXJuIG1Qcm9wZXJ0aWVzOyB9CisgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpnZXREZWZhdWx0Q29uZmlnKCkgY29uc3QgOworCisgICAgcHJpdmF0ZToKKworICAgICAgIHZvaWQgbm90aWZ5RGV2aWNlQ29ubmVjdGlvbihib29sIGNvbm5lY3RlZCwgY29uc3QgY2hhciAqYWRkcmVzcyk7CisKKyAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7ICAgICAgICAgIC8vIHByb3RlY3RzICBtTW9kdWxlQ2xpZW50cworICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9faHdfZGV2aWNlICAqbUh3RGV2aWNlOyAgICAgLy8gSEFMIGhhcmR3YXJlIGRldmljZQorICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyBtUHJvcGVydGllczsgICAgLy8gY2FjaGVkIGhhcmR3YXJlIG1vZHVsZSBwcm9wZXJ0aWVzCisgICAgICAgIFZlY3Rvcjwgc3A8TW9kdWxlQ2xpZW50PiA+ICAgIG1Nb2R1bGVDbGllbnRzOyAvLyBsaXN0IG9mIGF0dGFjaGVkIGNsaWVudHMKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgbU11dGU7ICAgICAgICAgIC8vIHJhZGlvIGF1ZGlvIHNvdXJjZSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB1bm11dGVkLCBhdWRpbyBpcyByb3V0ZWQgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgZGV2aWNlIHNlbGVjdGVkIGZvciBtZWRpYSB1c2UgY2FzZS4KKyAgICB9OyAvLyBjbGFzcyBNb2R1bGUKKworICAgIGNsYXNzIENhbGxiYWNrVGhyZWFkIDogcHVibGljIFRocmVhZCB7CisgICAgcHVibGljOgorCisgICAgICAgIENhbGxiYWNrVGhyZWFkKGNvbnN0IHdwPE1vZHVsZUNsaWVudD4mIG1vZHVsZUNsaWVudCk7CisKKyAgICAgICAgdmlydHVhbCB+Q2FsbGJhY2tUaHJlYWQoKTsKKworCisgICAgICAgIC8vIFRocmVhZCB2aXJ0dWFscworICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOworCisgICAgICAgIC8vIFJlZkJhc2UKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKKworICAgICAgICAgICAgICAgIHZvaWQgZXhpdCgpOworCisgICAgICAgICAgICAgICAgdm9pZCBzZW5kRXZlbnQocmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KTsKKyAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiBwcmVwYXJlRXZlbnQocmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHdwPE1vZHVsZUNsaWVudD4gICAgICBtTW9kdWxlQ2xpZW50OyAgICAvLyBjbGllbnQgbW9kdWxlIHRoZSB0aHJlYWQgYmVsb25ncyB0bworICAgICAgICBDb25kaXRpb24gICAgICAgICAgICAgbUNhbGxiYWNrQ29uZDsgICAgLy8gY29uZGl0aW9uIHNpZ25hbGVkIHdoZW4gYSBuZXcgZXZlbnQgaXMgcG9zdGVkCisgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tMb2NrOyAgICAvLyBwcm90ZWN0cyBtRXZlbnRRdWV1ZQorICAgICAgICBWZWN0b3I8IHNwPElNZW1vcnk+ID4gbUV2ZW50UXVldWU7ICAgICAgLy8gcGVuZGluZyBjYWxsYmFjayBldmVudHMKKyAgICAgICAgc3A8TWVtb3J5RGVhbGVyPiAgICAgIG1NZW1vcnlEZWFsZXI7ICAgIC8vIHNoYXJlZCBtZW1vcnkgZm9yIGNhbGxiYWNrIGV2ZW50CisgICAgfTsgLy8gY2xhc3MgQ2FsbGJhY2tUaHJlYWQKKworICAgIGNsYXNzIE1vZHVsZUNsaWVudCA6IHB1YmxpYyBCblJhZGlvLAorICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CisgICAgcHVibGljOgorCisgICAgICAgTW9kdWxlQ2xpZW50KGNvbnN0IHNwPE1vZHVsZT4mIG1vZHVsZSwKKyAgICAgICAgICAgICAgY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgYm9vbCBhdWRpbyk7CisKKyAgICAgICB2aXJ0dWFsIH5Nb2R1bGVDbGllbnQoKTsKKworICAgICAgIC8vIElSYWRpbworICAgICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZyk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNdXRlKGJvb2wgbXV0ZSk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE11dGUoYm9vbCAqbXV0ZSk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCB0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViQ2hhbm5lbCk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNhbmNlbCgpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbyk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IGhhc0NvbnRyb2woYm9vbCAqaGFzQ29udHJvbCk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworICAgICAgICAgICAgICAgc3A8SVJhZGlvQ2xpZW50PiBjbGllbnQoKSBjb25zdCB7IHJldHVybiBtQ2xpZW50OyB9CisgICAgICAgICAgICAgICB3cDxNb2R1bGU+IG1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2R1bGU7IH0KKyAgICAgICAgICAgICAgIHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190IGhhbENvbmZpZygpIGNvbnN0OworICAgICAgICAgICAgICAgc3A8Q2FsbGJhY2tUaHJlYWQ+IGNhbGxiYWNrVGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbUNhbGxiYWNrVGhyZWFkOyB9CisgICAgICAgICAgICAgICB2b2lkIHNldFR1bmVyKGNvbnN0IHN0cnVjdCByYWRpb190dW5lciAqdHVuZXIpOworICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX3R1bmVyICpnZXRUdW5lcigpIGNvbnN0OworICAgICAgICAgICAgICAgYm9vbCBhdWRpbygpIGNvbnN0IHsgcmV0dXJuIG1BdWRpbzsgfQorCisgICAgICAgICAgICAgICB2b2lkIG9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnQpOworCisgICAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKKworCisgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KKyAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobyk7CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsgICAgICAgICAgIC8vIHByb3RlY3RzIG1DbGllbnQsIG1Db25maWcgYW5kIG1UdW5lcgorICAgICAgICB3cDxNb2R1bGU+ICAgICAgICAgICAgICAgICAgbU1vZHVsZTsgICAgICAgICAvLyBUaGUgbW9kdWxlIHRoaXMgY2xpZW50IGlzIGF0dGFjaGVkIHRvCisgICAgICAgIHNwPElSYWRpb0NsaWVudD4gICAgICAgICAgICBtQ2xpZW50OyAgICAgICAgIC8vIGV2ZW50IGNhbGxiYWNrIGJpbmRlciBpbnRlcmZhY2UKKyAgICAgICAgcmFkaW9fYmFuZF9jb25maWdfdCAgICAgICAgIG1Db25maWc7ICAgICAgICAgLy8gY3VycmVudCBiYW5kIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgc3A8Q2FsbGJhY2tUaHJlYWQ+ICAgICAgICAgIG1DYWxsYmFja1RocmVhZDsgLy8gZXZlbnQgY2FsbGJhY2sgdGhyZWFkCisgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICAgICAgICAgICBtQXVkaW87CisgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb190dW5lciAgICAqbVR1bmVyOyAgICAgICAgLy8gSEFMIHR1bmVyIGludGVyZmFjZS4gTlVMTCBpbmRpY2F0ZXMgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY2xpZW50IGRvZXMgbm90IGhhdmUgY29udHJvbCBvbiBhbnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0dW5lcgorICAgIH07IC8vIGNsYXNzIE1vZHVsZUNsaWVudAorCisKKyAgICBzdGF0aWMgdm9pZCBjYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQsIHZvaWQgKmNvb2tpZSk7CisKK3ByaXZhdGU6CisKKyAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOworCisgICAgc3RhdGljIHZvaWQgY29udmVydFByb3BlcnRpZXMocmFkaW9fcHJvcGVydGllc190ICpwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKmhhbFByb3BlcnRpZXMpOworICAgIE11dGV4ICAgICAgICAgICAgICAgbVNlcnZpY2VMb2NrOyAgIC8vIHByb3RlY3RzIG1Nb2R1bGVzCisgICAgdm9sYXRpbGUgaW50MzJfdCAgICBtTmV4dFVuaXF1ZUlkOyAgLy8gZm9yIG1vZHVsZSBJRCBhbGxvY2F0aW9uCisgICAgRGVmYXVsdEtleWVkVmVjdG9yPCByYWRpb19oYW5kbGVfdCwgc3A8TW9kdWxlPiA+IG1Nb2R1bGVzOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKaW5kZXggMTIyYjAwNy4uZTQyODM4OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKQEAgLTgwOSw2ICs4MDksNyBAQAogICAgICAgICAgICAgICAgIG1Id0RldmljZS0+c3RvcF9yZWNvZ25pdGlvbihtSHdEZXZpY2UsIG1vZGVsLT5tSGFuZGxlKTsKICAgICAgICAgICAgICAgICAvLyBrZWVwIG1vZGVsIGluIEFDVElWRSBzdGF0ZSBzbyB0aGF0IGV2ZW50IGlzIHByb2Nlc3NlZCBieSBvbkNhbGxiYWNrRXZlbnQoKQogICAgICAgICAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9yZWNvZ25pdGlvbl9ldmVudCBwaHJhc2VFdmVudDsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnBocmFzZUV2ZW50LCAwLCBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3JlY29nbml0aW9uX2V2ZW50KSk7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtb2RlbC0+bVR5cGUpIHsKICAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01PREVMX1RZUEVfS0VZUEhSQVNFOgogICAgICAgICAgICAgICAgICAgICBwaHJhc2VFdmVudC5udW1fcGhyYXNlcyA9IG1vZGVsLT5tQ29uZmlnLm51bV9waHJhc2VzOwpkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCmluZGV4IDc1ZjY4YjguLmUxNGE3NzEgMTAwNjQ0Ci0tLSBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAorKysgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKQEAgLTQwLDYgKzQwLDggQEAKICAgICBTRVRfQ0FQVFVSRV9TVEFURSwKIH07CiAKKyNkZWZpbmUgTUFYX0lURU1TX1BFUl9MSVNUIDEwMjQKKwogY2xhc3MgQnBTb3VuZFRyaWdnZXJId1NlcnZpY2U6IHB1YmxpYyBCcEludGVyZmFjZTxJU291bmRUcmlnZ2VySHdTZXJ2aWNlPgogewogcHVibGljOgpAQCAtMTE2LDEwICsxMTgsMTggQEAKICAgICAgICAgY2FzZSBMSVNUX01PRFVMRVM6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VySHdTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTW9kdWxlc1JlcSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+IE1BWF9JVEVNU19QRVJfTElTVCkgeworICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTW9kdWxlcyA9IG51bU1vZHVsZXNSZXE7CiAgICAgICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcyA9CiAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqKWNhbGxvYyhudW1Nb2R1bGVzUmVxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yKSk7CisgICAgICAgICAgICBpZiAobW9kdWxlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTk9fTUVNT1JZKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0TW9kdWxlcyhtb2R1bGVzLCAmbnVtTW9kdWxlcyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtTW9kdWxlcyk7CmRpZmYgLS1naXQgYS90b29scy9yZXNhbXBsZXJfdG9vbHMvQW5kcm9pZC5tayBiL3Rvb2xzL3Jlc2FtcGxlcl90b29scy9BbmRyb2lkLm1rCmluZGV4IGU4Y2JlMzkuLmI1OGU0Y2QgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Jlc2FtcGxlcl90b29scy9BbmRyb2lkLm1rCisrKyBiL3Rvb2xzL3Jlc2FtcGxlcl90b29scy9BbmRyb2lkLm1rCkBAIC0xLDYgKzEsNiBAQAogIyBDb3B5cmlnaHQgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCi0jIEFuZHJvaWQubWsgZm9yIHJlc2FtcGxlcl90b29scyAKKyMgQW5kcm9pZC5tayBmb3IgcmVzYW1wbGVyX3Rvb2xzCiAjCiAKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL2Zpci5jcHAgYi90b29scy9yZXNhbXBsZXJfdG9vbHMvZmlyLmNwcAppbmRleCA2MmVkZGNhLi5mZTRkMjEyIDEwMDY0NAotLS0gYS90b29scy9yZXNhbXBsZXJfdG9vbHMvZmlyLmNwcAorKysgYi90b29scy9yZXNhbXBsZXJfdG9vbHMvZmlyLmNwcApAQCAtNjYsMTkgKzY2LDIwIEBACiAKIHN0YXRpYyB2b2lkIHVzYWdlKGNoYXIqIG5hbWUpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICJ1c2FnZTogJXMgWy1oXSBbLWRdIFstcyBzYW1wbGVfcmF0ZV0gWy1jIGN1dC1vZmZfZnJlcXVlbmN5XSBbLW4gaGFsZl96ZXJvX2Nyb3NzaW5nc10iCisgICAgICAgICAgICAidXNhZ2U6ICVzIFstaF0gWy1kXSBbLURdIFstcyBzYW1wbGVfcmF0ZV0gWy1jIGN1dC1vZmZfZnJlcXVlbmN5XSBbLW4gaGFsZl96ZXJvX2Nyb3NzaW5nc10iCiAgICAgICAgICAgICAiIFstZiB7ZmxvYXR8Zml4ZWR8Zml4ZWQxNn1dIFstYiBiZXRhXSBbLXYgZEJGU10gWy1sIGxlcnBdXG4iCi0gICAgICAgICAgICAiICAgICAgICVzIFstaF0gWy1kXSBbLXMgc2FtcGxlX3JhdGVdIFstYyBjdXQtb2ZmX2ZyZXF1ZW5jeV0gWy1uIGhhbGZfemVyb19jcm9zc2luZ3NdIgorICAgICAgICAgICAgIiAgICAgICAlcyBbLWhdIFstZF0gWy1EXSBbLXMgc2FtcGxlX3JhdGVdIFstYyBjdXQtb2ZmX2ZyZXF1ZW5jeV0gWy1uIGhhbGZfemVyb19jcm9zc2luZ3NdIgogICAgICAgICAgICAgIiBbLWYge2Zsb2F0fGZpeGVkfGZpeGVkMTZ9XSBbLWIgYmV0YV0gWy12IGRCRlNdIC1wIE0vTlxuIgogICAgICAgICAgICAgIiAgICAtaCAgICB0aGlzIGhlbHAgbWVzc2FnZVxuIgogICAgICAgICAgICAgIiAgICAtZCAgICBkZWJ1ZywgcHJpbnQgY29tbWEtc2VwYXJhdGVkIGNvZWZmaWNpZW50IHRhYmxlXG4iCisgICAgICAgICAgICAiICAgIC1EICAgIGdlbmVyYXRlIGV4dHJhIGRlY2xhcmF0aW9uc1xuIgogICAgICAgICAgICAgIiAgICAtcCAgICBnZW5lcmF0ZSBwb2x5LXBoYXNlIGZpbHRlciBjb2VmZmljaWVudHMsIHdpdGggc2FtcGxlIGluY3JlbWVudCBNL05cbiIKICAgICAgICAgICAgICIgICAgLXMgICAgc2FtcGxlIHJhdGUgKDQ4MDAwKVxuIgogICAgICAgICAgICAgIiAgICAtYyAgICBjdXQtb2ZmIGZyZXF1ZW5jeSAoMjA0NzgpXG4iCiAgICAgICAgICAgICAiICAgIC1uICAgIG51bWJlciBvZiB6ZXJvLWNyb3NzaW5ncyBvbiBvbmUgc2lkZSAoOClcbiIKICAgICAgICAgICAgICIgICAgLWwgICAgbnVtYmVyIG9mIGxlcnBpbmcgYml0cyAoNClcbiIKICAgICAgICAgICAgICIgICAgLW0gICAgbnVtYmVyIG9mIHBvbHlwaGFzZXMgKHJlbGF0ZWQgdG8gLWwsIGRlZmF1bHQgMTYpXG4iCi0gICAgICAgICAgICAiICAgIC1mICAgIG91dHB1dCBmb3JtYXQsIGNhbiBiZSBmaXhlZC1wb2ludCBvciBmbG9hdGluZy1wb2ludCAoZml4ZWQpXG4iCisgICAgICAgICAgICAiICAgIC1mICAgIG91dHB1dCBmb3JtYXQsIGNhbiBiZSBmaXhlZCwgZml4ZWQxNiwgb3IgZmxvYXQgKGZpeGVkKVxuIgogICAgICAgICAgICAgIiAgICAtYiAgICBrYWlzZXIgd2luZG93IHBhcmFtZXRlciBiZXRhICg3Ljg2NSBbLTgwZEJdKVxuIgogICAgICAgICAgICAgIiAgICAtdiAgICBhdHRlbnVhdGlvbiBpbiBkQkZTICgwKVxuIiwKICAgICAgICAgICAgIG5hbWUsIG5hbWUKQEAgLTk3LDcgKzk4LDggQEAKICAgICBkb3VibGUgRnMgPSA0ODAwMDsKICAgICBkb3VibGUgRmMgPSAyMDQ3ODsKICAgICBkb3VibGUgYXR0ZW4gPSAxOwotICAgIGludCBmb3JtYXQgPSAwOworICAgIGludCBmb3JtYXQgPSAwOyAgICAgLy8gMD1maXhlZCwgMT1mbG9hdAorICAgIGJvb2wgZGVjbGFyYXRpb25zID0gZmFsc2U7CiAKICAgICAvLyBpbiBvcmRlciB0byBrZWVwIHRoZSBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lYXIKICAgICAvLyBpbnRlcnBvbGF0aW9uIG9mIHRoZSBjb2VmZmljaWVudHMgYmVsb3cgdGhlIHF1YW50aXphdGlvbiBlcnJvcgpAQCAtMTU4LDExICsxNjAsMTQgQEAKIAogICAgIGludCBNID0gMSA8PCA0OyAvLyBudW1iZXIgb2YgcGhhc2VzIGZvciBpbnRlcnBvbGF0aW9uCiAgICAgaW50IGNoOwotICAgIHdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgIjpoZHM6YzpuOmY6bDptOmI6cDp2Ono6IikpICE9IC0xKSB7CisgICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiOmhkczpjOm46ZjpsOm06YjpwOnY6ejpEIikpICE9IC0xKSB7CiAgICAgICAgIHN3aXRjaCAoY2gpIHsKICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgICAgIGRlYnVnID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9ucyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdwJzoKICAgICAgICAgICAgICAgICBpZiAoc3NjYW5mKG9wdGFyZywgIiV1LyV1IiwgJnBvbHlNLCAmcG9seU4pICE9IDIpIHsKICAgICAgICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CkBAIC0yMjUsMjQgKzIzMCwyNiBAQAogICAgIGZvciAoaW50IGkgPSBNLTEgOyBpOyBpPj49MSwgbnorKyk7CiAgICAgLy8gZ2VuZXJhdGUgdGhlIHJpZ2h0IGhhbGYgb2YgdGhlIGZpbHRlcgogICAgIGlmICghZGVidWcpIHsKLSAgICAgICAgcHJpbnRmKCIvLyBjbWQtbGluZTogIik7Ci0gICAgICAgIGZvciAoaW50IGk9MSA7IGk8YXJnYyA7IGkrKykgewotICAgICAgICAgICAgcHJpbnRmKCIlcyAiLCBhcmd2W2ldKTsKKyAgICAgICAgcHJpbnRmKCIvLyBjbWQtbGluZToiKTsKKyAgICAgICAgZm9yIChpbnQgaT0wIDsgaTxhcmdjIDsgaSsrKSB7CisgICAgICAgICAgICBwcmludGYoIiAlcyIsIGFyZ3ZbaV0pOwogICAgICAgICB9CiAgICAgICAgIHByaW50ZigiXG4iKTsKLSAgICAgICAgaWYgKCFwb2x5cGhhc2UpIHsKLSAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfU0laRSAgICAgICAgICAgPSAlZDtcbiIsIE4pOwotICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9JTlRfUEhBU0VTICAgICA9ICVkO1xuIiwgTSk7Ci0gICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX05VTV9DT0VGICAgICAgID0gJWQ7XG4iLCBuemMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9TSVpFICAgICAgICAgICA9ICVkO1xuIiwgMipuemMqcG9seU4pOwotICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9OVU1fQ09FRiAgICAgICA9ICVkO1xuIiwgMipuemMpOworICAgICAgICBpZiAoZGVjbGFyYXRpb25zKSB7CisgICAgICAgICAgICBpZiAoIXBvbHlwaGFzZSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfU0laRSAgICAgICAgICAgPSAlZDtcbiIsIE4pOworICAgICAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfSU5UX1BIQVNFUyAgICAgPSAlZDtcbiIsIE0pOworICAgICAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfTlVNX0NPRUYgICAgICAgPSAlZDtcbiIsIG56Yyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfU0laRSAgICAgICAgICAgPSAlZDtcbiIsIDIqbnpjKnBvbHlOKTsKKyAgICAgICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX05VTV9DT0VGICAgICAgID0gJWQ7XG4iLCAyKm56Yyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZvcm1hdCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfQ09FRl9CSVRTICAgICAgPSAlZDtcbiIsIG5jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgIHByaW50Zigic3RhdGljICVzIHJlc2FtcGxlRklSW10gPSB7IiwgIWZvcm1hdCA/ICJpbnQzMl90IiA6ICJmbG9hdCIpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghZm9ybWF0KSB7Ci0gICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX0NPRUZfQklUUyAgICAgID0gJWQ7XG4iLCBuYyk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgICAgICBwcmludGYoInN0YXRpYyAlcyByZXNhbXBsZUZJUltdID0geyIsICFmb3JtYXQgPyAiaW50MzJfdCIgOiAiZmxvYXQiKTsKICAgICB9CiAKICAgICBpZiAoIXBvbHlwaGFzZSkgewpAQCAtMjYwLDEyICsyNjcsMTUgQEAKICAgICAgICAgICAgICAgICBpZiAoIWZvcm1hdCkgewogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHlpID0gdG9pbnQoeSwgMVVMTDw8KG5jLTEpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG5jID4gMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDh4LCAiLCBpbnQzMl90KHlpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA4eCwiLCBpbnQzMl90KHlpKSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA0eCwgIiwgaW50MzJfdCh5aSkmMHhmZmZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDR4LCIsIGludDMyX3QoeWkpJjB4ZmZmZik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUuOWclcyAiLCB5LCBkZWJ1ZyA/ICIsIiA6ICJmLCIpOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUuOWclcyIsIHksIGRlYnVnID8gIiwiIDogImYsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqICE9IG56Yy0xKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjgzLDIzICsyOTMsMjIgQEAKICAgICAgICAgICAgICAgICBpZiAoIWZvcm1hdCkgewogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHlpID0gdG9pbnQoeSwgMVVMTDw8KG5jLTEpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG5jID4gMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDh4LCAiLCBpbnQzMl90KHlpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA4eCwiLCBpbnQzMl90KHlpKSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA0eCwgIiwgaW50MzJfdCh5aSkmMHhmZmZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDR4LCIsIGludDMyX3QoeWkpJjB4ZmZmZik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUuOWclcyIsIHksIGRlYnVnID8gIiIgOiAiZiIpOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUuOWclcyIsIHksIGRlYnVnID8gIiwiIDogImYsIik7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGRlYnVnICYmIChpPT1uemMtMSkpIHsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gbnpjLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCFkZWJ1ZykgeworICAgIGlmICghZGVidWcgJiYgZGVjbGFyYXRpb25zKSB7CiAgICAgICAgIHByaW50ZigiXG59OyIpOwogICAgIH0KICAgICBwcmludGYoIlxuIik7Cg==